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
|
@@ -7,10 +7,9 @@ import {
|
|
|
7
7
|
} from '@tanstack/virtual-core';
|
|
8
8
|
import { generateId } from './uuid.js';
|
|
9
9
|
import { releaseMermaidNodes } from './render.js';
|
|
10
|
+
import { releaseProcessBlockDetails } from './features/process-block.js';
|
|
10
11
|
|
|
11
|
-
//
|
|
12
|
-
// Activate immediately — tanstack virtualizes DOM so only visible
|
|
13
|
-
// items are rendered, preventing DOM bloat at any message count
|
|
12
|
+
// Activate immediately: tanstack keeps only visible items mounted.
|
|
14
13
|
const THRESHOLD = 1;
|
|
15
14
|
const EST_HEIGHT = 80;
|
|
16
15
|
const OVERSCAN = 5;
|
|
@@ -31,6 +30,7 @@ export interface VirtualItem {
|
|
|
31
30
|
id: string;
|
|
32
31
|
html: string;
|
|
33
32
|
height: number; // used as estimateSize hint; tanstack measures real heights
|
|
33
|
+
rehydratesProcessDetails?: boolean;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
export type LazyRenderCallback = (targets: HTMLElement[]) => void;
|
|
@@ -86,8 +86,6 @@ export class VirtualScroll {
|
|
|
86
86
|
get active(): boolean { return this._active; }
|
|
87
87
|
get count(): number { return this.items.length; }
|
|
88
88
|
|
|
89
|
-
// ── Measure gap from CSS ──
|
|
90
|
-
|
|
91
89
|
private measureGap(): number {
|
|
92
90
|
if (this.itemGap > 0) return this.itemGap;
|
|
93
91
|
const probe = document.createElement('div');
|
|
@@ -114,8 +112,6 @@ export class VirtualScroll {
|
|
|
114
112
|
this.renderItems();
|
|
115
113
|
}
|
|
116
114
|
|
|
117
|
-
// ── Public API (preserved for callers) ──
|
|
118
|
-
|
|
119
115
|
/** Bulk-load items. Call AFTER registering onLazyRender/onPostRender. */
|
|
120
116
|
setItems(
|
|
121
117
|
items: VirtualItem[],
|
|
@@ -128,9 +124,7 @@ export class VirtualScroll {
|
|
|
128
124
|
}
|
|
129
125
|
}
|
|
130
126
|
|
|
131
|
-
/** Seed heights
|
|
132
|
-
* tanstack will re-measure via ResizeObserver on mount, but seeding
|
|
133
|
-
* gives accurate initial getTotalSize() for scrollToIndex precision. */
|
|
127
|
+
/** Seed heights so estimateSize is accurate before ResizeObserver runs. */
|
|
134
128
|
seedMeasuredHeights(startIndex: number, heights: number[]): void {
|
|
135
129
|
for (let offset = 0; offset < heights.length; offset++) {
|
|
136
130
|
const idx = startIndex + offset;
|
|
@@ -148,7 +142,10 @@ export class VirtualScroll {
|
|
|
148
142
|
}
|
|
149
143
|
|
|
150
144
|
addItem(id: string, html: string): void {
|
|
151
|
-
|
|
145
|
+
this.appendItem({ id, html, height: EST_HEIGHT });
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
appendItem(item: VirtualItem): void {
|
|
152
149
|
this.items.push(item);
|
|
153
150
|
if (!this._active && this.items.length >= THRESHOLD) {
|
|
154
151
|
this.activate(true);
|
|
@@ -409,14 +406,15 @@ export class VirtualScroll {
|
|
|
409
406
|
}
|
|
410
407
|
this.virtualizer = null;
|
|
411
408
|
this._active = false;
|
|
412
|
-
for (const el of this.mounted.values())
|
|
409
|
+
for (const el of this.mounted.values()) {
|
|
410
|
+
releaseMermaidNodes(el);
|
|
411
|
+
releaseProcessBlockDetails(el);
|
|
412
|
+
}
|
|
413
413
|
this.mounted.clear();
|
|
414
414
|
this.container.classList.remove('vs-active');
|
|
415
415
|
this.container.innerHTML = '';
|
|
416
416
|
}
|
|
417
417
|
|
|
418
|
-
// ── Render loop (called by tanstack onChange) ──
|
|
419
|
-
|
|
420
418
|
private renderItems(): void {
|
|
421
419
|
if (!this.virtualizer) return;
|
|
422
420
|
this.virtualizer._willUpdate();
|
|
@@ -424,50 +422,42 @@ export class VirtualScroll {
|
|
|
424
422
|
const virtualItems = this.virtualizer.getVirtualItems();
|
|
425
423
|
const totalSize = this.virtualizer.getTotalSize();
|
|
426
424
|
|
|
427
|
-
// Update inner container height (provides scrollbar range)
|
|
428
425
|
this.innerEl.style.height = `${totalSize}px`;
|
|
429
426
|
|
|
430
|
-
// Determine which indices tanstack wants rendered
|
|
431
427
|
const wantedSet = new Set(virtualItems.map(vi => vi.index));
|
|
432
428
|
|
|
433
|
-
// Remove items no longer in range
|
|
434
429
|
for (const [idx, el] of this.mounted) {
|
|
435
430
|
if (!wantedSet.has(idx)) {
|
|
436
431
|
releaseMermaidNodes(el);
|
|
432
|
+
const item = this.items[idx];
|
|
433
|
+
if (item?.rehydratesProcessDetails) releaseProcessBlockDetails(el);
|
|
437
434
|
el.remove();
|
|
438
435
|
this.mounted.delete(idx);
|
|
439
436
|
}
|
|
440
437
|
}
|
|
441
438
|
|
|
442
|
-
// Mount / reposition items
|
|
443
439
|
const newlyMounted: HTMLElement[] = [];
|
|
444
440
|
for (const vItem of virtualItems) {
|
|
445
441
|
let el = this.mounted.get(vItem.index);
|
|
446
442
|
|
|
447
443
|
if (!el) {
|
|
448
|
-
// Create new element from stored HTML
|
|
449
444
|
const item = this.items[vItem.index];
|
|
450
445
|
if (!item) continue;
|
|
451
446
|
const wrapper = document.createElement('div');
|
|
452
447
|
wrapper.innerHTML = item.html;
|
|
453
448
|
el = wrapper.firstElementChild as HTMLElement;
|
|
454
449
|
if (!el) continue;
|
|
455
|
-
el.dataset
|
|
450
|
+
el.dataset['vsIdx'] = String(vItem.index);
|
|
456
451
|
this.innerEl.appendChild(el);
|
|
457
452
|
this.mounted.set(vItem.index, el);
|
|
458
453
|
newlyMounted.push(el);
|
|
459
454
|
}
|
|
460
455
|
|
|
461
|
-
//
|
|
462
|
-
// so .msg-user align-self / left:auto works correctly
|
|
456
|
+
// CSS owns left/right/width, including .msg-user alignment.
|
|
463
457
|
el.style.transform = `translateY(${vItem.start}px)`;
|
|
464
458
|
}
|
|
465
459
|
|
|
466
|
-
// Lazy render
|
|
467
|
-
// code blocks, math which dramatically changes element heights.
|
|
468
|
-
// Measuring first would record pre-render heights (e.g. 50px),
|
|
469
|
-
// then lazy render expands to 300px+, causing overlap until the
|
|
470
|
-
// deferred ResizeObserver catches up (1+ frames later).
|
|
460
|
+
// Lazy render before measuring; markdown/code/math change heights.
|
|
471
461
|
if (this.onLazyRender) {
|
|
472
462
|
const lazyTargets = this.innerEl.querySelectorAll<HTMLElement>('.lazy-pending');
|
|
473
463
|
if (lazyTargets.length > 0) {
|
|
@@ -475,23 +465,19 @@ export class VirtualScroll {
|
|
|
475
465
|
}
|
|
476
466
|
}
|
|
477
467
|
|
|
478
|
-
// Post render: activate widgets, linkify paths
|
|
479
468
|
if (this.onPostRender) {
|
|
480
469
|
this.onPostRender(this.innerEl);
|
|
481
470
|
}
|
|
482
471
|
|
|
483
|
-
//
|
|
484
|
-
// Only for newly mounted elements (already-observed ones are tracked).
|
|
472
|
+
// Newly mounted elements now have their final rendered content.
|
|
485
473
|
for (const el of newlyMounted) {
|
|
486
|
-
const index = Number(el.dataset
|
|
474
|
+
const index = Number(el.dataset['vsIdx'] || '-1');
|
|
487
475
|
syncMeasuredItemHeight(this.items, index, el);
|
|
488
476
|
this.virtualizer!.measureElement(el);
|
|
489
477
|
}
|
|
490
478
|
}
|
|
491
479
|
}
|
|
492
480
|
|
|
493
|
-
// ── Singleton ──
|
|
494
|
-
|
|
495
481
|
let instance: VirtualScroll | null = null;
|
|
496
482
|
|
|
497
483
|
export function getVirtualScroll(): VirtualScroll {
|
package/public/js/ws.ts
CHANGED
|
@@ -55,12 +55,18 @@ interface WsMessage {
|
|
|
55
55
|
subtasks?: { agent?: string; name?: string }[];
|
|
56
56
|
action?: string;
|
|
57
57
|
icon?: string;
|
|
58
|
+
rawIcon?: string;
|
|
58
59
|
label?: string;
|
|
59
60
|
toolType?: string;
|
|
60
61
|
detail?: string;
|
|
61
62
|
stepRef?: string;
|
|
63
|
+
traceRunId?: string;
|
|
64
|
+
traceSeq?: number;
|
|
65
|
+
detailAvailable?: boolean;
|
|
66
|
+
detailBytes?: number;
|
|
67
|
+
rawRetentionStatus?: string;
|
|
62
68
|
text?: string;
|
|
63
|
-
toolLog?: { icon: string; label: string; detail?: string; toolType?: string; stepRef?: string }[];
|
|
69
|
+
toolLog?: { icon: string; label: string; detail?: string; toolType?: string; stepRef?: string; traceRunId?: string; traceSeq?: number; detailAvailable?: boolean; detailBytes?: number; rawRetentionStatus?: string }[];
|
|
64
70
|
from?: string;
|
|
65
71
|
to?: string;
|
|
66
72
|
source?: string;
|
|
@@ -263,8 +269,8 @@ function applyOrcState(orcState: string, title?: string) {
|
|
|
263
269
|
const brand = document.getElementById('pabcBrand');
|
|
264
270
|
|
|
265
271
|
if (roadmap && shark) {
|
|
266
|
-
if (!roadmap.dataset
|
|
267
|
-
roadmap.dataset
|
|
272
|
+
if (!roadmap.dataset['resizeObserved']) {
|
|
273
|
+
roadmap.dataset['resizeObserved'] = '1';
|
|
268
274
|
new ResizeObserver(() => {
|
|
269
275
|
if (currentSharkPhase && shark.classList.contains('running')) {
|
|
270
276
|
positionShark(roadmap, shark, currentSharkPhase);
|
|
@@ -379,10 +385,15 @@ export function connect(): void {
|
|
|
379
385
|
id: `step-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
|
|
380
386
|
type: stepType,
|
|
381
387
|
icon: msg.icon || ICONS.tool,
|
|
382
|
-
rawIcon:
|
|
388
|
+
rawIcon: msg.rawIcon || msg.icon || '',
|
|
383
389
|
label: empPrefix + (msg.label || ''),
|
|
384
390
|
detail: msg.detail || '',
|
|
385
391
|
stepRef: msg.stepRef || '',
|
|
392
|
+
traceRunId: msg.traceRunId || '',
|
|
393
|
+
traceSeq: msg.traceSeq,
|
|
394
|
+
detailAvailable: msg.detailAvailable,
|
|
395
|
+
detailBytes: msg.detailBytes,
|
|
396
|
+
rawRetentionStatus: msg.rawRetentionStatus,
|
|
386
397
|
status: (msg.status as 'running' | 'done' | 'error') || 'running',
|
|
387
398
|
startTime: Date.now(),
|
|
388
399
|
});
|
|
@@ -413,14 +424,15 @@ export function connect(): void {
|
|
|
413
424
|
} else if (msg.type === 'agent_added' || msg.type === 'agent_updated' || msg.type === 'agent_deleted') {
|
|
414
425
|
import('./features/employees.js').then(m => m.loadEmployees());
|
|
415
426
|
} else if (msg.type === 'heartbeat_pending') {
|
|
416
|
-
|
|
427
|
+
const heartbeatRuntimePatch: Partial<HeartbeatRuntimeState> = {
|
|
417
428
|
pending: msg.pending || 0,
|
|
418
429
|
deferredPending: msg.deferredPending || 0,
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
430
|
+
};
|
|
431
|
+
if (msg.reason !== undefined) heartbeatRuntimePatch.reason = msg.reason;
|
|
432
|
+
if (msg.policy !== undefined) heartbeatRuntimePatch.policy = msg.policy;
|
|
433
|
+
if (msg.jobId !== undefined) heartbeatRuntimePatch.jobId = msg.jobId;
|
|
434
|
+
if (msg.jobName !== undefined) heartbeatRuntimePatch.jobName = msg.jobName;
|
|
435
|
+
applyHeartbeatRuntime(heartbeatRuntimePatch);
|
|
424
436
|
} else if (msg.type === 'orc_state') {
|
|
425
437
|
if (!shouldApplyOrcStateEvent(msg.scope, currentOrcScope)) return;
|
|
426
438
|
applyOrcState(typeof msg.state === 'string' ? msg.state : 'IDLE', msg.title);
|
|
@@ -26,6 +26,11 @@ import { summarizeActivityTitleSupport } from './dashboard-settings/activity-tit
|
|
|
26
26
|
import { dashboardSettingsUiFromView } from './dashboard-settings/dashboard-settings-ui';
|
|
27
27
|
import { NotesSidebar } from './notes/NotesSidebar';
|
|
28
28
|
import { NotesWorkspace } from './notes/NotesWorkspace';
|
|
29
|
+
import { useNotesModel } from './notes/useNotesModel';
|
|
30
|
+
import { publishInvalidation } from './sync/invalidation-bus';
|
|
31
|
+
import { useInvalidationSubscription } from './sync/useInvalidationSubscription';
|
|
32
|
+
import { IframeBridge } from './sync/IframeBridge';
|
|
33
|
+
import { VisibilityBridge } from './sync/VisibilityBridge';
|
|
29
34
|
import { DashboardBoardSidebar } from './dashboard-board/DashboardBoardSidebar';
|
|
30
35
|
import { DashboardBoardWorkspace } from './dashboard-board/DashboardBoardWorkspace';
|
|
31
36
|
import type { BoardView } from './dashboard-board/board-view';
|
|
@@ -198,6 +203,8 @@ export function App() {
|
|
|
198
203
|
} : current);
|
|
199
204
|
}
|
|
200
205
|
|
|
206
|
+
useInvalidationSubscription('instances', () => void load(), 'app');
|
|
207
|
+
|
|
201
208
|
useEffect(() => {
|
|
202
209
|
async function initialize(): Promise<void> {
|
|
203
210
|
try {
|
|
@@ -233,7 +240,7 @@ export function App() {
|
|
|
233
240
|
}, []);
|
|
234
241
|
|
|
235
242
|
async function saveUi(ui: Parameters<typeof registry.save>[0]['ui']): Promise<void> {
|
|
236
|
-
if (!hydrated) return;
|
|
243
|
+
if (!hydrated || ui === undefined) return;
|
|
237
244
|
await registry.save({ ui });
|
|
238
245
|
}
|
|
239
246
|
|
|
@@ -245,7 +252,7 @@ export function App() {
|
|
|
245
252
|
}, [instances]);
|
|
246
253
|
const summary = useMemo(() => {
|
|
247
254
|
return instances.reduce((acc, instance) => {
|
|
248
|
-
acc
|
|
255
|
+
acc['total'] += 1;
|
|
249
256
|
acc[instance.status] = (acc[instance.status] || 0) + 1;
|
|
250
257
|
return acc;
|
|
251
258
|
}, { total: 0 } as Record<string, number>);
|
|
@@ -287,6 +294,10 @@ export function App() {
|
|
|
287
294
|
function handleTabChange(tab: DashboardDetailTab): void {
|
|
288
295
|
if (tab !== 'settings' && !canLeaveDirtySettings()) return;
|
|
289
296
|
if (tab !== 'settings') setSettingsDirty(false);
|
|
297
|
+
if (view.activeDetailTab === 'preview' && tab !== 'preview') {
|
|
298
|
+
const port = view.selectedPort;
|
|
299
|
+
if (port != null) activityUnread.markPortSeen(port);
|
|
300
|
+
}
|
|
290
301
|
view.setActiveDetailTab(tab);
|
|
291
302
|
if (tab === 'preview') {
|
|
292
303
|
const port = view.selectedPort;
|
|
@@ -318,6 +329,10 @@ export function App() {
|
|
|
318
329
|
}
|
|
319
330
|
|
|
320
331
|
function handleSidebarModeChange(mode: DashboardSidebarMode): void {
|
|
332
|
+
if (view.sidebarMode === 'instances' && mode !== 'instances' && view.activeDetailTab === 'preview') {
|
|
333
|
+
const port = view.selectedPort;
|
|
334
|
+
if (port != null) activityUnread.markPortSeen(port);
|
|
335
|
+
}
|
|
321
336
|
const sidebarMode = normalizeSidebarModeForBuild(mode);
|
|
322
337
|
view.setSidebarMode(sidebarMode); void saveUi({ sidebarMode });
|
|
323
338
|
}
|
|
@@ -342,6 +357,12 @@ export function App() {
|
|
|
342
357
|
view.setNotesTreeWidth(value); void saveUi({ notesTreeWidth: value });
|
|
343
358
|
}
|
|
344
359
|
|
|
360
|
+
const notesModel = useNotesModel({
|
|
361
|
+
active: view.sidebarMode === 'notes',
|
|
362
|
+
selectedPath: view.notesSelectedPath,
|
|
363
|
+
onSelectedPathChange: handleNotesSelectedPathChange,
|
|
364
|
+
});
|
|
365
|
+
|
|
345
366
|
function handleDashboardSettingsPatch(ui: NonNullable<Parameters<typeof saveUi>[0]>): void {
|
|
346
367
|
if (ui.showLatestActivityTitles !== undefined) view.setShowLatestActivityTitles(ui.showLatestActivityTitles);
|
|
347
368
|
if (ui.showInlineLabelEditor !== undefined) view.setShowInlineLabelEditor(ui.showInlineLabelEditor);
|
|
@@ -387,6 +408,7 @@ export function App() {
|
|
|
387
408
|
setLifecycleMessage(`${result.message} (not yet reachable, refresh manually if needed)`);
|
|
388
409
|
}
|
|
389
410
|
await load();
|
|
411
|
+
publishInvalidation({ topics: ['instances'], reason: 'instance:lifecycle', source: 'ui', sourceId: 'app' });
|
|
390
412
|
view.setSelectedPort(instance.port);
|
|
391
413
|
} catch (err) {
|
|
392
414
|
setLifecycleMessage((err as Error).message);
|
|
@@ -452,15 +474,21 @@ export function App() {
|
|
|
452
474
|
onSettingsDirtyChange={setSettingsDirty}
|
|
453
475
|
onSettingsSaved={() => {
|
|
454
476
|
if (selectedInstance) void refreshInstance(selectedInstance.port);
|
|
477
|
+
publishInvalidation({ topics: ['instances'], reason: 'instance:settings-saved', source: 'ui', sourceId: 'app' });
|
|
455
478
|
}}
|
|
456
479
|
onRegistryPatch={(port, patch) => {
|
|
457
|
-
void registry.save({ instances: { [String(port)]: patch } }).then(() =>
|
|
480
|
+
void registry.save({ instances: { [String(port)]: patch } }).then(() => {
|
|
481
|
+
load();
|
|
482
|
+
publishInvalidation({ topics: ['instances'], reason: 'instance:registry-patched', source: 'ui', sourceId: 'app' });
|
|
483
|
+
});
|
|
458
484
|
}}
|
|
459
485
|
/>
|
|
460
486
|
);
|
|
461
487
|
|
|
462
488
|
return (
|
|
463
489
|
<>
|
|
490
|
+
<IframeBridge />
|
|
491
|
+
<VisibilityBridge />
|
|
464
492
|
<ManagerShell
|
|
465
493
|
sidebarCollapsed={view.sidebarCollapsed}
|
|
466
494
|
commandBar={(
|
|
@@ -484,12 +512,12 @@ export function App() {
|
|
|
484
512
|
onCloseDrawer={() => view.setDrawerOpen(false)}
|
|
485
513
|
navigator={(
|
|
486
514
|
<>
|
|
487
|
-
<SidebarRail onlineCount={summary
|
|
515
|
+
<SidebarRail onlineCount={summary['online'] || 0} collapsed={view.sidebarCollapsed} mode={view.sidebarMode} scheduleWorkspaceEnabled={SCHEDULE_WORKSPACE_ENABLED} onModeChange={handleSidebarModeChange} onToggleSidebar={handleSidebarToggle} helpOpen={helpOpen} onToggleHelp={() => setHelpOpen(open => !open)} />
|
|
488
516
|
<div id="manager-sidebar-list" className="manager-sidebar-list">
|
|
489
517
|
{view.sidebarMode === 'settings' ? (
|
|
490
518
|
<DashboardSettingsSidebar activeSection={dashboardSettingsSection} locale={view.locale} onSectionChange={setDashboardSettingsSection} />
|
|
491
519
|
) : view.sidebarMode === 'notes' ? (
|
|
492
|
-
<NotesSidebar selectedPath={view.notesSelectedPath} dirtyPath={notesDirtyPath} treeWidth={view.notesTreeWidth} onSelectedPathChange={handleNotesSelectedPathChange} />
|
|
520
|
+
<NotesSidebar tree={notesModel.tree} loading={notesModel.loading} error={notesModel.error} notesRoot={notesModel.notesRoot} selectedPath={view.notesSelectedPath} dirtyPath={notesDirtyPath} treeWidth={view.notesTreeWidth} onSelectedPathChange={handleNotesSelectedPathChange} onRefreshTree={notesModel.refresh} />
|
|
493
521
|
) : view.sidebarMode === 'board' ? (
|
|
494
522
|
<DashboardBoardSidebar view={boardView} onViewChange={setBoardView} instances={instances} titlesByPort={messageActivity.titlesByPort} busyPorts={messageActivity.busyPorts} />
|
|
495
523
|
) : SCHEDULE_WORKSPACE_ENABLED && view.sidebarMode === 'schedule' ? (
|
|
@@ -524,7 +552,7 @@ export function App() {
|
|
|
524
552
|
)} logs={detailContent('logs')} settings={detailContent('settings')} />
|
|
525
553
|
</WorkspaceSurface>
|
|
526
554
|
<WorkspaceSurface active={view.sidebarMode === 'notes'}>
|
|
527
|
-
<NotesWorkspace active={view.sidebarMode === 'notes'} selectedPath={view.notesSelectedPath} viewMode={view.notesViewMode} authoringMode={view.notesAuthoringMode} wordWrap={view.notesWordWrap} treeWidth={view.notesTreeWidth} onSelectedPathChange={handleNotesSelectedPathChange} onDirtyPathChange={setNotesDirtyPath} onViewModeChange={handleNotesViewModeChange} onAuthoringModeChange={handleNotesAuthoringModeChange} onWordWrapChange={handleNotesWordWrapChange} onTreeWidthChange={handleNotesTreeWidthChange} />
|
|
555
|
+
<NotesWorkspace active={view.sidebarMode === 'notes'} selectedPath={view.notesSelectedPath} vaultIndex={notesModel.index} viewMode={view.notesViewMode} authoringMode={view.notesAuthoringMode} wordWrap={view.notesWordWrap} treeWidth={view.notesTreeWidth} onSelectedPathChange={handleNotesSelectedPathChange} onDirtyPathChange={setNotesDirtyPath} onViewModeChange={handleNotesViewModeChange} onAuthoringModeChange={handleNotesAuthoringModeChange} onWordWrapChange={handleNotesWordWrapChange} onTreeWidthChange={handleNotesTreeWidthChange} />
|
|
528
556
|
</WorkspaceSurface>
|
|
529
557
|
<WorkspaceSurface active={view.sidebarMode === 'settings'}>
|
|
530
558
|
<DashboardSettingsWorkspace activeSection={dashboardSettingsSection} ui={dashboardSettingsUi} titleSupport={titleSupport} onUiPatch={handleDashboardSettingsPatch} />
|
|
@@ -2,7 +2,9 @@ import type {
|
|
|
2
2
|
DashboardInstance,
|
|
3
3
|
DashboardLifecycleAction,
|
|
4
4
|
DashboardLifecycleResult,
|
|
5
|
+
DashboardNoteAssetResponse,
|
|
5
6
|
DashboardNoteFileResponse,
|
|
7
|
+
DashboardNotesCapabilities,
|
|
6
8
|
DashboardNoteTreeEntry,
|
|
7
9
|
DashboardPutNoteRequest,
|
|
8
10
|
DashboardProcessControlState,
|
|
@@ -14,6 +16,7 @@ import type {
|
|
|
14
16
|
HealthEvent,
|
|
15
17
|
InstanceLogSnapshot,
|
|
16
18
|
ManagerEvent,
|
|
19
|
+
VaultIndexSnapshot,
|
|
17
20
|
} from './types';
|
|
18
21
|
|
|
19
22
|
export class DashboardApiError extends Error {
|
|
@@ -90,7 +93,9 @@ export async function stopManagedProcesses(): Promise<DashboardProcessControlSta
|
|
|
90
93
|
}
|
|
91
94
|
|
|
92
95
|
export async function fetchInstanceStatus(port: number, options: { signal?: AbortSignal } = {}): Promise<DashboardInstance | null> {
|
|
93
|
-
const
|
|
96
|
+
const init: RequestInit = {};
|
|
97
|
+
if (options.signal !== undefined) init.signal = options.signal;
|
|
98
|
+
const response = await fetch(`/api/dashboard/instances/${port}`, init);
|
|
94
99
|
if (!response.ok) throw new Error(`status fetch failed: ${response.status}`);
|
|
95
100
|
const body = await response.json() as { ok: boolean; instance: DashboardInstance | null };
|
|
96
101
|
return body.instance;
|
|
@@ -146,11 +151,27 @@ export async function fetchNotesInfo(): Promise<{ root: string }> {
|
|
|
146
151
|
return await parseNotesResponse<{ root: string }>(response, `notes info fetch failed: ${response.status}`);
|
|
147
152
|
}
|
|
148
153
|
|
|
154
|
+
export async function fetchNotesVersion(): Promise<number> {
|
|
155
|
+
const response = await fetch('/api/dashboard/notes/version');
|
|
156
|
+
const body = await parseNotesResponse<{ version: number }>(response, `notes version fetch failed: ${response.status}`);
|
|
157
|
+
return body.version;
|
|
158
|
+
}
|
|
159
|
+
|
|
149
160
|
export async function fetchNotesTree(): Promise<DashboardNoteTreeEntry[]> {
|
|
150
161
|
const response = await fetch('/api/dashboard/notes/tree');
|
|
151
162
|
return await parseNotesResponse<DashboardNoteTreeEntry[]>(response, `notes tree fetch failed: ${response.status}`);
|
|
152
163
|
}
|
|
153
164
|
|
|
165
|
+
export async function fetchNotesIndex(): Promise<VaultIndexSnapshot> {
|
|
166
|
+
const response = await fetch('/api/dashboard/notes/index');
|
|
167
|
+
return await parseNotesResponse<VaultIndexSnapshot>(response, `notes index fetch failed: ${response.status}`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export async function fetchNotesCapabilities(): Promise<DashboardNotesCapabilities> {
|
|
171
|
+
const response = await fetch('/api/dashboard/notes/capabilities');
|
|
172
|
+
return await parseNotesResponse<DashboardNotesCapabilities>(response, `notes capabilities fetch failed: ${response.status}`);
|
|
173
|
+
}
|
|
174
|
+
|
|
154
175
|
export async function fetchNoteFile(path: string): Promise<DashboardNoteFileResponse> {
|
|
155
176
|
const response = await fetch(`/api/dashboard/notes/file?path=${encodeURIComponent(path)}`);
|
|
156
177
|
return await parseNotesResponse<DashboardNoteFileResponse>(response, `note fetch failed: ${response.status}`);
|
|
@@ -174,6 +195,39 @@ export async function saveNoteFile(request: DashboardPutNoteRequest): Promise<Da
|
|
|
174
195
|
return await parseNotesResponse<DashboardNoteFileResponse>(response, `note save failed: ${response.status}`);
|
|
175
196
|
}
|
|
176
197
|
|
|
198
|
+
function bytesToBase64(bytes: Uint8Array): string {
|
|
199
|
+
let binary = '';
|
|
200
|
+
const chunkSize = 0x8000;
|
|
201
|
+
for (let index = 0; index < bytes.length; index += chunkSize) {
|
|
202
|
+
const chunk = bytes.subarray(index, index + chunkSize);
|
|
203
|
+
binary += String.fromCharCode(...chunk);
|
|
204
|
+
}
|
|
205
|
+
return btoa(binary);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export async function uploadNoteAsset(notePath: string, file: File): Promise<DashboardNoteAssetResponse> {
|
|
209
|
+
const bytes = new Uint8Array(await file.arrayBuffer());
|
|
210
|
+
const response = await fetch('/api/dashboard/notes/asset', {
|
|
211
|
+
method: 'POST',
|
|
212
|
+
headers: { 'content-type': 'application/json' },
|
|
213
|
+
body: JSON.stringify({
|
|
214
|
+
notePath,
|
|
215
|
+
mime: file.type,
|
|
216
|
+
dataBase64: bytesToBase64(bytes),
|
|
217
|
+
}),
|
|
218
|
+
});
|
|
219
|
+
return await parseNotesResponse<DashboardNoteAssetResponse>(response, `note asset upload failed: ${response.status}`);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export async function uploadRemoteNoteAsset(notePath: string, url: string): Promise<DashboardNoteAssetResponse> {
|
|
223
|
+
const response = await fetch('/api/dashboard/notes/asset/remote', {
|
|
224
|
+
method: 'POST',
|
|
225
|
+
headers: { 'content-type': 'application/json' },
|
|
226
|
+
body: JSON.stringify({ notePath, url }),
|
|
227
|
+
});
|
|
228
|
+
return await parseNotesResponse<DashboardNoteAssetResponse>(response, `remote note asset upload failed: ${response.status}`);
|
|
229
|
+
}
|
|
230
|
+
|
|
177
231
|
export async function createNoteFolder(path: string): Promise<{ path: string }> {
|
|
178
232
|
const response = await fetch('/api/dashboard/notes/folder', {
|
|
179
233
|
method: 'POST',
|
|
@@ -58,7 +58,7 @@ const FIVE_MINUTES_MS = 5 * 60 * 1000;
|
|
|
58
58
|
|
|
59
59
|
function normalize(entry: ActivityEntry | ManagerEvent | string, fallbackAt: string): ActivityEntry {
|
|
60
60
|
if (typeof entry === 'string') {
|
|
61
|
-
return { at: fallbackAt,
|
|
61
|
+
return { at: fallbackAt, message: entry };
|
|
62
62
|
}
|
|
63
63
|
if ('kind' in entry) {
|
|
64
64
|
return eventToEntry(entry);
|
|
@@ -47,8 +47,8 @@ export function InstanceDetailPanel(props: InstanceDetailPanelProps) {
|
|
|
47
47
|
key={instance.port}
|
|
48
48
|
port={instance.port}
|
|
49
49
|
instanceUrl={`http://localhost:${instance.port}`}
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
{...(props.onSettingsDirtyChange !== undefined ? { onDirtyChange: props.onSettingsDirtyChange } : {})}
|
|
51
|
+
{...(props.onSettingsSaved !== undefined ? { onSaved: props.onSettingsSaved } : {})}
|
|
52
52
|
/>
|
|
53
53
|
)}
|
|
54
54
|
|
|
@@ -79,17 +79,17 @@ function renderInstanceRow(
|
|
|
79
79
|
<InstanceRow
|
|
80
80
|
key={instance.port}
|
|
81
81
|
instance={instance}
|
|
82
|
-
profile
|
|
82
|
+
{...(profile !== undefined ? { profile } : {})}
|
|
83
83
|
selected={props.selectedPort === instance.port}
|
|
84
84
|
busy={props.lifecycleBusyPort === instance.port}
|
|
85
85
|
transitioning={props.transitioningPort === instance.port ? props.transitionAction || null : null}
|
|
86
86
|
activityUnreadCount={props.activityUnreadByPort?.[instance.port] || 0}
|
|
87
87
|
latestActivityTitle={props.latestTitleByPort?.[instance.port] || null}
|
|
88
88
|
agentBusy={props.busyPorts?.has(instance.port) || false}
|
|
89
|
-
|
|
90
|
-
showInlineLabelEditor
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
{...(props.showLatestActivityTitles !== undefined ? { showLatestActivityTitle: props.showLatestActivityTitles } : {})}
|
|
90
|
+
{...(props.showInlineLabelEditor !== undefined ? { showInlineLabelEditor: props.showInlineLabelEditor } : {})}
|
|
91
|
+
{...(props.showSidebarRuntimeLine !== undefined ? { showRuntimeLine: props.showSidebarRuntimeLine } : {})}
|
|
92
|
+
{...(props.showSelectedRowActions !== undefined ? { showSelectedActions: props.showSelectedRowActions } : {})}
|
|
93
93
|
label={props.getLabel(instance)}
|
|
94
94
|
uptime={props.formatUptime(instance.uptime)}
|
|
95
95
|
onSelect={props.onSelect}
|
|
@@ -60,7 +60,7 @@ export function InstanceListContent(props: InstanceListContentProps) {
|
|
|
60
60
|
transitionAction={props.transitionAction}
|
|
61
61
|
activityUnreadByPort={props.activityUnreadByPort}
|
|
62
62
|
latestTitleByPort={props.latestTitleByPort}
|
|
63
|
-
busyPorts
|
|
63
|
+
{...(props.busyPorts !== undefined ? { busyPorts: props.busyPorts } : {})}
|
|
64
64
|
showLatestActivityTitles={props.showLatestActivityTitles}
|
|
65
65
|
showInlineLabelEditor={props.showInlineLabelEditor}
|
|
66
66
|
showSidebarRuntimeLine={props.showSidebarRuntimeLine}
|
|
@@ -3,7 +3,7 @@ import type { DashboardSidebarMode } from './types';
|
|
|
3
3
|
export const NPM_HIDDEN_WORKSPACE_MODES = new Set<DashboardSidebarMode>(['schedule']);
|
|
4
4
|
|
|
5
5
|
export const SCHEDULE_WORKSPACE_ENABLED =
|
|
6
|
-
import.meta.env.DEV || import.meta.env
|
|
6
|
+
import.meta.env.DEV || import.meta.env['VITE_CLI_JAW_EXPERIMENTAL_DASHBOARD'] === '1';
|
|
7
7
|
|
|
8
8
|
export function isNpmHiddenWorkspaceMode(mode: DashboardSidebarMode): boolean {
|
|
9
9
|
return NPM_HIDDEN_WORKSPACE_MODES.has(mode);
|
|
@@ -313,10 +313,34 @@
|
|
|
313
313
|
min-height: 0;
|
|
314
314
|
display: grid;
|
|
315
315
|
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
|
|
316
|
-
grid-
|
|
316
|
+
grid-template-rows: max-content minmax(0, 1fr);
|
|
317
317
|
overflow: hidden;
|
|
318
318
|
}
|
|
319
319
|
|
|
320
|
+
.notes-inline-title {
|
|
321
|
+
grid-column: 1 / -1;
|
|
322
|
+
grid-row: 1;
|
|
323
|
+
display: block;
|
|
324
|
+
width: 100%;
|
|
325
|
+
box-sizing: border-box;
|
|
326
|
+
padding: 8px 28px 4px;
|
|
327
|
+
border: none;
|
|
328
|
+
outline: none;
|
|
329
|
+
background: transparent;
|
|
330
|
+
font-size: 22px;
|
|
331
|
+
font-weight: 700;
|
|
332
|
+
color: var(--text-primary);
|
|
333
|
+
line-height: 1.3;
|
|
334
|
+
font-family: inherit;
|
|
335
|
+
overflow: hidden;
|
|
336
|
+
text-overflow: ellipsis;
|
|
337
|
+
white-space: nowrap;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
.notes-inline-title:focus {
|
|
341
|
+
background: var(--canvas-panel);
|
|
342
|
+
}
|
|
343
|
+
|
|
320
344
|
.notes-mode-raw .notes-document-grid,
|
|
321
345
|
.notes-mode-preview .notes-document-grid {
|
|
322
346
|
grid-template-columns: minmax(0, 1fr);
|
|
@@ -329,8 +353,15 @@
|
|
|
329
353
|
overflow: auto;
|
|
330
354
|
}
|
|
331
355
|
|
|
332
|
-
.notes-editor,
|
|
333
356
|
.notes-preview {
|
|
357
|
+
grid-row: 2;
|
|
358
|
+
min-width: 0;
|
|
359
|
+
min-height: 0;
|
|
360
|
+
height: 100%;
|
|
361
|
+
overflow: auto;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.notes-editor {
|
|
334
365
|
min-width: 0;
|
|
335
366
|
min-height: 0;
|
|
336
367
|
height: 100%;
|
|
@@ -338,6 +369,7 @@
|
|
|
338
369
|
}
|
|
339
370
|
|
|
340
371
|
.notes-editor-pane {
|
|
372
|
+
grid-row: 2;
|
|
341
373
|
min-width: 0;
|
|
342
374
|
min-height: 0;
|
|
343
375
|
height: 100%;
|
|
@@ -437,6 +469,18 @@
|
|
|
437
469
|
background: var(--danger-soft, var(--canvas-panel));
|
|
438
470
|
}
|
|
439
471
|
|
|
472
|
+
.notes-wysiwyg-upload-status {
|
|
473
|
+
padding: 4px 12px;
|
|
474
|
+
font-size: 13px;
|
|
475
|
+
color: var(--text-secondary, #888);
|
|
476
|
+
border-bottom: 1px solid var(--border-subtle);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
.notes-wysiwyg-upload-status[data-status="error"] {
|
|
480
|
+
color: var(--danger-strong, var(--text-primary));
|
|
481
|
+
background: var(--danger-soft, var(--canvas-panel));
|
|
482
|
+
}
|
|
483
|
+
|
|
440
484
|
.notes-milkdown-root .ProseMirror {
|
|
441
485
|
min-height: 100%;
|
|
442
486
|
padding: 24px 28px 160px;
|
|
@@ -832,9 +876,12 @@
|
|
|
832
876
|
vertical-align: top;
|
|
833
877
|
}
|
|
834
878
|
|
|
879
|
+
.notes-preview img,
|
|
835
880
|
.notes-milkdown-root .ProseMirror img {
|
|
881
|
+
display: block;
|
|
836
882
|
max-width: 100%;
|
|
837
883
|
height: auto;
|
|
884
|
+
border-radius: 6px;
|
|
838
885
|
}
|
|
839
886
|
|
|
840
887
|
.notes-milkdown-root .ProseMirror hr {
|
|
@@ -22,6 +22,7 @@ type MarkdownEditorProps = {
|
|
|
22
22
|
active: boolean;
|
|
23
23
|
authoringMode: NotesAuthoringMode;
|
|
24
24
|
content: string;
|
|
25
|
+
notePath: string;
|
|
25
26
|
wordWrap: boolean;
|
|
26
27
|
onChange: (value: string) => void;
|
|
27
28
|
};
|
|
@@ -53,7 +54,10 @@ export function MarkdownEditor(props: MarkdownEditorProps) {
|
|
|
53
54
|
notesEditorTheme,
|
|
54
55
|
notesSyntaxHighlighting,
|
|
55
56
|
markdown({ codeLanguages: languages }),
|
|
56
|
-
richMarkdownPastePolicy(
|
|
57
|
+
richMarkdownPastePolicy({
|
|
58
|
+
notePath: props.notePath,
|
|
59
|
+
onError: error => console.warn('[notes-image-paste]', error),
|
|
60
|
+
}),
|
|
57
61
|
richMarkdownExtension({
|
|
58
62
|
enabled: props.authoringMode === 'rich' || props.authoringMode === 'wysiwyg',
|
|
59
63
|
active: props.active,
|
|
@@ -64,13 +68,13 @@ export function MarkdownEditor(props: MarkdownEditorProps) {
|
|
|
64
68
|
];
|
|
65
69
|
if (props.wordWrap) base.push(EditorView.lineWrapping);
|
|
66
70
|
return base;
|
|
67
|
-
}, [props.active, props.authoringMode, props.wordWrap, registerWidget, requestMeasure, unregisterWidget]);
|
|
71
|
+
}, [props.active, props.authoringMode, props.notePath, props.wordWrap, registerWidget, requestMeasure, unregisterWidget]);
|
|
68
72
|
|
|
69
73
|
if (isWysiwyg) {
|
|
70
74
|
return (
|
|
71
75
|
<div className="notes-editor notes-wysiwyg-editor">
|
|
72
76
|
<Suspense fallback={<div className="notes-wysiwyg-loading">Loading WYSIWYG editor...</div>}>
|
|
73
|
-
<MilkdownWysiwygEditor active={props.active} content={props.content} onChange={props.onChange} />
|
|
77
|
+
<MilkdownWysiwygEditor active={props.active} content={props.content} notePath={props.notePath} onChange={props.onChange} />
|
|
74
78
|
</Suspense>
|
|
75
79
|
</div>
|
|
76
80
|
);
|