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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../../src/browser/primitives.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../../src/browser/primitives.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { getActivePort, getBrowserRuntimeStatus, getBrowserStatus } from './connection.js';
|
|
2
|
+
import { inspectBrowserRuntimeOrphans } from './runtime-orphans.js';
|
|
3
|
+
export async function getBrowserDiagnostics(port = getActivePort()) {
|
|
4
|
+
const status = await getBrowserStatus(port);
|
|
5
|
+
const runtime = getBrowserRuntimeStatus();
|
|
6
|
+
const orphanCandidates = await inspectBrowserRuntimeOrphans(runtime);
|
|
7
|
+
const issues = [];
|
|
8
|
+
const recommendations = [];
|
|
9
|
+
if (!status.running && runtime.ownership === 'jaw-owned') {
|
|
10
|
+
issues.push({
|
|
11
|
+
code: 'stale-jaw-owned-runtime',
|
|
12
|
+
severity: 'warn',
|
|
13
|
+
message: 'The server still has jaw-owned runtime metadata, but the expected CDP endpoint is not responding.',
|
|
14
|
+
});
|
|
15
|
+
recommendations.push('Run cli-jaw browser start again; launchChrome now clears stale jaw-owned process memory before retrying.');
|
|
16
|
+
}
|
|
17
|
+
if (runtime.ownership === 'external') {
|
|
18
|
+
issues.push({
|
|
19
|
+
code: 'external-runtime-not-autoclosed',
|
|
20
|
+
severity: 'info',
|
|
21
|
+
message: 'cli-jaw is attached to an external CDP browser and will not auto-close that process.',
|
|
22
|
+
});
|
|
23
|
+
recommendations.push('Use the owner that launched the external Chrome to close it; cli-jaw only disconnects from external runtimes.');
|
|
24
|
+
}
|
|
25
|
+
if (orphanCandidates.some((candidate) => candidate.action !== 'none')) {
|
|
26
|
+
issues.push({
|
|
27
|
+
code: 'orphan-runtime-candidate',
|
|
28
|
+
severity: 'warn',
|
|
29
|
+
message: 'A durable jaw-owned browser runtime record exists outside the current server runtime.',
|
|
30
|
+
});
|
|
31
|
+
recommendations.push('Run cli-jaw browser cleanup-runtimes for a dry-run, then add --close --force only if the candidate is expected.');
|
|
32
|
+
}
|
|
33
|
+
const cleanup = {
|
|
34
|
+
idleAutoClose: runtime.autoCloseEnabled === true,
|
|
35
|
+
idleAutoCloseScope: runtime.ownership === 'jaw-owned'
|
|
36
|
+
? 'current-server-jaw-owned-runtime'
|
|
37
|
+
: 'none',
|
|
38
|
+
orphanJanitor: true,
|
|
39
|
+
orphanJanitorScope: 'durable-jaw-owned-runtime-records-only',
|
|
40
|
+
safeExternalKill: false,
|
|
41
|
+
};
|
|
42
|
+
const ok = !issues.some((issue) => issue.severity === 'warn');
|
|
43
|
+
return { ok, port, status, runtime, cleanup, orphanCandidates, issues, recommendations };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=runtime-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-diagnostics.js","sourceRoot":"","sources":["../../../src/browser/runtime-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE3F,OAAO,EAAE,4BAA4B,EAAsC,MAAM,sBAAsB,CAAC;AA8BxG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAI,GAAG,aAAa,EAAE;IAC9D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAC1C,MAAM,gBAAgB,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACrE,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,mGAAmG;SAC/G,CAAC,CAAC;QACH,eAAe,CAAC,IAAI,CAAC,0GAA0G,CAAC,CAAC;IACrI,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,iCAAiC;YACvC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,sFAAsF;SAClG,CAAC,CAAC;QACH,eAAe,CAAC,IAAI,CAAC,+GAA+G,CAAC,CAAC;IAC1I,CAAC;IAED,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,uFAAuF;SACnG,CAAC,CAAC;QACH,eAAe,CAAC,IAAI,CAAC,iHAAiH,CAAC,CAAC;IAC5I,CAAC;IAED,MAAM,OAAO,GAAG;QACZ,aAAa,EAAE,OAAO,CAAC,gBAAgB,KAAK,IAAI;QAChD,kBAAkB,EAAE,OAAO,CAAC,SAAS,KAAK,WAAW;YACjD,CAAC,CAAC,kCAA2C;YAC7C,CAAC,CAAC,MAAe;QACrB,aAAa,EAAE,IAAa;QAC5B,kBAAkB,EAAE,wCAAiD;QACrE,gBAAgB,EAAE,KAAc;KACnC,CAAC;IAEF,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAC9D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { clearDurableBrowserRuntimeOwner, readDurableBrowserRuntimeOwner } from './runtime-owner-store.js';
|
|
4
|
+
function readProcessCommandLine(pid) {
|
|
5
|
+
if (process.platform === 'win32') {
|
|
6
|
+
return new Promise((resolve) => {
|
|
7
|
+
execFile('powershell.exe', [
|
|
8
|
+
'-NoProfile',
|
|
9
|
+
'-NonInteractive',
|
|
10
|
+
'-Command',
|
|
11
|
+
`(Get-CimInstance Win32_Process -Filter "ProcessId = ${Math.trunc(pid)}").CommandLine`,
|
|
12
|
+
], (error, stdout) => resolve(error ? null : stdout.trim() || null));
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
if (process.platform === 'linux') {
|
|
16
|
+
try {
|
|
17
|
+
return Promise.resolve(fs.readFileSync(`/proc/${pid}/cmdline`, 'utf8').replace(/\0/g, ' ').trim());
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return Promise.resolve(null);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return new Promise((resolve) => {
|
|
24
|
+
execFile('ps', ['-p', String(pid), '-o', 'command='], (error, stdout) => {
|
|
25
|
+
resolve(error ? null : stdout.trim() || null);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export function commandLineMatchesDurableRuntimeOwner(owner, command) {
|
|
30
|
+
if (!command || owner.ownership !== 'jaw-owned')
|
|
31
|
+
return false;
|
|
32
|
+
if (!owner.port || !owner.userDataDir)
|
|
33
|
+
return false;
|
|
34
|
+
if (command.includes('--type='))
|
|
35
|
+
return false;
|
|
36
|
+
return commandLineHasExactFlagValue(command, 'remote-debugging-port', String(owner.port))
|
|
37
|
+
&& commandLineHasExactFlagValue(command, 'user-data-dir', owner.userDataDir);
|
|
38
|
+
}
|
|
39
|
+
function escapeRegExp(value) {
|
|
40
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
41
|
+
}
|
|
42
|
+
function commandLineHasExactFlagValue(command, flag, expected) {
|
|
43
|
+
const pattern = new RegExp(`(?:^|\\s)--${escapeRegExp(flag)}=${escapeRegExp(expected)}(?:\\s|$)`);
|
|
44
|
+
return pattern.test(command);
|
|
45
|
+
}
|
|
46
|
+
function isCurrentRuntime(owner, current) {
|
|
47
|
+
if (!current || current.ownership !== 'jaw-owned')
|
|
48
|
+
return false;
|
|
49
|
+
return owner.pid === current.pid && owner.port === current.port && owner.userDataDir === current.userDataDir;
|
|
50
|
+
}
|
|
51
|
+
export async function inspectBrowserRuntimeOrphans(currentRuntime) {
|
|
52
|
+
const owner = readDurableBrowserRuntimeOwner();
|
|
53
|
+
if (!owner || owner.ownership !== 'jaw-owned')
|
|
54
|
+
return [];
|
|
55
|
+
if (isCurrentRuntime(owner, currentRuntime)) {
|
|
56
|
+
return [{
|
|
57
|
+
pid: owner.pid,
|
|
58
|
+
port: owner.port,
|
|
59
|
+
userDataDir: owner.userDataDir,
|
|
60
|
+
headless: owner.headless,
|
|
61
|
+
reason: 'current-runtime',
|
|
62
|
+
closeable: false,
|
|
63
|
+
action: 'none',
|
|
64
|
+
}];
|
|
65
|
+
}
|
|
66
|
+
if (!owner.pid) {
|
|
67
|
+
return [{
|
|
68
|
+
pid: owner.pid,
|
|
69
|
+
port: owner.port,
|
|
70
|
+
userDataDir: owner.userDataDir,
|
|
71
|
+
headless: owner.headless,
|
|
72
|
+
reason: 'process-not-running',
|
|
73
|
+
closeable: false,
|
|
74
|
+
action: 'prune-record',
|
|
75
|
+
}];
|
|
76
|
+
}
|
|
77
|
+
const command = await readProcessCommandLine(owner.pid);
|
|
78
|
+
if (!command) {
|
|
79
|
+
return [{
|
|
80
|
+
pid: owner.pid,
|
|
81
|
+
port: owner.port,
|
|
82
|
+
userDataDir: owner.userDataDir,
|
|
83
|
+
headless: owner.headless,
|
|
84
|
+
reason: 'process-not-running',
|
|
85
|
+
closeable: false,
|
|
86
|
+
action: 'prune-record',
|
|
87
|
+
}];
|
|
88
|
+
}
|
|
89
|
+
const closeable = commandLineMatchesDurableRuntimeOwner(owner, command);
|
|
90
|
+
return [{
|
|
91
|
+
pid: owner.pid,
|
|
92
|
+
port: owner.port,
|
|
93
|
+
userDataDir: owner.userDataDir,
|
|
94
|
+
headless: owner.headless,
|
|
95
|
+
reason: closeable ? 'durable-owner-not-current' : 'ownership-proof-failed',
|
|
96
|
+
closeable,
|
|
97
|
+
action: closeable ? 'close-process' : 'none',
|
|
98
|
+
}];
|
|
99
|
+
}
|
|
100
|
+
export async function cleanupBrowserRuntimeOrphans(options = {}) {
|
|
101
|
+
const candidates = await inspectBrowserRuntimeOrphans(options.currentRuntime);
|
|
102
|
+
const dryRun = !(options.close === true && options.force === true);
|
|
103
|
+
let closed = 0;
|
|
104
|
+
let pruned = 0;
|
|
105
|
+
if (!dryRun) {
|
|
106
|
+
for (const candidate of candidates) {
|
|
107
|
+
if (candidate.action === 'close-process' && candidate.closeable && candidate.pid) {
|
|
108
|
+
try {
|
|
109
|
+
process.kill(candidate.pid, 'SIGTERM');
|
|
110
|
+
closed++;
|
|
111
|
+
clearDurableBrowserRuntimeOwner(candidate);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Treat vanished processes as stale records.
|
|
115
|
+
if (clearDurableBrowserRuntimeOwner(candidate))
|
|
116
|
+
pruned++;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else if (candidate.action === 'prune-record') {
|
|
120
|
+
if (clearDurableBrowserRuntimeOwner(candidate))
|
|
121
|
+
pruned++;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return { ok: true, dryRun, closed, pruned, candidates };
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=runtime-orphans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-orphans.js","sourceRoot":"","sources":["../../../src/browser/runtime-orphans.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { JAW_HOME } from '../core/config.js';
|
|
4
|
+
const RUNTIME_OWNER_FILE = join(JAW_HOME, 'browser-runtime-owner.json');
|
|
5
|
+
function isRuntimeOwner(value) {
|
|
6
|
+
if (!value || typeof value !== 'object')
|
|
7
|
+
return false;
|
|
8
|
+
const record = value;
|
|
9
|
+
return (record["ownership"] === 'jaw-owned' || record["ownership"] === 'external')
|
|
10
|
+
&& (typeof record["pid"] === 'number' || record["pid"] === null)
|
|
11
|
+
&& (typeof record["port"] === 'number' || record["port"] === null)
|
|
12
|
+
&& (typeof record["userDataDir"] === 'string' || record["userDataDir"] === null);
|
|
13
|
+
}
|
|
14
|
+
export function readDurableBrowserRuntimeOwner() {
|
|
15
|
+
try {
|
|
16
|
+
if (!fs.existsSync(RUNTIME_OWNER_FILE))
|
|
17
|
+
return null;
|
|
18
|
+
const parsed = JSON.parse(fs.readFileSync(RUNTIME_OWNER_FILE, 'utf8'));
|
|
19
|
+
return isRuntimeOwner(parsed) ? parsed : null;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function writeDurableBrowserRuntimeOwner(owner) {
|
|
26
|
+
if (owner.ownership !== 'jaw-owned')
|
|
27
|
+
return;
|
|
28
|
+
fs.mkdirSync(JAW_HOME, { recursive: true });
|
|
29
|
+
fs.writeFileSync(RUNTIME_OWNER_FILE, `${JSON.stringify(owner, null, 2)}\n`);
|
|
30
|
+
}
|
|
31
|
+
export function clearDurableBrowserRuntimeOwner(expected) {
|
|
32
|
+
const current = readDurableBrowserRuntimeOwner();
|
|
33
|
+
if (!current)
|
|
34
|
+
return false;
|
|
35
|
+
if (expected && (current.pid !== expected.pid ||
|
|
36
|
+
current.port !== expected.port ||
|
|
37
|
+
current.userDataDir !== expected.userDataDir)) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
fs.rmSync(RUNTIME_OWNER_FILE, { force: true });
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function getBrowserRuntimeOwnerFile() {
|
|
49
|
+
return RUNTIME_OWNER_FILE;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=runtime-owner-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-owner-store.js","sourceRoot":"","sources":["../../../src/browser/runtime-owner-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAC;AAIxE,SAAS,cAAc,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,UAAU,CAAC;WAC3E,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;WAC7D,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;WAC/D,CAAC,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC1C,IAAI,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC;YAAE,OAAO,IAAI,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAY,CAAC;QAClF,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAA0B;IACtE,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW;QAAE,OAAO;IAC5C,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,QAA0C;IACtF,MAAM,OAAO,GAAG,8BAA8B,EAAE,CAAC;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,QAAQ,IAAI,CACZ,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;QAC5B,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;QAC9B,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW,CAC/C,EAAE,CAAC;QACA,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,CAAC;QACD,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,0BAA0B;IACtC,OAAO,kBAAkB,CAAC;AAC9B,CAAC"}
|
|
@@ -57,10 +57,10 @@ export function createExternalBrowserRuntime(port) {
|
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
59
|
export function browserIdleTimeoutMs() {
|
|
60
|
-
return parseBrowserRuntimeTimeout(process.env
|
|
60
|
+
return parseBrowserRuntimeTimeout(process.env["JAW_BROWSER_IDLE_TIMEOUT_MS"], DEFAULT_IDLE_TIMEOUT_MS);
|
|
61
61
|
}
|
|
62
62
|
export function browserReaperIntervalMs() {
|
|
63
|
-
return parseBrowserRuntimeTimeout(process.env
|
|
63
|
+
return parseBrowserRuntimeTimeout(process.env["JAW_BROWSER_REAPER_INTERVAL_MS"], DEFAULT_REAPER_INTERVAL_MS);
|
|
64
64
|
}
|
|
65
65
|
export function shouldCloseIdleRuntime(owner, nowMs, activeCommandCount) {
|
|
66
66
|
if (!owner)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-owner.js","sourceRoot":"","sources":["../../../src/browser/runtime-owner.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACtD,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpD,MAAM,YAAY,GAAG,GAAG,CAAC;AAuBzB,SAAS,MAAM;IACX,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,0BAA0B,CACtC,KAAyB,EACzB,QAAgB;IAEhB,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,YAAY;QAAE,OAAO,QAAQ,CAAC;IACvE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,yBAAyB,CACrC,kBAAkB,GAAG,CAAC;IAEtB,OAAO;QACH,SAAS,EAAE,MAAM;QACjB,GAAG,EAAE,IAAI;QACT,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,oBAAoB,EAAE;QACrC,gBAAgB,EAAE,KAAK;QACvB,QAAQ,EAAE,KAAK;QACf,kBAAkB;KACrB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAK5C;IACG,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,OAAO;QACH,SAAS,EAAE,WAAW;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,GAAG;QACd,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,aAAa,EAAE,oBAAoB,EAAE;QACrC,gBAAgB,EAAE,IAAI;QACtB,QAAQ,EAAE,IAAI;KACjB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAY;IACrD,OAAO;QACH,SAAS,EAAE,UAAU;QACrB,GAAG,EAAE,IAAI;QACT,IAAI;QACJ,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,oBAAoB,EAAE;QACrC,gBAAgB,EAAE,KAAK;QACvB,QAAQ,EAAE,KAAK;KAClB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,oBAAoB;IAChC,OAAO,0BAA0B,CAC7B,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"runtime-owner.js","sourceRoot":"","sources":["../../../src/browser/runtime-owner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { closeTab, listTabs } from './connection.js';
|
|
2
|
+
import { listSessions } from './web-ai/session.js';
|
|
3
|
+
import { listLeases } from './web-ai/tab-lease-store.js';
|
|
4
|
+
const DEFAULT_MAX_TABS = 10;
|
|
5
|
+
const DEFAULT_IDLE_TIMEOUT_MS = 30 * 60 * 1000;
|
|
6
|
+
const pinnedTabs = new Set();
|
|
7
|
+
const PROVIDER_ORIGINS = {
|
|
8
|
+
chatgpt: 'https://chatgpt.com',
|
|
9
|
+
gemini: 'https://gemini.google.com',
|
|
10
|
+
grok: 'https://grok.com',
|
|
11
|
+
};
|
|
12
|
+
export function parseTabDuration(value) {
|
|
13
|
+
const raw = String(value || '').trim();
|
|
14
|
+
const match = /^(\d+)\s*(ms|s|m|h)?$/i.exec(raw);
|
|
15
|
+
if (!match)
|
|
16
|
+
return DEFAULT_IDLE_TIMEOUT_MS;
|
|
17
|
+
const n = Number(match[1]);
|
|
18
|
+
const unit = (match[2] || 'm').toLowerCase();
|
|
19
|
+
if (unit === 'ms')
|
|
20
|
+
return n;
|
|
21
|
+
if (unit === 's')
|
|
22
|
+
return n * 1000;
|
|
23
|
+
if (unit === 'h')
|
|
24
|
+
return n * 3_600_000;
|
|
25
|
+
return n * 60_000;
|
|
26
|
+
}
|
|
27
|
+
export function pinTab(targetId) {
|
|
28
|
+
pinnedTabs.add(targetId);
|
|
29
|
+
}
|
|
30
|
+
export function unpinTab(targetId) {
|
|
31
|
+
pinnedTabs.delete(targetId);
|
|
32
|
+
}
|
|
33
|
+
export function isPinned(targetId) {
|
|
34
|
+
return pinnedTabs.has(targetId);
|
|
35
|
+
}
|
|
36
|
+
export function selectTabsForCleanup({ tabs, activeSessionTargetIds = new Set(), pinnedTargetIds = new Set(), now = Date.now(), idleTimeoutMs = DEFAULT_IDLE_TIMEOUT_MS, maxTabs = DEFAULT_MAX_TABS, includeUntracked = false, leaseByTargetId, }) {
|
|
37
|
+
const selected = new Map();
|
|
38
|
+
const hasLeaseMetadata = Boolean(leaseByTargetId);
|
|
39
|
+
const isCloseableByOwnership = (tab) => {
|
|
40
|
+
const lease = leaseByTargetId?.get(tab.targetId);
|
|
41
|
+
if (!hasLeaseMetadata)
|
|
42
|
+
return true;
|
|
43
|
+
if (!lease)
|
|
44
|
+
return includeUntracked;
|
|
45
|
+
if (!['cli-jaw', 'web-ai'].includes(lease.owner))
|
|
46
|
+
return includeUntracked;
|
|
47
|
+
return ['pooled', 'completed-session', 'closing'].includes(lease.state);
|
|
48
|
+
};
|
|
49
|
+
const closeable = tabs.filter(tab => tab.targetId &&
|
|
50
|
+
!pinnedTargetIds.has(tab.targetId) &&
|
|
51
|
+
!activeSessionTargetIds.has(tab.targetId) &&
|
|
52
|
+
isCloseableByOwnership(tab));
|
|
53
|
+
for (const tab of closeable) {
|
|
54
|
+
const lastActiveAt = Number(tab.lastActiveAt);
|
|
55
|
+
const tracked = Number.isFinite(lastActiveAt) && lastActiveAt > 0;
|
|
56
|
+
if ((tracked && now - lastActiveAt > idleTimeoutMs) || (!tracked && includeUntracked)) {
|
|
57
|
+
selected.set(tab.targetId, {
|
|
58
|
+
...tab,
|
|
59
|
+
cleanupReason: tracked ? 'idle-timeout' : 'untracked',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const remaining = tabs.filter(tab => tab.targetId && !selected.has(tab.targetId));
|
|
64
|
+
const remainingCloseable = remaining.filter(tab => {
|
|
65
|
+
const lastActiveAt = Number(tab.lastActiveAt);
|
|
66
|
+
const tracked = Number.isFinite(lastActiveAt) && lastActiveAt > 0;
|
|
67
|
+
return !pinnedTargetIds.has(tab.targetId) &&
|
|
68
|
+
!activeSessionTargetIds.has(tab.targetId) &&
|
|
69
|
+
isCloseableByOwnership(tab) &&
|
|
70
|
+
(tracked || includeUntracked);
|
|
71
|
+
});
|
|
72
|
+
const managedCount = hasLeaseMetadata ? remainingCloseable.length : remaining.length;
|
|
73
|
+
if (managedCount > maxTabs) {
|
|
74
|
+
const limitCloseCount = managedCount - maxTabs;
|
|
75
|
+
const oldest = remainingCloseable
|
|
76
|
+
.slice()
|
|
77
|
+
.sort((a, b) => (Number(a.lastActiveAt) || 0) - (Number(b.lastActiveAt) || 0))
|
|
78
|
+
.slice(0, limitCloseCount);
|
|
79
|
+
for (const tab of oldest) {
|
|
80
|
+
selected.set(tab.targetId, { ...tab, cleanupReason: 'max-tabs' });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return Array.from(selected.values());
|
|
84
|
+
}
|
|
85
|
+
export function selectProviderTabsForCleanup({ tabs, provider, keep = 1, activeSessionTargetIds = new Set(), pinnedTargetIds = new Set(), }) {
|
|
86
|
+
const origin = PROVIDER_ORIGINS[String(provider || '').toLowerCase()];
|
|
87
|
+
if (!origin)
|
|
88
|
+
return [];
|
|
89
|
+
const keepCount = Math.max(0, Number.isFinite(keep) ? Math.trunc(keep) : 1);
|
|
90
|
+
const candidates = tabs
|
|
91
|
+
.filter(tab => tab.targetId && tab.type === 'page')
|
|
92
|
+
.filter(tab => !activeSessionTargetIds.has(tab.targetId))
|
|
93
|
+
.filter(tab => !pinnedTargetIds.has(tab.targetId))
|
|
94
|
+
.filter(tab => {
|
|
95
|
+
try {
|
|
96
|
+
return new URL(tab.url || '').origin === origin;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
.sort((a, b) => (Number(b.lastActiveAt) || 0) - (Number(a.lastActiveAt) || 0));
|
|
103
|
+
return candidates.slice(keepCount).map(tab => ({ ...tab, cleanupReason: 'provider-overflow' }));
|
|
104
|
+
}
|
|
105
|
+
export async function cleanupIdleTabs(port, opts = {}) {
|
|
106
|
+
const tabs = await listTabs(port);
|
|
107
|
+
const leases = await listLeases();
|
|
108
|
+
const leaseByTargetId = new Map(leases.map(lease => [lease.targetId, lease]));
|
|
109
|
+
const activeSessionTargetIds = new Set();
|
|
110
|
+
for (const session of [...listSessions({ status: 'sent' }), ...listSessions({ status: 'streaming' })]) {
|
|
111
|
+
if (session.targetId)
|
|
112
|
+
activeSessionTargetIds.add(session.targetId);
|
|
113
|
+
}
|
|
114
|
+
const candidates = selectTabsForCleanup({
|
|
115
|
+
tabs,
|
|
116
|
+
activeSessionTargetIds,
|
|
117
|
+
pinnedTargetIds: pinnedTabs,
|
|
118
|
+
now: opts.now || Date.now(),
|
|
119
|
+
idleTimeoutMs: opts.idleTimeoutMs || parseTabDuration(process.env["JAW_BROWSER_TAB_IDLE"] || '30m'),
|
|
120
|
+
maxTabs: opts.maxTabs ?? Number(process.env["JAW_BROWSER_MAX_TABS"] || DEFAULT_MAX_TABS),
|
|
121
|
+
includeUntracked: opts.includeUntracked === true,
|
|
122
|
+
leaseByTargetId,
|
|
123
|
+
});
|
|
124
|
+
if (opts.provider) {
|
|
125
|
+
for (const tab of selectProviderTabsForCleanup({
|
|
126
|
+
tabs,
|
|
127
|
+
provider: opts.provider,
|
|
128
|
+
keep: opts.keepProviderTabs ?? 1,
|
|
129
|
+
activeSessionTargetIds,
|
|
130
|
+
pinnedTargetIds: pinnedTabs,
|
|
131
|
+
})) {
|
|
132
|
+
if (!candidates.some(candidate => candidate.targetId === tab.targetId)) {
|
|
133
|
+
candidates.push(tab);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const summary = { closed: 0, idleClosed: 0, limitClosed: 0, untrackedClosed: 0, providerClosed: 0 };
|
|
138
|
+
for (const tab of candidates) {
|
|
139
|
+
try {
|
|
140
|
+
await closeTab(port, tab.targetId);
|
|
141
|
+
summary.closed += 1;
|
|
142
|
+
if (tab.cleanupReason === 'idle-timeout')
|
|
143
|
+
summary.idleClosed += 1;
|
|
144
|
+
else if (tab.cleanupReason === 'max-tabs')
|
|
145
|
+
summary.limitClosed += 1;
|
|
146
|
+
else if (tab.cleanupReason === 'untracked')
|
|
147
|
+
summary.untrackedClosed += 1;
|
|
148
|
+
else if (tab.cleanupReason === 'provider-overflow')
|
|
149
|
+
summary.providerClosed += 1;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Tab may already be closed by the user or Chrome.
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return summary;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=tab-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-lifecycle.js","sourceRoot":"","sources":["../../../src/browser/tab-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,36 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { spawn } from 'child_process';
|
|
6
6
|
import { screenshot, mouseClick, snapshot } from './actions.js';
|
|
7
|
+
function isRecord(value) {
|
|
8
|
+
return Boolean(value && typeof value === 'object' && !Array.isArray(value));
|
|
9
|
+
}
|
|
10
|
+
function recordText(record, key) {
|
|
11
|
+
const value = record[key];
|
|
12
|
+
return typeof value === 'string' ? value : null;
|
|
13
|
+
}
|
|
14
|
+
function parseVisionCoordinates(value) {
|
|
15
|
+
if (!isRecord(value))
|
|
16
|
+
return null;
|
|
17
|
+
if (typeof value["found"] !== 'boolean')
|
|
18
|
+
return null;
|
|
19
|
+
if (typeof value["x"] !== 'number' || typeof value["y"] !== 'number')
|
|
20
|
+
return null;
|
|
21
|
+
return {
|
|
22
|
+
found: value["found"],
|
|
23
|
+
x: value["x"],
|
|
24
|
+
y: value["y"],
|
|
25
|
+
provider: 'codex',
|
|
26
|
+
...(typeof value["description"] === 'string' ? { description: value["description"] } : {}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function collectEventTexts(value) {
|
|
30
|
+
if (!isRecord(value) || !isRecord(value["item"]))
|
|
31
|
+
return [];
|
|
32
|
+
return [
|
|
33
|
+
recordText(value["item"], 'text'),
|
|
34
|
+
recordText(value["item"], 'aggregated_output'),
|
|
35
|
+
].filter((text) => Boolean(text));
|
|
36
|
+
}
|
|
7
37
|
/**
|
|
8
38
|
* Extract click coordinates from screenshot using vision AI.
|
|
9
39
|
* @param {string} screenshotPath - Path to screenshot image
|
|
@@ -57,20 +87,14 @@ function codexVision(screenshotPath, target) {
|
|
|
57
87
|
for (const line of lines.reverse()) { // Reverse: last message most likely has the answer
|
|
58
88
|
try {
|
|
59
89
|
const event = JSON.parse(line);
|
|
60
|
-
const textsToSearch =
|
|
61
|
-
// Collect text from all event types
|
|
62
|
-
if (event.item?.text)
|
|
63
|
-
textsToSearch.push(event.item.text);
|
|
64
|
-
if (event.item?.aggregated_output)
|
|
65
|
-
textsToSearch.push(event.item.aggregated_output);
|
|
90
|
+
const textsToSearch = collectEventTexts(event);
|
|
66
91
|
for (const text of textsToSearch) {
|
|
67
92
|
// Try to extract {"found":...,"x":...,"y":...} from text
|
|
68
93
|
const jsonMatch = text.match(/\{[^{}]*"found"\s*:\s*(true|false)[^{}]*"x"\s*:\s*\d+[^{}]*"y"\s*:\s*\d+[^{}]*\}/);
|
|
69
94
|
if (jsonMatch) {
|
|
70
|
-
const coords = JSON.parse(jsonMatch[0]);
|
|
71
|
-
if (
|
|
72
|
-
return resolve(
|
|
73
|
-
}
|
|
95
|
+
const coords = parseVisionCoordinates(JSON.parse(jsonMatch[0]));
|
|
96
|
+
if (coords)
|
|
97
|
+
return resolve(coords);
|
|
74
98
|
}
|
|
75
99
|
}
|
|
76
100
|
}
|
|
@@ -115,7 +139,7 @@ export async function visionClick(port, target, opts = {}) {
|
|
|
115
139
|
const viewportProbe = await screenshot(port, { json: true });
|
|
116
140
|
const clip = opts.clip || resolveRegionClip(opts.region, viewportProbe.viewport);
|
|
117
141
|
const ss = clip ? await screenshot(port, { clip, json: true }) : viewportProbe;
|
|
118
|
-
const dpr = ss.dpr
|
|
142
|
+
const dpr = typeof ss.dpr === 'number' && Number.isFinite(ss.dpr) ? ss.dpr : 1;
|
|
119
143
|
// 2. Vision → coordinates (image pixel space)
|
|
120
144
|
const result = await extractCoordinates(ss.path, target, {
|
|
121
145
|
provider: opts.provider || 'codex',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vision.js","sourceRoot":"","sources":["../../../src/browser/vision.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"vision.js","sourceRoot":"","sources":["../../../src/browser/vision.ts"],"names":[],"mappings":"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"}
|