67 Commits
Author SHA1 Message Date
rays 28bf8e71c2 fix(ui): keep node target identifiers out of HTML attributes 2026-10-25 19:31:47 +08:00
rays 60ea66c3ec fix(diagnostics): preserve opaque node identities and exact targets 2026-10-25 16:33:06 +08:00
rays 3c73c29d75 fix: realign diagnostics, telemetry and metadata contracts with their producers
- Privacy diagnostics: the provider name is None for unknown endpoints
  and when no base URL is set; calling .lower() on it raised and dropped
  every issue of the check, including the warning for privacy_mode=none
  with an unknown remote endpoint.
- Telemetry: the pattern allowlist built a PatternLoader without its
  required directories, so it was always empty and every pattern label
  became __unknown__. It now reads ids from the shared loader through a
  new PatternLoader.get_pattern_ids().
- Error summary: the LLM context builder read the category from a nested
  pattern_match key that the pattern stage never writes; it now reads the
  top-level category (nested key kept as a fallback).
- Sidebar: an error delivered before the sidebar panel existed (it waits
  for UI text) threw on auto-open, and so did the menu toggle. Visibility
  is now applied when the panel is created.
- OpenAPI info.version now matches the package version, and the version
  metadata test enforces it.
- A missing optional patterns/custom directory is logged at debug level
  instead of a warning; missing built-in directories still warn.
2026-10-13 14:28:45 +08:00
rays b7aa4f92d7 fix(ui): load chat rendering assets from the extension's own folder
The markdown and code-highlighting libraries were requested from the
absolute path /extensions/ComfyUI-Doctor/lib/. ComfyUI serves an
extension under its install folder name, so any other folder name got
404s and silently loaded unpinned copies from cdn.jsdelivr.net into the
ComfyUI origin; offline, assistant replies rendered as blank bubbles and
the failed load surfaced as an unhandled promise rejection.

Asset URLs are now resolved relative to the rendering module, and the
CDN fallback is removed. A missing asset logs one warning and the load
never rejects. The chat island shows a reply as plain text while marked
is unavailable and re-renders it as markdown once the assets settle.

The E2E test server also serves the extension under a lowercase install
folder, and the harness can load Doctor through a host-shaped
/extensions/<folder>/ entry. Host-asset tests cover both folder names,
missing assets and late asset loading, with CDN requests blocked.
2026-10-13 14:17:43 +08:00
rays 63dfc1e1b7 fix(chat): show chat failures in the sidebar instead of a stuck placeholder
The chat panel logged stream failures to the console only, so HTTP
errors, in-stream error events, network failures and empty replies left
the pending "..." reply on screen forever. Every request now settles its
pending reply: failures become a localized, text-only error (partial
replies are kept), a new Stop button ends a reply with a stop notice,
and an empty reply reports a stream error.

Error and notice bubbles render as plain text and are never sent back to
the model as conversation history; the request history now carries only
user and assistant turns as role/content pairs.
2026-10-13 13:29:38 +08:00
rays 9e24dcd5b9 fix(security): render fix suggestions as text and apply them only to exact nodes
Fix suggestions come from model output and can be steered by prompt
injection. Button labels and titles are now set as text, buttons are only
offered on assistant replies, node ids must match a live node exactly
(execution paths walk real subgraph hosts only), and suggested values are
parsed strictly per widget type (number range, toggle literals, combo
membership, bounded text) before anything is changed. Undo and highlight
use the resolved node instead of re-parsing the id.

Adds a Playwright spec that streams a hostile fix block through the chat
island and covers role gating, exact-id resolution and value rejection.
2026-10-13 13:15:54 +08:00
rays cc31b1433d fix(security): restrict LLM requests to operator-approved destinations
The analyze, chat, verify-key and model-list routes sent server-side
requests to a caller-supplied base URL guarded only by a pre-flight
denylist. Callers could choose arbitrary hosts and paths, reach shared
address space and metadata ranges, drive local LLM write APIs, and use
DNS rebinding to deliver server-held keys to loopback services.

Requests now select an entry of an immutable destination registry built
at startup from the built-in provider catalog, local Ollama/LM Studio,
and operator environment variables (DOCTOR_LLM_ALLOWED_BASE_URLS and the
existing base URL variables). Outbound URLs are built from the approved
entry, resolved addresses are checked at connect time inside the shared
connector, redirects are never followed or treated as success, and error
responses no longer reflect upstream bodies or network details. The UI
shows localized operator guidance, a static rule enforces disabled
redirects and policy-managed sessions, and .comfyignore keeps tests and
tooling out of the published archive.
2026-10-13 12:22:39 +08:00
rays 750b05e290 test(harness): execute real route handlers and serve host-shaped assets
Add a reusable backend harness that executes the real package entrypoint
host-style, serves the registered PromptServer routes on loopback through
aiohttp's test server, captures provider requests in-process, and refuses
non-loopback connects and unknown DNS lookups. Characterization tests pin
current handler behavior and the harness's process-state restoration.

Map /extensions/ComfyUI-Doctor/ onto web/ in the E2E server, confined to
web/, so vendored rendering assets load the way ComfyUI serves them and the
default lane no longer falls back to CDN downloads. A focused spec asserts
local asset loading, markdown rendering of a chat reply, and alias
confinement.
2026-10-13 11:36:37 +08:00
rays a951b03b9a fix(compat): align host contracts and node focus lifecycle
Refresh exact frontend lanes and relocated host contracts while preserving
Desktop settings behavior. Recognize first-party Switch nodes and optional
branches without suppressing required-input or broken-link diagnostics.

Revalidate canvas, workflow and target identity across focus navigation;
cancel stale requests on newer actions and sidebar teardown. Keep legacy
positioning and nested graph traversal covered by action-level regressions.

