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
|
@@ -1,14 +1,23 @@
|
|
|
1
|
-
import { getActivePage, getCdpSession } from '../connection.js';
|
|
1
|
+
import { getActivePage, getCdpSession, createTab, waitForPageByTargetId, getPageByTargetId, listTabs } from '../connection.js';
|
|
2
2
|
import { getActiveTab } from '../connection.js';
|
|
3
|
+
import { cleanupIdleTabs, isPinned } from '../tab-lifecycle.js';
|
|
4
|
+
import { stripUndefined } from '../../core/strip-undefined.js';
|
|
5
|
+
import { cleanupPoolTabs, getPooledTab } from './tab-pool.js';
|
|
6
|
+
import { finalizeProviderTab } from './tab-finalizer.js';
|
|
7
|
+
import { listLeases, recordActiveLease } from './tab-lease-store.js';
|
|
8
|
+
import { withSessionCommandLock } from './session-store.js';
|
|
3
9
|
import { basename } from 'node:path';
|
|
4
10
|
import { statSync } from 'node:fs';
|
|
5
11
|
import { countConversationTurns } from './chatgpt-composer.js';
|
|
6
12
|
import { attachLocalFileLive, verifySentTurnAttachmentLive, } from './chatgpt-attachments.js';
|
|
7
13
|
import { createChatGptEditorAdapter } from './vendor-editor-contract.js';
|
|
8
14
|
import { normalizeEnvelope, renderQuestionEnvelope, renderQuestionEnvelopeWithContext } from './question.js';
|
|
9
|
-
import { assertSameTarget, createSession, findSessionByTarget, getBaseline, getSession, listSessions, pruneSessions, saveBaseline, updateSessionResult, updateSessionStatus, } from './session.js';
|
|
15
|
+
import { assertSameTarget, bindSessionToTab, createSession, findSessionByTarget, getBaseline, getSession, listSessions, pruneSessions, saveBaseline, updateSessionResult, updateSessionStatus, } from './session.js';
|
|
10
16
|
import { captureAssistantResponse } from './chatgpt-response.js';
|
|
11
17
|
import { selectChatGptModel } from './chatgpt-model.js';
|
|
18
|
+
import { withAnswerArtifact } from './answer-artifact.js';
|
|
19
|
+
import { auditSources } from './source-audit.js';
|
|
20
|
+
import { resolveTargetForIntent } from './target-resolver.js';
|
|
12
21
|
import { listActiveWebAiWatchers, resumeStoredWebAiWatchers, startWebAiWatcher } from './watcher.js';
|
|
13
22
|
import { captureWebAiDiagnostics, } from './diagnostics.js';
|
|
14
23
|
import { geminiSend, geminiPoll, geminiStop, geminiStatus } from './gemini-live.js';
|
|
@@ -17,6 +26,7 @@ import { ProviderRuntimeDisabledError } from './provider-adapter.js';
|
|
|
17
26
|
import { fromCliJawStructuredError, WebAiError } from './errors.js';
|
|
18
27
|
import { listCapabilitySchemas } from './capability-registry.js';
|
|
19
28
|
import { prepareContextForBrowser, summarizeContextPack } from './context-pack/index.js';
|
|
29
|
+
import { appendTraceToSession } from './trace-persistence.js';
|
|
20
30
|
const CHATGPT_HOSTS = new Set(['chatgpt.com', 'chat.openai.com']);
|
|
21
31
|
const ASSISTANT_SELECTORS = [
|
|
22
32
|
'[data-message-author-role="assistant"]',
|
|
@@ -72,7 +82,7 @@ export async function status(port, input = {}) {
|
|
|
72
82
|
const active = await requireVerifiedChatGptTab(port, vendor);
|
|
73
83
|
inner = { ok: true, vendor: 'chatgpt', status: 'ready', url: active.url, warnings: [] };
|
|
74
84
|
}
|
|
75
|
-
const allRows = listCapabilitySchemas({ vendor
|
|
85
|
+
const allRows = listCapabilitySchemas({ vendor });
|
|
76
86
|
const rows = input.probe
|
|
77
87
|
? allRows.filter((row) => row.capabilityId === input.probe)
|
|
78
88
|
: allRows;
|
|
@@ -81,6 +91,117 @@ export async function status(port, input = {}) {
|
|
|
81
91
|
capabilities: rows,
|
|
82
92
|
};
|
|
83
93
|
}
|
|
94
|
+
async function ensureProviderTab(port, input) {
|
|
95
|
+
const reuseTab = input.reuseTab === true || process.env["JAW_REUSE_TAB"] === '1';
|
|
96
|
+
if (reuseTab) {
|
|
97
|
+
const active = await requireVerifiedChatGptTab(port, input.vendor);
|
|
98
|
+
const page = await requireActivePage(port);
|
|
99
|
+
return { page, targetId: active.targetId };
|
|
100
|
+
}
|
|
101
|
+
const vendor = (input.vendor || 'chatgpt');
|
|
102
|
+
const vendorUrl = input.url || 'https://chatgpt.com';
|
|
103
|
+
await cleanupPoolTabs(port);
|
|
104
|
+
await cleanupIdleTabs(port, { maxTabs: Number.POSITIVE_INFINITY });
|
|
105
|
+
if (input.newTab !== true) {
|
|
106
|
+
const pooled = await getPooledTab(port, vendor, {
|
|
107
|
+
owner: 'cli-jaw',
|
|
108
|
+
sessionType: 'jaw',
|
|
109
|
+
url: vendorUrl,
|
|
110
|
+
});
|
|
111
|
+
if (pooled) {
|
|
112
|
+
const page = await waitForPageByTargetId(port, pooled.targetId);
|
|
113
|
+
if (page.url?.() !== vendorUrl) {
|
|
114
|
+
await page.goto(vendorUrl, { waitUntil: 'domcontentloaded', timeout: 30_000 });
|
|
115
|
+
}
|
|
116
|
+
return { page, targetId: pooled.targetId };
|
|
117
|
+
}
|
|
118
|
+
const reusable = await findReusableChatGptTab(port);
|
|
119
|
+
if (reusable?.targetId) {
|
|
120
|
+
const page = await waitForPageByTargetId(port, reusable.targetId);
|
|
121
|
+
if (page.url?.() !== vendorUrl) {
|
|
122
|
+
await page.goto(vendorUrl, { waitUntil: 'domcontentloaded', timeout: 30_000 });
|
|
123
|
+
}
|
|
124
|
+
return { page, targetId: reusable.targetId };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const tab = await createTab(port, vendorUrl, { activate: false });
|
|
128
|
+
const page = await waitForPageByTargetId(port, tab.targetId);
|
|
129
|
+
return { page, targetId: tab.targetId };
|
|
130
|
+
}
|
|
131
|
+
async function findReusableChatGptTab(port) {
|
|
132
|
+
const activeSessions = new Set();
|
|
133
|
+
for (const session of [...listSessions({ status: 'sent' }), ...listSessions({ status: 'streaming' })]) {
|
|
134
|
+
if (session.targetId)
|
|
135
|
+
activeSessions.add(session.targetId);
|
|
136
|
+
}
|
|
137
|
+
const leases = await listLeases();
|
|
138
|
+
const leaseByTargetId = new Map(leases.map(lease => [lease.targetId, lease]));
|
|
139
|
+
const tabs = await listTabs(port);
|
|
140
|
+
return tabs
|
|
141
|
+
.filter(tab => tab.targetId && tab.type === 'page')
|
|
142
|
+
.filter(tab => !activeSessions.has(tab.targetId))
|
|
143
|
+
.filter(tab => !isPinned(tab.targetId))
|
|
144
|
+
.filter(tab => isReusableByLease(tab.targetId, leaseByTargetId))
|
|
145
|
+
.filter(tab => isChatGptUrl(tab.url || ''))
|
|
146
|
+
.sort((a, b) => (Number(b.lastActiveAt) || 0) - (Number(a.lastActiveAt) || 0))[0] || null;
|
|
147
|
+
}
|
|
148
|
+
function isReusableByLease(targetId, leaseByTargetId) {
|
|
149
|
+
const lease = leaseByTargetId.get(targetId);
|
|
150
|
+
if (!lease)
|
|
151
|
+
return true;
|
|
152
|
+
return ['cli-jaw', 'web-ai'].includes(lease.owner) &&
|
|
153
|
+
['pooled', 'completed-session'].includes(lease.state);
|
|
154
|
+
}
|
|
155
|
+
async function withSessionPage(port, sessionId, fn) {
|
|
156
|
+
const session = getSession(sessionId);
|
|
157
|
+
if (!session)
|
|
158
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
159
|
+
async function resolvePage(forceRecover = false) {
|
|
160
|
+
const current = getSession(sessionId);
|
|
161
|
+
if (!current)
|
|
162
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
163
|
+
const alive = current.targetId ? !!(await getPageByTargetId(port, current.targetId).catch(() => null)) : false;
|
|
164
|
+
if (!alive || forceRecover) {
|
|
165
|
+
const tab = await createTab(port, current.conversationUrl || current.url || 'https://chatgpt.com', { activate: false });
|
|
166
|
+
const page = await waitForPageByTargetId(port, tab.targetId);
|
|
167
|
+
updateSessionResult({ sessionId, status: current.status, tabState: { createdAt: current.tabState?.createdAt || new Date().toISOString(), lastActiveAt: new Date().toISOString(), recoveryCount: (current.tabState?.recoveryCount || 0) + 1, closeCount: current.tabState?.closeCount || 0 } });
|
|
168
|
+
const recovered = getSession(sessionId);
|
|
169
|
+
return { page, targetId: tab.targetId, session: recovered || current };
|
|
170
|
+
}
|
|
171
|
+
const page = await getPageByTargetId(port, current.targetId);
|
|
172
|
+
if (!page)
|
|
173
|
+
throw new Error(`Session ${sessionId} page not found for targetId ${current.targetId}`);
|
|
174
|
+
return { page, targetId: current.targetId, session: current };
|
|
175
|
+
}
|
|
176
|
+
const first = await resolvePage();
|
|
177
|
+
try {
|
|
178
|
+
return await fn(first);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
const msg = errorMessage(err).toLowerCase();
|
|
182
|
+
const isPageDeath = msg.includes('target closed') || msg.includes('page closed') || msg.includes('browser has been closed') || msg.includes('crash');
|
|
183
|
+
if (!isPageDeath)
|
|
184
|
+
throw err;
|
|
185
|
+
const recovered = await resolvePage(true);
|
|
186
|
+
return fn(recovered);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async function runBoundCommand(port, command, input, pollFn, stopFn) {
|
|
190
|
+
if (['poll', 'stop'].includes(command) && input.session) {
|
|
191
|
+
const sessionId = input.session;
|
|
192
|
+
return withSessionCommandLock(sessionId, async () => {
|
|
193
|
+
return withSessionPage(port, sessionId, async ({ session }) => {
|
|
194
|
+
const boundInput = { ...input, vendor: session.vendor, session: session.sessionId };
|
|
195
|
+
return command === 'poll' ? pollFn(port, boundInput) : stopFn(port, boundInput);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
if (command === 'poll')
|
|
200
|
+
return pollFn(port, input);
|
|
201
|
+
if (command === 'stop')
|
|
202
|
+
return stopFn(port, input);
|
|
203
|
+
throw new Error(`runBoundCommand: unsupported command ${command}`);
|
|
204
|
+
}
|
|
84
205
|
export async function send(port, input = {}) {
|
|
85
206
|
const requestedVendor = parseVendor(input.vendor);
|
|
86
207
|
if (requestedVendor === 'gemini') {
|
|
@@ -99,39 +220,49 @@ export async function send(port, input = {}) {
|
|
|
99
220
|
throw stageError(e, 'send-click');
|
|
100
221
|
}
|
|
101
222
|
}
|
|
102
|
-
await navigateRequestedConversation(port, input.url, 'chatgpt');
|
|
103
223
|
const envelope = normalizeEnvelope(input);
|
|
104
|
-
const
|
|
105
|
-
const page = await requireActivePage(port);
|
|
224
|
+
const { page, targetId } = await ensureProviderTab(port, input);
|
|
106
225
|
const contextPack = await prepareContextForBrowser(input);
|
|
107
226
|
const rendered = contextPack
|
|
108
227
|
? contextPack.transport === 'inline'
|
|
109
228
|
? renderQuestionEnvelopeWithContext(envelope, contextPack.composerText)
|
|
110
229
|
: renderQuestionEnvelope(envelope)
|
|
111
230
|
: renderQuestionEnvelope(envelope);
|
|
112
|
-
const selectedModel = await selectChatGptModel(page, input.model);
|
|
231
|
+
const selectedModel = await selectChatGptModel(page, input.model, stripUndefined({ effort: input.reasoningEffort }));
|
|
113
232
|
await waitForStableAssistantCount(page);
|
|
114
233
|
const assistantCount = await countAssistantMessages(page);
|
|
115
234
|
const baseline = saveBaseline({
|
|
116
235
|
vendor: envelope.vendor,
|
|
117
|
-
targetId
|
|
118
|
-
url:
|
|
236
|
+
targetId,
|
|
237
|
+
url: page.url(),
|
|
119
238
|
envelope,
|
|
120
239
|
assistantCount,
|
|
121
240
|
textHash: String((await page.innerText('body').catch(() => '')).length),
|
|
122
241
|
});
|
|
123
242
|
const session = createSession({
|
|
124
243
|
vendor: envelope.vendor,
|
|
125
|
-
targetId
|
|
126
|
-
url:
|
|
127
|
-
conversationUrl:
|
|
244
|
+
targetId,
|
|
245
|
+
url: page.url(),
|
|
246
|
+
conversationUrl: page.url(),
|
|
128
247
|
envelope,
|
|
129
248
|
assistantCount,
|
|
130
249
|
timeoutMs: 600_000,
|
|
131
250
|
});
|
|
251
|
+
bindSessionToTab(session.sessionId, targetId);
|
|
252
|
+
await recordActiveLease({
|
|
253
|
+
owner: 'cli-jaw',
|
|
254
|
+
vendor: envelope.vendor,
|
|
255
|
+
sessionType: 'jaw',
|
|
256
|
+
port,
|
|
257
|
+
targetId,
|
|
258
|
+
sessionId: session.sessionId,
|
|
259
|
+
url: page.url(),
|
|
260
|
+
});
|
|
132
261
|
const adapter = createChatGptEditorAdapter(page, {
|
|
133
262
|
insertText: async (text) => {
|
|
134
263
|
const cdp = await getCdpSession(port);
|
|
264
|
+
if (!cdp)
|
|
265
|
+
throw new Error('No CDP session available for text insertion');
|
|
135
266
|
try {
|
|
136
267
|
await cdp.send('Input.insertText', { text });
|
|
137
268
|
}
|
|
@@ -141,6 +272,13 @@ export async function send(port, input = {}) {
|
|
|
141
272
|
},
|
|
142
273
|
});
|
|
143
274
|
try {
|
|
275
|
+
const composerTarget = await resolveTargetForIntent(page, {
|
|
276
|
+
provider: envelope.vendor,
|
|
277
|
+
intentId: 'composer.fill',
|
|
278
|
+
});
|
|
279
|
+
if (!composerTarget.ok && composerTarget.required) {
|
|
280
|
+
throw new Error(`composer target unresolved: ${composerTarget.errorCode || 'unknown'}`);
|
|
281
|
+
}
|
|
144
282
|
await adapter.waitForReady();
|
|
145
283
|
const commitBaseline = { turnsCount: await countConversationTurns(page).catch(() => assistantCount) };
|
|
146
284
|
await adapter.insertPrompt(rendered.composerText);
|
|
@@ -150,11 +288,22 @@ export async function send(port, input = {}) {
|
|
|
150
288
|
}
|
|
151
289
|
const uploadPath = input.filePath || contextAttachmentPath;
|
|
152
290
|
if (uploadPath) {
|
|
291
|
+
await resolveTargetForIntent(page, {
|
|
292
|
+
provider: envelope.vendor,
|
|
293
|
+
intentId: 'upload.attach',
|
|
294
|
+
}).catch(() => null);
|
|
153
295
|
const info = localFileInfo(uploadPath);
|
|
154
296
|
const uploaded = await attachLocalFileLive(page, info);
|
|
155
297
|
if (!uploaded.ok)
|
|
156
298
|
throw new Error(uploaded.error);
|
|
157
299
|
}
|
|
300
|
+
const sendTarget = await resolveTargetForIntent(page, {
|
|
301
|
+
provider: envelope.vendor,
|
|
302
|
+
intentId: 'send.click',
|
|
303
|
+
});
|
|
304
|
+
if (!sendTarget.ok && sendTarget.required) {
|
|
305
|
+
throw new Error(`send target unresolved: ${sendTarget.errorCode || 'unknown'}`);
|
|
306
|
+
}
|
|
158
307
|
await adapter.submitPrompt();
|
|
159
308
|
await adapter.verifyPromptCommitted(rendered.composerText, commitBaseline);
|
|
160
309
|
if (uploadPath) {
|
|
@@ -168,11 +317,11 @@ export async function send(port, input = {}) {
|
|
|
168
317
|
updateSessionStatus(session.sessionId, 'error');
|
|
169
318
|
throw stageError(e, 'send-click');
|
|
170
319
|
}
|
|
171
|
-
return {
|
|
320
|
+
return stripUndefined({
|
|
172
321
|
ok: true,
|
|
173
322
|
vendor: envelope.vendor,
|
|
174
323
|
status: 'sent',
|
|
175
|
-
url:
|
|
324
|
+
url: page.url(),
|
|
176
325
|
baseline,
|
|
177
326
|
sessionId: session.sessionId,
|
|
178
327
|
...(contextPack ? { contextPack: summarizeContextPack(contextPack) } : {}),
|
|
@@ -182,8 +331,9 @@ export async function send(port, input = {}) {
|
|
|
182
331
|
...(contextPack?.warnings || []),
|
|
183
332
|
...(contextPack?.attachments?.[0] ? [`context package attached: ${contextPack.attachments[0].displayPath}`] : []),
|
|
184
333
|
...(selectedModel ? [`model selected: ${selectedModel.selected}${selectedModel.alreadySelected ? ' (already selected)' : ''}`] : []),
|
|
334
|
+
...(selectedModel?.effort ? [`reasoning effort selected: ${selectedModel.effort}`] : []),
|
|
185
335
|
],
|
|
186
|
-
};
|
|
336
|
+
});
|
|
187
337
|
}
|
|
188
338
|
function localFileInfo(filePath) {
|
|
189
339
|
const stat = statSync(filePath);
|
|
@@ -195,11 +345,11 @@ export async function poll(port, input = {}) {
|
|
|
195
345
|
const vendor = parseVendor(input.vendor);
|
|
196
346
|
if (vendor === 'gemini') {
|
|
197
347
|
try {
|
|
198
|
-
return await geminiPoll(port, {
|
|
348
|
+
return decorateCompletedOutput(await geminiPoll(port, stripUndefined({
|
|
199
349
|
timeout: input.timeout,
|
|
200
350
|
session: input.session,
|
|
201
351
|
allowCopyMarkdownFallback: input.allowCopyMarkdownFallback === true,
|
|
202
|
-
});
|
|
352
|
+
})), input, 'poll');
|
|
203
353
|
}
|
|
204
354
|
catch (e) {
|
|
205
355
|
throw stageError(e, 'poll-timeout');
|
|
@@ -207,19 +357,31 @@ export async function poll(port, input = {}) {
|
|
|
207
357
|
}
|
|
208
358
|
if (vendor === 'grok') {
|
|
209
359
|
try {
|
|
210
|
-
return await grokPoll(port, {
|
|
360
|
+
return decorateCompletedOutput(await grokPoll(port, stripUndefined({
|
|
211
361
|
timeout: input.timeout,
|
|
212
362
|
session: input.session,
|
|
213
363
|
allowCopyMarkdownFallback: input.allowCopyMarkdownFallback === true,
|
|
214
|
-
});
|
|
364
|
+
})), input, 'poll');
|
|
215
365
|
}
|
|
216
366
|
catch (e) {
|
|
217
367
|
throw stageError(e, 'poll-timeout');
|
|
218
368
|
}
|
|
219
369
|
}
|
|
220
|
-
|
|
221
|
-
let
|
|
222
|
-
|
|
370
|
+
let page;
|
|
371
|
+
let targetId;
|
|
372
|
+
let session = input.session ? getSession(input.session) : null;
|
|
373
|
+
if (session) {
|
|
374
|
+
const ctx = await withSessionPage(port, session.sessionId, async (c) => c);
|
|
375
|
+
page = ctx.page;
|
|
376
|
+
targetId = ctx.targetId;
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
const active = await requireVerifiedChatGptTab(port, vendor);
|
|
380
|
+
targetId = active.targetId;
|
|
381
|
+
page = await requireActivePage(port);
|
|
382
|
+
session = findSessionByTarget(vendor, targetId);
|
|
383
|
+
}
|
|
384
|
+
const baseline = getBaseline(vendor, targetId);
|
|
223
385
|
if (!baseline)
|
|
224
386
|
throw new WebAiError({
|
|
225
387
|
errorCode: 'provider.poll-timeout',
|
|
@@ -229,8 +391,8 @@ export async function poll(port, input = {}) {
|
|
|
229
391
|
message: 'baseline required. Run web-ai send or query first.',
|
|
230
392
|
});
|
|
231
393
|
if (session)
|
|
232
|
-
assertSameTarget(session,
|
|
233
|
-
const
|
|
394
|
+
assertSameTarget(session, targetId);
|
|
395
|
+
const currentUrl = page.url?.() || session?.url || 'https://chatgpt.com';
|
|
234
396
|
const timeoutMs = Math.max(1, Number(input.timeout || 1200)) * 1000;
|
|
235
397
|
const result = await captureAssistantResponse(page, {
|
|
236
398
|
minTurnIndex: baseline.assistantCount,
|
|
@@ -242,57 +404,150 @@ export async function poll(port, input = {}) {
|
|
|
242
404
|
updateSessionStatus(session.sessionId, 'complete');
|
|
243
405
|
if (session && !result.ok)
|
|
244
406
|
updateSessionStatus(session.sessionId, 'timeout');
|
|
407
|
+
const traceSummary = session
|
|
408
|
+
? appendTraceToSession(session.sessionId, (result.resolverTrace || []))
|
|
409
|
+
: null;
|
|
245
410
|
if (result.canvas) {
|
|
246
|
-
if (session)
|
|
247
|
-
|
|
248
|
-
|
|
411
|
+
if (session) {
|
|
412
|
+
await finalizeProviderTab({ vendor, session, port, url: currentUrl, answerText: result.answerText || '' });
|
|
413
|
+
}
|
|
414
|
+
const output = decorateCompletedOutput(stripUndefined({
|
|
249
415
|
ok: true,
|
|
250
416
|
vendor,
|
|
251
417
|
status: 'complete',
|
|
252
|
-
url:
|
|
418
|
+
url: currentUrl,
|
|
253
419
|
answerText: result.answerText,
|
|
254
420
|
canvas: result.canvas,
|
|
255
421
|
baseline,
|
|
256
422
|
...(session ? { sessionId: session.sessionId } : {}),
|
|
423
|
+
...(traceSummary ? { traceSummary } : {}),
|
|
257
424
|
usedFallbacks: result.usedFallbacks,
|
|
258
425
|
warnings: result.warnings,
|
|
259
|
-
};
|
|
426
|
+
}), input, 'poll');
|
|
427
|
+
if (session)
|
|
428
|
+
updateSessionResult(stripUndefined({
|
|
429
|
+
sessionId: session.sessionId,
|
|
430
|
+
status: 'complete',
|
|
431
|
+
answerText: output.answerText,
|
|
432
|
+
answerArtifact: output.answerArtifact,
|
|
433
|
+
sourceAudit: output.sourceAudit,
|
|
434
|
+
}));
|
|
435
|
+
return output;
|
|
260
436
|
}
|
|
261
437
|
if (result.ok) {
|
|
262
|
-
if (session)
|
|
263
|
-
|
|
264
|
-
|
|
438
|
+
if (session) {
|
|
439
|
+
await finalizeProviderTab({ vendor, session, port, url: currentUrl, answerText: result.answerText || '' });
|
|
440
|
+
}
|
|
441
|
+
const output = decorateCompletedOutput(stripUndefined({
|
|
265
442
|
ok: true,
|
|
266
443
|
vendor,
|
|
267
444
|
status: 'complete',
|
|
268
|
-
url:
|
|
445
|
+
url: currentUrl,
|
|
269
446
|
answerText: result.answerText,
|
|
270
447
|
baseline,
|
|
271
448
|
...(session ? { sessionId: session.sessionId } : {}),
|
|
449
|
+
...(traceSummary ? { traceSummary } : {}),
|
|
272
450
|
usedFallbacks: result.usedFallbacks,
|
|
273
451
|
warnings: result.warnings,
|
|
274
|
-
};
|
|
452
|
+
}), input, 'poll');
|
|
453
|
+
if (session)
|
|
454
|
+
updateSessionResult(stripUndefined({
|
|
455
|
+
sessionId: session.sessionId,
|
|
456
|
+
status: 'complete',
|
|
457
|
+
answerText: output.answerText,
|
|
458
|
+
answerArtifact: output.answerArtifact,
|
|
459
|
+
sourceAudit: output.sourceAudit,
|
|
460
|
+
}));
|
|
461
|
+
return output;
|
|
275
462
|
}
|
|
276
463
|
return {
|
|
277
464
|
ok: false,
|
|
278
465
|
vendor,
|
|
279
466
|
status: 'timeout',
|
|
280
|
-
url:
|
|
467
|
+
url: currentUrl,
|
|
281
468
|
baseline,
|
|
282
469
|
...(session ? { sessionId: session.sessionId, next: 'poll' } : {}),
|
|
470
|
+
...(traceSummary ? { traceSummary } : {}),
|
|
283
471
|
usedFallbacks: result.usedFallbacks,
|
|
284
472
|
warnings: result.warnings,
|
|
285
473
|
error: 'timed out waiting for answer',
|
|
286
474
|
};
|
|
287
475
|
}
|
|
476
|
+
function decorateCompletedOutput(result, input, command) {
|
|
477
|
+
const withArtifact = withAnswerArtifact(result, {
|
|
478
|
+
provider: result.vendor || input.vendor,
|
|
479
|
+
sessionId: result.sessionId,
|
|
480
|
+
conversationUrl: result.url,
|
|
481
|
+
});
|
|
482
|
+
if (input.requireSourceAudit !== true)
|
|
483
|
+
return withArtifact;
|
|
484
|
+
const answerText = withArtifact.answerText || withArtifact.answerArtifact?.text || withArtifact.answerArtifact?.markdown || '';
|
|
485
|
+
if (!answerText && withArtifact.ok === false)
|
|
486
|
+
return withArtifact;
|
|
487
|
+
if (!answerText) {
|
|
488
|
+
throw new WebAiError({
|
|
489
|
+
errorCode: 'source-audit.answer-missing',
|
|
490
|
+
stage: 'source-audit',
|
|
491
|
+
vendor: result.vendor || parseVendor(input.vendor),
|
|
492
|
+
retryHint: 'poll-or-disable-audit',
|
|
493
|
+
message: `source audit requires completed answer text for web-ai ${command}`,
|
|
494
|
+
mutationAllowed: false,
|
|
495
|
+
evidence: { status: result.status || null },
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
const sourceAudit = auditSources(answerText, {
|
|
499
|
+
requiredSourceRatio: parseSourceAuditRatio(input.sourceAuditRatio),
|
|
500
|
+
checkedScope: input.sourceAuditScope || null,
|
|
501
|
+
checkedDate: input.sourceAuditDate || null,
|
|
502
|
+
});
|
|
503
|
+
withArtifact.sourceAudit = sourceAudit;
|
|
504
|
+
if (!sourceAudit.ok) {
|
|
505
|
+
throw new WebAiError({
|
|
506
|
+
errorCode: 'source-audit.failed',
|
|
507
|
+
stage: 'source-audit',
|
|
508
|
+
vendor: result.vendor || parseVendor(input.vendor),
|
|
509
|
+
retryHint: 'add-inline-sources-or-disable-audit',
|
|
510
|
+
message: `source audit failed: ${sourceAudit.gaps.map(gap => gap.code).join(', ')}`,
|
|
511
|
+
mutationAllowed: false,
|
|
512
|
+
evidence: {
|
|
513
|
+
gaps: sourceAudit.gaps,
|
|
514
|
+
claimCount: sourceAudit.claims.length,
|
|
515
|
+
unsourcedClaimCount: sourceAudit.unsourcedClaims.length,
|
|
516
|
+
checkedScope: sourceAudit.checkedScope,
|
|
517
|
+
checkedDate: sourceAudit.checkedDate,
|
|
518
|
+
},
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
return withArtifact;
|
|
522
|
+
}
|
|
523
|
+
function parseSourceAuditRatio(value) {
|
|
524
|
+
if (value === undefined || value === null || value === '')
|
|
525
|
+
return 1;
|
|
526
|
+
const parsed = Number(value);
|
|
527
|
+
if (!Number.isFinite(parsed) || parsed < 0 || parsed > 1) {
|
|
528
|
+
throw new WebAiError({
|
|
529
|
+
errorCode: 'source-audit.invalid-ratio',
|
|
530
|
+
stage: 'source-audit',
|
|
531
|
+
retryHint: 'fix-source-audit-ratio',
|
|
532
|
+
message: '--source-audit-ratio must be a number between 0 and 1',
|
|
533
|
+
mutationAllowed: false,
|
|
534
|
+
evidence: { value },
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
return parsed;
|
|
538
|
+
}
|
|
288
539
|
export async function query(port, input = {}) {
|
|
289
540
|
const sent = await send(port, input);
|
|
290
|
-
const result = await poll(port, {
|
|
541
|
+
const result = await poll(port, stripUndefined({
|
|
291
542
|
vendor: sent.vendor,
|
|
292
543
|
timeout: input.timeout,
|
|
293
544
|
session: sent.sessionId,
|
|
294
545
|
allowCopyMarkdownFallback: input.allowCopyMarkdownFallback,
|
|
295
|
-
|
|
546
|
+
requireSourceAudit: input.requireSourceAudit,
|
|
547
|
+
sourceAuditRatio: input.sourceAuditRatio,
|
|
548
|
+
sourceAuditScope: input.sourceAuditScope,
|
|
549
|
+
sourceAuditDate: input.sourceAuditDate,
|
|
550
|
+
}));
|
|
296
551
|
return {
|
|
297
552
|
...result,
|
|
298
553
|
usedFallbacks: [...(sent.usedFallbacks || []), ...(result.usedFallbacks || [])],
|
|
@@ -310,7 +565,7 @@ export async function watch(port, input = {}) {
|
|
|
310
565
|
sessionId: input.session,
|
|
311
566
|
timeoutMs: Math.max(1, Number(input.timeout || 1200)) * 1000,
|
|
312
567
|
pollIntervalSeconds: Number(input.pollIntervalSeconds || 30),
|
|
313
|
-
allowCopyMarkdownFallback: input.allowCopyMarkdownFallback,
|
|
568
|
+
...(input.allowCopyMarkdownFallback !== undefined ? { allowCopyMarkdownFallback: input.allowCopyMarkdownFallback } : {}),
|
|
314
569
|
pollOnce: (pollInput) => poll(port, pollInput),
|
|
315
570
|
});
|
|
316
571
|
return {
|
|
@@ -337,7 +592,7 @@ export function resumeStoredWatchers(port, input = {}) {
|
|
|
337
592
|
const vendor = input.vendor ? parseVendor(input.vendor) : undefined;
|
|
338
593
|
const resumed = resumeStoredWebAiWatchers({
|
|
339
594
|
port,
|
|
340
|
-
vendor,
|
|
595
|
+
...(vendor ? { vendor } : {}),
|
|
341
596
|
pollIntervalSeconds: Number(input.pollIntervalSeconds || 30),
|
|
342
597
|
pollOnce: (pollInput) => poll(port, pollInput),
|
|
343
598
|
});
|
|
@@ -351,22 +606,22 @@ export function resumeStoredWatchers(port, input = {}) {
|
|
|
351
606
|
}
|
|
352
607
|
export async function sessions(input = {}) {
|
|
353
608
|
const vendor = input.vendor ? parseVendor(input.vendor) : undefined;
|
|
354
|
-
const status = input.status;
|
|
609
|
+
const status = parseSessionStatus(input.status);
|
|
355
610
|
return {
|
|
356
611
|
ok: true,
|
|
357
612
|
vendor: vendor || 'chatgpt',
|
|
358
613
|
status: 'ready',
|
|
359
|
-
sessions: listSessions({ vendor, status }),
|
|
614
|
+
sessions: listSessions(stripUndefined({ vendor, status })),
|
|
360
615
|
warnings: [],
|
|
361
616
|
};
|
|
362
617
|
}
|
|
363
618
|
export async function sessionsPrune(input = {}) {
|
|
364
619
|
const ms = typeof input.olderThanMs === 'string' ? Number(input.olderThanMs) : input.olderThanMs;
|
|
365
|
-
const result = pruneSessions({
|
|
620
|
+
const result = pruneSessions(stripUndefined({
|
|
366
621
|
...(typeof ms === 'number' && Number.isFinite(ms) ? { olderThanMs: ms } : {}),
|
|
367
622
|
...(input.before ? { before: input.before } : {}),
|
|
368
|
-
...(input.status ? { status: input.status } : {}),
|
|
369
|
-
});
|
|
623
|
+
...(parseSessionStatus(input.status) ? { status: parseSessionStatus(input.status) } : {}),
|
|
624
|
+
}));
|
|
370
625
|
return {
|
|
371
626
|
ok: true,
|
|
372
627
|
vendor: 'chatgpt',
|
|
@@ -393,15 +648,27 @@ export async function stop(port, input = {}) {
|
|
|
393
648
|
throw stageError(e, 'send-click');
|
|
394
649
|
}
|
|
395
650
|
}
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
651
|
+
let page;
|
|
652
|
+
let targetId;
|
|
653
|
+
let session = input.session ? getSession(input.session) : null;
|
|
654
|
+
if (session) {
|
|
655
|
+
const ctx = await withSessionPage(port, session.sessionId, async (c) => c);
|
|
656
|
+
page = ctx.page;
|
|
657
|
+
targetId = ctx.targetId;
|
|
658
|
+
}
|
|
659
|
+
else {
|
|
660
|
+
const active = await requireVerifiedChatGptTab(port, vendor);
|
|
661
|
+
targetId = active.targetId;
|
|
662
|
+
page = await requireActivePage(port);
|
|
663
|
+
session = findSessionByTarget(vendor, targetId);
|
|
664
|
+
}
|
|
399
665
|
if (session)
|
|
400
|
-
assertSameTarget(session,
|
|
666
|
+
assertSameTarget(session, targetId);
|
|
401
667
|
await page.keyboard.press('Escape');
|
|
402
668
|
if (session)
|
|
403
669
|
updateSessionStatus(session.sessionId, 'complete');
|
|
404
|
-
|
|
670
|
+
const currentUrl = page.url?.() || session?.url || 'https://chatgpt.com';
|
|
671
|
+
return { ok: true, vendor: 'chatgpt', status: 'blocked', url: currentUrl, warnings: ['sent Escape to stop generation'] };
|
|
405
672
|
}
|
|
406
673
|
export async function diagnose(port, input = {}) {
|
|
407
674
|
const vendor = parseVendor(input.vendor);
|
|
@@ -445,6 +712,15 @@ function parseVendor(vendor) {
|
|
|
445
712
|
evidence: { vendor },
|
|
446
713
|
});
|
|
447
714
|
}
|
|
715
|
+
function parseSessionStatus(status) {
|
|
716
|
+
if (status === 'sent' || status === 'streaming' || status === 'complete' || status === 'timeout' || status === 'error') {
|
|
717
|
+
return status;
|
|
718
|
+
}
|
|
719
|
+
return undefined;
|
|
720
|
+
}
|
|
721
|
+
function errorMessage(error) {
|
|
722
|
+
return error instanceof Error ? error.message : String(error ?? '');
|
|
723
|
+
}
|
|
448
724
|
async function requireVerifiedChatGptTab(port, vendor) {
|
|
449
725
|
const parsed = parseVendor(vendor);
|
|
450
726
|
if (parsed === 'gemini') {
|