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
|
@@ -11,7 +11,7 @@ function codeText(node: ProseMirrorNode): string {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
function codeLanguage(node: ProseMirrorNode): string {
|
|
14
|
-
return String(node.attrs
|
|
14
|
+
return String(node.attrs['language'] ?? '');
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
function fencedCodeSource(node: ProseMirrorNode): string {
|
|
@@ -92,7 +92,7 @@ function commitAndExitCodeBlock(
|
|
|
92
92
|
return;
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
|
-
const paragraph = view.state.schema.nodes
|
|
95
|
+
const paragraph = view.state.schema.nodes['paragraph']?.create();
|
|
96
96
|
if (!paragraph) return;
|
|
97
97
|
tr.insert(codeAfter, paragraph);
|
|
98
98
|
tr.setSelection(TextSelection.create(tr.doc, codeAfter + 1));
|
|
@@ -112,7 +112,7 @@ function commitAndExitCodeBlock(
|
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
const paragraph = view.state.schema.nodes
|
|
115
|
+
const paragraph = view.state.schema.nodes['paragraph']?.create();
|
|
116
116
|
if (!paragraph) return;
|
|
117
117
|
tr.insert(pos, paragraph);
|
|
118
118
|
tr.setSelection(TextSelection.create(tr.doc, pos + 1));
|
|
@@ -173,27 +173,27 @@ function createCodeBlockView(): NodeViewConstructor {
|
|
|
173
173
|
function sync(): void {
|
|
174
174
|
const language = codeLanguage(currentNode);
|
|
175
175
|
const source = codeText(currentNode);
|
|
176
|
-
dom.dataset
|
|
177
|
-
pre.dataset
|
|
176
|
+
dom.dataset['language'] = language;
|
|
177
|
+
pre.dataset['language'] = language;
|
|
178
178
|
copyBtn.textContent = copyButtonLabel();
|
|
179
179
|
const highlighted = highlightCode(source, language);
|
|
180
180
|
code.className = `hljs language-${highlighted.language}`;
|
|
181
|
-
code.dataset
|
|
181
|
+
code.dataset['highlighted'] = highlighted['highlighted'] ? 'yes' : 'no';
|
|
182
182
|
code.innerHTML = highlighted.html;
|
|
183
|
-
if (dom.dataset
|
|
183
|
+
if (dom.dataset['editing'] !== 'true') raw.value = fencedCodeSource(currentNode);
|
|
184
184
|
}
|
|
185
185
|
|
|
186
186
|
function setEditing(editing: boolean, options: { commit?: boolean } = {}): void {
|
|
187
|
-
if (dom.dataset
|
|
188
|
-
if (!editing && dom.dataset
|
|
187
|
+
if (dom.dataset['editing'] === 'true' && editing) return;
|
|
188
|
+
if (!editing && dom.dataset['editing'] !== 'true') return;
|
|
189
189
|
if (!editing && options.commit !== false) {
|
|
190
190
|
const source = raw.value;
|
|
191
|
-
dom.dataset
|
|
191
|
+
dom.dataset['editing'] = 'false';
|
|
192
192
|
raw.blur();
|
|
193
193
|
updateCodeBlockNode(view, getPos, source);
|
|
194
194
|
return;
|
|
195
195
|
}
|
|
196
|
-
dom.dataset
|
|
196
|
+
dom.dataset['editing'] = editing ? 'true' : 'false';
|
|
197
197
|
if (editing) {
|
|
198
198
|
raw.value = fencedCodeSource(currentNode);
|
|
199
199
|
raw.focus();
|
|
@@ -204,10 +204,10 @@ function createCodeBlockView(): NodeViewConstructor {
|
|
|
204
204
|
}
|
|
205
205
|
|
|
206
206
|
function closeAfterOutsidePointer(event: Event): void {
|
|
207
|
-
if (dom.dataset
|
|
207
|
+
if (dom.dataset['editing'] !== 'true') return;
|
|
208
208
|
if (dom.contains(event.target as Node)) return;
|
|
209
209
|
setTimeout(() => {
|
|
210
|
-
if (dom.dataset
|
|
210
|
+
if (dom.dataset['editing'] === 'true') setEditing(false, { commit: false });
|
|
211
211
|
}, 0);
|
|
212
212
|
}
|
|
213
213
|
|
|
@@ -222,7 +222,7 @@ function createCodeBlockView(): NodeViewConstructor {
|
|
|
222
222
|
if (!(targetDom instanceof HTMLElement)) return;
|
|
223
223
|
const targetRaw = targetDom.querySelector('textarea.notes-code-raw');
|
|
224
224
|
if (!(targetRaw instanceof HTMLTextAreaElement)) return;
|
|
225
|
-
targetDom.dataset
|
|
225
|
+
targetDom.dataset['editing'] = 'true';
|
|
226
226
|
targetRaw.focus();
|
|
227
227
|
targetRaw.select();
|
|
228
228
|
}
|
|
@@ -230,7 +230,7 @@ function createCodeBlockView(): NodeViewConstructor {
|
|
|
230
230
|
function openFromRenderedEvent(event: Event): void {
|
|
231
231
|
if (raw.contains(event.target as Node)) return;
|
|
232
232
|
if (copyBtn.contains(event.target as Node)) return;
|
|
233
|
-
if (dom.dataset
|
|
233
|
+
if (dom.dataset['editing'] === 'true') return;
|
|
234
234
|
event.preventDefault();
|
|
235
235
|
event.stopPropagation();
|
|
236
236
|
const pointer = event instanceof PointerEvent || event instanceof MouseEvent
|
|
@@ -253,7 +253,7 @@ function createCodeBlockView(): NodeViewConstructor {
|
|
|
253
253
|
dom.addEventListener('click', openFromRenderedEvent);
|
|
254
254
|
dom.addEventListener('keydown', event => {
|
|
255
255
|
if (event.target !== dom) return;
|
|
256
|
-
if (dom.dataset
|
|
256
|
+
if (dom.dataset['editing'] === 'true') return;
|
|
257
257
|
if (event.key === 'Enter' || event.key === ' ') {
|
|
258
258
|
event.preventDefault();
|
|
259
259
|
setEditing(true);
|
|
@@ -311,7 +311,7 @@ function createCodeBlockView(): NodeViewConstructor {
|
|
|
311
311
|
});
|
|
312
312
|
raw.addEventListener('blur', () => {
|
|
313
313
|
setTimeout(() => {
|
|
314
|
-
if (dom.dataset
|
|
314
|
+
if (dom.dataset['editing'] === 'true' && document.activeElement !== raw) {
|
|
315
315
|
setEditing(false, { commit: false });
|
|
316
316
|
}
|
|
317
317
|
}, 0);
|
|
@@ -353,11 +353,11 @@ function createCodeBlockView(): NodeViewConstructor {
|
|
|
353
353
|
return true;
|
|
354
354
|
},
|
|
355
355
|
selectNode: () => {
|
|
356
|
-
dom.dataset
|
|
356
|
+
dom.dataset['selected'] = 'true';
|
|
357
357
|
},
|
|
358
358
|
deselectNode: () => {
|
|
359
|
-
dom.dataset
|
|
360
|
-
if (dom.dataset
|
|
359
|
+
dom.dataset['selected'] = 'false';
|
|
360
|
+
if (dom.dataset['editing'] === 'true') {
|
|
361
361
|
setEditing(false, { commit: false });
|
|
362
362
|
}
|
|
363
363
|
},
|
|
@@ -10,7 +10,7 @@ const MAX_HEADING_LEVEL = 6;
|
|
|
10
10
|
const HEADING_SOURCE_UPDATED_EVENT = 'notes-heading-source-updated';
|
|
11
11
|
|
|
12
12
|
function headingLevel(node: ProseMirrorNode): number {
|
|
13
|
-
const raw = Number(node.attrs
|
|
13
|
+
const raw = Number(node.attrs['level']);
|
|
14
14
|
if (!Number.isFinite(raw)) return MIN_HEADING_LEVEL;
|
|
15
15
|
return Math.min(MAX_HEADING_LEVEL, Math.max(MIN_HEADING_LEVEL, Math.trunc(raw)));
|
|
16
16
|
}
|
|
@@ -41,7 +41,7 @@ function updateHeadingLevel(
|
|
|
41
41
|
const current = view.state.doc.nodeAt(pos);
|
|
42
42
|
if (!current || current.type.name !== 'heading') return;
|
|
43
43
|
|
|
44
|
-
const paragraph = view.state.schema.nodes
|
|
44
|
+
const paragraph = view.state.schema.nodes['paragraph'];
|
|
45
45
|
const tr = level === 0 && paragraph
|
|
46
46
|
? view.state.tr.setNodeMarkup(pos, paragraph as NodeType)
|
|
47
47
|
: view.state.tr.setNodeMarkup(pos, undefined, { ...node.attrs, level });
|
|
@@ -70,7 +70,7 @@ function createHeadingSourceView(): NodeViewConstructor {
|
|
|
70
70
|
|
|
71
71
|
function sync(): void {
|
|
72
72
|
const level = headingLevel(currentNode);
|
|
73
|
-
dom.dataset
|
|
73
|
+
dom.dataset['level'] = String(level);
|
|
74
74
|
dom.setAttribute('role', 'heading');
|
|
75
75
|
dom.setAttribute('aria-level', String(level));
|
|
76
76
|
dom.setAttribute('aria-label', currentNode.textContent);
|
|
@@ -102,7 +102,7 @@ function createHeadingSourceView(): NodeViewConstructor {
|
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
function handleFocus(): void {
|
|
105
|
-
dom.dataset
|
|
105
|
+
dom.dataset['editing'] = 'true';
|
|
106
106
|
marker.select();
|
|
107
107
|
}
|
|
108
108
|
|
|
@@ -114,7 +114,7 @@ function createHeadingSourceView(): NodeViewConstructor {
|
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
function handleBlur(): void {
|
|
117
|
-
dom.dataset
|
|
117
|
+
dom.dataset['editing'] = 'false';
|
|
118
118
|
commitMarker();
|
|
119
119
|
}
|
|
120
120
|
|
|
@@ -127,7 +127,7 @@ function createHeadingSourceView(): NodeViewConstructor {
|
|
|
127
127
|
if (event.key === 'Escape') {
|
|
128
128
|
event.preventDefault();
|
|
129
129
|
marker.value = markerForLevel(headingLevel(currentNode));
|
|
130
|
-
dom.dataset
|
|
130
|
+
dom.dataset['editing'] = 'false';
|
|
131
131
|
marker.blur();
|
|
132
132
|
view.focus();
|
|
133
133
|
}
|
|
@@ -153,10 +153,10 @@ function createHeadingSourceView(): NodeViewConstructor {
|
|
|
153
153
|
return true;
|
|
154
154
|
},
|
|
155
155
|
selectNode(): void {
|
|
156
|
-
dom.dataset
|
|
156
|
+
dom.dataset['selected'] = 'true';
|
|
157
157
|
},
|
|
158
158
|
deselectNode(): void {
|
|
159
|
-
delete dom.dataset
|
|
159
|
+
delete dom.dataset['selected'];
|
|
160
160
|
},
|
|
161
161
|
stopEvent(event: Event): boolean {
|
|
162
162
|
return marker.contains(event.target as Node)
|
|
@@ -115,7 +115,7 @@ function commitAndExitMathNode(
|
|
|
115
115
|
return;
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
|
-
const paragraph = view.state.schema.nodes
|
|
118
|
+
const paragraph = view.state.schema.nodes['paragraph']?.create();
|
|
119
119
|
if (!paragraph) return;
|
|
120
120
|
tr.insert(pos, paragraph);
|
|
121
121
|
tr.setSelection(TextSelection.create(tr.doc, pos + 1));
|
|
@@ -136,7 +136,7 @@ function commitAndExitMathNode(
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
if (!landed) {
|
|
139
|
-
const paragraph = view.state.schema.nodes
|
|
139
|
+
const paragraph = view.state.schema.nodes['paragraph']?.create();
|
|
140
140
|
if (!paragraph) return;
|
|
141
141
|
tr.insert(after, paragraph);
|
|
142
142
|
tr.setSelection(TextSelection.create(tr.doc, after + 1));
|
|
@@ -191,13 +191,13 @@ function createMathView(options: {
|
|
|
191
191
|
dom.append(rendered, raw);
|
|
192
192
|
|
|
193
193
|
function value(): string {
|
|
194
|
-
return String(currentNode.attrs
|
|
194
|
+
return String(currentNode.attrs['value'] ?? '');
|
|
195
195
|
}
|
|
196
196
|
|
|
197
197
|
function setEditing(editing: boolean): void {
|
|
198
|
-
if (dom.dataset
|
|
199
|
-
if (!editing && dom.dataset
|
|
200
|
-
dom.dataset
|
|
198
|
+
if (dom.dataset['editing'] === 'true' && editing) return;
|
|
199
|
+
if (!editing && dom.dataset['editing'] !== 'true') return;
|
|
200
|
+
dom.dataset['editing'] = editing ? 'true' : 'false';
|
|
201
201
|
if (editing) {
|
|
202
202
|
raw.value = options.block ? blockMathSource(value()) : inlineMathSource(value());
|
|
203
203
|
raw.focus();
|
|
@@ -216,8 +216,8 @@ function createMathView(options: {
|
|
|
216
216
|
|
|
217
217
|
function sync(): void {
|
|
218
218
|
const code = value();
|
|
219
|
-
dom.dataset
|
|
220
|
-
if (dom.dataset
|
|
219
|
+
dom.dataset['value'] = code;
|
|
220
|
+
if (dom.dataset['editing'] !== 'true') {
|
|
221
221
|
raw.value = options.block ? blockMathSource(code) : inlineMathSource(code);
|
|
222
222
|
}
|
|
223
223
|
options.render(rendered, code);
|
|
@@ -227,14 +227,14 @@ function createMathView(options: {
|
|
|
227
227
|
if (!(targetDom instanceof HTMLElement)) return;
|
|
228
228
|
const targetRaw = targetDom.querySelector('.notes-math-raw');
|
|
229
229
|
if (!(targetRaw instanceof HTMLInputElement || targetRaw instanceof HTMLTextAreaElement)) return;
|
|
230
|
-
targetDom.dataset
|
|
230
|
+
targetDom.dataset['editing'] = 'true';
|
|
231
231
|
targetRaw.focus();
|
|
232
232
|
targetRaw.select();
|
|
233
233
|
}
|
|
234
234
|
|
|
235
235
|
function openFromRenderedEvent(event: Event): void {
|
|
236
236
|
if (raw.contains(event.target as Node)) return;
|
|
237
|
-
if (dom.dataset
|
|
237
|
+
if (dom.dataset['editing'] === 'true') return;
|
|
238
238
|
event.preventDefault();
|
|
239
239
|
event.stopPropagation();
|
|
240
240
|
const pointer = event instanceof PointerEvent || event instanceof MouseEvent
|
|
@@ -258,7 +258,7 @@ function createMathView(options: {
|
|
|
258
258
|
dom.addEventListener('keydown', event => {
|
|
259
259
|
const keyEvent = event as KeyboardEvent;
|
|
260
260
|
if (keyEvent.target !== dom) return;
|
|
261
|
-
if (dom.dataset
|
|
261
|
+
if (dom.dataset['editing'] === 'true') return;
|
|
262
262
|
if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {
|
|
263
263
|
keyEvent.preventDefault();
|
|
264
264
|
setEditing(true);
|
|
@@ -346,10 +346,10 @@ function createMathView(options: {
|
|
|
346
346
|
return true;
|
|
347
347
|
},
|
|
348
348
|
selectNode: () => {
|
|
349
|
-
dom.dataset
|
|
349
|
+
dom.dataset['selected'] = 'true';
|
|
350
350
|
},
|
|
351
351
|
deselectNode: () => {
|
|
352
|
-
dom.dataset
|
|
352
|
+
dom.dataset['selected'] = 'false';
|
|
353
353
|
},
|
|
354
354
|
stopEvent: event =>
|
|
355
355
|
event.target === raw
|
|
@@ -377,28 +377,28 @@ export const notesMathInlineSchema = $nodeSchema(mathInlineId, ctx => ({
|
|
|
377
377
|
{
|
|
378
378
|
tag: `span[data-type="${mathInlineId}"]`,
|
|
379
379
|
getAttrs: dom => ({
|
|
380
|
-
value: dom instanceof HTMLElement ? dom.dataset
|
|
380
|
+
value: dom instanceof HTMLElement ? dom.dataset['value'] ?? '' : '',
|
|
381
381
|
}),
|
|
382
382
|
},
|
|
383
383
|
],
|
|
384
384
|
toDOM: node => {
|
|
385
|
-
const code = node.attrs
|
|
385
|
+
const code = node.attrs['value'] as string;
|
|
386
386
|
const dom = document.createElement('span');
|
|
387
|
-
dom.dataset
|
|
388
|
-
dom.dataset
|
|
387
|
+
dom.dataset['type'] = mathInlineId;
|
|
388
|
+
dom.dataset['value'] = code;
|
|
389
389
|
renderKatex(dom, code, ctx.get(notesMilkdownKatexOptionsCtx.key));
|
|
390
390
|
return dom;
|
|
391
391
|
},
|
|
392
392
|
parseMarkdown: {
|
|
393
393
|
match: node => node.type === 'inlineMath',
|
|
394
394
|
runner: (state, node, type) => {
|
|
395
|
-
state.addNode(type, { value: node
|
|
395
|
+
state.addNode(type, { value: node['value'] as string });
|
|
396
396
|
},
|
|
397
397
|
},
|
|
398
398
|
toMarkdown: {
|
|
399
399
|
match: node => node.type.name === mathInlineId,
|
|
400
400
|
runner: (state, node) => {
|
|
401
|
-
state.addNode('inlineMath', undefined, node.attrs
|
|
401
|
+
state.addNode('inlineMath', undefined, node.attrs['value'] as string);
|
|
402
402
|
},
|
|
403
403
|
},
|
|
404
404
|
}));
|
|
@@ -418,28 +418,28 @@ export const notesMathBlockSchema = $nodeSchema(mathBlockId, ctx => ({
|
|
|
418
418
|
tag: `div[data-type="${mathBlockId}"]`,
|
|
419
419
|
preserveWhitespace: 'full',
|
|
420
420
|
getAttrs: dom => ({
|
|
421
|
-
value: dom instanceof HTMLElement ? dom.dataset
|
|
421
|
+
value: dom instanceof HTMLElement ? dom.dataset['value'] ?? '' : '',
|
|
422
422
|
}),
|
|
423
423
|
},
|
|
424
424
|
],
|
|
425
425
|
toDOM: node => {
|
|
426
|
-
const code = node.attrs
|
|
426
|
+
const code = node.attrs['value'] as string;
|
|
427
427
|
const dom = document.createElement('div');
|
|
428
|
-
dom.dataset
|
|
429
|
-
dom.dataset
|
|
428
|
+
dom.dataset['type'] = mathBlockId;
|
|
429
|
+
dom.dataset['value'] = code;
|
|
430
430
|
renderKatex(dom, code, ctx.get(notesMilkdownKatexOptionsCtx.key));
|
|
431
431
|
return dom;
|
|
432
432
|
},
|
|
433
433
|
parseMarkdown: {
|
|
434
434
|
match: node => node.type === 'math',
|
|
435
435
|
runner: (state, node, type) => {
|
|
436
|
-
state.addNode(type, { value: node
|
|
436
|
+
state.addNode(type, { value: node['value'] as string });
|
|
437
437
|
},
|
|
438
438
|
},
|
|
439
439
|
toMarkdown: {
|
|
440
440
|
match: node => node.type.name === mathBlockId,
|
|
441
441
|
runner: (state, node) => {
|
|
442
|
-
state.addNode('math', undefined, node.attrs
|
|
442
|
+
state.addNode('math', undefined, node.attrs['value'] as string);
|
|
443
443
|
},
|
|
444
444
|
},
|
|
445
445
|
}));
|
|
@@ -43,31 +43,35 @@ const POLL_INTERVAL_MS = 3000;
|
|
|
43
43
|
|
|
44
44
|
export function normalizeBrowserStatus(raw: unknown): BrowserStatus {
|
|
45
45
|
if (!raw || typeof raw !== 'object') {
|
|
46
|
-
return { running: false, tabs: 0
|
|
46
|
+
return { running: false, tabs: 0 };
|
|
47
47
|
}
|
|
48
48
|
const r = raw as Record<string, unknown>;
|
|
49
|
-
|
|
50
|
-
running: r
|
|
51
|
-
tabs: typeof r
|
|
52
|
-
cdpUrl: typeof r.cdpUrl === 'string' ? r.cdpUrl : undefined,
|
|
49
|
+
const status: BrowserStatus = {
|
|
50
|
+
running: r['running'] === true,
|
|
51
|
+
tabs: typeof r['tabs'] === 'number' && Number.isFinite(r['tabs']) ? r['tabs'] : 0,
|
|
53
52
|
};
|
|
53
|
+
if (typeof r['cdpUrl'] === 'string') status.cdpUrl = r['cdpUrl'];
|
|
54
|
+
return status;
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
export function normalizeActiveTab(raw: unknown): ActiveTab | null {
|
|
57
58
|
if (!raw || typeof raw !== 'object') return null;
|
|
58
59
|
const r = raw as Record<string, unknown>;
|
|
59
|
-
const tab = r
|
|
60
|
-
|
|
61
|
-
ok: r
|
|
62
|
-
reason: typeof r.reason === 'string' ? r.reason : undefined,
|
|
63
|
-
tab: tab
|
|
64
|
-
? {
|
|
65
|
-
url: typeof tab.url === 'string' ? tab.url : undefined,
|
|
66
|
-
title: typeof tab.title === 'string' ? tab.title : undefined,
|
|
67
|
-
targetId: typeof tab.targetId === 'string' ? tab.targetId : undefined,
|
|
68
|
-
}
|
|
69
|
-
: null,
|
|
60
|
+
const tab = r['tab'] && typeof r['tab'] === 'object' ? (r['tab'] as Record<string, unknown>) : null;
|
|
61
|
+
const active: ActiveTab = {
|
|
62
|
+
ok: r['ok'] === true,
|
|
70
63
|
};
|
|
64
|
+
if (typeof r['reason'] === 'string') active.reason = r['reason'];
|
|
65
|
+
if (tab) {
|
|
66
|
+
const normalizedTab: NonNullable<ActiveTab['tab']> = {};
|
|
67
|
+
if (typeof tab['url'] === 'string') normalizedTab.url = tab['url'];
|
|
68
|
+
if (typeof tab['title'] === 'string') normalizedTab.title = tab['title'];
|
|
69
|
+
if (typeof tab['targetId'] === 'string') normalizedTab.targetId = tab['targetId'];
|
|
70
|
+
active.tab = normalizedTab;
|
|
71
|
+
} else {
|
|
72
|
+
active.tab = null;
|
|
73
|
+
}
|
|
74
|
+
return active;
|
|
71
75
|
}
|
|
72
76
|
|
|
73
77
|
export function describeStatus(status: BrowserStatus | null): string {
|
|
@@ -145,8 +149,14 @@ export default function Browser({ port, client }: SettingsPageProps) {
|
|
|
145
149
|
[fetchStatus],
|
|
146
150
|
);
|
|
147
151
|
|
|
148
|
-
const
|
|
149
|
-
void runAction('Start', () =>
|
|
152
|
+
const onStartVisible = useCallback(() => {
|
|
153
|
+
void runAction('Start visible browser', () =>
|
|
154
|
+
client.post('/api/browser/start', { mode: 'manual', headless: false }),
|
|
155
|
+
);
|
|
156
|
+
}, [client, runAction]);
|
|
157
|
+
|
|
158
|
+
const onStartAgent = useCallback(() => {
|
|
159
|
+
void runAction('Start agent browser', () =>
|
|
150
160
|
client.post('/api/browser/start', { mode: 'agent', headless: true }),
|
|
151
161
|
);
|
|
152
162
|
}, [client, runAction]);
|
|
@@ -201,9 +211,17 @@ export default function Browser({ port, client }: SettingsPageProps) {
|
|
|
201
211
|
type="button"
|
|
202
212
|
className="settings-action settings-action-save"
|
|
203
213
|
disabled={status.running || actionPending}
|
|
204
|
-
onClick={
|
|
214
|
+
onClick={onStartVisible}
|
|
215
|
+
>
|
|
216
|
+
Start visible browser
|
|
217
|
+
</button>
|
|
218
|
+
<button
|
|
219
|
+
type="button"
|
|
220
|
+
className="settings-action"
|
|
221
|
+
disabled={status.running || actionPending}
|
|
222
|
+
onClick={onStartAgent}
|
|
205
223
|
>
|
|
206
|
-
Start
|
|
224
|
+
Start agent browser
|
|
207
225
|
</button>
|
|
208
226
|
<button
|
|
209
227
|
type="button"
|
|
@@ -50,13 +50,15 @@ export default function ModelProvider({ port, client, dirty, registerSave }: Set
|
|
|
50
50
|
if (state.kind !== 'ready') return;
|
|
51
51
|
setPerCliDraft({ ...(state.data.perCli || {}) });
|
|
52
52
|
setFallback([...(state.data.fallbackOrder || [])]);
|
|
53
|
-
const codex = state.data.perCli?.codex || {};
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
53
|
+
const codex = state.data.perCli?.['codex'] || {};
|
|
54
|
+
const nextCodexCtx: typeof codexCtx = {};
|
|
55
|
+
if (typeof codex.contextWindowSize === 'number') {
|
|
56
|
+
nextCodexCtx.contextWindowSize = codex.contextWindowSize;
|
|
57
|
+
}
|
|
58
|
+
if (typeof codex.contextWindowCompactLimit === 'number') {
|
|
59
|
+
nextCodexCtx.contextWindowCompactLimit = codex.contextWindowCompactLimit;
|
|
60
|
+
}
|
|
61
|
+
setCodexCtx(nextCodexCtx);
|
|
60
62
|
}, [state]);
|
|
61
63
|
|
|
62
64
|
useEffect(() => {
|
|
@@ -120,7 +122,7 @@ export default function ModelProvider({ port, client, dirty, registerSave }: Set
|
|
|
120
122
|
const data = state.data;
|
|
121
123
|
const perCliOriginal = data.perCli || {};
|
|
122
124
|
const cliKeys = Object.keys(perCliOriginal);
|
|
123
|
-
const codexOriginal = perCliOriginal
|
|
125
|
+
const codexOriginal = perCliOriginal['codex'] || {};
|
|
124
126
|
const overrides = data.activeOverrides || {};
|
|
125
127
|
const overrideRows = Object.entries(overrides);
|
|
126
128
|
|
|
@@ -153,7 +155,7 @@ export default function ModelProvider({ port, client, dirty, registerSave }: Set
|
|
|
153
155
|
)}
|
|
154
156
|
</SettingsSection>
|
|
155
157
|
|
|
156
|
-
{perCliOriginal
|
|
158
|
+
{perCliOriginal['codex'] ? (
|
|
157
159
|
<SettingsSection
|
|
158
160
|
title="Codex context window"
|
|
159
161
|
hint="Codex-only sliders. Other CLIs ignore these values."
|
|
@@ -63,6 +63,14 @@ const REMOTE_ACCESS_OPTIONS = [
|
|
|
63
63
|
{ value: 'full', label: 'full — HTTP + WebSocket from remote' },
|
|
64
64
|
];
|
|
65
65
|
|
|
66
|
+
function normalizeNetworkBlock(block: NetworkBlock): NetworkBlock {
|
|
67
|
+
const next: NetworkBlock = {};
|
|
68
|
+
if (block.bindHost !== undefined) next.bindHost = block.bindHost;
|
|
69
|
+
if (block.lanBypass !== undefined) next.lanBypass = block.lanBypass;
|
|
70
|
+
next.remoteAccess = { ...(block.remoteAccess ?? {}) };
|
|
71
|
+
return next;
|
|
72
|
+
}
|
|
73
|
+
|
|
66
74
|
// ─── Pure helpers (exported for tests) ───────────────────────────────
|
|
67
75
|
|
|
68
76
|
export type PublicOriginValidation =
|
|
@@ -123,11 +131,7 @@ export default function Network({ port, client, dirty, registerSave }: SettingsP
|
|
|
123
131
|
useEffect(() => {
|
|
124
132
|
if (state.kind === 'ready') {
|
|
125
133
|
const block = state.data.network ?? {};
|
|
126
|
-
setDraft(
|
|
127
|
-
bindHost: block.bindHost,
|
|
128
|
-
lanBypass: block.lanBypass,
|
|
129
|
-
remoteAccess: { ...(block.remoteAccess ?? {}) },
|
|
130
|
-
});
|
|
134
|
+
setDraft(normalizeNetworkBlock(block));
|
|
131
135
|
}
|
|
132
136
|
}, [state]);
|
|
133
137
|
|
|
@@ -192,11 +196,7 @@ export default function Network({ port, client, dirty, registerSave }: SettingsP
|
|
|
192
196
|
: updated) as NetworkSnapshot;
|
|
193
197
|
dirty.clear();
|
|
194
198
|
const block = fresh.network ?? {};
|
|
195
|
-
setDraft(
|
|
196
|
-
bindHost: block.bindHost,
|
|
197
|
-
lanBypass: block.lanBypass,
|
|
198
|
-
remoteAccess: { ...(block.remoteAccess ?? {}) },
|
|
199
|
-
});
|
|
199
|
+
setDraft(normalizeNetworkBlock(block));
|
|
200
200
|
setData(fresh);
|
|
201
201
|
await refresh();
|
|
202
202
|
}, [client, dirty, lockoutRisk, refresh, setData]);
|
|
@@ -112,11 +112,11 @@ export function interpretTelegramProbe(payload: unknown): HealthState {
|
|
|
112
112
|
return { kind: 'unknown', reason: 'Empty probe response.' };
|
|
113
113
|
}
|
|
114
114
|
const p = payload as Record<string, unknown>;
|
|
115
|
-
if (p
|
|
116
|
-
const username = typeof p
|
|
117
|
-
return { kind: 'ok', detail:
|
|
115
|
+
if (p['ok'] === true) {
|
|
116
|
+
const username = typeof p['username'] === 'string' ? p['username'] : undefined;
|
|
117
|
+
return username ? { kind: 'ok', detail: `@${username}` } : { kind: 'ok' };
|
|
118
118
|
}
|
|
119
|
-
const reason = typeof p
|
|
119
|
+
const reason = typeof p['error'] === 'string' ? p['error'] : 'Probe failed.';
|
|
120
120
|
return { kind: 'error', reason };
|
|
121
121
|
}
|
|
122
122
|
|
|
@@ -125,23 +125,23 @@ export function interpretDiscordHealth(payload: unknown): HealthState {
|
|
|
125
125
|
return { kind: 'unknown', reason: 'Empty health response.' };
|
|
126
126
|
}
|
|
127
127
|
const p = payload as Record<string, unknown>;
|
|
128
|
-
const discord = (p
|
|
129
|
-
? p
|
|
128
|
+
const discord = (p['discord'] && typeof p['discord'] === 'object')
|
|
129
|
+
? p['discord'] as Record<string, unknown>
|
|
130
130
|
: null;
|
|
131
131
|
if (!discord) {
|
|
132
132
|
return { kind: 'unknown', reason: 'No discord block in /api/health.' };
|
|
133
133
|
}
|
|
134
|
-
if (discord
|
|
134
|
+
if (discord['ready'] === true && discord['degraded'] !== true) {
|
|
135
135
|
return { kind: 'ok' };
|
|
136
136
|
}
|
|
137
|
-
if (discord
|
|
138
|
-
const why = typeof discord
|
|
139
|
-
? discord
|
|
137
|
+
if (discord['degraded'] === true) {
|
|
138
|
+
const why = typeof discord['degradedReason'] === 'string'
|
|
139
|
+
? discord['degradedReason']
|
|
140
140
|
: 'MESSAGE_CONTENT intent missing — slash commands only.';
|
|
141
141
|
return { kind: 'degraded', detail: why };
|
|
142
142
|
}
|
|
143
|
-
if (discord
|
|
144
|
-
const why = typeof discord
|
|
143
|
+
if (discord['ready'] === false) {
|
|
144
|
+
const why = typeof discord['error'] === 'string' ? discord['error'] : 'Bot not connected.';
|
|
145
145
|
return { kind: 'error', reason: why };
|
|
146
146
|
}
|
|
147
147
|
return { kind: 'unknown', reason: 'Discord status indeterminate.' };
|
|
@@ -58,19 +58,20 @@ export function unwrapRuntimeEmployees(response: RuntimeEmployeesResponse | Runt
|
|
|
58
58
|
export function normalizeRuntimeEmployee(value: unknown): RuntimeEmployeeRecord | null {
|
|
59
59
|
if (!value || typeof value !== 'object') return null;
|
|
60
60
|
const row = value as Record<string, unknown>;
|
|
61
|
-
const id = typeof row
|
|
62
|
-
const name = typeof row
|
|
61
|
+
const id = typeof row['id'] === 'string' ? row['id'] : '';
|
|
62
|
+
const name = typeof row['name'] === 'string' ? row['name'] : '';
|
|
63
63
|
if (!id || !name) return null;
|
|
64
|
-
const source = row
|
|
65
|
-
|
|
64
|
+
const source = row['source'] === 'static' || id.startsWith('static:') ? 'static' : 'db';
|
|
65
|
+
const employee: RuntimeEmployeeRecord = {
|
|
66
66
|
id,
|
|
67
67
|
name,
|
|
68
|
-
cli: typeof row
|
|
69
|
-
model: typeof row
|
|
70
|
-
role: typeof row
|
|
71
|
-
status: typeof row.status === 'string' ? row.status : undefined,
|
|
68
|
+
cli: typeof row['cli'] === 'string' && row['cli'] ? row['cli'] : 'claude',
|
|
69
|
+
model: typeof row['model'] === 'string' && row['model'] ? row['model'] : 'default',
|
|
70
|
+
role: typeof row['role'] === 'string' ? row['role'] : '',
|
|
72
71
|
source,
|
|
73
72
|
};
|
|
73
|
+
if (typeof row['status'] === 'string') employee.status = row['status'];
|
|
74
|
+
return employee;
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
export function runtimeEmployeeError(row: RuntimeEmployeeRecord): string | null {
|
|
@@ -174,13 +175,14 @@ function toDbCreatePayload(row: RuntimeEmployeeRecord): Record<string, string> {
|
|
|
174
175
|
}
|
|
175
176
|
|
|
176
177
|
function stableRuntimeEmployee(row: RuntimeEmployeeRecord): RuntimeEmployeeRecord {
|
|
177
|
-
|
|
178
|
+
const stable: RuntimeEmployeeRecord = {
|
|
178
179
|
id: row.id,
|
|
179
180
|
name: row.name,
|
|
180
181
|
cli: row.cli,
|
|
181
182
|
model: row.model,
|
|
182
183
|
role: row.role,
|
|
183
|
-
status: row.status,
|
|
184
184
|
source: row.source,
|
|
185
185
|
};
|
|
186
|
+
if (row.status !== undefined) stable.status = row.status;
|
|
187
|
+
return stable;
|
|
186
188
|
}
|
|
@@ -73,18 +73,18 @@ export function normalizeEmployees(payload: unknown): EmployeeRecord[] {
|
|
|
73
73
|
}
|
|
74
74
|
if (!raw || typeof raw !== 'object') continue;
|
|
75
75
|
const r = raw as Record<string, unknown>;
|
|
76
|
-
const name = typeof r
|
|
77
|
-
if (!name && !r
|
|
76
|
+
const name = typeof r['name'] === 'string' ? r['name'] : '';
|
|
77
|
+
if (!name && !r['id']) continue;
|
|
78
78
|
fallback += 1;
|
|
79
79
|
const id =
|
|
80
|
-
typeof r
|
|
81
|
-
? r
|
|
80
|
+
typeof r['id'] === 'string' && r['id'].trim()
|
|
81
|
+
? r['id'].trim()
|
|
82
82
|
: `emp_unknown_${fallback}`;
|
|
83
83
|
const cli =
|
|
84
|
-
typeof r
|
|
85
|
-
const role = typeof r
|
|
86
|
-
const prompt = typeof r
|
|
87
|
-
const active = r
|
|
84
|
+
typeof r['cli'] === 'string' && r['cli'].trim() ? r['cli'].trim() : 'claude';
|
|
85
|
+
const role = typeof r['role'] === 'string' ? r['role'] : '';
|
|
86
|
+
const prompt = typeof r['prompt'] === 'string' ? r['prompt'] : '';
|
|
87
|
+
const active = r['active'] !== false;
|
|
88
88
|
out.push({ id, name, cli, role, prompt, active });
|
|
89
89
|
}
|
|
90
90
|
return out;
|
|
@@ -136,7 +136,7 @@ export function toPersistShape(rows: ReadonlyArray<EmployeeRecord>): unknown[] {
|
|
|
136
136
|
role: row.role.trim(),
|
|
137
137
|
active: row.active,
|
|
138
138
|
};
|
|
139
|
-
if (row
|
|
139
|
+
if (row['prompt'].trim()) out['prompt'] = row['prompt'];
|
|
140
140
|
return out;
|
|
141
141
|
});
|
|
142
142
|
}
|