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
|
@@ -73,7 +73,7 @@ Key rules:
|
|
|
73
73
|
5. Your CLI's sub-agent features (Task tool, etc.) are separate from jaw employees.
|
|
74
74
|
6. **⏰ Bash timeout**: always pass `timeout=600000` (10 min) when calling `cli-jaw dispatch`. Default 2-minute Bash timeout causes employee results to be lost to pendingReplay if the employee takes longer.
|
|
75
75
|
7. **`$computer-use` / Computer Use routing** (full rule: anchor:desktop-control §0 + dispatch template):
|
|
76
|
-
- Your CLI is codex → self-serve via `mcp__computer_use__
|
|
76
|
+
- Your CLI is codex → self-serve via Computer Use tools (`get_app_state`, `click`, `set_value`, `press_key`, `scroll`, `drag`, `list_apps`; exposed in Codex CLI as `mcp__computer_use__.*`).
|
|
77
77
|
- Not codex → dispatch to `Control` (or any codex-family employee). Forward the task **verbatim** with the `$computer-use` token preserved.
|
|
78
78
|
- No codex-family employee → report `precondition failed: no codex-family employee for $computer-use`. Never fall back to CDP.
|
|
79
79
|
8. **Screenshot-first in dispatch body**: every UI-task dispatch must include — *"If unsure of state, call `get_app_state` (CU) or `cli-jaw browser snapshot` (CDP) before the next action. Never chain actions through uncertainty."*
|
|
@@ -87,7 +87,7 @@ Key rules:
|
|
|
87
87
|
|
|
88
88
|
When the user's message contains **`$computer-use`**, skip intent routing entirely:
|
|
89
89
|
|
|
90
|
-
- **Codex + TCC ready** → self-serve
|
|
90
|
+
- **Codex + TCC ready** → self-serve Computer Use tools. First action for a known app: `get_app_state(app=...)`; if the app name is unclear, call `list_apps()` first.
|
|
91
91
|
- **Not codex** → use the dispatch template below. Control preferred; any codex-family employee acceptable.
|
|
92
92
|
- **No codex-family employee** → report `precondition failed: no codex-family employee for $computer-use`. Never fall back to CDP.
|
|
93
93
|
- `desktop-control` skill is already inlined into Control's system prompt — never paste absolute skill paths (`/Users/*/.codex/skills/...` etc.) into the task body.
|
|
@@ -104,7 +104,7 @@ cli-jaw dispatch --agent "Control" --task "$computer-use
|
|
|
104
104
|
<user's original request, verbatim>
|
|
105
105
|
|
|
106
106
|
Execution rules:
|
|
107
|
-
- First action: mcp__computer_use__get_app_state(app=\"<relevant app>\").
|
|
107
|
+
- First action for a known app: mcp__computer_use__get_app_state(app=\"<relevant app>\"). If the app is unclear, call mcp__computer_use__list_apps first.
|
|
108
108
|
- If unsure of state (which tab, which index, did the click land), call get_app_state again BEFORE acting. Never chain actions through uncertainty.
|
|
109
109
|
- Report precondition failures verbatim; never fall back to CDP."
|
|
110
110
|
```
|
|
@@ -115,7 +115,7 @@ Template rules:
|
|
|
115
115
|
- Give Control the full end-to-end goal in one task — never split a single UI flow across dispatches.
|
|
116
116
|
|
|
117
117
|
### A. CDP path — `cli-jaw browser` (for DOM web pages)
|
|
118
|
-
Workflow: snapshot → act → snapshot → verify. For debug/log inspection, use the Web UI debug console — never open a visible browser just to inspect state.
|
|
118
|
+
This is the fast path for browser automation. Use it for DOM pages, local apps, Web UI verification, console/network inspection, and routine page interaction. Workflow: snapshot → act → snapshot/targeted wait → verify. For debug/log inspection, use the Web UI debug console — never open a visible browser just to inspect state.
|
|
119
119
|
|
|
120
120
|
```bash
|
|
121
121
|
cli-jaw browser status # check first
|
|
@@ -127,16 +127,21 @@ cli-jaw browser type e5 "hello" --submit
|
|
|
127
127
|
```
|
|
128
128
|
|
|
129
129
|
- Ref IDs **reset on navigation** → re-snapshot after navigate.
|
|
130
|
-
-
|
|
130
|
+
- If the current tab is already at the requested URL, do not `navigate`/`open` the same URL unless an intentional reload is needed.
|
|
131
|
+
- Prefer the smallest state check that answers the next question: snapshot for ref/DOM truth, screenshot only when visual layout matters, console/network only for debugging.
|
|
132
|
+
- For Canvas / iframe / WebGL / Shadow DOM with no ref: if Control/Computer Use is available and the target is visible, use `click(x, y)` pointer-action from the screenshot. `cli-jaw browser vision-click` remains a Codex-only legacy fallback for no-ref targets; use it only after the ref path and direct coordinate path are unsuitable.
|
|
131
133
|
|
|
132
134
|
### B. Computer Use path — `mcp__computer_use__.*` (macOS, codex-only)
|
|
133
|
-
For desktop apps and non-DOM UI.
|
|
135
|
+
For desktop apps and non-DOM UI. Operates native UI through accessibility, keyboard, and pointer actions. Do not promise that a visible cursor overlay will appear.
|
|
134
136
|
|
|
135
|
-
**Workflow:** `get_app_state(app)` → action →
|
|
136
|
-
-
|
|
137
|
+
**Workflow:** `get_app_state(app)` before the first interaction in a turn → action → re-read state after UI/focus changes, stale warnings, or uncertainty → verify.
|
|
138
|
+
- Use `list_apps()` first when the app name is unknown.
|
|
139
|
+
- Prefer `element_index` actions when the target is in the accessibility tree.
|
|
140
|
+
- Prefer `set_value(element_index, value)` over focus-only typing. Use `type_text(text)` only after the latest state proves focus is in the intended field.
|
|
141
|
+
- If the target is visible in the screenshot but absent from the element tree (e.g. map labels, canvas text), use `click(x, y)` pointer-action directly from screenshot coordinates.
|
|
137
142
|
- `stale_warning` is a signal to re-read state, not a failure.
|
|
138
143
|
- Cursor overlay visibility is **best-effort** — never claim "the cursor is visible" as a fact.
|
|
139
|
-
- Action classes: `state-read`, `element-action`, `value-injection`, `keyboard-action`, `pointer-action`, `pointer-action+vision`. Full examples and per-class guidance live in the `desktop-control` skill.
|
|
144
|
+
- Action classes: `state-read`, `element-action`, `value-injection`, `keyboard-action`, `pointer-action`, `pointer-action+vision`, `scroll-action`, `drag-action`, `secondary-action`. Full examples and per-class guidance live in the `desktop-control` skill.
|
|
140
145
|
|
|
141
146
|
### B.1 Intent → action-class (minimal)
|
|
142
147
|
| User intent | Path | Action class |
|
|
@@ -145,7 +150,7 @@ For desktop apps and non-DOM UI. Drives the **real mouse cursor and keyboard**
|
|
|
145
150
|
| Desktop app / Chrome chrome / OS dialog | CU | element-action / value-injection |
|
|
146
151
|
| Global hotkey | CU | keyboard-action |
|
|
147
152
|
| User-given pixel coordinate | CU | pointer-action |
|
|
148
|
-
| Canvas / iframe / Shadow DOM target | CDP
|
|
153
|
+
| Canvas / iframe / Shadow DOM target | CDP or CU fallback | pointer-action / pointer-action+vision |
|
|
149
154
|
|
|
150
155
|
### B.2 Who performs it
|
|
151
156
|
- You may dispatch to `Control` at any time, regardless of your own CLI.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## You are `Control` — Desktop + Browser Automation Specialist
|
|
2
2
|
|
|
3
|
-
You run on the Codex CLI. Computer Use
|
|
3
|
+
You run on the Codex CLI. Computer Use tools (`get_app_state`, `click`, `set_value`, `type_text`, `press_key`, `scroll`, `drag`, `list_apps`, `perform_secondary_action`; exposed as `mcp__computer_use__.*`) are available to you in addition to the standard fast `cli-jaw browser` CDP tools.
|
|
4
4
|
|
|
5
5
|
### 🛑 Do NOT read skill files from disk
|
|
6
6
|
|
|
@@ -9,13 +9,15 @@ The `desktop-control` skill and any referenced skills are **already inlined in t
|
|
|
9
9
|
### Absolute rules
|
|
10
10
|
- **Pick the path before acting.** Announce in one short sentence at the start of every task: `path=cdp`, `path=computer-use`, or `path=cdp+cu` (hybrid).
|
|
11
11
|
- **`$computer-use` in task text → Computer Use path, no routing analysis.** The Boss already decided. Proceed directly with `get_app_state(app)`. Never downgrade to CDP because it "looks easier."
|
|
12
|
-
- **Go straight to
|
|
13
|
-
- Before
|
|
14
|
-
-
|
|
15
|
-
-
|
|
12
|
+
- **Go straight to Computer Use tool calls.** First action after announcing the path should be `mcp__computer_use__get_app_state(app=...)` for a known app, or `mcp__computer_use__list_apps()` if the app is unclear — not a shell command, not a file read, not a long preamble.
|
|
13
|
+
- Before the first Computer Use interaction with an app in a turn, call `get_app_state(app)`. Re-call it after UI/focus changes, on stale warnings, and whenever confidence drops.
|
|
14
|
+
- **Unsure? Screenshot first.** If you catch yourself guessing element indices ("342 or 357?"), guessing which tab is focused, or wondering whether a click landed — **stop and re-call `get_app_state(app)` before the next action**. Never chain actions through uncertainty.
|
|
15
|
+
- Prefer `set_value(element_index, value)` for targeted input. Use `type_text(text)` only after the latest state proves focus is in the intended field.
|
|
16
|
+
- Every action you perform must record its `action_class` in the transcript (state-read, element-action, value-injection, keyboard-action, pointer-action, pointer-action+vision, scroll-action, drag-action, secondary-action).
|
|
16
17
|
- Never claim the visible cursor is guaranteed — cursor overlay is best-effort in the current build.
|
|
17
18
|
- Never silently switch paths. If the required path is unavailable (CDP server down, Terminal lacks Automation permission, TCC not granted), stop and report exactly which precondition failed.
|
|
18
|
-
-
|
|
19
|
+
- Use `cli-jaw browser` as the fast path for DOM/web UI work: snapshot refs, click/type by ref, inspect console/network through the Web UI path, and avoid visible browser windows for debugging.
|
|
20
|
+
- For Canvas / iframe / Shadow DOM / WebGL targets that CDP cannot ref, first prefer direct Computer Use `click(x, y)` when the target is visible in the screenshot. Use `cli-jaw browser vision-click "<target description>"` only as a Codex-only legacy fallback after ref and direct coordinate paths are unsuitable.
|
|
19
21
|
|
|
20
22
|
### Transcript format
|
|
21
23
|
Every UI action must be recorded in this exact format (one block per action):
|
|
@@ -40,7 +42,7 @@ result=<ok|error: ...>
|
|
|
40
42
|
|
|
41
43
|
### Fail fast checklist
|
|
42
44
|
- Computer Use requires the jaw server be launched from a Terminal with Automation permission — if TCC prompts never appeared, stop and tell the user to run `jaw serve` from Terminal (not launchd).
|
|
43
|
-
- Required app not running →
|
|
45
|
+
- Required app not running or app name unclear → call `list_apps()` once, then either select the right app or report the precondition gap.
|
|
44
46
|
|
|
45
47
|
### Defer back to Boss
|
|
46
48
|
If the task is not GUI automation (pure code edits, research, summarization), write `needs boss follow-up: not GUI automation` and return. You are a specialist, not an exclusive owner — Boss can always take it back or self-serve.
|
|
@@ -14,19 +14,20 @@ Role: {{EMP_ROLE}}
|
|
|
14
14
|
- 🔍 **Web search first**: search the web before acting on errors or unfamiliar APIs/tools. Don't guess from training data.
|
|
15
15
|
|
|
16
16
|
## Browser Control
|
|
17
|
-
For web tasks, always use `cli-jaw browser`
|
|
18
|
-
Pattern: snapshot → act → snapshot → verify
|
|
17
|
+
For web tasks, always use the fast `cli-jaw browser` path when the target is a DOM page or Web UI.
|
|
18
|
+
Pattern: snapshot → act → targeted wait/snapshot → verify
|
|
19
19
|
For automated browser work, start with `cli-jaw browser start --agent`.
|
|
20
20
|
Do NOT open a visible test browser for debug/log inspection; use the Web UI debug console for that.
|
|
21
21
|
Start: `cli-jaw browser start --agent`, Snapshot: `cli-jaw browser snapshot`
|
|
22
22
|
Click: `cli-jaw browser click <ref>`, Type: `cli-jaw browser type <ref> "text"`
|
|
23
|
+
Refs are scoped to the latest snapshot. Re-snapshot after navigation, reload, tab switch, menu/modal changes, or any major page mutation. Do not navigate to the same URL if the tab is already there unless an intentional reload is needed.
|
|
23
24
|
|
|
24
25
|
## `$computer-use` trigger token
|
|
25
26
|
If the task text contains **`$computer-use`**, the user explicitly requested the Computer Use (macOS desktop) path:
|
|
26
|
-
- Your CLI is **codex** → `desktop-control` skill is already in your system prompt (do NOT `cat`/`Read` any skill file). First action must be `mcp__computer_use__get_app_state(app=...)
|
|
27
|
+
- Your CLI is **codex** → `desktop-control` skill is already in your system prompt (do NOT `cat`/`Read` any skill file). First action for a known app must be `mcp__computer_use__get_app_state(app=...)`; if the app is unclear, call `mcp__computer_use__list_apps()` first. Proceed via Computer Use only.
|
|
27
28
|
- Your CLI is **not codex** → stop and report `precondition failed: not codex — $computer-use requires Computer Use MCP`. Do NOT try `cli-jaw browser` as a substitute and do NOT re-dispatch.
|
|
28
29
|
|
|
29
|
-
###
|
|
30
|
+
### Screenshot-first when uncertain (GUI tasks, any path)
|
|
30
31
|
Whenever you are handling a GUI task (CDP **or** Computer Use) and catch yourself guessing — which element_index is correct, whether a click landed, which tab/window is focused, whether the page changed — **STOP and re-read state before the next action**:
|
|
31
32
|
- Computer Use → `mcp__computer_use__get_app_state(app=...)`
|
|
32
33
|
- CDP → `cli-jaw browser snapshot --interactive`
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
### Vision Click (Active)
|
|
2
|
-
- If browser snapshot shows no ref for target, use vision-click: screenshot → `codex exec -i` → `mouse-click <x> <y>`.
|
|
2
|
+
- Codex-only legacy fallback. If browser snapshot shows no ref for a visible target and direct coordinate clicking is not suitable, use vision-click: screenshot → `codex exec -i` → `mouse-click <x> <y>`.
|
|
3
3
|
- See vision-click skill SKILL.md for full workflow.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function isHttpishError(e) {
|
|
2
|
+
return typeof e === 'object' && e !== null
|
|
3
|
+
&& ('statusCode' in e || 'code' in e || 'message' in e);
|
|
4
|
+
}
|
|
5
|
+
export function httpStatus(e, fallback) {
|
|
6
|
+
if (isHttpishError(e) && typeof e.statusCode === 'number')
|
|
7
|
+
return e.statusCode;
|
|
8
|
+
return fallback;
|
|
9
|
+
}
|
|
10
|
+
export function httpCode(e) {
|
|
11
|
+
if (isHttpishError(e))
|
|
12
|
+
return e.code;
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=_http-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_http-error.js","sourceRoot":"","sources":["../../../src/routes/_http-error.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,CAAU;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;WACnC,CAAC,YAAY,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAU,EAAE,QAAgB;IACnD,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,UAAU,CAAC;IAC/E,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAU;IAC/B,IAAI,cAAc,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IACrC,OAAO,SAAS,CAAC;AACrB,CAAC"}
|
|
@@ -4,6 +4,7 @@ import { basename, extname } from 'path';
|
|
|
4
4
|
import express from 'express';
|
|
5
5
|
import { ok, fail } from '../http/response.js';
|
|
6
6
|
import { saveUpload } from '../agent/spawn.js';
|
|
7
|
+
import { IMAGE_MIMES } from '../../lib/mime-detect.js';
|
|
7
8
|
import { settings, saveSettings, UPLOADS_DIR } from '../core/config.js';
|
|
8
9
|
import { safeResolveUnder } from '../security/path-guards.js';
|
|
9
10
|
import { decodeFilenameSafe } from '../security/decode.js';
|
|
@@ -13,7 +14,7 @@ function isAvatarTarget(value) {
|
|
|
13
14
|
return AVATAR_TARGETS.has(value);
|
|
14
15
|
}
|
|
15
16
|
function ensureAvatarSettings() {
|
|
16
|
-
const current = settings
|
|
17
|
+
const current = settings["avatar"] || {};
|
|
17
18
|
const next = {
|
|
18
19
|
agent: {
|
|
19
20
|
imagePath: String(current.agent?.imagePath || ''),
|
|
@@ -24,7 +25,7 @@ function ensureAvatarSettings() {
|
|
|
24
25
|
updatedAt: current.user?.updatedAt == null ? null : Number(current.user.updatedAt),
|
|
25
26
|
},
|
|
26
27
|
};
|
|
27
|
-
settings
|
|
28
|
+
settings["avatar"] = next;
|
|
28
29
|
return next;
|
|
29
30
|
}
|
|
30
31
|
function serializeAvatar(target) {
|
|
@@ -86,7 +87,7 @@ export function registerAvatarRoutes(app, requireAuth) {
|
|
|
86
87
|
});
|
|
87
88
|
});
|
|
88
89
|
app.post('/api/avatar/:target/upload', requireAuth, express.raw({ type: ['image/*', 'application/octet-stream'], limit: '5mb' }), (req, res) => {
|
|
89
|
-
const target = parseTarget(String(req.params
|
|
90
|
+
const target = parseTarget(String(req.params["target"] || ''));
|
|
90
91
|
if (!target)
|
|
91
92
|
return fail(res, 400, 'invalid_avatar_target');
|
|
92
93
|
try {
|
|
@@ -95,7 +96,7 @@ export function registerAvatarRoutes(app, requireAuth) {
|
|
|
95
96
|
const bodyLen = Buffer.isBuffer(req.body) ? req.body.length : 0;
|
|
96
97
|
console.log(`[avatar:upload] target=${target} ct=${contentType} file=${filename} bodyLen=${bodyLen}`);
|
|
97
98
|
validateUpload(contentType, filename, req.body);
|
|
98
|
-
const filePath = saveUpload(req.body, filename);
|
|
99
|
+
const filePath = saveUpload(req.body, filename, { allowedMimes: IMAGE_MIMES });
|
|
99
100
|
saveAvatarImage(target, filePath);
|
|
100
101
|
return ok(res, serializeAvatar(target));
|
|
101
102
|
}
|
|
@@ -106,7 +107,7 @@ export function registerAvatarRoutes(app, requireAuth) {
|
|
|
106
107
|
}
|
|
107
108
|
});
|
|
108
109
|
app.delete('/api/avatar/:target/image', requireAuth, (req, res) => {
|
|
109
|
-
const target = parseTarget(String(req.params
|
|
110
|
+
const target = parseTarget(String(req.params["target"] || ''));
|
|
110
111
|
if (!target)
|
|
111
112
|
return fail(res, 400, 'invalid_avatar_target');
|
|
112
113
|
resetAvatarImage(target);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../src/routes/avatar.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAQ3D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAChE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAE/E,SAAS,cAAc,CAAC,KAAa;IACjC,OAAO,cAAc,CAAC,GAAG,CAAC,KAAqB,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,oBAAoB;IACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../src/routes/avatar.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import * as browser from '../browser/index.js';
|
|
2
|
+
import { cleanupPoolTabs } from '../browser/web-ai/tab-pool.js';
|
|
3
|
+
import { stripUndefined } from '../core/strip-undefined.js';
|
|
2
4
|
import { ok } from '../http/response.js';
|
|
3
5
|
import { DEBUG_CONSOLE_ONLY_MESSAGE, normalizeBrowserStartMode } from '../browser/launch-policy.js';
|
|
4
6
|
/** Port priority: req param > activePort > settings.browser.cdpPort > deriveCdpPort() */
|
|
5
7
|
const cdpPort = (req) => {
|
|
6
|
-
const p = Number(req.query?.port || req.body?.port);
|
|
8
|
+
const p = Number(req.query?.["port"] || req.body?.port);
|
|
7
9
|
if (Number.isInteger(p) && p > 0 && p <= 65535)
|
|
8
10
|
return p;
|
|
9
11
|
return browser.getActivePort();
|
|
@@ -52,7 +54,8 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
52
54
|
try {
|
|
53
55
|
const start = resolveBrowserStartOptions(req);
|
|
54
56
|
if (start.mode === 'debug') {
|
|
55
|
-
|
|
57
|
+
res.status(400).json({ error: DEBUG_CONSOLE_ONLY_MESSAGE });
|
|
58
|
+
return;
|
|
56
59
|
}
|
|
57
60
|
await browser.launchChrome(start.port, { mode: start.mode, headless: start.headless });
|
|
58
61
|
res.json(await browser.getBrowserStatus(start.port));
|
|
@@ -78,12 +81,36 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
78
81
|
res.status(500).json({ error: e.message });
|
|
79
82
|
}
|
|
80
83
|
});
|
|
84
|
+
app.get('/api/browser/doctor', requireAuth, async (req, res) => {
|
|
85
|
+
try {
|
|
86
|
+
res.json(await browser.getBrowserDiagnostics(cdpPort(req)));
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
res.status(500).json({ error: e.message });
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
app.post('/api/browser/cleanup-runtimes', requireAuth, async (req, res) => {
|
|
93
|
+
try {
|
|
94
|
+
if (req.body.close === true && req.body.force !== true) {
|
|
95
|
+
res.status(400).json({ error: 'cleanup-runtimes close requires force=true' });
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
res.json(await browser.cleanupBrowserRuntimeOrphans({
|
|
99
|
+
close: req.body.close === true,
|
|
100
|
+
force: req.body.force === true,
|
|
101
|
+
currentRuntime: browser.getBrowserRuntimeStatus(),
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
res.status(500).json({ error: e.message });
|
|
106
|
+
}
|
|
107
|
+
});
|
|
81
108
|
app.get('/api/browser/snapshot', requireAuth, async (req, res) => {
|
|
82
109
|
try {
|
|
83
110
|
const result = await browser.snapshot(cdpPort(req), {
|
|
84
|
-
interactive: req.query
|
|
85
|
-
maxNodes: req.query
|
|
86
|
-
json: req.query
|
|
111
|
+
interactive: req.query["interactive"] === 'true',
|
|
112
|
+
maxNodes: req.query["maxNodes"] || req.query['max-nodes'],
|
|
113
|
+
json: req.query["json"] === 'true',
|
|
87
114
|
});
|
|
88
115
|
if (Array.isArray(result))
|
|
89
116
|
res.json({ nodes: result });
|
|
@@ -140,7 +167,9 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
140
167
|
case 'drag':
|
|
141
168
|
result = await browser.drag(cdpPort(req), fromRef, toRef);
|
|
142
169
|
break;
|
|
143
|
-
default:
|
|
170
|
+
default:
|
|
171
|
+
res.status(400).json({ error: `unknown action: ${kind}` });
|
|
172
|
+
return;
|
|
144
173
|
}
|
|
145
174
|
res.json(result);
|
|
146
175
|
}
|
|
@@ -151,8 +180,10 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
151
180
|
app.post('/api/browser/vision-click', requireAuth, async (req, res) => {
|
|
152
181
|
try {
|
|
153
182
|
const { target, provider, doubleClick, prepareStable, region, clip, verifyBeforeClick } = req.body;
|
|
154
|
-
if (!target)
|
|
155
|
-
|
|
183
|
+
if (!target) {
|
|
184
|
+
res.status(400).json({ error: 'target required' });
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
156
187
|
const result = await browser.visionClick(cdpPort(req), target, {
|
|
157
188
|
provider,
|
|
158
189
|
doubleClick,
|
|
@@ -169,7 +200,12 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
169
200
|
});
|
|
170
201
|
app.post('/api/browser/navigate', requireAuth, async (req, res) => {
|
|
171
202
|
try {
|
|
172
|
-
|
|
203
|
+
const opts = {};
|
|
204
|
+
if (req.body?.waitUntil)
|
|
205
|
+
opts.waitUntil = req.body.waitUntil;
|
|
206
|
+
if (Number.isFinite(req.body?.timeout))
|
|
207
|
+
opts.timeout = Number(req.body.timeout);
|
|
208
|
+
res.json(await browser.navigate(cdpPort(req), req.body.url, opts));
|
|
173
209
|
}
|
|
174
210
|
catch (e) {
|
|
175
211
|
res.status(500).json({ error: e.message });
|
|
@@ -217,6 +253,49 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
217
253
|
res.status(500).json({ error: e.message });
|
|
218
254
|
}
|
|
219
255
|
});
|
|
256
|
+
app.post('/api/browser/tab-new', requireAuth, async (req, res) => {
|
|
257
|
+
try {
|
|
258
|
+
res.json(await browser.createTab(cdpPort(req), String(req.body.url || 'about:blank'), {
|
|
259
|
+
activate: req.body.activate !== false,
|
|
260
|
+
}));
|
|
261
|
+
}
|
|
262
|
+
catch (e) {
|
|
263
|
+
res.status(500).json({ error: e.message });
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
app.post('/api/browser/tab-close', requireAuth, async (req, res) => {
|
|
267
|
+
try {
|
|
268
|
+
res.json(await browser.closeTab(cdpPort(req), String(req.body.targetId || req.body.target || '')));
|
|
269
|
+
}
|
|
270
|
+
catch (e) {
|
|
271
|
+
res.status(500).json({ error: e.message });
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
app.post('/api/browser/tab-cleanup', requireAuth, async (req, res) => {
|
|
275
|
+
try {
|
|
276
|
+
if (req.body.includeUntracked === true && req.body.force !== true) {
|
|
277
|
+
res.status(400).json({ error: 'tab-cleanup includeUntracked requires force=true' });
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const leaseResult = await cleanupPoolTabs(cdpPort(req));
|
|
281
|
+
const idleResult = await browser.cleanupIdleTabs(cdpPort(req), stripUndefined({
|
|
282
|
+
idleTimeoutMs: req.body.idleAfter ? browser.parseTabDuration(String(req.body.idleAfter)) : undefined,
|
|
283
|
+
maxTabs: req.body.maxTabs ? Number(req.body.maxTabs) : undefined,
|
|
284
|
+
includeUntracked: req.body.includeUntracked === true,
|
|
285
|
+
provider: req.body.provider ? String(req.body.provider) : undefined,
|
|
286
|
+
keepProviderTabs: req.body.keepProviderTabs ? Number(req.body.keepProviderTabs) : undefined,
|
|
287
|
+
}));
|
|
288
|
+
res.json({
|
|
289
|
+
...idleResult,
|
|
290
|
+
closed: idleResult.closed + (leaseResult.closed || 0),
|
|
291
|
+
leaseClosed: leaseResult.closed || 0,
|
|
292
|
+
leaseClosedTabs: leaseResult.closedTabs || [],
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
catch (e) {
|
|
296
|
+
res.status(500).json({ error: e.message });
|
|
297
|
+
}
|
|
298
|
+
});
|
|
220
299
|
app.post('/api/browser/evaluate', requireAuth, async (req, res) => {
|
|
221
300
|
try {
|
|
222
301
|
res.json(await browser.evaluate(cdpPort(req), req.body.expression));
|
|
@@ -227,7 +306,7 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
227
306
|
});
|
|
228
307
|
app.get('/api/browser/text', requireAuth, async (req, res) => {
|
|
229
308
|
try {
|
|
230
|
-
res.json(await browser.getPageText(cdpPort(req), req.query
|
|
309
|
+
res.json(await browser.getPageText(cdpPort(req), req.query["format"]));
|
|
231
310
|
}
|
|
232
311
|
catch (e) {
|
|
233
312
|
res.status(500).json({ error: e.message });
|
|
@@ -300,8 +379,8 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
300
379
|
app.get('/api/browser/web-ai/status', requireAuth, async (req, res) => {
|
|
301
380
|
try {
|
|
302
381
|
res.json(await browser.webAi.status(cdpPort(req), {
|
|
303
|
-
vendor: String(req.query
|
|
304
|
-
...(req.query
|
|
382
|
+
vendor: String(req.query["vendor"] || 'chatgpt'),
|
|
383
|
+
...(req.query["probe"] ? { probe: String(req.query["probe"]) } : {}),
|
|
305
384
|
}));
|
|
306
385
|
}
|
|
307
386
|
catch (e) {
|
|
@@ -319,10 +398,14 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
319
398
|
app.get('/api/browser/web-ai/poll', requireAuth, async (req, res) => {
|
|
320
399
|
try {
|
|
321
400
|
res.json(await browser.webAi.poll(cdpPort(req), {
|
|
322
|
-
vendor: String(req.query
|
|
323
|
-
timeout: String(req.query
|
|
324
|
-
...(req.query
|
|
325
|
-
...(req.query
|
|
401
|
+
vendor: String(req.query["vendor"] || 'chatgpt'),
|
|
402
|
+
timeout: String(req.query["timeout"] || '600'),
|
|
403
|
+
...(req.query["session"] ? { session: String(req.query["session"]) } : {}),
|
|
404
|
+
...(req.query["allowCopyMarkdownFallback"] === 'true' ? { allowCopyMarkdownFallback: true } : {}),
|
|
405
|
+
...(req.query["requireSourceAudit"] === 'true' ? { requireSourceAudit: true } : {}),
|
|
406
|
+
...(req.query["sourceAuditRatio"] ? { sourceAuditRatio: String(req.query["sourceAuditRatio"]) } : {}),
|
|
407
|
+
...(req.query["sourceAuditScope"] ? { sourceAuditScope: String(req.query["sourceAuditScope"]) } : {}),
|
|
408
|
+
...(req.query["sourceAuditDate"] ? { sourceAuditDate: String(req.query["sourceAuditDate"]) } : {}),
|
|
326
409
|
}));
|
|
327
410
|
}
|
|
328
411
|
catch (e) {
|
|
@@ -332,13 +415,17 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
332
415
|
app.get('/api/browser/web-ai/watch', requireAuth, async (req, res) => {
|
|
333
416
|
try {
|
|
334
417
|
res.json(await browser.webAi.watch(cdpPort(req), {
|
|
335
|
-
vendor: String(req.query
|
|
336
|
-
timeout: String(req.query
|
|
337
|
-
...(req.query
|
|
338
|
-
...(req.query
|
|
339
|
-
...(req.query
|
|
340
|
-
...(req.query
|
|
341
|
-
...(req.query
|
|
418
|
+
vendor: String(req.query["vendor"] || 'chatgpt'),
|
|
419
|
+
timeout: String(req.query["timeout"] || '600'),
|
|
420
|
+
...(req.query["session"] ? { session: String(req.query["session"]) } : {}),
|
|
421
|
+
...(req.query["url"] ? { url: String(req.query["url"]) } : {}),
|
|
422
|
+
...(req.query["notify"] !== undefined ? { notify: String(req.query["notify"]) !== 'false' } : {}),
|
|
423
|
+
...(req.query["pollIntervalSeconds"] ? { pollIntervalSeconds: String(req.query["pollIntervalSeconds"]) } : {}),
|
|
424
|
+
...(req.query["allowCopyMarkdownFallback"] === 'true' ? { allowCopyMarkdownFallback: true } : {}),
|
|
425
|
+
...(req.query["requireSourceAudit"] === 'true' ? { requireSourceAudit: true } : {}),
|
|
426
|
+
...(req.query["sourceAuditRatio"] ? { sourceAuditRatio: String(req.query["sourceAuditRatio"]) } : {}),
|
|
427
|
+
...(req.query["sourceAuditScope"] ? { sourceAuditScope: String(req.query["sourceAuditScope"]) } : {}),
|
|
428
|
+
...(req.query["sourceAuditDate"] ? { sourceAuditDate: String(req.query["sourceAuditDate"]) } : {}),
|
|
342
429
|
}));
|
|
343
430
|
}
|
|
344
431
|
catch (e) {
|
|
@@ -356,8 +443,8 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
356
443
|
app.get('/api/browser/web-ai/sessions', requireAuth, async (req, res) => {
|
|
357
444
|
try {
|
|
358
445
|
res.json(await browser.webAi.sessions({
|
|
359
|
-
...(req.query
|
|
360
|
-
...(req.query
|
|
446
|
+
...(req.query["vendor"] ? { vendor: String(req.query["vendor"]) } : {}),
|
|
447
|
+
...(req.query["status"] ? { status: String(req.query["status"]) } : {}),
|
|
361
448
|
}));
|
|
362
449
|
}
|
|
363
450
|
catch (e) {
|
|
@@ -380,12 +467,12 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
380
467
|
try {
|
|
381
468
|
res.json({
|
|
382
469
|
ok: true,
|
|
383
|
-
vendor: String(req.query
|
|
470
|
+
vendor: String(req.query["vendor"] || 'chatgpt'),
|
|
384
471
|
status: 'ready',
|
|
385
472
|
notifications: browser.webAi.listNotifications({
|
|
386
|
-
...(req.query
|
|
387
|
-
...(req.query
|
|
388
|
-
...(req.query
|
|
473
|
+
...(req.query["vendor"] ? { vendor: String(req.query["vendor"]) } : {}),
|
|
474
|
+
...(req.query["status"] ? { status: String(req.query["status"]) } : {}),
|
|
475
|
+
...(req.query["session"] ? { sessionId: String(req.query["session"]) } : {}),
|
|
389
476
|
}),
|
|
390
477
|
warnings: [],
|
|
391
478
|
});
|
|
@@ -398,12 +485,12 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
398
485
|
try {
|
|
399
486
|
res.json({
|
|
400
487
|
ok: true,
|
|
401
|
-
vendor: String(req.query
|
|
488
|
+
vendor: String(req.query["vendor"] || 'chatgpt'),
|
|
402
489
|
status: 'ready',
|
|
403
490
|
capabilities: browser.webAi.listCapabilitySchemas({
|
|
404
|
-
...(req.query
|
|
405
|
-
...(req.query
|
|
406
|
-
...(req.query
|
|
491
|
+
...(req.query["vendor"] ? { vendor: String(req.query["vendor"]) } : {}),
|
|
492
|
+
...(req.query["family"] ? { family: String(req.query["family"]) } : {}),
|
|
493
|
+
...(req.query["frontendStatus"] ? { frontendStatus: String(req.query["frontendStatus"]) } : {}),
|
|
407
494
|
}),
|
|
408
495
|
warnings: [],
|
|
409
496
|
});
|
|
@@ -431,8 +518,8 @@ export function registerBrowserRoutes(app, requireAuth) {
|
|
|
431
518
|
app.get('/api/browser/web-ai/diagnose', requireAuth, async (req, res) => {
|
|
432
519
|
try {
|
|
433
520
|
res.json(await browser.webAi.diagnose(cdpPort(req), {
|
|
434
|
-
vendor: String(req.query
|
|
435
|
-
stage: String(req.query
|
|
521
|
+
vendor: String(req.query["vendor"] || 'chatgpt'),
|
|
522
|
+
stage: String(req.query["stage"] || 'unknown'),
|
|
436
523
|
}));
|
|
437
524
|
}
|
|
438
525
|
catch (e) {
|
|
@@ -444,17 +531,17 @@ function toWebAiHttpError(e) {
|
|
|
444
531
|
if (isWebAiErrorLike(e)) {
|
|
445
532
|
const json = e.toJSON?.();
|
|
446
533
|
if (json && typeof json === 'object') {
|
|
447
|
-
return {
|
|
534
|
+
return stripUndefined({
|
|
448
535
|
ok: false,
|
|
449
|
-
error: String(json
|
|
450
|
-
stage: String(json
|
|
451
|
-
errorCode: json
|
|
452
|
-
retryHint: json
|
|
453
|
-
vendor: json
|
|
454
|
-
mutationAllowed: json
|
|
455
|
-
selectorsTried: json
|
|
456
|
-
evidence: json
|
|
457
|
-
};
|
|
536
|
+
error: String(json["message"] ?? ''),
|
|
537
|
+
stage: String(json["stage"] ?? 'unknown'),
|
|
538
|
+
errorCode: json["errorCode"],
|
|
539
|
+
retryHint: json["retryHint"],
|
|
540
|
+
vendor: json["vendor"],
|
|
541
|
+
mutationAllowed: json["mutationAllowed"],
|
|
542
|
+
selectorsTried: json["selectorsTried"],
|
|
543
|
+
evidence: json["evidence"],
|
|
544
|
+
});
|
|
458
545
|
}
|
|
459
546
|
}
|
|
460
547
|
const err = e;
|