Skip to content

Commit cf6f784

Browse files
committed
(v1.4.5) update READMEs, bug fix, and bump version to v1.4.5
1 parent 27ea2fb commit cf6f784

File tree

11 files changed

+964
-152
lines changed

11 files changed

+964
-152
lines changed

README.md

Lines changed: 107 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,115 @@ A continuous, real-time runtime diagnostics suite for ComfyUI featuring **LLM-po
77
## Latest Updates (Jan 2026)
88

99
<details>
10-
<summary><strong>Update (v1.4.1, Jan 2026)</strong> - Click to expand</summary>
10+
<summary><strong>🔴 Major Fix: R0/R13 Pipeline Governance & Plugin Security (v1.4.5)</strong></summary>
11+
12+
**Security Hardening:**
13+
14+
- **SSRF Protection++**: Replaced substring checks with host/port parsing; blocked outbound redirects (`allow_redirects=False`)
15+
- **Outbound Sanitization Funnel**: Single boundary (`outbound.py`) ensuring all external payloads are sanitized; `privacy_mode=none` only for verified local LLMs
16+
17+
**Plugin Trust System:**
18+
19+
- **Safe-by-default**: Plugins disabled by default, requires explicit allowlist + manifest/SHA256
20+
- **Trust Taxonomy**: `trusted | unsigned | untrusted | blocked` classification
21+
- **Filesystem Hardening**: realpath containment, symlink rejection, size limits, strict filename rules
22+
- **Optional HMAC Signature**: Shared-secret integrity verification (not public-key signing)
23+
24+
**Pipeline Governance:**
25+
26+
- **Metadata Contract**: Schema versioning + end-of-run validation + quarantine for invalid keys
27+
- **Dependency Policy**: `requires/provides` enforcement; missing deps → stage skipped, status `degraded`
28+
- **Logger Backpressure**: `DroppingQueue` with priority-aware eviction + drop metrics
29+
- **Prestartup Handoff**: Clean logger uninstall before SmartLogger takes over
30+
31+
**Observability:**
32+
33+
- `/doctor/health` endpoint with queue metrics, drop counters, SSRF blocks, pipeline status
34+
35+
**Test Results**: 159 Python tests passed | 17 Phase 2 gate tests
36+
37+
</details>
38+
39+
---
40+
41+
<details>
42+
<summary><strong>🟡 Enhancement: T11/T12/A8 - CI Gates & Plugin Tooling</strong></summary>
43+
44+
**T11 - Phase 2 Release CI Gate:**
45+
46+
- GitHub Actions workflow (`phase2-release-gate.yml`) enforcing 4 pytest suites + E2E
47+
- Local validator script (`scripts/phase2_gate.py`) with `--fast` and `--e2e` modes
48+
49+
**T12 - Outbound Safety Static Checker:**
50+
51+
- AST-based analyzer (`scripts/check_outbound_safety.py`) detecting bypass patterns
52+
- 6 detection rules: `RAW_FIELD_IN_PAYLOAD`, `DANGEROUS_FALLBACK`, `POST_WITHOUT_SANITIZATION`, etc.
53+
- CI workflow + 8 unit tests + documentation (`docs/OUTBOUND_SAFETY.md`)
54+
55+
**A8 - Plugin Migration Tooling:**
56+
57+
- `scripts/plugin_manifest.py`: Generate manifest with SHA256 hash
58+
- `scripts/plugin_allowlist.py`: Scan plugins and suggest config
59+
- `scripts/plugin_validator.py`: Validate manifests and config
60+
- `scripts/plugin_hmac_sign.py`: Optional HMAC signature generation
61+
- Documentation: `docs/PLUGIN_MIGRATION.md`, `docs/PLUGIN_GUIDE.md` updates
62+
63+
</details>
64+
65+
---
66+
67+
<details>
68+
<summary><strong>🟡 Enhancement: S1/S3 - CSP Documentation & Telemetry</strong></summary>
69+
70+
**S1 - CSP Compliance Documentation:**
71+
72+
- Verified all assets load locally (`web/lib/`); CDN URLs are fallback-only
73+
- Added "CSP Compatibility" section to README
74+
- Code audit complete (manual verification pending)
75+
76+
**S3 - Local Telemetry Infrastructure:**
77+
78+
- Backend: `telemetry.py` with TelemetryStore, RateLimiter, PII detection
79+
- 6 API endpoints: `/doctor/telemetry/{status,buffer,track,clear,export,toggle}`
80+
- Frontend: Settings UI controls for telemetry management
81+
- Security: Origin check (403 cross-origin), 1KB payload limit, field whitelist
82+
- **Default OFF**: No recording/network until explicitly enabled
83+
- 81 i18n strings (9 keys × 9 languages)
84+
85+
**Test Results**: 27 telemetry unit tests | 8 E2E tests
86+
87+
</details>
88+
89+
---
90+
91+
<details>
92+
<summary><strong>🟡 Enhancement: E2E Runner Hardening & Trust/Health UI</strong></summary>
93+
94+
**E2E Runner Hardening (WSL `/mnt/c` Support):**
95+
96+
- Fixed Playwright transform cache permission issues on WSL
97+
- Added writable temp dir under repo (`.tmp/playwright`)
98+
- `PW_PYTHON` override for cross-platform compatibility
99+
100+
**Trust & Health UI Panel:**
101+
102+
- Added "Trust & Health" panel in Settings tab
103+
- Displays: pipeline_status, ssrf_blocked, dropped_logs
104+
- Plugin trust list with badges and reasons
105+
- `GET /doctor/plugins` scan-only endpoint (no code import)
106+
107+
**Test Results**: 61/61 E2E tests | 159/159 Python tests
108+
109+
</details>
110+
111+
---
112+
113+
<details>
114+
<summary><strong>🟢 Previous Update (v1.4.0)</strong></summary>
11115

