cli-jaw 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +3 -2
- package/README.md +41 -12
- package/dist/bin/_http-client.js +34 -0
- package/dist/bin/_http-client.js.map +1 -0
- package/dist/bin/cli-jaw.js +10 -5
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/browser-web-ai.js +155 -38
- package/dist/bin/commands/browser-web-ai.js.map +1 -1
- package/dist/bin/commands/browser.js +265 -37
- package/dist/bin/commands/browser.js.map +1 -1
- package/dist/bin/commands/chat.js +18 -14
- package/dist/bin/commands/chat.js.map +1 -1
- package/dist/bin/commands/clone.js +3 -2
- package/dist/bin/commands/clone.js.map +1 -1
- package/dist/bin/commands/dashboard.js +22 -18
- package/dist/bin/commands/dashboard.js.map +1 -1
- package/dist/bin/commands/dispatch.js +9 -11
- package/dist/bin/commands/dispatch.js.map +1 -1
- package/dist/bin/commands/doctor.js +26 -14
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/employee.js +12 -7
- package/dist/bin/commands/employee.js.map +1 -1
- package/dist/bin/commands/init.js +9 -9
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/commands/launchd.js +17 -7
- package/dist/bin/commands/launchd.js.map +1 -1
- package/dist/bin/commands/mcp.js +7 -4
- package/dist/bin/commands/mcp.js.map +1 -1
- package/dist/bin/commands/memory.js +7 -5
- package/dist/bin/commands/memory.js.map +1 -1
- package/dist/bin/commands/orchestrate.js +6 -3
- package/dist/bin/commands/orchestrate.js.map +1 -1
- package/dist/bin/commands/reset.js +4 -3
- package/dist/bin/commands/reset.js.map +1 -1
- package/dist/bin/commands/serve.js +3 -2
- package/dist/bin/commands/serve.js.map +1 -1
- package/dist/bin/commands/service.js +2 -2
- package/dist/bin/commands/service.js.map +1 -1
- package/dist/bin/commands/status.js +10 -9
- package/dist/bin/commands/status.js.map +1 -1
- package/dist/bin/commands/tui/api.js +26 -18
- package/dist/bin/commands/tui/api.js.map +1 -1
- package/dist/bin/commands/tui/overlays.js +3 -1
- package/dist/bin/commands/tui/overlays.js.map +1 -1
- package/dist/bin/commands/tui/simple-mode.js +1 -1
- package/dist/bin/commands/tui/simple-mode.js.map +1 -1
- package/dist/bin/commands/tui/types.js.map +1 -1
- package/dist/bin/postinstall.js +153 -65
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/bin/star-prompt.js +4 -3
- package/dist/bin/star-prompt.js.map +1 -1
- package/dist/lib/mcp/format-converters.js +15 -10
- package/dist/lib/mcp/format-converters.js.map +1 -1
- package/dist/lib/mcp/mcp-install.js +2 -2
- package/dist/lib/mcp/mcp-install.js.map +1 -1
- package/dist/lib/mcp/skills-distribution.js +2 -2
- package/dist/lib/mcp/skills-distribution.js.map +1 -1
- package/dist/lib/mcp/skills-reset.js +5 -4
- package/dist/lib/mcp/skills-reset.js.map +1 -1
- package/dist/lib/mcp/skills-symlinks.js +9 -9
- package/dist/lib/mcp/skills-symlinks.js.map +1 -1
- package/dist/lib/mcp/skills-utils.js +5 -4
- package/dist/lib/mcp/skills-utils.js.map +1 -1
- package/dist/lib/mcp/unified-config.js +3 -2
- package/dist/lib/mcp/unified-config.js.map +1 -1
- package/dist/lib/mime-detect.js +65 -0
- package/dist/lib/mime-detect.js.map +1 -0
- package/dist/lib/quota-copilot.js +12 -10
- package/dist/lib/quota-copilot.js.map +1 -1
- package/dist/lib/stt.js +3 -3
- package/dist/lib/stt.js.map +1 -1
- package/dist/lib/upload.js +14 -5
- package/dist/lib/upload.js.map +1 -1
- package/dist/scripts/i18n-registry.js +4 -4
- package/dist/scripts/i18n-registry.js.map +1 -1
- package/dist/server.js +61 -57
- package/dist/server.js.map +1 -1
- package/dist/src/agent/alert-escalation.js +61 -0
- package/dist/src/agent/alert-escalation.js.map +1 -0
- package/dist/src/agent/args.js +71 -2
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/error-classifier.js +9 -4
- package/dist/src/agent/error-classifier.js.map +1 -1
- package/dist/src/agent/events.js +130 -101
- package/dist/src/agent/events.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +44 -19
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/live-run-state.js +7 -3
- package/dist/src/agent/live-run-state.js.map +1 -1
- package/dist/src/agent/memory-flush-controller.js +6 -4
- package/dist/src/agent/memory-flush-controller.js.map +1 -1
- package/dist/src/agent/opencode-diagnostics.js +7 -6
- package/dist/src/agent/opencode-diagnostics.js.map +1 -1
- package/dist/src/agent/session-persistence.js +1 -1
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/spawn-env.js +33 -16
- package/dist/src/agent/spawn-env.js.map +1 -1
- package/dist/src/agent/spawn.js +176 -110
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/agent/watchdog.js +56 -0
- package/dist/src/agent/watchdog.js.map +1 -0
- package/dist/src/browser/actions.js +179 -70
- package/dist/src/browser/actions.js.map +1 -1
- package/dist/src/browser/connection.js +296 -19
- package/dist/src/browser/connection.js.map +1 -1
- package/dist/src/browser/index.js +4 -1
- package/dist/src/browser/index.js.map +1 -1
- package/dist/src/browser/launch-policy.js +1 -1
- package/dist/src/browser/launch-policy.js.map +1 -1
- package/dist/src/browser/primitives.js +11 -7
- package/dist/src/browser/primitives.js.map +1 -1
- package/dist/src/browser/runtime-diagnostics.js +45 -0
- package/dist/src/browser/runtime-diagnostics.js.map +1 -0
- package/dist/src/browser/runtime-orphans.js +127 -0
- package/dist/src/browser/runtime-orphans.js.map +1 -0
- package/dist/src/browser/runtime-owner-store.js +51 -0
- package/dist/src/browser/runtime-owner-store.js.map +1 -0
- package/dist/src/browser/runtime-owner.js +2 -2
- package/dist/src/browser/runtime-owner.js.map +1 -1
- package/dist/src/browser/tab-lifecycle.js +157 -0
- package/dist/src/browser/tab-lifecycle.js.map +1 -0
- package/dist/src/browser/vision.js +35 -11
- package/dist/src/browser/vision.js.map +1 -1
- package/dist/src/browser/web-ai/action-breadth.js +56 -0
- package/dist/src/browser/web-ai/action-breadth.js.map +1 -0
- package/dist/src/browser/web-ai/action-cache.js +9 -8
- package/dist/src/browser/web-ai/action-cache.js.map +1 -1
- package/dist/src/browser/web-ai/action-intent.js +64 -0
- package/dist/src/browser/web-ai/action-intent.js.map +1 -0
- package/dist/src/browser/web-ai/action-memory.js +82 -0
- package/dist/src/browser/web-ai/action-memory.js.map +1 -0
- package/dist/src/browser/web-ai/action-trace.js +11 -6
- package/dist/src/browser/web-ai/action-trace.js.map +1 -1
- package/dist/src/browser/web-ai/annotated-screenshot.js +2 -1
- package/dist/src/browser/web-ai/annotated-screenshot.js.map +1 -1
- package/dist/src/browser/web-ai/answer-artifact.js +97 -0
- package/dist/src/browser/web-ai/answer-artifact.js.map +1 -0
- package/dist/src/browser/web-ai/ax-snapshot.js +3 -2
- package/dist/src/browser/web-ai/ax-snapshot.js.map +1 -1
- package/dist/src/browser/web-ai/browser-primitives.js +10 -7
- package/dist/src/browser/web-ai/browser-primitives.js.map +1 -1
- package/dist/src/browser/web-ai/capability-registry.js +1 -1
- package/dist/src/browser/web-ai/capability-registry.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-composer.js +12 -12
- package/dist/src/browser/web-ai/chatgpt-composer.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-model.js +469 -50
- package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-response.js +82 -10
- package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt.js +325 -49
- package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
- package/dist/src/browser/web-ai/churn-log.js +1 -1
- package/dist/src/browser/web-ai/churn-log.js.map +1 -1
- package/dist/src/browser/web-ai/cli-sessions.js +42 -26
- package/dist/src/browser/web-ai/cli-sessions.js.map +1 -1
- package/dist/src/browser/web-ai/context-pack/builder.js +1 -1
- package/dist/src/browser/web-ai/context-pack/builder.js.map +1 -1
- package/dist/src/browser/web-ai/context-pack/file-selector.js +2 -2
- package/dist/src/browser/web-ai/context-pack/file-selector.js.map +1 -1
- package/dist/src/browser/web-ai/context-pack/report.js +1 -1
- package/dist/src/browser/web-ai/context-pack/report.js.map +1 -1
- package/dist/src/browser/web-ai/copy-markdown.js +25 -5
- package/dist/src/browser/web-ai/copy-markdown.js.map +1 -1
- package/dist/src/browser/web-ai/diagnostics.js +17 -14
- package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
- package/dist/src/browser/web-ai/doctor.js +10 -6
- package/dist/src/browser/web-ai/doctor.js.map +1 -1
- package/dist/src/browser/web-ai/dom-hash.js.map +1 -1
- package/dist/src/browser/web-ai/errors.js +5 -22
- package/dist/src/browser/web-ai/errors.js.map +1 -1
- package/dist/src/browser/web-ai/gemini-live.js +7 -6
- package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
- package/dist/src/browser/web-ai/grok-live.js +9 -5
- package/dist/src/browser/web-ai/grok-live.js.map +1 -1
- package/dist/src/browser/web-ai/index.js +5 -0
- package/dist/src/browser/web-ai/index.js.map +1 -1
- package/dist/src/browser/web-ai/observation-bundle.js +90 -0
- package/dist/src/browser/web-ai/observation-bundle.js.map +1 -0
- package/dist/src/browser/web-ai/observe-actions.js +186 -0
- package/dist/src/browser/web-ai/observe-actions.js.map +1 -0
- package/dist/src/browser/web-ai/observe-targets.js +6 -1
- package/dist/src/browser/web-ai/observe-targets.js.map +1 -1
- package/dist/src/browser/web-ai/planner-contract.js +18 -0
- package/dist/src/browser/web-ai/planner-contract.js.map +1 -0
- package/dist/src/browser/web-ai/post-action-assert.js +8 -7
- package/dist/src/browser/web-ai/post-action-assert.js.map +1 -1
- package/dist/src/browser/web-ai/product-surfaces.js +2 -1
- package/dist/src/browser/web-ai/product-surfaces.js.map +1 -1
- package/dist/src/browser/web-ai/provider-adapter.js.map +1 -1
- package/dist/src/browser/web-ai/question.js +14 -7
- package/dist/src/browser/web-ai/question.js.map +1 -1
- package/dist/src/browser/web-ai/ref-registry.js.map +1 -1
- package/dist/src/browser/web-ai/self-heal.js +20 -14
- package/dist/src/browser/web-ai/self-heal.js.map +1 -1
- package/dist/src/browser/web-ai/session-store.js +61 -1
- package/dist/src/browser/web-ai/session-store.js.map +1 -1
- package/dist/src/browser/web-ai/session.js +43 -2
- package/dist/src/browser/web-ai/session.js.map +1 -1
- package/dist/src/browser/web-ai/source-audit.js +116 -0
- package/dist/src/browser/web-ai/source-audit.js.map +1 -0
- package/dist/src/browser/web-ai/tab-finalizer.js +18 -0
- package/dist/src/browser/web-ai/tab-finalizer.js.map +1 -0
- package/dist/src/browser/web-ai/tab-lease-store.js +390 -0
- package/dist/src/browser/web-ai/tab-lease-store.js.map +1 -0
- package/dist/src/browser/web-ai/tab-pool.js +44 -0
- package/dist/src/browser/web-ai/tab-pool.js.map +1 -0
- package/dist/src/browser/web-ai/target-resolver.js +31 -0
- package/dist/src/browser/web-ai/target-resolver.js.map +1 -0
- package/dist/src/browser/web-ai/trace-persistence.js +4 -2
- package/dist/src/browser/web-ai/trace-persistence.js.map +1 -1
- package/dist/src/browser/web-ai/vendor-editor-contract.js.map +1 -1
- package/dist/src/browser/web-ai/watcher.js +8 -7
- package/dist/src/browser/web-ai/watcher.js.map +1 -1
- package/dist/src/cli/acp-client.js +40 -26
- package/dist/src/cli/acp-client.js.map +1 -1
- package/dist/src/cli/command-context.js +3 -3
- package/dist/src/cli/command-context.js.map +1 -1
- package/dist/src/cli/commands.js +25 -16
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/compact.js.map +1 -1
- package/dist/src/cli/handlers-completions.js +6 -4
- package/dist/src/cli/handlers-completions.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +45 -38
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/handlers.js +44 -36
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/readiness.js +3 -1
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry.js +1 -1
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/cli/tui/overlay.js +4 -1
- package/dist/src/cli/tui/overlay.js.map +1 -1
- package/dist/src/cli/types.js +4 -0
- package/dist/src/cli/types.js.map +1 -0
- package/dist/src/command-contract/catalog.js +1 -1
- package/dist/src/command-contract/catalog.js.map +1 -1
- package/dist/src/command-contract/help-renderer.js +1 -1
- package/dist/src/command-contract/help-renderer.js.map +1 -1
- package/dist/src/core/browser-open-default.js +13 -0
- package/dist/src/core/browser-open-default.js.map +1 -0
- package/dist/src/core/browser-open.js +41 -0
- package/dist/src/core/browser-open.js.map +1 -0
- package/dist/src/core/bus.js +13 -2
- package/dist/src/core/bus.js.map +1 -1
- package/dist/src/core/compact.js +5 -4
- package/dist/src/core/compact.js.map +1 -1
- package/dist/src/core/config.js +51 -52
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +48 -6
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/employees.js +9 -8
- package/dist/src/core/employees.js.map +1 -1
- package/dist/src/core/instance.js +7 -6
- package/dist/src/core/instance.js.map +1 -1
- package/dist/src/core/logger.js +1 -1
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/main-session.js +7 -7
- package/dist/src/core/main-session.js.map +1 -1
- package/dist/src/core/path-expand.js +10 -0
- package/dist/src/core/path-expand.js.map +1 -0
- package/dist/src/core/runtime-path.js +1 -1
- package/dist/src/core/runtime-path.js.map +1 -1
- package/dist/src/core/runtime-settings.js +13 -13
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/settings-merge.js +14 -14
- package/dist/src/core/settings-merge.js.map +1 -1
- package/dist/src/core/strip-undefined.js +13 -0
- package/dist/src/core/strip-undefined.js.map +1 -0
- package/dist/src/core/tcc.js +1 -1
- package/dist/src/core/tcc.js.map +1 -1
- package/dist/src/discord/bot.js +19 -18
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/channel-types.js +14 -0
- package/dist/src/discord/channel-types.js.map +1 -0
- package/dist/src/discord/commands.js +7 -6
- package/dist/src/discord/commands.js.map +1 -1
- package/dist/src/discord/discord-file.js.map +1 -1
- package/dist/src/discord/forwarder.js +3 -3
- package/dist/src/discord/forwarder.js.map +1 -1
- package/dist/src/http/error-middleware.js +3 -3
- package/dist/src/http/error-middleware.js.map +1 -1
- package/dist/src/http/response.js +2 -2
- package/dist/src/http/response.js.map +1 -1
- package/dist/src/ide/diff.js +7 -7
- package/dist/src/ide/diff.js.map +1 -1
- package/dist/src/manager/board/routes.js +28 -27
- package/dist/src/manager/board/routes.js.map +1 -1
- package/dist/src/manager/dashboard-home.js +3 -5
- package/dist/src/manager/dashboard-home.js.map +1 -1
- package/dist/src/manager/dashboard-service.js +2 -2
- package/dist/src/manager/dashboard-service.js.map +1 -1
- package/dist/src/manager/health-history.js +10 -9
- package/dist/src/manager/health-history.js.map +1 -1
- package/dist/src/manager/launchd-service.js +2 -2
- package/dist/src/manager/launchd-service.js.map +1 -1
- package/dist/src/manager/lifecycle-helpers.js +7 -6
- package/dist/src/manager/lifecycle-helpers.js.map +1 -1
- package/dist/src/manager/lifecycle.js +7 -6
- package/dist/src/manager/lifecycle.js.map +1 -1
- package/dist/src/manager/logs.js +18 -18
- package/dist/src/manager/logs.js.map +1 -1
- package/dist/src/manager/metadata.js +10 -2
- package/dist/src/manager/metadata.js.map +1 -1
- package/dist/src/manager/notes/assets.js +216 -0
- package/dist/src/manager/notes/assets.js.map +1 -0
- package/dist/src/manager/notes/capabilities.js +56 -0
- package/dist/src/manager/notes/capabilities.js.map +1 -0
- package/dist/src/manager/notes/constants.js +11 -0
- package/dist/src/manager/notes/constants.js.map +1 -0
- package/dist/src/manager/notes/frontmatter.js +120 -0
- package/dist/src/manager/notes/frontmatter.js.map +1 -0
- package/dist/src/manager/notes/link-resolver.js +96 -0
- package/dist/src/manager/notes/link-resolver.js.map +1 -0
- package/dist/src/manager/notes/path-guards.js +4 -0
- package/dist/src/manager/notes/path-guards.js.map +1 -1
- package/dist/src/manager/notes/remote-assets.js +128 -0
- package/dist/src/manager/notes/remote-assets.js.map +1 -0
- package/dist/src/manager/notes/routes.js +63 -13
- package/dist/src/manager/notes/routes.js.map +1 -1
- package/dist/src/manager/notes/store.js +3 -2
- package/dist/src/manager/notes/store.js.map +1 -1
- package/dist/src/manager/notes/system-trash.js +3 -3
- package/dist/src/manager/notes/system-trash.js.map +1 -1
- package/dist/src/manager/notes/vault-index.js +220 -0
- package/dist/src/manager/notes/vault-index.js.map +1 -0
- package/dist/src/manager/notes/watcher.js +27 -0
- package/dist/src/manager/notes/watcher.js.map +1 -0
- package/dist/src/manager/notes/wiki-links.js +109 -0
- package/dist/src/manager/notes/wiki-links.js.map +1 -0
- package/dist/src/manager/process-verify.js +29 -0
- package/dist/src/manager/process-verify.js.map +1 -1
- package/dist/src/manager/profiles.js +3 -2
- package/dist/src/manager/profiles.js.map +1 -1
- package/dist/src/manager/registry.js +60 -58
- package/dist/src/manager/registry.js.map +1 -1
- package/dist/src/manager/routes/electron-metrics.js +22 -22
- package/dist/src/manager/routes/electron-metrics.js.map +1 -1
- package/dist/src/manager/scan.js +2 -2
- package/dist/src/manager/scan.js.map +1 -1
- package/dist/src/manager/schedule/routes.js +24 -23
- package/dist/src/manager/schedule/routes.js.map +1 -1
- package/dist/src/manager/server.js +28 -28
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/systemd-service.js +1 -1
- package/dist/src/manager/systemd-service.js.map +1 -1
- package/dist/src/memory/bootstrap.js +5 -4
- package/dist/src/memory/bootstrap.js.map +1 -1
- package/dist/src/memory/heartbeat-schedule.js +10 -10
- package/dist/src/memory/heartbeat-schedule.js.map +1 -1
- package/dist/src/memory/heartbeat.js +23 -22
- package/dist/src/memory/heartbeat.js.map +1 -1
- package/dist/src/memory/indexing.js.map +1 -1
- package/dist/src/memory/keyword-expand.js +1 -1
- package/dist/src/memory/keyword-expand.js.map +1 -1
- package/dist/src/memory/memory.js +2 -2
- package/dist/src/memory/memory.js.map +1 -1
- package/dist/src/memory/runtime.js +6 -5
- package/dist/src/memory/runtime.js.map +1 -1
- package/dist/src/memory/shared.js +2 -1
- package/dist/src/memory/shared.js.map +1 -1
- package/dist/src/memory/worklog.js +1 -1
- package/dist/src/memory/worklog.js.map +1 -1
- package/dist/src/messaging/runtime.js +13 -10
- package/dist/src/messaging/runtime.js.map +1 -1
- package/dist/src/messaging/send.js +16 -15
- package/dist/src/messaging/send.js.map +1 -1
- package/dist/src/orchestrator/collect.js +6 -6
- package/dist/src/orchestrator/collect.js.map +1 -1
- package/dist/src/orchestrator/distribute.js +112 -77
- package/dist/src/orchestrator/distribute.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +6 -5
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +42 -42
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/state-machine.js +3 -3
- package/dist/src/orchestrator/state-machine.js.map +1 -1
- package/dist/src/orchestrator/worker-registry.js +4 -3
- package/dist/src/orchestrator/worker-registry.js.map +1 -1
- package/dist/src/prompt/builder.js +24 -19
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +15 -10
- package/dist/src/prompt/templates/control-system.md +9 -7
- package/dist/src/prompt/templates/employee.md +5 -4
- package/dist/src/prompt/templates/vision-click.md +1 -1
- package/dist/src/routes/_http-error.js +15 -0
- package/dist/src/routes/_http-error.js.map +1 -0
- package/dist/src/routes/avatar.js +6 -5
- package/dist/src/routes/avatar.js.map +1 -1
- package/dist/src/routes/browser.js +132 -45
- package/dist/src/routes/browser.js.map +1 -1
- package/dist/src/routes/employees.js +28 -21
- package/dist/src/routes/employees.js.map +1 -1
- package/dist/src/routes/heartbeat.js +12 -9
- package/dist/src/routes/heartbeat.js.map +1 -1
- package/dist/src/routes/i18n.js +13 -7
- package/dist/src/routes/i18n.js.map +1 -1
- package/dist/src/routes/jaw-memory.js +15 -11
- package/dist/src/routes/jaw-memory.js.map +1 -1
- package/dist/src/routes/memory.js +25 -20
- package/dist/src/routes/memory.js.map +1 -1
- package/dist/src/routes/messaging.js +50 -29
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +38 -24
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/quota.js +81 -17
- package/dist/src/routes/quota.js.map +1 -1
- package/dist/src/routes/settings.js +28 -18
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/skills.js +22 -13
- package/dist/src/routes/skills.js.map +1 -1
- package/dist/src/routes/traces.js +77 -0
- package/dist/src/routes/traces.js.map +1 -0
- package/dist/src/security/path-guards.js +2 -1
- package/dist/src/security/path-guards.js.map +1 -1
- package/dist/src/shared/tool-log-sanitize.js +191 -0
- package/dist/src/shared/tool-log-sanitize.js.map +1 -0
- package/dist/src/telegram/bot.js +65 -55
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/telegram/forwarder.js +5 -9
- package/dist/src/telegram/forwarder.js.map +1 -1
- package/dist/src/telegram/telegram-file.js +28 -24
- package/dist/src/telegram/telegram-file.js.map +1 -1
- package/dist/src/telegram/voice.js +4 -3
- package/dist/src/telegram/voice.js.map +1 -1
- package/dist/src/trace/redact.js +50 -0
- package/dist/src/trace/redact.js.map +1 -0
- package/dist/src/trace/store.js +162 -0
- package/dist/src/trace/store.js.map +1 -0
- package/dist/src/trace/types.js +2 -0
- package/dist/src/trace/types.js.map +1 -0
- package/dist/src/types/cli-engine.js +34 -0
- package/dist/src/types/cli-engine.js.map +1 -0
- package/dist/src/types/cli-events.js +31 -0
- package/dist/src/types/cli-events.js.map +1 -0
- package/package.json +22 -2
- package/public/css/tool-ui.css +3 -1
- package/public/css/trace-drawer.css +48 -0
- package/public/dist/assets/{AdvancedExport-3WAYIabE.js → AdvancedExport-DJZ2VmBR.js} +1 -1
- package/public/dist/assets/Agent-CgpLT8IY.js +1 -0
- package/public/dist/assets/Browser-CrkiQoB8.js +1 -0
- package/public/dist/assets/{ChannelsDiscord-UzFPlWT4.js → ChannelsDiscord-CVUC22D4.js} +1 -1
- package/public/dist/assets/{ChannelsTelegram-DNWtPX0w.js → ChannelsTelegram-DEatIQNM.js} +1 -1
- package/public/dist/assets/{DashboardMeta-Y_6nVeJO.js → DashboardMeta-BKoxRc7i.js} +1 -1
- package/public/dist/assets/{Display-D8vGOl4s.js → Display-DnNGV9Km.js} +1 -1
- package/public/dist/assets/{Employees-YR_sIRK4.js → Employees-DZ2iJYKy.js} +1 -1
- package/public/dist/assets/{HealthBadge-CPePajyU.js → HealthBadge-Cq2c7G9s.js} +1 -1
- package/public/dist/assets/{Heartbeat-DTpAULQR.js → Heartbeat-BML6eTXZ.js} +1 -1
- package/public/dist/assets/{Mcp-DM-PgG6z.js → Mcp-BlEviQ3h.js} +1 -1
- package/public/dist/assets/{Memory-C_LvJnkn.js → Memory-BRyH80He.js} +1 -1
- package/public/dist/assets/MilkdownWysiwygEditor-Cm3uXfWf.js +52 -0
- package/public/dist/assets/ModelProvider-DxyR7EL9.js +1 -0
- package/public/dist/assets/Network-DDOOESh1.js +1 -0
- package/public/dist/assets/{Permissions-B1naJjjw.js → Permissions-Br0eSbKb.js} +1 -1
- package/public/dist/assets/{Permissions-BKffrMJD.js → Permissions-QHkzStqQ.js} +1 -1
- package/public/dist/assets/{Profile-DIqjSe2C.js → Profile-C79NKumk.js} +1 -1
- package/public/dist/assets/{Prompts-BMfbV6Y4.js → Prompts-BmiIDiXW.js} +1 -1
- package/public/dist/assets/{SpeechKeys-DjiQTzSL.js → SpeechKeys-B8304XJK.js} +1 -1
- package/public/dist/assets/app-Be58Cs3Y.js +32 -0
- package/public/dist/assets/{app-BzvwJJiv.css → app-CphocJzo.css} +1 -1
- package/public/dist/assets/{dist-DTvxN3ux.js → dist-BD0UXfgF2.js} +1 -1
- package/public/dist/assets/{dist-CASeq-Tl.js → dist-BNfXO3Yr.js} +1 -1
- package/public/dist/assets/{dist-BMPiaUzF.js → dist-BUnPYbK3.js} +1 -1
- package/public/dist/assets/{dist-CT_X3hVT.js → dist-BZosRD2u.js} +1 -1
- package/public/dist/assets/{dist-4J6YbNXv.js → dist-Bd9PlnQm.js} +1 -1
- package/public/dist/assets/{dist-BcZjyn5g.js → dist-BsT5UdNP.js} +1 -1
- package/public/dist/assets/{dist-BfBhOPR-.js → dist-CIuXW-sc.js} +1 -1
- package/public/dist/assets/{dist-BMiCig3A2.js → dist-CL4PTYWf.js} +1 -1
- package/public/dist/assets/{dist-VyP6-HLb.js → dist-Ch5VAlV9.js} +1 -1
- package/public/dist/assets/dist-ClqO40BE.js +1 -0
- package/public/dist/assets/{dist-c98Tp7bP.js → dist-Cp42cMcI.js} +1 -1
- package/public/dist/assets/{dist-CIlYL1qe.js → dist-CpUK8ypo.js} +1 -1
- package/public/dist/assets/dist-CxeLAw2Y.js +1 -0
- package/public/dist/assets/dist-D2SH8nxa.js +1 -0
- package/public/dist/assets/{dist-84fwQ7bO.js → dist-D6cUXP7K.js} +1 -1
- package/public/dist/assets/{dist-BOCcQAyF.js → dist-D7bCuS3f.js} +1 -1
- package/public/dist/assets/{dist-DMmpfLVP.js → dist-DFYRUAjN.js} +1 -1
- package/public/dist/assets/{dist-DdY6pTJr.js → dist-DZsFVYF4.js} +1 -1
- package/public/dist/assets/{dist-B0p3Eyme.js → dist-Db16ogVk.js} +1 -1
- package/public/dist/assets/{dist-DlnNtr6L.js → dist-DfodGES_.js} +1 -1
- package/public/dist/assets/{dist-DO9so2a2.js → dist-SU-YTAIg.js} +1 -1
- package/public/dist/assets/{dist-DUjXiMLP.js → dist-UYn7T-GH.js} +1 -1
- package/public/dist/assets/{dist-BW1409rz.js → dist-W51oDoeA.js} +1 -1
- package/public/dist/assets/{dist-BimBQZx1.js → dist-eU7TyC86.js} +1 -1
- package/public/dist/assets/dist-l9HH00ip.js +1 -0
- package/public/dist/assets/{dist-BrOPNxdH.js → dist-urPTQzXL.js} +1 -1
- package/public/dist/assets/{dist-AloEV3J52.js → dist-yHP6L0Ty.js} +1 -1
- package/public/dist/assets/{employees-Bbabvbyx.js → employees-CxdghzoD.js} +7 -7
- package/public/dist/assets/{error-normalize-DdvKGLt_.js → error-normalize-5n-zlEQ3.js} +1 -1
- package/public/dist/assets/insert-image-markdown-DIEa-zjk.js +22 -0
- package/public/dist/assets/{manager-DyB2ZUr9.css → manager-DEiyrWDP.css} +1 -1
- package/public/dist/assets/manager-UEXd1_9T.js +25 -0
- package/public/dist/assets/{memory-B_plvcuQ.js → memory-CsMNkYtv.js} +9 -9
- package/public/dist/assets/memory-DXad_DPO.js +1 -0
- package/public/dist/assets/{page-shell-DML_HneX.js → page-shell-D5tbivHH.js} +1 -1
- package/public/dist/assets/{render-DEhbfUAW.js → render-DGQX46ei.js} +2 -2
- package/public/dist/assets/{settings-D7F-_kYG.js → settings-BH213Yv3.js} +14 -14
- package/public/dist/assets/settings-DXT87G2U.js +1 -0
- package/public/dist/assets/settings-client-ajlwI-oK.js +1 -0
- package/public/dist/assets/skills-5o_1v0nz.js +1 -0
- package/public/dist/assets/{skills-DoGJOc0D.js → skills-CQtCtHPA.js} +6 -6
- package/public/dist/assets/slash-commands-D4-hrrmh.js +1 -0
- package/public/dist/assets/{slash-commands-khNFPOyF.js → slash-commands-Dzk1xHWS.js} +1 -1
- package/public/dist/assets/trace-drawer-SRKcfm2S.js +15 -0
- package/public/dist/assets/ui-CdRKN2S6.js +141 -0
- package/public/dist/assets/ui-n43jmg_f.js +1 -0
- package/public/dist/assets/{ws-B2aJ-nD2.js → ws-CTHQFzM1.js} +8 -8
- package/public/dist/index.html +2 -2
- package/public/dist/manager/index.html +2 -2
- package/public/index.html +1 -0
- package/public/js/constants.ts +5 -5
- package/public/js/diagram/iframe-renderer.ts +11 -11
- package/public/js/features/chat.ts +1 -1
- package/public/js/features/memory.ts +10 -10
- package/public/js/features/pending-queue.ts +2 -2
- package/public/js/features/process-block.ts +257 -29
- package/public/js/features/process-step-match.ts +18 -0
- package/public/js/features/settings-cli-status.ts +1 -1
- package/public/js/features/settings-stt.ts +37 -11
- package/public/js/features/settings-templates.ts +2 -2
- package/public/js/features/slash-commands.ts +1 -1
- package/public/js/features/tool-ui.ts +13 -7
- package/public/js/features/trace-drawer.ts +122 -0
- package/public/js/icons.ts +1 -1
- package/public/js/main.ts +28 -28
- package/public/js/provider-icons.ts +1 -1
- package/public/js/render.ts +29 -27
- package/public/js/sanitizer.ts +4 -0
- package/public/js/ui.ts +234 -68
- package/public/js/virtual-scroll.ts +19 -33
- package/public/js/ws.ts +22 -10
- package/public/manager/src/App.tsx +34 -6
- package/public/manager/src/api.ts +55 -1
- package/public/manager/src/components/ActivityTimeline.tsx +1 -1
- package/public/manager/src/components/InstanceDetailPanel.tsx +2 -2
- package/public/manager/src/components/InstanceGroups.tsx +5 -5
- package/public/manager/src/components/InstanceListContent.tsx +1 -1
- package/public/manager/src/dashboard-features.ts +1 -1
- package/public/manager/src/manager-notes.css +49 -2
- package/public/manager/src/notes/MarkdownEditor.tsx +7 -3
- package/public/manager/src/notes/NotesFileTree.tsx +45 -6
- package/public/manager/src/notes/NotesSidebar.tsx +24 -55
- package/public/manager/src/notes/NotesWorkspace.tsx +50 -3
- package/public/manager/src/notes/image-assets/clipboard-images.ts +100 -0
- package/public/manager/src/notes/image-assets/insert-image-markdown.ts +85 -0
- package/public/manager/src/notes/notes-api.ts +2 -0
- package/public/manager/src/notes/notes-types.ts +8 -1
- package/public/manager/src/notes/rendering/MarkdownRenderer.tsx +6 -0
- package/public/manager/src/notes/rendering/markdown-render-security.ts +19 -1
- package/public/manager/src/notes/rich-markdown/paste-policy.ts +6 -2
- package/public/manager/src/notes/rich-markdown/rich-markdown-extension.ts +5 -5
- package/public/manager/src/notes/rich-markdown/rich-widget.ts +8 -8
- package/public/manager/src/notes/useNotesExternalSync.ts +37 -0
- package/public/manager/src/notes/useNotesModel.ts +91 -0
- package/public/manager/src/notes/wysiwyg/MilkdownWysiwygEditor.tsx +157 -17
- package/public/manager/src/notes/wysiwyg/milkdown-block-keymap.ts +14 -2
- package/public/manager/src/notes/wysiwyg/milkdown-code-block-view.ts +20 -20
- package/public/manager/src/notes/wysiwyg/milkdown-heading-source-view.ts +8 -8
- package/public/manager/src/notes/wysiwyg/milkdown-math.ts +25 -25
- package/public/manager/src/settings/pages/Browser.tsx +38 -20
- package/public/manager/src/settings/pages/ModelProvider.tsx +11 -9
- package/public/manager/src/settings/pages/Network.tsx +10 -10
- package/public/manager/src/settings/pages/components/HealthBadge.tsx +12 -12
- package/public/manager/src/settings/pages/components/agent/runtime-employees-helpers.ts +12 -10
- package/public/manager/src/settings/pages/components/employees-helpers.ts +9 -9
- package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +13 -13
- package/public/manager/src/settings/pages/components/memory-helpers.ts +4 -4
- package/public/manager/src/settings/pages/mcp-helpers.ts +7 -7
- package/public/manager/src/settings/settings-client.ts +4 -3
- package/public/manager/src/sync/IframeBridge.tsx +29 -0
- package/public/manager/src/sync/VisibilityBridge.tsx +24 -0
- package/public/manager/src/sync/invalidation-bus.ts +30 -0
- package/public/manager/src/sync/useInvalidationSubscription.ts +19 -0
- package/public/manager/src/types.ts +101 -0
- package/scripts/check-strict-baseline.mjs +255 -0
- package/scripts/claim-audit.mjs +159 -0
- package/scripts/i18n-registry.ts +4 -4
- package/scripts/install-officecli.sh +2 -2
- package/scripts/install-wsl.sh +2 -1
- package/scripts/release-gates.mjs +347 -0
- package/scripts/release-preview.sh +3 -0
- package/scripts/release.sh +4 -0
- package/scripts/smoke/opencode-external-dir-smoke.ts +14 -5
- package/public/dist/assets/Agent-BYdzZwD0.js +0 -1
- package/public/dist/assets/Browser-CkGeczuN.js +0 -1
- package/public/dist/assets/MilkdownWysiwygEditor-B7k9bAey.js +0 -52
- package/public/dist/assets/ModelProvider-CX3Qhowu.js +0 -1
- package/public/dist/assets/Network-DfPLFAvw.js +0 -1
- package/public/dist/assets/app-DLYoRkU9.js +0 -32
- package/public/dist/assets/dist-8zNAQAIa.js +0 -1
- package/public/dist/assets/dist-BgeY6nvK.js +0 -1
- package/public/dist/assets/dist-BzDGGxHQ.js +0 -1
- package/public/dist/assets/dist-D3YKbVi-.js +0 -1
- package/public/dist/assets/manager-CUSgFbMO.js +0 -25
- package/public/dist/assets/markdown-render-security-DJfJPWO-.js +0 -22
- package/public/dist/assets/memory-DQ6dU0qs.js +0 -1
- package/public/dist/assets/settings-DxLPUbpj.js +0 -1
- package/public/dist/assets/settings-client-CGf3uPPf.js +0 -1
- package/public/dist/assets/skills-yMfNYJ8m.js +0 -1
- package/public/dist/assets/slash-commands-CZcwr1W6.js +0 -1
- package/public/dist/assets/ui-04YlOMgn.js +0 -136
- package/public/dist/assets/ui-D6hlMjRq.js +0 -1
- /package/public/dist/assets/{InlineWarn-CqgWEC41.js → InlineWarn-BooBRm7o.js} +0 -0
- /package/public/dist/assets/{agent-meta-puNn13DV.js → agent-meta-DHddpWHQ.js} +0 -0
- /package/public/dist/assets/{fields-DH9JS3mb.js → fields-BtncIZYA.js} +0 -0
- /package/public/dist/assets/{mermaid-loader-6XC0y10y.js → mermaid-loader-BEFIOoJn.js} +0 -0
- /package/public/dist/assets/{path-utils-CtsDDGZg.js → path-utils-BuEEtj9w.js} +0 -0
- /package/public/dist/assets/{w3c-keyname-VSld09PZ.js → w3c-keyname-IiiZScED.js} +0 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { api } from '../api.js';
|
|
2
|
+
import { escapeHtml } from '../render.js';
|
|
3
|
+
|
|
4
|
+
interface TraceSummary {
|
|
5
|
+
id: string; cli: string; model: string; agentLabel: string; status: string;
|
|
6
|
+
rawRetentionStatus: string; eventCount: number; byteCount: number; startedAt: number;
|
|
7
|
+
}
|
|
8
|
+
interface TraceEventListItem {
|
|
9
|
+
seq: number; source: string; event_type?: string; eventType?: string; preview?: string;
|
|
10
|
+
bytes?: number; retention_status?: string; retentionStatus?: string; created_at?: number; createdAt?: number;
|
|
11
|
+
}
|
|
12
|
+
interface TraceEventDetail extends TraceEventListItem { runId: string; raw: string; }
|
|
13
|
+
interface TraceEventsPage { total: number; events: TraceEventListItem[]; }
|
|
14
|
+
|
|
15
|
+
const PAGE_SIZE = 80;
|
|
16
|
+
let currentRunId = '';
|
|
17
|
+
let loadedCount = 0;
|
|
18
|
+
let totalCount = 0;
|
|
19
|
+
let loading = false;
|
|
20
|
+
|
|
21
|
+
function eventTypeOf(event: TraceEventListItem): string { return event.eventType || event.event_type || 'event'; }
|
|
22
|
+
|
|
23
|
+
function ensureDrawer(): HTMLElement {
|
|
24
|
+
let overlay = document.getElementById('traceDrawerOverlay') as HTMLElement | null;
|
|
25
|
+
if (overlay) return overlay;
|
|
26
|
+
overlay = document.createElement('div');
|
|
27
|
+
overlay.id = 'traceDrawerOverlay';
|
|
28
|
+
overlay.className = 'trace-drawer-overlay';
|
|
29
|
+
overlay.innerHTML = `<aside class="trace-drawer" role="dialog" aria-modal="true" aria-labelledby="traceDrawerTitle">
|
|
30
|
+
<header class="trace-drawer-header">
|
|
31
|
+
<div><p class="trace-drawer-kicker">Raw trace</p><h2 id="traceDrawerTitle">Trace</h2></div>
|
|
32
|
+
<button class="trace-drawer-close" type="button" aria-label="Close trace drawer">×</button>
|
|
33
|
+
</header>
|
|
34
|
+
<section class="trace-drawer-meta" id="traceDrawerMeta"></section>
|
|
35
|
+
<section class="trace-drawer-body">
|
|
36
|
+
<div class="trace-event-list" id="traceEventList"></div>
|
|
37
|
+
<pre class="trace-event-raw" id="traceEventRaw">Select an event.</pre>
|
|
38
|
+
</section>
|
|
39
|
+
<footer class="trace-drawer-footer"><button class="trace-load-more" type="button">Load more</button></footer>
|
|
40
|
+
</aside>`;
|
|
41
|
+
document.body.appendChild(overlay);
|
|
42
|
+
overlay.addEventListener('click', event => {
|
|
43
|
+
const target = event.target as HTMLElement | null;
|
|
44
|
+
if (!target) return;
|
|
45
|
+
if (target === overlay || target.closest('.trace-drawer-close')) closeTraceDrawer();
|
|
46
|
+
const row = target.closest('.trace-event-row') as HTMLElement | null;
|
|
47
|
+
if (row) void loadEventDetail(row.dataset['runId'] || '', Number(row.dataset['seq'] || 0));
|
|
48
|
+
if (target.closest('.trace-load-more')) void loadNextPage();
|
|
49
|
+
});
|
|
50
|
+
document.addEventListener('keydown', event => {
|
|
51
|
+
if (event.key === 'Escape' && overlay?.classList.contains('open')) closeTraceDrawer();
|
|
52
|
+
});
|
|
53
|
+
return overlay;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function setRaw(text: string): void {
|
|
57
|
+
const raw = document.getElementById('traceEventRaw');
|
|
58
|
+
if (raw) raw.textContent = text;
|
|
59
|
+
}
|
|
60
|
+
function closeTraceDrawer(): void { document.getElementById('traceDrawerOverlay')?.classList.remove('open'); }
|
|
61
|
+
|
|
62
|
+
function renderSummary(summary: TraceSummary): void {
|
|
63
|
+
const title = document.getElementById('traceDrawerTitle');
|
|
64
|
+
if (title) title.textContent = `${summary.cli || 'agent'} trace`;
|
|
65
|
+
const meta = document.getElementById('traceDrawerMeta');
|
|
66
|
+
if (!meta) return;
|
|
67
|
+
meta.innerHTML = [
|
|
68
|
+
['run', summary.id], ['model', summary.model || '-'], ['agent', summary.agentLabel || '-'],
|
|
69
|
+
['status', summary.status], ['events', `${summary.eventCount}`], ['bytes', `${summary.byteCount}`],
|
|
70
|
+
['retention', summary.rawRetentionStatus],
|
|
71
|
+
].map(([label, value]) => `<span><b>${escapeHtml(label)}</b>${escapeHtml(value)}</span>`).join('');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function renderEventRows(events: TraceEventListItem[]): void {
|
|
75
|
+
const list = document.getElementById('traceEventList');
|
|
76
|
+
if (!list) return;
|
|
77
|
+
const html = events.map(event => {
|
|
78
|
+
const seq = Number(event.seq || 0);
|
|
79
|
+
return `<button class="trace-event-row" type="button" data-run-id="${escapeHtml(currentRunId)}" data-seq="${seq}">
|
|
80
|
+
<span class="trace-event-seq">#${seq}</span><span class="trace-event-source">${escapeHtml(event.source || 'trace')}</span>
|
|
81
|
+
<span class="trace-event-type">${escapeHtml(eventTypeOf(event))}</span><span class="trace-event-preview">${escapeHtml(event.preview || '')}</span>
|
|
82
|
+
</button>`;
|
|
83
|
+
}).join('');
|
|
84
|
+
list.insertAdjacentHTML('beforeend', html);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function loadNextPage(): Promise<void> {
|
|
88
|
+
if (!currentRunId || loading || (loadedCount >= totalCount && totalCount > 0)) return;
|
|
89
|
+
loading = true;
|
|
90
|
+
const page = await api<TraceEventsPage>(`/api/traces/${encodeURIComponent(currentRunId)}/events?offset=${loadedCount}&limit=${PAGE_SIZE}`);
|
|
91
|
+
loading = false;
|
|
92
|
+
if (!page) { setRaw('Trace events could not be loaded.'); return; }
|
|
93
|
+
totalCount = page.total || 0;
|
|
94
|
+
loadedCount += page.events.length;
|
|
95
|
+
renderEventRows(page.events);
|
|
96
|
+
const more = document.querySelector('.trace-load-more') as HTMLButtonElement | null;
|
|
97
|
+
if (more) more.disabled = loadedCount >= totalCount;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async function loadEventDetail(runId: string, seq: number): Promise<void> {
|
|
101
|
+
if (!runId || !Number.isInteger(seq) || seq < 1) return;
|
|
102
|
+
setRaw('Loading event...');
|
|
103
|
+
const detail = await api<TraceEventDetail>(`/api/traces/${encodeURIComponent(runId)}/events/${seq}`);
|
|
104
|
+
setRaw(detail?.raw || (detail ? '(empty trace event)' : 'Trace event could not be loaded.'));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export async function openTraceDrawer(runId: string, seq?: number): Promise<void> {
|
|
108
|
+
const overlay = ensureDrawer();
|
|
109
|
+
currentRunId = runId;
|
|
110
|
+
loadedCount = 0;
|
|
111
|
+
totalCount = 0;
|
|
112
|
+
const list = document.getElementById('traceEventList');
|
|
113
|
+
if (list) list.innerHTML = '';
|
|
114
|
+
setRaw('Loading trace...');
|
|
115
|
+
overlay.classList.add('open');
|
|
116
|
+
const summary = await api<TraceSummary>(`/api/traces/${encodeURIComponent(runId)}`);
|
|
117
|
+
if (!summary) { setRaw('Trace is unavailable or internal-only.'); return; }
|
|
118
|
+
renderSummary(summary);
|
|
119
|
+
totalCount = summary.eventCount || 0;
|
|
120
|
+
await loadNextPage();
|
|
121
|
+
if (seq) await loadEventDetail(runId, seq);
|
|
122
|
+
}
|
package/public/js/icons.ts
CHANGED
|
@@ -269,7 +269,7 @@ export function emojiToStatus(emoji: string): 'done' | 'error' | null {
|
|
|
269
269
|
export function hydrateIcons(root: Element = document.body): void {
|
|
270
270
|
const els = root.querySelectorAll<HTMLElement>('[data-icon]');
|
|
271
271
|
for (const el of els) {
|
|
272
|
-
const name = el.dataset
|
|
272
|
+
const name = el.dataset['icon'] as IconName;
|
|
273
273
|
if (name && ICONS[name]) {
|
|
274
274
|
el.innerHTML = ICONS[name];
|
|
275
275
|
el.classList.add('icon-hydrated');
|
package/public/js/main.ts
CHANGED
|
@@ -112,7 +112,7 @@ initPendingQueue();
|
|
|
112
112
|
document.getElementById('filePreviewClear')?.addEventListener('click', clearAttachedFiles);
|
|
113
113
|
document.getElementById('filePreviewList')?.addEventListener('click', (e) => {
|
|
114
114
|
const btn = (e.target as HTMLElement)?.closest('[data-file-idx]') as HTMLElement | null;
|
|
115
|
-
if (btn) removeAttachedFile(+(btn.dataset
|
|
115
|
+
if (btn) removeAttachedFile(+(btn.dataset['fileIdx'] || '0'));
|
|
116
116
|
});
|
|
117
117
|
document.querySelector('.btn-attach')?.addEventListener('click', () => {
|
|
118
118
|
(document.getElementById('fileInput') as HTMLInputElement | null)?.click();
|
|
@@ -158,14 +158,14 @@ document.querySelector('[data-action="addEmployee"]')?.addEventListener('click',
|
|
|
158
158
|
// ── Employees (Event Delegation) ──
|
|
159
159
|
document.getElementById('employeesList')?.addEventListener('click', (e) => {
|
|
160
160
|
const del = (e.target as HTMLElement)?.closest('[data-emp-delete]') as HTMLElement | null;
|
|
161
|
-
if (del) { deleteEmployee(del.dataset
|
|
161
|
+
if (del) { deleteEmployee(del.dataset['empDelete'] || ''); return; }
|
|
162
162
|
});
|
|
163
163
|
document.getElementById('employeesList')?.addEventListener('change', (e) => {
|
|
164
164
|
const tgt = e.target as HTMLSelectElement;
|
|
165
165
|
const name = tgt.closest('[data-emp-name]') as HTMLElement | null;
|
|
166
|
-
if (name) { updateEmployee(name.dataset
|
|
166
|
+
if (name) { updateEmployee(name.dataset['empName'] || '', { name: tgt.value }); return; }
|
|
167
167
|
const cli = tgt.closest('[data-emp-cli]') as HTMLElement | null;
|
|
168
|
-
if (cli) { onEmpCliChange(cli.dataset
|
|
168
|
+
if (cli) { onEmpCliChange(cli.dataset['empCli'] || '', tgt.value); return; }
|
|
169
169
|
const model = tgt.closest('[data-emp-model]') as HTMLElement | null;
|
|
170
170
|
if (model) {
|
|
171
171
|
if (tgt.value === '__custom__') {
|
|
@@ -176,29 +176,29 @@ document.getElementById('employeesList')?.addEventListener('change', (e) => {
|
|
|
176
176
|
const customOpt = tgt.querySelector('option[value="__custom__"]');
|
|
177
177
|
if (customOpt) tgt.insertBefore(opt, customOpt);
|
|
178
178
|
tgt.value = val.trim();
|
|
179
|
-
updateEmployee(model.dataset
|
|
179
|
+
updateEmployee(model.dataset['empModel'] || '', { model: val.trim() });
|
|
180
180
|
} else { tgt.value = 'default'; }
|
|
181
|
-
} else { updateEmployee(model.dataset
|
|
181
|
+
} else { updateEmployee(model.dataset['empModel'] || '', { model: tgt.value }); }
|
|
182
182
|
return;
|
|
183
183
|
}
|
|
184
184
|
const role = tgt.closest('[data-emp-role]') as HTMLElement | null;
|
|
185
|
-
if (role) { onEmpRoleChange(role.dataset
|
|
185
|
+
if (role) { onEmpRoleChange(role.dataset['empRole'] || '', tgt.value); return; }
|
|
186
186
|
const custom = tgt.closest('[data-emp-custom]') as HTMLElement | null;
|
|
187
|
-
if (custom) { updateEmployee(custom.dataset
|
|
187
|
+
if (custom) { updateEmployee(custom.dataset['empCustom'] || '', { role: tgt.value }); return; }
|
|
188
188
|
});
|
|
189
189
|
|
|
190
190
|
// ── Skills Tab (Event Delegation) ──
|
|
191
191
|
document.getElementById('skillsList')?.addEventListener('click', (e) => {
|
|
192
192
|
const toggle = (e.target as HTMLElement)?.closest('[data-skill-id]') as HTMLElement | null;
|
|
193
193
|
if (toggle) {
|
|
194
|
-
toggleSkill(toggle.dataset
|
|
194
|
+
toggleSkill(toggle.dataset['skillId'] || '', toggle.dataset['skillEnabled'] === 'true');
|
|
195
195
|
}
|
|
196
196
|
});
|
|
197
197
|
// Skill filter buttons (event delegation)
|
|
198
198
|
document.querySelector('#tabSkills')?.addEventListener('click', (e) => {
|
|
199
199
|
const filterBtn = (e.target as HTMLElement)?.closest('.skill-filter') as HTMLElement | null;
|
|
200
200
|
if (filterBtn) {
|
|
201
|
-
const cat = filterBtn.dataset
|
|
201
|
+
const cat = filterBtn.dataset['filter'] || 'all';
|
|
202
202
|
filterSkills(cat, filterBtn);
|
|
203
203
|
}
|
|
204
204
|
});
|
|
@@ -344,32 +344,32 @@ document.querySelector('[data-action="addHeartbeat"]')?.addEventListener('click'
|
|
|
344
344
|
// Heartbeat jobs (event delegation)
|
|
345
345
|
document.getElementById('hbJobsList')?.addEventListener('click', (e) => {
|
|
346
346
|
const toggle = (e.target as HTMLElement)?.closest('[data-hb-toggle]') as HTMLElement | null;
|
|
347
|
-
if (toggle) { toggleHeartbeatJob(+(toggle.dataset
|
|
347
|
+
if (toggle) { toggleHeartbeatJob(+(toggle.dataset['hbToggle'] || '0')); return; }
|
|
348
348
|
const remove = (e.target as HTMLElement)?.closest('[data-hb-remove]') as HTMLElement | null;
|
|
349
|
-
if (remove) { removeHeartbeatJob(+(remove.dataset
|
|
349
|
+
if (remove) { removeHeartbeatJob(+(remove.dataset['hbRemove'] || '0')); return; }
|
|
350
350
|
});
|
|
351
351
|
document.getElementById('hbJobsList')?.addEventListener('change', (e) => {
|
|
352
352
|
const tgt = e.target as HTMLInputElement | HTMLSelectElement;
|
|
353
353
|
const name = tgt.closest('[data-hb-name]') as HTMLElement | null;
|
|
354
|
-
if (name) { state.heartbeatJobs[+(name.dataset
|
|
354
|
+
if (name) { state.heartbeatJobs[+(name.dataset['hbName'] || '0')].name = tgt.value; saveHeartbeatJobs(); return; }
|
|
355
355
|
const kind = tgt.closest('[data-hb-kind]') as HTMLElement | null;
|
|
356
356
|
if (kind) {
|
|
357
|
-
const i = +(kind.dataset
|
|
357
|
+
const i = +(kind.dataset['hbKind'] || '0');
|
|
358
358
|
const current = state.heartbeatJobs[i]?.schedule as Record<string, unknown> | undefined;
|
|
359
|
-
const timeZone = typeof current?.timeZone === 'string' ? current
|
|
359
|
+
const timeZone = typeof current?.['timeZone'] === 'string' ? current['timeZone'] : undefined;
|
|
360
360
|
state.heartbeatJobs[i].schedule = tgt.value === 'cron'
|
|
361
|
-
? { kind: 'cron', cron: typeof current?.cron === 'string' && current
|
|
362
|
-
: { kind: 'every', minutes: typeof current?.minutes === 'number' && current
|
|
361
|
+
? { kind: 'cron', cron: typeof current?.['cron'] === 'string' && current['cron'].trim() ? current['cron'] : '0 9 * * *', ...(timeZone ? { timeZone } : {}) }
|
|
362
|
+
: { kind: 'every', minutes: typeof current?.['minutes'] === 'number' && current['minutes'] > 0 ? Math.floor(current['minutes']) : 5, ...(timeZone ? { timeZone } : {}) };
|
|
363
363
|
renderHeartbeatJobs();
|
|
364
364
|
saveHeartbeatJobs();
|
|
365
365
|
return;
|
|
366
366
|
}
|
|
367
367
|
const min = tgt.closest('[data-hb-minutes]') as HTMLElement | null;
|
|
368
368
|
if (min) {
|
|
369
|
-
const i = +(min.dataset
|
|
369
|
+
const i = +(min.dataset['hbMinutes'] || '0');
|
|
370
370
|
const current = state.heartbeatJobs[i]?.schedule as Record<string, unknown> | undefined;
|
|
371
371
|
const minutes = Math.max(1, Math.floor(Number(tgt.value) || 5));
|
|
372
|
-
const timeZone = typeof current?.timeZone === 'string' ? current
|
|
372
|
+
const timeZone = typeof current?.['timeZone'] === 'string' ? current['timeZone'] : undefined;
|
|
373
373
|
state.heartbeatJobs[i].schedule = { kind: 'every', minutes, ...(timeZone ? { timeZone } : {}) };
|
|
374
374
|
renderHeartbeatJobs();
|
|
375
375
|
saveHeartbeatJobs();
|
|
@@ -377,9 +377,9 @@ document.getElementById('hbJobsList')?.addEventListener('change', (e) => {
|
|
|
377
377
|
}
|
|
378
378
|
const cron = tgt.closest('[data-hb-cron]') as HTMLElement | null;
|
|
379
379
|
if (cron) {
|
|
380
|
-
const i = +(cron.dataset
|
|
380
|
+
const i = +(cron.dataset['hbCron'] || '0');
|
|
381
381
|
const current = state.heartbeatJobs[i]?.schedule as Record<string, unknown> | undefined;
|
|
382
|
-
const timeZone = typeof current?.timeZone === 'string' ? current
|
|
382
|
+
const timeZone = typeof current?.['timeZone'] === 'string' ? current['timeZone'] : undefined;
|
|
383
383
|
const cronExpr = tgt.value.trim().replace(/\s+/g, ' ');
|
|
384
384
|
state.heartbeatJobs[i].schedule = { kind: 'cron', cron: cronExpr, ...(timeZone ? { timeZone } : {}) };
|
|
385
385
|
renderHeartbeatJobs();
|
|
@@ -388,18 +388,18 @@ document.getElementById('hbJobsList')?.addEventListener('change', (e) => {
|
|
|
388
388
|
}
|
|
389
389
|
const timeZone = tgt.closest('[data-hb-timezone]') as HTMLElement | null;
|
|
390
390
|
if (timeZone) {
|
|
391
|
-
const i = +(timeZone.dataset
|
|
391
|
+
const i = +(timeZone.dataset['hbTimezone'] || '0');
|
|
392
392
|
const current = state.heartbeatJobs[i]?.schedule as Record<string, unknown> | undefined;
|
|
393
|
-
if (current?.kind === 'cron') {
|
|
393
|
+
if (current?.['kind'] === 'cron') {
|
|
394
394
|
state.heartbeatJobs[i].schedule = {
|
|
395
395
|
kind: 'cron',
|
|
396
|
-
cron: typeof current
|
|
396
|
+
cron: typeof current['cron'] === 'string' && current['cron'].trim() ? current['cron'] : '0 9 * * *',
|
|
397
397
|
...(tgt.value.trim() ? { timeZone: tgt.value.trim() } : {}),
|
|
398
398
|
};
|
|
399
399
|
} else {
|
|
400
400
|
state.heartbeatJobs[i].schedule = {
|
|
401
401
|
kind: 'every',
|
|
402
|
-
minutes: typeof current?.minutes === 'number' && current
|
|
402
|
+
minutes: typeof current?.['minutes'] === 'number' && current['minutes'] > 0 ? Math.floor(current['minutes']) : 5,
|
|
403
403
|
...(tgt.value.trim() ? { timeZone: tgt.value.trim() } : {}),
|
|
404
404
|
};
|
|
405
405
|
}
|
|
@@ -408,7 +408,7 @@ document.getElementById('hbJobsList')?.addEventListener('change', (e) => {
|
|
|
408
408
|
return;
|
|
409
409
|
}
|
|
410
410
|
const prompt = tgt.closest('[data-hb-prompt]') as HTMLElement | null;
|
|
411
|
-
if (prompt) { state.heartbeatJobs[+(prompt.dataset
|
|
411
|
+
if (prompt) { state.heartbeatJobs[+(prompt.dataset['hbPrompt'] || '0')].prompt = tgt.value; saveHeartbeatJobs(); return; }
|
|
412
412
|
});
|
|
413
413
|
|
|
414
414
|
// ── Memory Modal ──
|
|
@@ -437,9 +437,9 @@ bindAdvancedProviderUi();
|
|
|
437
437
|
// Memory files (event delegation)
|
|
438
438
|
document.getElementById('basicMemoryFiles')?.addEventListener('click', (e) => {
|
|
439
439
|
const del = (e.target as HTMLElement)?.closest('[data-mem-delete]') as HTMLElement | null;
|
|
440
|
-
if (del) { e.stopPropagation(); deleteMemFile(del.dataset
|
|
440
|
+
if (del) { e.stopPropagation(); deleteMemFile(del.dataset['memDelete'] || ''); return; }
|
|
441
441
|
const view = (e.target as HTMLElement)?.closest('[data-mem-view]') as HTMLElement | null;
|
|
442
|
-
if (view) { viewMemFile(view.dataset
|
|
442
|
+
if (view) { viewMemFile(view.dataset['memView'] || ''); return; }
|
|
443
443
|
const back = (e.target as HTMLElement)?.closest('[data-mem-back]');
|
|
444
444
|
if (back) { openMemoryModal(); return; }
|
|
445
445
|
});
|
|
@@ -62,7 +62,7 @@ export function providerIcon(slug: string, variant: 'color' | 'mono' = 'color'):
|
|
|
62
62
|
export function hydrateProviderIcons(root: Element = document.body): void {
|
|
63
63
|
const els = root.querySelectorAll<HTMLElement>('[data-provider]');
|
|
64
64
|
for (const el of els) {
|
|
65
|
-
const slug = el.dataset
|
|
65
|
+
const slug = el.dataset['provider'] || '';
|
|
66
66
|
const svg = providerIcon(slug);
|
|
67
67
|
if (svg) {
|
|
68
68
|
el.innerHTML = svg;
|
package/public/js/render.ts
CHANGED
|
@@ -32,7 +32,9 @@ import {
|
|
|
32
32
|
extractTopLevelSvg,
|
|
33
33
|
} from './diagram/types.js';
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
function purifier() {
|
|
36
|
+
return getDOMPurify();
|
|
37
|
+
}
|
|
36
38
|
|
|
37
39
|
// Register hljs languages (core-only import: ~25KB vs ~1MB full)
|
|
38
40
|
hljs.registerLanguage('javascript', javascript);
|
|
@@ -134,7 +136,7 @@ function applyMermaidTheme() {
|
|
|
134
136
|
// Mermaid is configured with htmlLabels:false so labels use SVG <text>,
|
|
135
137
|
// not <foreignObject> + HTML. This avoids DOMPurify namespace issues.
|
|
136
138
|
function sanitizeMermaidSvg(svg: string): string {
|
|
137
|
-
const clean =
|
|
139
|
+
const clean = purifier().sanitize(svg, {
|
|
138
140
|
USE_PROFILES: { svg: true, svgFilters: true },
|
|
139
141
|
FORBID_TAGS: [
|
|
140
142
|
'script', 'iframe', 'object', 'embed', 'form', 'input',
|
|
@@ -163,7 +165,7 @@ export function escapeHtml(str: string): string {
|
|
|
163
165
|
|
|
164
166
|
// ── XSS sanitization (hardened for inline SVG — Phase 1) ──
|
|
165
167
|
export function sanitizeHtml(html: string): string {
|
|
166
|
-
return
|
|
168
|
+
return purifier().sanitize(html, {
|
|
167
169
|
USE_PROFILES: { html: true, svg: true, svgFilters: true },
|
|
168
170
|
FORBID_TAGS: [
|
|
169
171
|
'script', 'style', 'iframe', 'object', 'embed', 'form', 'input',
|
|
@@ -284,7 +286,7 @@ export async function rerenderMermaidDiagrams(): Promise<void> {
|
|
|
284
286
|
const mm = await ensureMermaidLoaded();
|
|
285
287
|
for (const el of rendered) {
|
|
286
288
|
const htmlEl = el as HTMLElement;
|
|
287
|
-
const code = htmlEl.dataset
|
|
289
|
+
const code = htmlEl.dataset['mermaidCode'];
|
|
288
290
|
if (!code || !htmlEl.isConnected) continue;
|
|
289
291
|
const id = `mermaid-${++mermaidId}`;
|
|
290
292
|
try {
|
|
@@ -361,17 +363,17 @@ function renderMermaidError(el: HTMLElement, code: string, errMsg: string): void
|
|
|
361
363
|
|
|
362
364
|
async function renderSingleMermaidImpl(el: HTMLElement): Promise<void> {
|
|
363
365
|
if (!el.isConnected) {
|
|
364
|
-
delete el.dataset
|
|
365
|
-
delete el.dataset
|
|
366
|
+
delete el.dataset['mermaidQueued'];
|
|
367
|
+
delete el.dataset['mermaidInflight'];
|
|
366
368
|
return;
|
|
367
369
|
}
|
|
368
370
|
el.classList.remove('mermaid-pending');
|
|
369
371
|
// Phase 127-F1: raw source lives in data attribute (skeleton DOM has no source text).
|
|
370
|
-
const encoded = el.dataset
|
|
372
|
+
const encoded = el.dataset['mermaidCodeRaw'] || '';
|
|
371
373
|
const code = encoded ? decodeURIComponent(encoded) : (el.textContent || '');
|
|
372
|
-
el.dataset
|
|
374
|
+
el.dataset['mermaidCode'] = code;
|
|
373
375
|
const id = `mermaid-${++mermaidId}`;
|
|
374
|
-
el.dataset
|
|
376
|
+
el.dataset['mermaidInflight'] = '1';
|
|
375
377
|
try {
|
|
376
378
|
const mm = await ensureMermaidLoaded();
|
|
377
379
|
// Apply theme immediately before render — no intermediate parse()
|
|
@@ -383,7 +385,7 @@ async function renderSingleMermaidImpl(el: HTMLElement): Promise<void> {
|
|
|
383
385
|
}
|
|
384
386
|
el.innerHTML = sanitizeMermaidSvg(svg);
|
|
385
387
|
el.classList.add('mermaid-rendered');
|
|
386
|
-
delete el.dataset
|
|
388
|
+
delete el.dataset['mermaidCodeRaw'];
|
|
387
389
|
appendMermaidActionBtns(el);
|
|
388
390
|
bindDiagramZoom(el);
|
|
389
391
|
} catch (err: unknown) {
|
|
@@ -391,8 +393,8 @@ async function renderSingleMermaidImpl(el: HTMLElement): Promise<void> {
|
|
|
391
393
|
|| (err as { str?: string })?.str || 'Unknown error';
|
|
392
394
|
renderMermaidError(el, code, errMsg);
|
|
393
395
|
} finally {
|
|
394
|
-
delete el.dataset
|
|
395
|
-
delete el.dataset
|
|
396
|
+
delete el.dataset['mermaidQueued'];
|
|
397
|
+
delete el.dataset['mermaidInflight'];
|
|
396
398
|
}
|
|
397
399
|
}
|
|
398
400
|
|
|
@@ -402,8 +404,8 @@ function renderSingleMermaid(el: HTMLElement): void {
|
|
|
402
404
|
// Phase 127-N2: synchronous queued guard prevents duplicate enqueueing when
|
|
403
405
|
// renderMermaidBlocks immediate mode fires repeatedly (e.g. VS onPostRender
|
|
404
406
|
// on every scroll). Class/dataset is set right away so the next pass skips.
|
|
405
|
-
if (el.dataset
|
|
406
|
-
el.dataset
|
|
407
|
+
if (el.dataset['mermaidQueued'] === '1') return;
|
|
408
|
+
el.dataset['mermaidQueued'] = '1';
|
|
407
409
|
// Phase 127-F6: .catch tail keeps the queue alive after any rejection so
|
|
408
410
|
// one bad render cannot permanently block subsequent diagrams.
|
|
409
411
|
mermaidQueue = mermaidQueue
|
|
@@ -430,7 +432,7 @@ export async function renderMermaidBlocks(
|
|
|
430
432
|
if (!pending.length) return;
|
|
431
433
|
ensureMermaidObserver();
|
|
432
434
|
for (const el of pending) {
|
|
433
|
-
if (el.dataset
|
|
435
|
+
if (el.dataset['mermaidQueued'] === '1') continue; // N2 guard
|
|
434
436
|
if (opts.immediate) {
|
|
435
437
|
const rect = el.getBoundingClientRect();
|
|
436
438
|
const vh = window.innerHeight || document.documentElement.clientHeight;
|
|
@@ -457,11 +459,11 @@ export function releaseMermaidNodes(scope: HTMLElement): void {
|
|
|
457
459
|
scope.querySelectorAll<HTMLElement>(selector).forEach((el) => nodes.push(el));
|
|
458
460
|
for (const el of nodes) {
|
|
459
461
|
mermaidObserver.unobserve(el);
|
|
460
|
-
delete el.dataset
|
|
461
|
-
delete el.dataset
|
|
462
|
-
delete el.dataset
|
|
462
|
+
delete el.dataset['mermaidQueued'];
|
|
463
|
+
delete el.dataset['mermaidQueuedAt'];
|
|
464
|
+
delete el.dataset['mermaidInflight'];
|
|
463
465
|
if (!el.classList.contains('mermaid-rendered')
|
|
464
|
-
&& (el.dataset
|
|
466
|
+
&& (el.dataset['mermaidCodeRaw'] || el.dataset['mermaidCode'])) {
|
|
465
467
|
el.classList.add('mermaid-pending');
|
|
466
468
|
}
|
|
467
469
|
}
|
|
@@ -540,7 +542,7 @@ function ensureMarked(): boolean {
|
|
|
540
542
|
export function rehighlightAll(scope?: HTMLElement | Document): void {
|
|
541
543
|
const root = scope || document;
|
|
542
544
|
root.querySelectorAll('.code-block pre code, .code-block-wrapper pre code').forEach(el => {
|
|
543
|
-
if ((el as HTMLElement).dataset
|
|
545
|
+
if ((el as HTMLElement).dataset['highlighted'] === 'yes') return;
|
|
544
546
|
const lang = [...el.classList].find(c => c.startsWith('language-'))?.replace('language-', '');
|
|
545
547
|
const raw = el.textContent || '';
|
|
546
548
|
try {
|
|
@@ -549,7 +551,7 @@ export function rehighlightAll(scope?: HTMLElement | Document): void {
|
|
|
549
551
|
} else {
|
|
550
552
|
el.innerHTML = hljs.highlightAuto(raw).value;
|
|
551
553
|
}
|
|
552
|
-
(el as HTMLElement).dataset
|
|
554
|
+
(el as HTMLElement).dataset['highlighted'] = 'yes';
|
|
553
555
|
} catch { /* ignore */ }
|
|
554
556
|
});
|
|
555
557
|
}
|
|
@@ -763,8 +765,8 @@ function ensureDiagramActionDelegation(): void {
|
|
|
763
765
|
const container = diagCopyBtn.closest('.diagram-container') as HTMLElement | null;
|
|
764
766
|
if (!container) return;
|
|
765
767
|
let text = '';
|
|
766
|
-
if (container.dataset
|
|
767
|
-
try { text = decodeURIComponent(escape(atob(container.dataset
|
|
768
|
+
if (container.dataset['widgetHtml']) {
|
|
769
|
+
try { text = decodeURIComponent(escape(atob(container.dataset['widgetHtml']))); }
|
|
768
770
|
catch { return; }
|
|
769
771
|
} else {
|
|
770
772
|
const svgEl = container.querySelector('svg');
|
|
@@ -778,7 +780,7 @@ function ensureDiagramActionDelegation(): void {
|
|
|
778
780
|
if (mermaidCopyBtn) {
|
|
779
781
|
const container = mermaidCopyBtn.closest('.mermaid-container') as HTMLElement | null;
|
|
780
782
|
if (!container) return;
|
|
781
|
-
const code = container.dataset
|
|
783
|
+
const code = container.dataset['mermaidCode'] || '';
|
|
782
784
|
if (code) btnFeedback(mermaidCopyBtn, code, 'copy');
|
|
783
785
|
return;
|
|
784
786
|
}
|
|
@@ -789,7 +791,7 @@ function ensureDiagramActionDelegation(): void {
|
|
|
789
791
|
const container = diagSaveBtn.closest('.diagram-container') as HTMLElement | null;
|
|
790
792
|
if (!container) return;
|
|
791
793
|
// Widget: request screenshot via bridge
|
|
792
|
-
if (container.dataset
|
|
794
|
+
if (container.dataset['widgetHtml']) {
|
|
793
795
|
const iframe = container.querySelector('iframe') as HTMLIFrameElement | null;
|
|
794
796
|
if (iframe?.contentWindow) {
|
|
795
797
|
iframe.contentWindow.postMessage({ type: 'jaw-request-screenshot' }, '*');
|
|
@@ -929,8 +931,8 @@ function unshieldSvgBlocks(html: string, blocks: SvgBlock[]): string {
|
|
|
929
931
|
export function bindDiagramZoom(scope?: HTMLElement | Document): void {
|
|
930
932
|
const root = scope || document;
|
|
931
933
|
root.querySelectorAll('.diagram-zoom-btn, .mermaid-zoom-btn').forEach(btn => {
|
|
932
|
-
if ((btn as HTMLElement).dataset
|
|
933
|
-
(btn as HTMLElement).dataset
|
|
934
|
+
if ((btn as HTMLElement).dataset['bound']) return;
|
|
935
|
+
(btn as HTMLElement).dataset['bound'] = '1';
|
|
934
936
|
btn.addEventListener('click', () => {
|
|
935
937
|
if (btn.closest('.diagram-widget')) return;
|
|
936
938
|
const container = btn.closest('.diagram-container, .mermaid-container');
|