Validation: 75 source contracts, 84 frontend unit tests, Windows full gate
with 871 backend tests and 125 subtests, and 149 mocked browser E2E tests.
Seven existing backend skips remain. No live-host certification is claimed.
2026-09-22 15:18:41 +08:00
rays 25f9290635 fix(frontend): preserve sidebar layout across host tab switches 2026-09-05 04:29:45 +08:00
rays 4288961706 fix(diagnostics): accept current dynamic vram warning 2026-09-04 22:09:27 +08:00
rays cce05160da feat(diagnostics): surface DynamicVRAM fallback advisory 2026-08-19 16:48:22 +08:00
rays 1f2daa26fb docs: align public guidance with current behavior 2026-08-08 17:30:22 +08:00
rays cf23770200 fix(ui): scope chat activation to owned tab pane
Pass the concrete tab pane through activation hooks and release late async renders after manager destruction. Keep Chat island activation, unmount, and vanilla status updates bound to their owning container.
2026-08-08 17:00:32 +08:00
rays ddb51c6c95 fix(frontend): render dynamic status messages as text 2026-08-08 16:39:10 +08:00
rays 34e7717ce7 fix(frontend): recognize partner policy validation errors 2026-07-31 03:52:13 +08:00
rays 139de767d4 fix(validation): surface public subgraph boundary errors 2026-07-19 20:01:11 +08:00
rays dbcbf34b5c fix(navigation): distinguish subgraphs from groups 2026-07-19 19:13:13 +08:00
rays 255d259dd3 fix(settings): disable host change telemetry 2026-07-19 19:04:36 +08:00
rays 9c6b21ff70 fix(frontend): align error aggregate handling 2026-06-24 17:31:57 +08:00
rays 7dc255bbb4 fix(frontend): align validation error copy 2026-06-12 16:16:45 +08:00
rays e1dfb588ee test(e2e): add stress test lane 2026-05-31 14:09:10 +08:00
rays a85ee2fc1d test(e2e): make integration lane deterministic 2026-05-31 14:02:42 +08:00
rays e9f9286b50 chore(test): rename focused gate entrypoints 2026-05-31 13:56:30 +08:00
rays 10a2302a56 feat(ui): add provider quick switch 2026-05-31 13:28:27 +08:00
rays a12d76811d refactor(ui): extract right panel renderer 2026-05-31 13:20:23 +08:00
rays aaf79c85ba feat(ui): surface host validation errors 2026-05-31 12:09:34 +08:00
rays 31736a4615 fix(frontend): align locate focus behavior 2026-05-13 16:19:40 +08:00
rays c9dd4eb188 fix(frontend): prefer current sidebar API 2026-05-13 16:04:07 +08:00
rays 72a023b2bf test(host): expand compatibility harness 2026-05-13 15:56:16 +08:00
rays ac766c06ec chore: align version metadata and cleanup tracked artifacts 2026-04-26 18:21:04 +08:00
rays b3b920500c fix(frontend): enrich execution error lineage 2026-04-25 17:39:13 +08:00
rays b6633d5f4c fix(frontend): prefer modern settings API 2026-04-25 17:34:17 +08:00
rays a55ee4caef feat(frontend): modernize ComfyUI extension API integration 2026-04-04 19:04:19 +08:00
rays 01568bf8a8 fix(startup): harden prestartup encoding and non-ui console output 2026-04-04 17:23:22 +08:00
rays 8f99daa282 fix(imports): harden package-safe startup loading 2026-04-04 16:27:47 +08:00
rays 40ad1c7a3f merge detached release chain back into main 2026-03-26 20:36:50 +08:00
rays cd19630539 feat(r23): align execution_error compatibility with subgraph workflows 2026-03-26 18:58:24 +08:00
rays 83015fdf32 R23: execution_error Event Structure Compatibility Update
- doctor_ui.js: Extract traceback array, current_inputs, and current_outputs from new execution_error structure
- Extend handleNewError data payload with 'execution_context'
- Add Playwright E2E test to verify tracebacks and inputs are parsed properly
- Add detect-secrets whitelist for dummy key in roadmap.md
- Mark R23 completed with planning URLs
2026-03-25 05:25:50 +08:00
rays 633603d785 feat: add F16 quick feedback PR flow 2026-02-27 01:42:31 +08:00
rays 0456823e93 feat: finalize dual-mode API key strategy (ENV-first + advanced server key store) 2026-02-10 15:43:06 +08:00
rays 05ed16ab8d fix: E2E test 2026-01-24 00:47:40 +08:00
rays bd5ad0b68d test(t14): add frontend unit tests and fix E2E i18n/settings persistence 2026-01-23 20:26:37 +08:00
rays 1d599737f2 docs(planning): mark F14-P3 follow-ups as F14-P4 and add reviewer verification notes 2026-01-23 19:44:08 +08:00
rays 3e0dbe759b feat(f14): harden diagnostics intent UX (top-k intents, stage badges, workflow dict support) 2026-01-23 19:03:23 +08:00
rays 61c36e1795 feat(f17): add default-on toggle to auto-open the right error report panel 2026-01-23 14:44:28 +08:00
rays 598c17b268 fix: Stat E2E 2026-01-16 01:10:44 +08:00
rays 70e32c6c38 feat: Statistics Reset + Smarter AI Prompts 2026-01-15 21:45:53 +08:00
rays ea090ed825 feat(ui): move Trust & Health + Anonymous Telemetry from Settings to Statistics and stabilize Playwright E2E routes 2026-01-15 14:40:09 +08:00
rays e8deeda582 fix(e2e): make preact loader failure tests deterministic 2026-01-14 23:33:53 +08:00