12116
- A7 Preact migration completed across Phases 5A–5C (Chat/Stats islands, registry, shared rendering, robust fallbacks).
13-
- F15 Resolution Marking UI: mark the latest error as Resolved/Unresolved/Ignored from Statistics; status persists and reflects on load.
14-
- Integration hardening: fixed resolution_status plumbing and strengthened Playwright E2E coverage.
15-
- UI fixes: Locate Node button persistence and sidebar tooltip timing.
117+
- Integration hardening: strengthened Playwright E2E coverage.
118+
- UI fixes: Sidebar tooltip timing.
16119

17120
</details>
18121

i18n.py

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -232,14 +232,19 @@
232232
"status_update_failed": "Failed to update status",
233233
# S3: Telemetry UI
234234
"telemetry_label": "Anonymous Telemetry",
235-
"telemetry_description": "Send anonymous usage data to help improve Doctor",
235+
"telemetry_description": "Send anonymous usage data to help improve Doctor (Under Construction)",
236236
"telemetry_view_buffer": "View Buffer",
237237
"telemetry_clear_all": "Clear All",
238238
"telemetry_export": "Export",
239239
"telemetry_buffer_count": "Currently buffered: {n} events",
240240
"telemetry_upload_none": "Upload destination: None (local only)",
241241
"telemetry_cleared": "Telemetry buffer cleared",
242242
"telemetry_confirm_clear": "Clear all telemetry data?",
243+
# Trust & Health Panel (Phase 2)
244+
"trust_health_title": "Trust & Health",
245+
"trust_health_hint": "Fetch /doctor/health and plugin trust report (scan-only).",
246+
"refresh_btn": "Refresh",
247+
"plugins_none_found": "No plugins found.",
243248
},
244249
"zh_TW": {
245250
"info_title": "資訊",
@@ -371,14 +376,19 @@
371376
"status_update_failed": "更新狀態失敗",
372377
# S3: Telemetry UI
373378
"telemetry_label": "匿名遙測",
374-
"telemetry_description": "發送匿名使用資料以幫助改善 Doctor",
379+
"telemetry_description": "發送匿名使用資料以幫助改善 Doctor (建設中)",
375380
"telemetry_view_buffer": "查看緩衝區",
376381
"telemetry_clear_all": "全部清除",
377382
"telemetry_export": "匯出",
378383
"telemetry_buffer_count": "目前緩衝:{n} 個事件",
379384
"telemetry_upload_none": "上傳目的地:無(僅本地)",
380385
"telemetry_cleared": "遙測緩衝區已清除",
381386
"telemetry_confirm_clear": "清除所有遙測資料?",
387+
# Trust & Health Panel (Phase 2)
388+
"trust_health_title": "信任與健康",
389+
"trust_health_hint": "取得 /doctor/health 與插件信任報告(僅掃描)。",
390+
"refresh_btn": "重新整理",
391+
"plugins_none_found": "找不到插件。",
382392
},
383393
"zh_CN": {
384394
"info_title": "信息",
@@ -509,14 +519,19 @@
509519
"status_update_failed": "更新状态失败",
510520
# S3: Telemetry UI
511521
"telemetry_label": "匿名遥测",
512-
"telemetry_description": "发送匿名使用数据以帮助改进 Doctor",
522+
"telemetry_description": "发送匿名使用数据以帮助改进 Doctor (建设中)",
513523
"telemetry_view_buffer": "查看缓冲区",
514524
"telemetry_clear_all": "全部清除",
515525
"telemetry_export": "导出",
516526
"telemetry_buffer_count": "当前缓冲:{n} 个事件",
517527
"telemetry_upload_none": "上传目的地:无(仅本地)",
518528
"telemetry_cleared": "遥测缓冲区已清除",
519529
"telemetry_confirm_clear": "清除所有遥测数据?",
530+
# Trust & Health Panel (Phase 2)
531+
"trust_health_title": "信任与健康",
532+
"trust_health_hint": "获取 /doctor/health 和插件信任报告(仅扫描)。",
533+
"refresh_btn": "刷新",
534+
"plugins_none_found": "未找到插件。",
520535
},
521536
"ja": {
522537
"info_title": "情報",
@@ -647,14 +662,19 @@
647662
"status_update_failed": "ステータスの更新に失敗しました",
648663
# S3: Telemetry UI
649664
"telemetry_label": "匿名テレメトリ",
650-
"telemetry_description": "Doctor の改善のために匿名の使用データを送信",
665+
"telemetry_description": "Doctor の改善のために匿名の使用データを送信 (建設中)",
651666
"telemetry_view_buffer": "バッファを表示",
652667
"telemetry_clear_all": "すべてクリア",
653668
"telemetry_export": "エクスポート",
654669
"telemetry_buffer_count": "現在バッファ: {n} イベント",
655670
"telemetry_upload_none": "アップロード先: なし(ローカルのみ)",
656671
"telemetry_cleared": "テレメトリバッファがクリアされました",
657672
"telemetry_confirm_clear": "すべてのテレメトリデータをクリアしますか?",
673+
# Trust & Health Panel (Phase 2)
674+
"trust_health_title": "信頼と健全性",
675+
"trust_health_hint": "/doctor/health とプラグイン信頼レポートを取得(スキャンのみ)。",
676+
"refresh_btn": "更新",
677+
"plugins_none_found": "プラグインが見つかりません。",
658678
},
659679
"de": {
660680
"info_title": "INFO",
@@ -785,14 +805,19 @@
785805
"status_update_failed": "Status konnte nicht aktualisiert werden",
786806
# S3: Telemetry UI
787807
"telemetry_label": "Anonyme Telemetrie",
788-
"telemetry_description": "Anonyme Nutzungsdaten senden, um Doctor zu verbessern",
808+
"telemetry_description": "Anonyme Nutzungsdaten senden, um Doctor zu verbessern (Im Aufbau)",
789809
"telemetry_view_buffer": "Puffer anzeigen",
790810
"telemetry_clear_all": "Alle löschen",
791811
"telemetry_export": "Exportieren",
792812
"telemetry_buffer_count": "Aktuell gepuffert: {n} Ereignisse",
793813
"telemetry_upload_none": "Upload-Ziel: Keins (nur lokal)",
794814
"telemetry_cleared": "Telemetrie-Puffer geleert",
795815
"telemetry_confirm_clear": "Alle Telemetriedaten löschen?",
816+
# Trust & Health Panel (Phase 2)
817+
"trust_health_title": "Vertrauen & Gesundheit",
818+
"trust_health_hint": "/doctor/health und Plugin-Vertrauensbericht abrufen (nur Scannen).",
819+
"refresh_btn": "Aktualisieren",
820+
"plugins_none_found": "Keine Plugins gefunden.",
796821
},
797822
"fr": {
798823
"info_title": "INFO",
@@ -923,14 +948,19 @@
923948
"status_update_failed": "Échec de la mise à jour du statut",
924949
# S3: Telemetry UI
925950
"telemetry_label": "Télémétrie anonyme",
926-
"telemetry_description": "Envoyer des données d'utilisation anonymes pour améliorer Doctor",
951+
"telemetry_description": "Envoyer des données d'utilisation anonymes pour améliorer Doctor (En construction)",
927952
"telemetry_view_buffer": "Voir le tampon",
928953
"telemetry_clear_all": "Tout effacer",
929954
"telemetry_export": "Exporter",
930955
"telemetry_buffer_count": "Actuellement en tampon : {n} événements",
931956
"telemetry_upload_none": "Destination : Aucune (local uniquement)",
932957
"telemetry_cleared": "Tampon de télémétrie effacé",
933958
"telemetry_confirm_clear": "Effacer toutes les données de télémétrie ?",
959+
# Trust & Health Panel (Phase 2)
960+
"trust_health_title": "Confiance et Santé",
961+
"trust_health_hint": "Récupérer /doctor/health et le rapport de confiance des plugins (scan uniquement).",
962+
"refresh_btn": "Actualiser",
963+
"plugins_none_found": "Aucun plugin trouvé.",
934964
},
935965
"it": {
936966
"info_title": "INFO",
@@ -1061,14 +1091,19 @@
10611091
"status_update_failed": "Aggiornamento stato fallito",
10621092
# S3: Telemetry UI
10631093
"telemetry_label": "Telemetria anonima",
1064-
"telemetry_description": "Invia dati di utilizzo anonimi per migliorare Doctor",
1094+
"telemetry_description": "Invia dati di utilizzo anonimi per migliorare Doctor (In costruzione)",
10651095
"telemetry_view_buffer": "Visualizza buffer",
10661096
"telemetry_clear_all": "Cancella tutto",
10671097
"telemetry_export": "Esporta",
10681098
"telemetry_buffer_count": "Attualmente nel buffer: {n} eventi",
10691099
"telemetry_upload_none": "Destinazione: Nessuna (solo locale)",
10701100
"telemetry_cleared": "Buffer di telemetria cancellato",
10711101
"telemetry_confirm_clear": "Cancellare tutti i dati di telemetria?",
1102+
# Trust & Health Panel (Phase 2)
1103+
"trust_health_title": "Fiducia e Salute",
1104+
"trust_health_hint": "Recupera /doctor/health e rapporto sulla fiducia dei plugin (solo scansione).",
1105+
"refresh_btn": "Aggiorna",
1106+
"plugins_none_found": "Nessun plugin trovato.",
10721107
},
10731108
"es": {
10741109
"info_title": "INFO",
@@ -1199,14 +1234,19 @@
11991234
"status_update_failed": "Error al actualizar el estado",
12001235
# S3: Telemetry UI
12011236
"telemetry_label": "Telemetría anónima",
1202-
"telemetry_description": "Enviar datos de uso anónimos para mejorar Doctor",
1237+
"telemetry_description": "Enviar datos de uso anónimos para mejorar Doctor (En construcción)",
12031238
"telemetry_view_buffer": "Ver búfer",
12041239
"telemetry_clear_all": "Borrar todo",
12051240
"telemetry_export": "Exportar",
12061241
"telemetry_buffer_count": "Actualmente en búfer: {n} eventos",
12071242
"telemetry_upload_none": "Destino: Ninguno (solo local)",
12081243
"telemetry_cleared": "Búfer de telemetría borrado",
12091244
"telemetry_confirm_clear": "¿Borrar todos los datos de telemetría?",
1245+
# Trust & Health Panel (Phase 2)
1246+
"trust_health_title": "Confianza y Salud",
1247+
"trust_health_hint": "Obtener /doctor/health y reporte de confianza de plugins (solo escaneo).",
1248+
"refresh_btn": "Actualizar",
1249+
"plugins_none_found": "No se encontraron plugins.",
12101250
},
12111251
"ko": {
12121252
"info_title": "정보",
@@ -1337,14 +1377,19 @@
13371377
"status_update_failed": "상태 업데이트 실패",
13381378
# S3: Telemetry UI
13391379
"telemetry_label": "익명 텔레메트리",
1340-
"telemetry_description": "Doctor 개선을 위해 익명 사용 데이터 전송",
1380+
"telemetry_description": "Doctor 개선을 위해 익명 사용 데이터 전송 (공사 중)",
13411381
"telemetry_view_buffer": "버퍼 보기",
13421382
"telemetry_clear_all": "모두 삭제",
13431383
"telemetry_export": "내보내기",
13441384
"telemetry_buffer_count": "현재 버퍼: {n}개 이벤트",
13451385
"telemetry_upload_none": "업로드 대상: 없음 (로컬만)",
13461386
"telemetry_cleared": "텔레메트리 버퍼 삭제됨",
13471387
"telemetry_confirm_clear": "모든 텔레메트리 데이터를 삭제하시겠습니까?",
1388+
# Trust & Health Panel (Phase 2)
1389+
"trust_health_title": "신뢰 및 상태",
1390+
"trust_health_hint": "/doctor/health 및 플러그인 신뢰 보고서 가져오기(스캔 전용).",
1391+
"refresh_btn": "새로고침",
1392+
"plugins_none_found": "플러그인을 찾을 수 없습니다.",
13481393
},
13491394
}
13501395

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[project]
22
name = "comfyui-doctor"
33
description = "A real-time runtime diagnostics suite for ComfyUI, featuring interactive debugging chat, and 50+ fix patterns. Automatically intercepts terminal output from startup, and delivers prioritized fix suggestions with node-level context extraction. Now supports JSON-based pattern management with hot-reload and full i18n support for 9 languages."
4-
version = "1.4.1"
4+
version = "1.4.5"
55
license = {text = "MIT"}
66
readme = "README.md"
77
requires-python = ">=3.10"

0 commit comments

Comments
 (0)