cli-jaw 2.2.15 → 2.2.17
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.md +23 -2
- package/dist/bin/cli-jaw.js +39 -0
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/_shared/dashboard-client.js +42 -0
- package/dist/bin/commands/_shared/dashboard-client.js.map +1 -0
- package/dist/bin/commands/_shared/search-format.js +40 -0
- package/dist/bin/commands/_shared/search-format.js.map +1 -0
- package/dist/bin/commands/chat-search.js +5 -3
- package/dist/bin/commands/chat-search.js.map +1 -1
- package/dist/bin/commands/dashboard-chat.js +14 -31
- package/dist/bin/commands/dashboard-chat.js.map +1 -1
- package/dist/bin/commands/dashboard-memory.js +12 -49
- package/dist/bin/commands/dashboard-memory.js.map +1 -1
- package/dist/bin/commands/doctor.js +56 -11
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/init.js +31 -1
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/commands/memory.js +5 -1
- package/dist/bin/commands/memory.js.map +1 -1
- package/dist/bin/commands/provider.js +23 -0
- package/dist/bin/commands/provider.js.map +1 -1
- package/dist/bin/commands/slack.js +57 -3
- package/dist/bin/commands/slack.js.map +1 -1
- package/dist/bin/commands/tui/input-handler.js +1 -1
- package/dist/bin/commands/tui/input-handler.js.map +1 -1
- package/dist/bin/commands/tui/slash-command-runner.js +4 -5
- package/dist/bin/commands/tui/slash-command-runner.js.map +1 -1
- package/dist/bin/postinstall.js +16 -18
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/lib/media-kind.js +28 -0
- package/dist/lib/media-kind.js.map +1 -0
- package/dist/lib/upload.js +27 -10
- package/dist/lib/upload.js.map +1 -1
- package/dist/server.js +35 -51
- package/dist/server.js.map +1 -1
- package/dist/src/agent/args.js +34 -0
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/codex-app-client.js +1016 -135
- package/dist/src/agent/codex-app-client.js.map +1 -1
- package/dist/src/agent/codex-app-events.js +72 -1
- package/dist/src/agent/codex-app-events.js.map +1 -1
- package/dist/src/agent/codex-host-pool.js +617 -0
- package/dist/src/agent/codex-host-pool.js.map +1 -0
- package/dist/src/agent/jwc-runtime.js +12 -4
- package/dist/src/agent/jwc-runtime.js.map +1 -1
- package/dist/src/agent/kiro-auth.js +10 -4
- package/dist/src/agent/kiro-auth.js.map +1 -1
- package/dist/src/agent/kiro-runtime.js +45 -8
- package/dist/src/agent/kiro-runtime.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +75 -52
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/memory-flush-controller.js +241 -33
- package/dist/src/agent/memory-flush-controller.js.map +1 -1
- package/dist/src/agent/prompt-context.js +4 -0
- package/dist/src/agent/prompt-context.js.map +1 -1
- package/dist/src/agent/runtime-pool.js +64 -34
- package/dist/src/agent/runtime-pool.js.map +1 -1
- package/dist/src/agent/session-persistence.js +71 -15
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/spawn/queue.js +319 -162
- package/dist/src/agent/spawn/queue.js.map +1 -1
- package/dist/src/agent/spawn.js +581 -268
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/bgtask/types.js +1 -1
- package/dist/src/bgtask/types.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/safety.js +25 -0
- package/dist/src/browser/adaptive-fetch/safety.js.map +1 -1
- package/dist/src/browser/connection.js +2 -8
- package/dist/src/browser/connection.js.map +1 -1
- package/dist/src/cli/capability-probe-worker.js +172 -0
- package/dist/src/cli/capability-probe-worker.js.map +1 -0
- package/dist/src/cli/capability-probe.js +83 -0
- package/dist/src/cli/capability-probe.js.map +1 -0
- package/dist/src/cli/claude-models.js +2 -2
- package/dist/src/cli/claude-models.js.map +1 -1
- package/dist/src/cli/cli-status-worker.js +296 -0
- package/dist/src/cli/cli-status-worker.js.map +1 -0
- package/dist/src/cli/cli-status.js +81 -0
- package/dist/src/cli/cli-status.js.map +1 -0
- package/dist/src/cli/command-context.js +17 -5
- package/dist/src/cli/command-context.js.map +1 -1
- package/dist/src/cli/compact.js +56 -19
- package/dist/src/cli/compact.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +6 -4
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/handlers.js +7 -2
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/opencodex-models.js +5 -32
- package/dist/src/cli/opencodex-models.js.map +1 -1
- package/dist/src/cli/opencodex-runtime.js +82 -0
- package/dist/src/cli/opencodex-runtime.js.map +1 -0
- package/dist/src/cli/readiness.js +35 -18
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry-live.js +8 -2
- package/dist/src/cli/registry-live.js.map +1 -1
- package/dist/src/cli/registry.js +1 -1
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/core/browser-open-default.js +6 -4
- package/dist/src/core/browser-open-default.js.map +1 -1
- package/dist/src/core/browser-open.js +11 -15
- package/dist/src/core/browser-open.js.map +1 -1
- package/dist/src/core/bus.js +7 -1
- package/dist/src/core/bus.js.map +1 -1
- package/dist/src/core/chat-sessions.js +121 -12
- package/dist/src/core/chat-sessions.js.map +1 -1
- package/dist/src/core/cli-detect.js +148 -4
- package/dist/src/core/cli-detect.js.map +1 -1
- package/dist/src/core/codex-config.js +21 -0
- package/dist/src/core/codex-config.js.map +1 -1
- package/dist/src/core/compact.js +73 -21
- package/dist/src/core/compact.js.map +1 -1
- package/dist/src/core/config.js +449 -20
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +225 -0
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/event-bus.js +49 -4
- package/dist/src/core/event-bus.js.map +1 -1
- package/dist/src/core/event-scope.js +100 -0
- package/dist/src/core/event-scope.js.map +1 -0
- package/dist/src/core/install-integrity.js +176 -0
- package/dist/src/core/install-integrity.js.map +1 -0
- package/dist/src/core/main-session.js +64 -21
- package/dist/src/core/main-session.js.map +1 -1
- package/dist/src/core/message-summary.js +12 -2
- package/dist/src/core/message-summary.js.map +1 -1
- package/dist/src/core/platform-kind.js +139 -0
- package/dist/src/core/platform-kind.js.map +1 -0
- package/dist/src/core/rate-limit.js +156 -0
- package/dist/src/core/rate-limit.js.map +1 -0
- package/dist/src/core/runtime-settings.js +165 -17
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/session-context.js +7 -0
- package/dist/src/core/session-context.js.map +1 -0
- package/dist/src/core/session-ops.js +53 -9
- package/dist/src/core/session-ops.js.map +1 -1
- package/dist/src/core/settings-merge.js +105 -3
- package/dist/src/core/settings-merge.js.map +1 -1
- package/dist/src/core/settings-watch.js +29 -5
- package/dist/src/core/settings-watch.js.map +1 -1
- package/dist/src/core/widget-watcher.js +15 -2
- package/dist/src/core/widget-watcher.js.map +1 -1
- package/dist/src/discord/bot.js +5 -2
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/commands.js +4 -4
- package/dist/src/discord/commands.js.map +1 -1
- package/dist/src/goal/heartbeat.js +1 -1
- package/dist/src/goal/heartbeat.js.map +1 -1
- package/dist/src/goal/runtime.js +1 -1
- package/dist/src/goal/runtime.js.map +1 -1
- package/dist/src/goal-run/controller.js +2 -2
- package/dist/src/goal-run/controller.js.map +1 -1
- package/dist/src/manager/internal-fetch.js +15 -0
- package/dist/src/manager/internal-fetch.js.map +1 -0
- package/dist/src/manager/logs.js +2 -1
- package/dist/src/manager/logs.js.map +1 -1
- package/dist/src/manager/memory/chat-federation.js +104 -11
- package/dist/src/manager/memory/chat-federation.js.map +1 -1
- package/dist/src/manager/memory/federation.js +100 -0
- package/dist/src/manager/memory/federation.js.map +1 -1
- package/dist/src/manager/metadata.js +4 -1
- package/dist/src/manager/metadata.js.map +1 -1
- package/dist/src/manager/notes/assets.js +1 -1
- package/dist/src/manager/notes/assets.js.map +1 -1
- package/dist/src/manager/notes/frontmatter.js +5 -49
- package/dist/src/manager/notes/frontmatter.js.map +1 -1
- package/dist/src/manager/notes/link-resolver.js +2 -2
- package/dist/src/manager/notes/link-resolver.js.map +1 -1
- package/dist/src/manager/notes/remote-assets.js +1 -1
- package/dist/src/manager/notes/remote-assets.js.map +1 -1
- package/dist/src/manager/notes/routes.js +2 -2
- package/dist/src/manager/notes/routes.js.map +1 -1
- package/dist/src/manager/notes/store.js +2 -2
- package/dist/src/manager/notes/store.js.map +1 -1
- package/dist/src/manager/notes/trash.js +1 -1
- package/dist/src/manager/notes/trash.js.map +1 -1
- package/dist/src/manager/notes/vault-index.js +2 -2
- package/dist/src/manager/notes/vault-index.js.map +1 -1
- package/dist/src/manager/notes/wiki-links.js +1 -1
- package/dist/src/manager/notes/wiki-links.js.map +1 -1
- package/dist/src/manager/notes/wiki-routes.js +84 -0
- package/dist/src/manager/notes/wiki-routes.js.map +1 -0
- package/dist/src/manager/proxy.js +1 -0
- package/dist/src/manager/proxy.js.map +1 -1
- package/dist/src/manager/routes/dashboard-memory.js +24 -1
- package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
- package/dist/src/manager/routes/runtime-monitor.js +1 -1
- package/dist/src/manager/routes/runtime-monitor.js.map +1 -1
- package/dist/src/manager/scan.js +5 -3
- package/dist/src/manager/scan.js.map +1 -1
- package/dist/src/manager/server.js +20 -6
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/telegram-hub/hub-bot.js +4 -3
- package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -1
- package/dist/src/manager/worker-events.js +2 -1
- package/dist/src/manager/worker-events.js.map +1 -1
- package/dist/src/memory/heartbeat.js +6 -5
- package/dist/src/memory/heartbeat.js.map +1 -1
- package/dist/src/memory/indexing.js +162 -45
- package/dist/src/memory/indexing.js.map +1 -1
- package/dist/src/messaging/channel-validate.js +14 -1
- package/dist/src/messaging/channel-validate.js.map +1 -1
- package/dist/src/messaging/redact.js +2 -1
- package/dist/src/messaging/redact.js.map +1 -1
- package/dist/src/messaging/session-key.js +21 -2
- package/dist/src/messaging/session-key.js.map +1 -1
- package/dist/src/notes/constants.js.map +1 -0
- package/dist/src/notes/frontmatter.js +59 -0
- package/dist/src/notes/frontmatter.js.map +1 -0
- package/dist/src/notes/path-guards.js.map +1 -0
- package/dist/src/notes/search.js.map +1 -0
- package/dist/src/orchestrator/attestation.js +1 -1
- package/dist/src/orchestrator/attestation.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +135 -31
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +53 -21
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/scope.js +36 -2
- package/dist/src/orchestrator/scope.js.map +1 -1
- package/dist/src/orchestrator/session-lanes.js +87 -0
- package/dist/src/orchestrator/session-lanes.js.map +1 -0
- package/dist/src/orchestrator/session-work.js +25 -0
- package/dist/src/orchestrator/session-work.js.map +1 -0
- package/dist/src/orchestrator/state-machine.js +1 -5
- package/dist/src/orchestrator/state-machine.js.map +1 -1
- package/dist/src/orchestrator/worker-registry.js +20 -10
- package/dist/src/orchestrator/worker-registry.js.map +1 -1
- package/dist/src/prompt/builder.js +40 -2
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +8 -1
- package/dist/src/routes/agent-control.js +44 -8
- package/dist/src/routes/agent-control.js.map +1 -1
- package/dist/src/routes/chat-sessions.js +34 -6
- package/dist/src/routes/chat-sessions.js.map +1 -1
- package/dist/src/routes/command.js +63 -8
- package/dist/src/routes/command.js.map +1 -1
- package/dist/src/routes/events.js +11 -2
- package/dist/src/routes/events.js.map +1 -1
- package/dist/src/routes/link-preview.js +1 -27
- package/dist/src/routes/link-preview.js.map +1 -1
- package/dist/src/routes/messages.js +6 -5
- package/dist/src/routes/messages.js.map +1 -1
- package/dist/src/routes/messaging.js +45 -1
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +53 -33
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/search.js +84 -0
- package/dist/src/routes/search.js.map +1 -0
- package/dist/src/routes/session-request.js +29 -0
- package/dist/src/routes/session-request.js.map +1 -0
- package/dist/src/routes/settings.js +110 -3
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/static.js +30 -8
- package/dist/src/routes/static.js.map +1 -1
- package/dist/src/routes/system.js +1 -1
- package/dist/src/routes/system.js.map +1 -1
- package/dist/src/routes/wiki.js +122 -0
- package/dist/src/routes/wiki.js.map +1 -0
- package/dist/src/search/contract.js +2 -0
- package/dist/src/search/contract.js.map +1 -0
- package/dist/src/search/coordinator.js +153 -0
- package/dist/src/search/coordinator.js.map +1 -0
- package/dist/src/search/provider.js +40 -0
- package/dist/src/search/provider.js.map +1 -0
- package/dist/src/search/providers/chat.js +115 -0
- package/dist/src/search/providers/chat.js.map +1 -0
- package/dist/src/search/providers/memory.js +53 -0
- package/dist/src/search/providers/memory.js.map +1 -0
- package/dist/src/search/providers/wiki.js +80 -0
- package/dist/src/search/providers/wiki.js.map +1 -0
- package/dist/src/slack/api.js +10 -1
- package/dist/src/slack/api.js.map +1 -1
- package/dist/src/slack/attachment-recovery.js +42 -0
- package/dist/src/slack/attachment-recovery.js.map +1 -0
- package/dist/src/slack/bot.js +120 -41
- package/dist/src/slack/bot.js.map +1 -1
- package/dist/src/slack/commands.js +24 -8
- package/dist/src/slack/commands.js.map +1 -1
- package/dist/src/slack/events.js +12 -1
- package/dist/src/slack/events.js.map +1 -1
- package/dist/src/slack/history.js +108 -0
- package/dist/src/slack/history.js.map +1 -0
- package/dist/src/slack/inbound-file.js +242 -0
- package/dist/src/slack/inbound-file.js.map +1 -0
- package/dist/src/slack/inbound-url.js +39 -0
- package/dist/src/slack/inbound-url.js.map +1 -0
- package/dist/src/slack/ingress.js +140 -0
- package/dist/src/slack/ingress.js.map +1 -0
- package/dist/src/slack/manifest.js +3 -0
- package/dist/src/slack/manifest.js.map +1 -1
- package/dist/src/slack/socket.js +1 -1
- package/dist/src/slack/socket.js.map +1 -1
- package/dist/src/slack/thread-tracker.js +86 -0
- package/dist/src/slack/thread-tracker.js.map +1 -0
- package/dist/src/telegram/bot.js +21 -11
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/wiki/config.js +193 -0
- package/dist/src/wiki/config.js.map +1 -0
- package/dist/src/wiki/entities.js +61 -0
- package/dist/src/wiki/entities.js.map +1 -0
- package/dist/src/wiki/ontology.js +72 -0
- package/dist/src/wiki/ontology.js.map +1 -0
- package/dist/src/wiki/prompt.js +172 -0
- package/dist/src/wiki/prompt.js.map +1 -0
- package/dist/src/wiki/safe-traversal.js +198 -0
- package/dist/src/wiki/safe-traversal.js.map +1 -0
- package/dist/src/wiki/scaffold.js +77 -0
- package/dist/src/wiki/scaffold.js.map +1 -0
- package/package.json +6 -5
- package/public/css/session-hub.css +266 -0
- package/public/dist/assets/AdvancedExport-DYGcCAUq.js +1 -0
- package/public/dist/assets/Agent-CNNQ7KkJ.js +1 -0
- package/public/dist/assets/{DesignPanel-BGMPhZSx.js → DesignPanel-DcL369nB.js} +1 -1
- package/public/dist/assets/{DocPanel-Dz-J_l5M.js → DocPanel-K8A2pm_1.js} +1 -1
- package/public/dist/assets/{FolderPanel-DbPhzzvi.js → FolderPanel-CV52EzwG.js} +1 -1
- package/public/dist/assets/{MilkdownWysiwygEditor-Em7iC6y9.js → MilkdownWysiwygEditor-BKOCDI4Z.js} +1 -1
- package/public/dist/assets/api-B25zNNFJ.js +1 -0
- package/public/dist/assets/{app-DX4e6isX.css → app-DjgGeXhJ.css} +1 -1
- package/public/dist/assets/app-Dsgp4xpU.js +55 -0
- package/public/dist/assets/bgtask-badge-C6h5C-o4.js +1 -0
- package/public/dist/assets/{bgtask-badge-qMkKOZx0.js → bgtask-badge-CpavV0Jc.js} +4 -4
- package/public/dist/assets/{employees-BnobWM_2.js → employees-BJyEgim7.js} +4 -4
- package/public/dist/assets/idb-cache-B5PX63p7.js +1 -0
- package/public/dist/assets/{idb-cache-BzzftUET.js → idb-cache-lOntwU3S.js} +1 -1
- package/public/dist/assets/{iframe-renderer-C5vRbbl9.js → iframe-renderer-B8k3AvTv.js} +12 -12
- package/public/dist/assets/iframe-renderer-BO_GgCTR.js +1 -0
- package/public/dist/assets/manager-LkGs6qEJ.css +1 -0
- package/public/dist/assets/manager-kXYQyMhR.js +13 -0
- package/public/dist/assets/{memory-DF4kPwwC.js → memory-D2RbBVO-.js} +11 -11
- package/public/dist/assets/memory-amsvg4Ey.js +1 -0
- package/public/dist/assets/message-history-BGHZxvgV.js +1 -0
- package/public/dist/assets/message-history-Bw2E_b8L.js +1 -0
- package/public/dist/assets/pi-settings-5HVg1sXJ.js +1 -0
- package/public/dist/assets/render-BkGcpH7z.js +157 -0
- package/public/dist/assets/settings-B1FPORO2.js +56 -0
- package/public/dist/assets/settings-CMN-zN4Q.js +1 -0
- package/public/dist/assets/settings-core-B_OjGYVN.js +1 -0
- package/public/dist/assets/settings-core-CxRwqx86.js +144 -0
- package/public/dist/assets/sidebar-DW78DANx.js +49 -0
- package/public/dist/assets/skills-Dz-9Yrxr.js +1 -0
- package/public/dist/assets/{skills-IGquen_j.js → skills-lWi0ZFiV.js} +6 -6
- package/public/dist/assets/{slash-commands-ZRDOL99E.js → slash-commands-DYOI6nKj.js} +1 -1
- package/public/dist/assets/slash-commands-xJFCdTTM.js +1 -0
- package/public/dist/assets/{trace-drawer-D8To8fYt.js → trace-drawer-DBX9xzmt.js} +1 -1
- package/public/dist/assets/{ui-Hx_mNoDf.js → ui-Bx7eqnXt.js} +1 -1
- package/public/dist/assets/ui-JOcrYeG-.js +1 -0
- package/public/dist/assets/{wiki-link-suggestions-DZQc78gj.js → wiki-link-suggestions-Dp6kBQVu.js} +1 -1
- package/public/dist/index.html +4 -4
- package/public/dist/manager/index.html +2 -2
- package/public/index.html +3 -2
- package/public/js/event-channel.ts +25 -0
- package/public/js/features/channel-onboarding-flow.ts +16 -1
- package/public/js/features/channel-onboarding.ts +20 -2
- package/public/js/features/chat-messages.ts +3 -1
- package/public/js/features/chat-search.ts +2 -1
- package/public/js/features/chat.ts +56 -18
- package/public/js/features/elicitation.ts +15 -0
- package/public/js/features/idb-cache.ts +34 -0
- package/public/js/features/message-history.ts +2 -1
- package/public/js/features/session-hub.ts +334 -0
- package/public/js/features/settings-cli-status-render.ts +1 -1
- package/public/js/features/settings-cli-status.ts +25 -11
- package/public/js/features/settings-core.ts +72 -3
- package/public/js/features/settings-types.ts +32 -0
- package/public/js/features/ui-status.ts +2 -1
- package/public/js/main.ts +20 -0
- package/public/js/render/compose-block.ts +7 -0
- package/public/js/ws.ts +22 -2
- package/public/locales/en.json +46 -4
- package/public/locales/ja.json +46 -4
- package/public/locales/ko.json +46 -4
- package/public/locales/zh.json +46 -4
- package/public/manager/src/App.tsx +1 -1
- package/public/manager/src/InstancePreview.tsx +5 -1
- package/public/manager/src/api.ts +2 -1
- package/public/manager/src/components/InstanceGroups.tsx +10 -0
- package/public/manager/src/components/InstanceListContent.tsx +24 -1
- package/public/manager/src/components/InstanceRow.tsx +33 -3
- package/public/manager/src/components/InstanceSessionList.tsx +132 -0
- package/public/manager/src/hooks/useActiveSessionDisclosure.ts +45 -0
- package/public/manager/src/lib/resilient-fetch.ts +93 -0
- package/public/manager/src/lib/session-store.ts +216 -0
- package/public/manager/src/manager-components.css +97 -0
- package/public/manager/src/settings/pages/AdvancedExport.tsx +12 -2
- package/public/manager/src/settings/pages/Agent.tsx +113 -1
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +1 -1
- package/scripts/bundle-sidecar.sh +50 -2
- package/scripts/burst-scenario.mjs +72 -0
- package/scripts/check-redaction-sinks.mjs +1 -0
- package/scripts/check-strict-baseline.mjs +1 -1
- package/scripts/ensure-native-modules.cjs +50 -3
- package/scripts/install-risk-gate.mjs +8 -0
- package/scripts/install-wsl.sh +27 -2
- package/scripts/install.ps1 +121 -0
- package/scripts/install.sh +28 -2
- package/scripts/postinstall-guard.cjs +44 -2
- package/scripts/release-gates.mjs +12 -0
- package/dist/src/manager/notes/constants.js.map +0 -1
- package/dist/src/manager/notes/path-guards.js.map +0 -1
- package/dist/src/manager/notes/search.js.map +0 -1
- package/public/dist/assets/AdvancedExport-DsDpqXoH.js +0 -1
- package/public/dist/assets/Agent-BjbZVZ9p.js +0 -1
- package/public/dist/assets/api-C9dOxby7.js +0 -1
- package/public/dist/assets/app-BzD_ZLvt.js +0 -55
- package/public/dist/assets/bgtask-badge-Dqbp-Y4e.js +0 -1
- package/public/dist/assets/idb-cache-ZH6lOebk.js +0 -1
- package/public/dist/assets/iframe-renderer-Df4KIVyx.js +0 -1
- package/public/dist/assets/manager-C4eNDNFt.css +0 -1
- package/public/dist/assets/manager-DaN201mN.js +0 -13
- package/public/dist/assets/memory-D-bULTHl.js +0 -1
- package/public/dist/assets/message-history-C4WOisGx.js +0 -1
- package/public/dist/assets/message-history-ZBoza6ew.js +0 -1
- package/public/dist/assets/pi-settings-CBUGDAuT.js +0 -1
- package/public/dist/assets/render-DYX6GRQ0.js +0 -122
- package/public/dist/assets/settings-DbJpGoaX.js +0 -55
- package/public/dist/assets/settings-SreihUje.js +0 -1
- package/public/dist/assets/settings-core-B1Y5Nb4Z.js +0 -1
- package/public/dist/assets/settings-core-DobZWIZ7.js +0 -140
- package/public/dist/assets/sidebar-Cp22g0Gv.js +0 -49
- package/public/dist/assets/skills-DwPIP08e.js +0 -1
- package/public/dist/assets/slash-commands-BBVfwcnW.js +0 -1
- package/public/dist/assets/ui-CAicpUZc.js +0 -1
- /package/dist/src/{manager/notes → notes}/constants.js +0 -0
- /package/dist/src/{manager/notes → notes}/path-guards.js +0 -0
- /package/dist/src/{manager/notes → notes}/search.js +0 -0
- /package/public/dist/assets/{pi-settings-Dh5lgb87.js → pi-settings-DEuKgvIj.js} +0 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { fork, spawn } from 'node:child_process';
|
|
2
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
3
|
+
import { extname } from 'node:path';
|
|
4
|
+
import { detectAllCli } from '../core/cli-detection.js';
|
|
5
|
+
import { readClaudeCreds, readCodexTokens } from '../routes/quota.js';
|
|
6
|
+
import { hasCopilotAuthSync } from '../../lib/quota-copilot.js';
|
|
7
|
+
import { killProcessTree, killProcessTreeIfAlive } from '../agent/spawn/process-kill.js';
|
|
8
|
+
import { probeCodexAppCapabilityAsync } from './capability-probe.js';
|
|
9
|
+
import { CLI_KEYS } from './registry.js';
|
|
10
|
+
const WORKER_OUTER_TIMEOUT_MS = 60_000;
|
|
11
|
+
const WORKER_KILL_GRACE_MS = 250;
|
|
12
|
+
const CHILD_MARKER = '--cli-status-worker-child';
|
|
13
|
+
const OUTPUT_LIMIT_BYTES = 64 * 1024;
|
|
14
|
+
function defaultWorkerPath() {
|
|
15
|
+
const extension = extname(fileURLToPath(import.meta.url));
|
|
16
|
+
return fileURLToPath(new URL(`./cli-status-worker${extension}`, import.meta.url));
|
|
17
|
+
}
|
|
18
|
+
function workerExecArgv() {
|
|
19
|
+
const args = [];
|
|
20
|
+
for (let index = 0; index < process.execArgv.length; index += 1) {
|
|
21
|
+
const arg = process.execArgv[index];
|
|
22
|
+
if (arg === '--eval' || arg === '-e' || arg === '--print' || arg === '-p') {
|
|
23
|
+
index += 1;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (arg === '--input-type' || arg?.startsWith('--input-type=')) {
|
|
27
|
+
if (arg === '--input-type')
|
|
28
|
+
index += 1;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (arg)
|
|
32
|
+
args.push(arg);
|
|
33
|
+
}
|
|
34
|
+
return args;
|
|
35
|
+
}
|
|
36
|
+
function terminateWorker(child) {
|
|
37
|
+
if (!child.pid)
|
|
38
|
+
return;
|
|
39
|
+
if (process.platform !== 'win32') {
|
|
40
|
+
try {
|
|
41
|
+
process.kill(-child.pid, 'SIGTERM');
|
|
42
|
+
}
|
|
43
|
+
catch { /* group may not exist */ }
|
|
44
|
+
}
|
|
45
|
+
killProcessTree(child.pid, 'SIGTERM');
|
|
46
|
+
const escalation = setTimeout(() => {
|
|
47
|
+
if (process.platform !== 'win32' && child.pid) {
|
|
48
|
+
try {
|
|
49
|
+
process.kill(-child.pid, 'SIGKILL');
|
|
50
|
+
}
|
|
51
|
+
catch { /* already exited */ }
|
|
52
|
+
}
|
|
53
|
+
killProcessTreeIfAlive(child, child.pid);
|
|
54
|
+
}, WORKER_KILL_GRACE_MS);
|
|
55
|
+
escalation.unref();
|
|
56
|
+
}
|
|
57
|
+
function isSnapshot(value) {
|
|
58
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
59
|
+
return false;
|
|
60
|
+
const snapshot = value;
|
|
61
|
+
return CLI_KEYS.every((cli) => {
|
|
62
|
+
const row = snapshot[cli];
|
|
63
|
+
if (!row || typeof row !== 'object' || Array.isArray(row))
|
|
64
|
+
return false;
|
|
65
|
+
const record = row;
|
|
66
|
+
return (typeof record['available'] === 'boolean' || record['available'] === null)
|
|
67
|
+
&& (typeof record['binaryInstalled'] === 'boolean' || record['binaryInstalled'] === null)
|
|
68
|
+
&& (typeof record['capabilityReady'] === 'boolean' || record['capabilityReady'] === null)
|
|
69
|
+
&& (typeof record['authenticated'] === 'boolean' || record['authenticated'] === null)
|
|
70
|
+
&& (typeof record['path'] === 'string' || record['path'] === null)
|
|
71
|
+
&& typeof record['source'] === 'string'
|
|
72
|
+
&& ['checking', 'fresh', 'stale'].includes(String(record['probeState']));
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
export function runCliStatusWorker(options = {}) {
|
|
76
|
+
const workerPath = options.workerPath ?? defaultWorkerPath();
|
|
77
|
+
const child = fork(workerPath, options.workerPath ? [] : [CHILD_MARKER], {
|
|
78
|
+
detached: process.platform !== 'win32',
|
|
79
|
+
env: options.env ?? process.env,
|
|
80
|
+
execArgv: workerExecArgv(),
|
|
81
|
+
stdio: ['ignore', 'ignore', 'ignore', 'ipc'],
|
|
82
|
+
});
|
|
83
|
+
return new Promise((resolve, reject) => {
|
|
84
|
+
let settled = false;
|
|
85
|
+
const finish = (error, snapshot) => {
|
|
86
|
+
if (settled)
|
|
87
|
+
return;
|
|
88
|
+
settled = true;
|
|
89
|
+
clearTimeout(timeout);
|
|
90
|
+
child.removeAllListeners();
|
|
91
|
+
if (error)
|
|
92
|
+
reject(error);
|
|
93
|
+
else
|
|
94
|
+
resolve(snapshot);
|
|
95
|
+
};
|
|
96
|
+
const timeout = setTimeout(() => {
|
|
97
|
+
terminateWorker(child);
|
|
98
|
+
finish(new Error(`CLI status worker exceeded ${options.timeoutMs ?? WORKER_OUTER_TIMEOUT_MS}ms`));
|
|
99
|
+
}, options.timeoutMs ?? WORKER_OUTER_TIMEOUT_MS);
|
|
100
|
+
timeout.unref();
|
|
101
|
+
child.once('error', (error) => finish(error));
|
|
102
|
+
child.once('exit', (code, signal) => {
|
|
103
|
+
if (!settled)
|
|
104
|
+
finish(new Error(`CLI status worker exited before result (${code ?? signal ?? 'unknown'})`));
|
|
105
|
+
});
|
|
106
|
+
child.once('message', (message) => {
|
|
107
|
+
const payload = message;
|
|
108
|
+
if (payload?.ok === true && isSnapshot(payload.snapshot)) {
|
|
109
|
+
finish(null, payload.snapshot);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
finish(new Error(typeof payload?.error === 'string' ? payload.error : 'Invalid CLI status worker response'));
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
export function runCommand(binary, args, timeoutMs) {
|
|
117
|
+
return new Promise((resolve) => {
|
|
118
|
+
const child = spawn(binary, args, {
|
|
119
|
+
detached: process.platform !== 'win32',
|
|
120
|
+
shell: process.platform === 'win32' && !binary.toLowerCase().endsWith('.exe'),
|
|
121
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
122
|
+
});
|
|
123
|
+
let output = '';
|
|
124
|
+
let bytes = 0;
|
|
125
|
+
let timedOut = false;
|
|
126
|
+
let outputLimited = false;
|
|
127
|
+
let settled = false;
|
|
128
|
+
const finish = (code) => {
|
|
129
|
+
if (settled)
|
|
130
|
+
return;
|
|
131
|
+
settled = true;
|
|
132
|
+
clearTimeout(timer);
|
|
133
|
+
const result = { code, output, timedOut, outputLimited };
|
|
134
|
+
if (cleanupDone)
|
|
135
|
+
void cleanupDone.then(() => resolve(result));
|
|
136
|
+
else
|
|
137
|
+
resolve(result);
|
|
138
|
+
};
|
|
139
|
+
// Both abort paths face the same process: one that may ignore SIGTERM
|
|
140
|
+
// and may have left a descendant holding the pipe. Terminating only on
|
|
141
|
+
// the timeout path would let a chatty command survive by exceeding the
|
|
142
|
+
// output cap instead of the clock, so they share one escalation.
|
|
143
|
+
//
|
|
144
|
+
// The tree walk alone is not enough. If the direct child obeys SIGTERM
|
|
145
|
+
// and only a grandchild ignores it, the escalation would find the child
|
|
146
|
+
// already gone and return, leaving an orphan that no PID-parent scan
|
|
147
|
+
// can reach any more. On POSIX the child is detached and therefore
|
|
148
|
+
// leads its own process group, so signalling the negated PID covers
|
|
149
|
+
// every descendant regardless of what the direct child did.
|
|
150
|
+
//
|
|
151
|
+
// The escalation must not be unref'd. This runs inside a short-lived
|
|
152
|
+
// worker that exits as soon as the last probe settles, and an unref'd
|
|
153
|
+
// timer simply never fires there: the direct child's pipe closes, the
|
|
154
|
+
// event loop empties, and the process leaves before the grace period is
|
|
155
|
+
// up. Holding a real ref and resolving only after cleanup keeps the
|
|
156
|
+
// worker alive exactly long enough to finish killing what it started.
|
|
157
|
+
let aborted = false;
|
|
158
|
+
let cleanupDone = null;
|
|
159
|
+
const signalGroup = (signal) => {
|
|
160
|
+
if (process.platform === 'win32' || !child.pid)
|
|
161
|
+
return;
|
|
162
|
+
try {
|
|
163
|
+
process.kill(-child.pid, signal);
|
|
164
|
+
}
|
|
165
|
+
catch { /* group already gone */ }
|
|
166
|
+
};
|
|
167
|
+
const abortChild = () => {
|
|
168
|
+
if (aborted || !child.pid)
|
|
169
|
+
return;
|
|
170
|
+
aborted = true;
|
|
171
|
+
killProcessTree(child.pid, 'SIGTERM');
|
|
172
|
+
signalGroup('SIGTERM');
|
|
173
|
+
cleanupDone = new Promise((done) => {
|
|
174
|
+
setTimeout(() => {
|
|
175
|
+
killProcessTreeIfAlive(child, child.pid);
|
|
176
|
+
signalGroup('SIGKILL');
|
|
177
|
+
done();
|
|
178
|
+
}, WORKER_KILL_GRACE_MS);
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
const onData = (chunk) => {
|
|
182
|
+
if (settled || outputLimited)
|
|
183
|
+
return;
|
|
184
|
+
bytes += chunk.byteLength;
|
|
185
|
+
if (bytes > OUTPUT_LIMIT_BYTES) {
|
|
186
|
+
outputLimited = true;
|
|
187
|
+
abortChild();
|
|
188
|
+
finish(null);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
output += chunk.toString('utf8');
|
|
192
|
+
};
|
|
193
|
+
child.stdout?.on('data', onData);
|
|
194
|
+
child.stderr?.on('data', onData);
|
|
195
|
+
child.once('error', () => finish(null));
|
|
196
|
+
child.once('exit', (code) => finish(code));
|
|
197
|
+
const timer = setTimeout(() => {
|
|
198
|
+
timedOut = true;
|
|
199
|
+
abortChild();
|
|
200
|
+
finish(null);
|
|
201
|
+
}, timeoutMs);
|
|
202
|
+
timer.unref();
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
async function probeCodexApp(binary) {
|
|
206
|
+
const result = await probeCodexAppCapabilityAsync(binary);
|
|
207
|
+
return result.ok ? { ready: true } : { ready: false, reason: `app-server ${result.reason}` };
|
|
208
|
+
}
|
|
209
|
+
async function authForCli(cli, path, detected) {
|
|
210
|
+
switch (cli) {
|
|
211
|
+
case 'agy': return { authenticated: true, source: 'installed; auth checked by agy at run time' };
|
|
212
|
+
case 'ai-e': return { authenticated: true, source: 'provider-delegated' };
|
|
213
|
+
case 'pi': return { authenticated: true, source: 'profile auth validated at registration' };
|
|
214
|
+
case 'claude': {
|
|
215
|
+
const creds = readClaudeCreds();
|
|
216
|
+
return { authenticated: Boolean(creds?.token) || creds?.source === 'cloud-provider-env', source: creds?.source ?? 'none' };
|
|
217
|
+
}
|
|
218
|
+
case 'codex':
|
|
219
|
+
case 'codex-app': {
|
|
220
|
+
const authenticated = Boolean(readCodexTokens()?.access_token);
|
|
221
|
+
return { authenticated, source: authenticated ? 'auth.json' : 'none' };
|
|
222
|
+
}
|
|
223
|
+
case 'cursor': {
|
|
224
|
+
if (process.env['CURSOR_API_KEY'])
|
|
225
|
+
return { authenticated: true, source: 'CURSOR_API_KEY' };
|
|
226
|
+
const result = await runCommand(path || 'cursor-agent', ['status'], 5_000);
|
|
227
|
+
const authenticated = result.code === 0 && /logged in|authenticated/i.test(result.output);
|
|
228
|
+
return { authenticated, source: authenticated ? 'cursor-agent status' : 'none' };
|
|
229
|
+
}
|
|
230
|
+
case 'kiro-code': {
|
|
231
|
+
const result = await runCommand(path || 'kiro-cli', ['whoami'], 5_000);
|
|
232
|
+
const authenticated = result.code === 0 && /logged in|email:/i.test(result.output);
|
|
233
|
+
return { authenticated, source: authenticated ? 'kiro-cli whoami' : 'none' };
|
|
234
|
+
}
|
|
235
|
+
case 'grok': {
|
|
236
|
+
const result = await runCommand(path || 'grok', ['models'], 5_000);
|
|
237
|
+
const authenticated = result.code === 0 && /grok-build|Available models/.test(result.output);
|
|
238
|
+
return { authenticated, source: authenticated ? 'grok models' : 'none' };
|
|
239
|
+
}
|
|
240
|
+
case 'copilot': {
|
|
241
|
+
const authenticated = hasCopilotAuthSync();
|
|
242
|
+
return { authenticated, source: authenticated ? 'local-auth-chain' : 'none' };
|
|
243
|
+
}
|
|
244
|
+
case 'claude-e': {
|
|
245
|
+
if (!detected['claude']?.available)
|
|
246
|
+
return { authenticated: false, source: 'underlying claude missing' };
|
|
247
|
+
const creds = readClaudeCreds();
|
|
248
|
+
return { authenticated: Boolean(creds?.token) || creds?.source === 'cloud-provider-env', source: creds?.source ?? 'none' };
|
|
249
|
+
}
|
|
250
|
+
case 'opencode': return { authenticated: true, source: 'installed' };
|
|
251
|
+
default: return { authenticated: false, source: 'none' };
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
export async function collectCliStatus() {
|
|
255
|
+
const detected = detectAllCli();
|
|
256
|
+
const rows = await Promise.all(Object.entries(detected).map(async ([cli, info]) => {
|
|
257
|
+
const binaryInstalled = Boolean(info.available);
|
|
258
|
+
const path = typeof info.path === 'string' ? info.path : null;
|
|
259
|
+
let capability = { ready: binaryInstalled };
|
|
260
|
+
if (cli === 'codex-app' && binaryInstalled && path)
|
|
261
|
+
capability = await probeCodexApp(path);
|
|
262
|
+
const auth = binaryInstalled
|
|
263
|
+
? await authForCli(cli, path, detected)
|
|
264
|
+
: { authenticated: false, source: 'none' };
|
|
265
|
+
const row = {
|
|
266
|
+
available: binaryInstalled && capability.ready,
|
|
267
|
+
binaryInstalled,
|
|
268
|
+
capabilityReady: capability.ready,
|
|
269
|
+
authenticated: auth.authenticated,
|
|
270
|
+
path,
|
|
271
|
+
source: auth.source,
|
|
272
|
+
probeState: 'fresh',
|
|
273
|
+
...(capability.reason ? { reason: capability.reason } : {}),
|
|
274
|
+
};
|
|
275
|
+
return [cli, row];
|
|
276
|
+
}));
|
|
277
|
+
return Object.fromEntries(rows);
|
|
278
|
+
}
|
|
279
|
+
async function runChild() {
|
|
280
|
+
try {
|
|
281
|
+
process.send?.({ ok: true, snapshot: await collectCliStatus() });
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
process.send?.({ ok: false, error: error instanceof Error ? error.message : String(error) });
|
|
285
|
+
}
|
|
286
|
+
finally {
|
|
287
|
+
process.disconnect?.();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (process.argv.includes(CHILD_MARKER))
|
|
291
|
+
void runChild();
|
|
292
|
+
/** Fixture helper for tests that need a standalone worker URL. */
|
|
293
|
+
export function cliStatusWorkerUrl() {
|
|
294
|
+
return pathToFileURL(defaultWorkerPath());
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=cli-status-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-status-worker.js","sourceRoot":"","sources":["../../../src/cli/cli-status-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { CLI_KEYS } from './registry.js';
|
|
2
|
+
import { runCliStatusWorker } from './cli-status-worker.js';
|
|
3
|
+
export function formatCliStatusLine(cli, row) {
|
|
4
|
+
if (row.probeState === 'checking')
|
|
5
|
+
return `${cli}: checking`;
|
|
6
|
+
const ready = row.available === true && row.capabilityReady !== false;
|
|
7
|
+
return `${cli}: ${ready ? '✅' : '❌'}${row.path ? ` ${row.path}` : ''}`;
|
|
8
|
+
}
|
|
9
|
+
const FRESH_TTL_MS = 30_000;
|
|
10
|
+
const STALE_TTL_MS = 5 * 60_000;
|
|
11
|
+
function coldSnapshot() {
|
|
12
|
+
return Object.fromEntries(CLI_KEYS.map((cli) => [cli, {
|
|
13
|
+
available: null,
|
|
14
|
+
binaryInstalled: null,
|
|
15
|
+
capabilityReady: null,
|
|
16
|
+
authenticated: null,
|
|
17
|
+
path: null,
|
|
18
|
+
source: 'pending-probe',
|
|
19
|
+
probeState: 'checking',
|
|
20
|
+
}]));
|
|
21
|
+
}
|
|
22
|
+
function snapshotWithState(snapshot, probeState) {
|
|
23
|
+
return Object.fromEntries(Object.entries(snapshot).map(([cli, row]) => [cli, {
|
|
24
|
+
...row,
|
|
25
|
+
probeState,
|
|
26
|
+
}]));
|
|
27
|
+
}
|
|
28
|
+
export class CliStatusCache {
|
|
29
|
+
now;
|
|
30
|
+
refresh;
|
|
31
|
+
freshTtlMs;
|
|
32
|
+
staleTtlMs;
|
|
33
|
+
lastSuccessfulSnapshot = null;
|
|
34
|
+
lastSuccessfulProbeAt = null;
|
|
35
|
+
refreshInFlight = null;
|
|
36
|
+
constructor(options = {}) {
|
|
37
|
+
this.now = options.now ?? Date.now;
|
|
38
|
+
this.refresh = options.refresh ?? runCliStatusWorker;
|
|
39
|
+
this.freshTtlMs = options.freshTtlMs ?? FRESH_TTL_MS;
|
|
40
|
+
this.staleTtlMs = options.staleTtlMs ?? STALE_TTL_MS;
|
|
41
|
+
}
|
|
42
|
+
getSnapshot() {
|
|
43
|
+
const now = this.now();
|
|
44
|
+
const age = this.lastSuccessfulProbeAt == null
|
|
45
|
+
? Number.POSITIVE_INFINITY
|
|
46
|
+
: now - this.lastSuccessfulProbeAt;
|
|
47
|
+
if (this.lastSuccessfulSnapshot && age <= this.freshTtlMs) {
|
|
48
|
+
return snapshotWithState(this.lastSuccessfulSnapshot, 'fresh');
|
|
49
|
+
}
|
|
50
|
+
this.startRefresh();
|
|
51
|
+
if (this.lastSuccessfulSnapshot && age <= this.staleTtlMs) {
|
|
52
|
+
return snapshotWithState(this.lastSuccessfulSnapshot, 'stale');
|
|
53
|
+
}
|
|
54
|
+
return coldSnapshot();
|
|
55
|
+
}
|
|
56
|
+
startRefresh() {
|
|
57
|
+
if (this.refreshInFlight)
|
|
58
|
+
return;
|
|
59
|
+
this.refreshInFlight = Promise.resolve()
|
|
60
|
+
.then(() => this.refresh())
|
|
61
|
+
.then((snapshot) => {
|
|
62
|
+
this.lastSuccessfulSnapshot = snapshotWithState(snapshot, 'fresh');
|
|
63
|
+
this.lastSuccessfulProbeAt = this.now();
|
|
64
|
+
})
|
|
65
|
+
.catch(() => {
|
|
66
|
+
// Preserve the last successful snapshot/timestamp. A later request retries.
|
|
67
|
+
})
|
|
68
|
+
.finally(() => {
|
|
69
|
+
this.refreshInFlight = null;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const defaultCliStatusCache = new CliStatusCache();
|
|
74
|
+
export function getCachedCliStatus() {
|
|
75
|
+
return defaultCliStatusCache.getSnapshot();
|
|
76
|
+
}
|
|
77
|
+
/** @internal exported for deterministic cache tests. */
|
|
78
|
+
export function createCliStatusCacheForTest(options) {
|
|
79
|
+
return new CliStatusCache(options);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=cli-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-status.js","sourceRoot":"","sources":["../../../src/cli/cli-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,27 +2,36 @@
|
|
|
2
2
|
// Replaces makeWebCommandCtx (server.ts) and makeTelegramCommandCtx (bot.ts).
|
|
3
3
|
// Interface-specific behavior is handled via the `interface` parameter.
|
|
4
4
|
import fs from 'fs';
|
|
5
|
-
import { settings,
|
|
5
|
+
import { settings, APP_VERSION, deriveCdpPort } from '../core/config.js';
|
|
6
6
|
import { getSession } from '../core/db.js';
|
|
7
7
|
import { t } from '../core/i18n.js';
|
|
8
8
|
import { getMergedSkills, A2_PATH, regenerateB } from '../prompt/builder.js';
|
|
9
9
|
import { isAgentBusy, messageQueue } from '../agent/spawn.js';
|
|
10
|
+
import { currentSessionScope } from '../core/session-context.js';
|
|
10
11
|
import * as browser from '../browser/index.js';
|
|
11
12
|
import * as memory from '../memory/memory.js';
|
|
12
13
|
import { bootstrapMemory, ensureMemoryStructure, getMemoryStatus, reindexMemory } from '../memory/runtime.js';
|
|
13
14
|
import { searchMemoryWithPolicy } from '../memory/injection.js';
|
|
14
15
|
import { loadUnifiedMcp, saveUnifiedMcp, syncToAll, runSkillReset, } from '../../lib/mcp-sync.js';
|
|
16
|
+
import { getCachedCliStatus } from './cli-status.js';
|
|
15
17
|
// Remote interface에서 허용하는 settings patch 키
|
|
16
18
|
const REMOTE_ALLOWED_SETTINGS_KEYS = new Set([
|
|
17
19
|
'fallbackOrder', // /fallback
|
|
18
|
-
'cli', // /cli
|
|
19
|
-
'perCli', // /model
|
|
20
20
|
'showReasoning', // /thought
|
|
21
21
|
'memory', // /flush
|
|
22
22
|
'telegram', // /forward (telegram)
|
|
23
23
|
'discord', // /forward (discord)
|
|
24
24
|
'slack', // /forward (slack)
|
|
25
25
|
]);
|
|
26
|
+
// Runtime selection is shared by the whole instance and the instance web owns it
|
|
27
|
+
// (devlog 074). A remote channel changing it would move every other session's model
|
|
28
|
+
// too, so these keys are refused there with an answer that says where to go instead
|
|
29
|
+
// of the generic "unsupported" line.
|
|
30
|
+
const RUNTIME_SELECTION_SETTINGS_KEYS = new Set([
|
|
31
|
+
'cli', // /cli
|
|
32
|
+
'perCli', // /model, /effort
|
|
33
|
+
'activeOverrides', // /model, /effort
|
|
34
|
+
]);
|
|
26
35
|
export function makeCommandCtx(iface, locale, deps) {
|
|
27
36
|
return {
|
|
28
37
|
interface: iface,
|
|
@@ -39,6 +48,9 @@ export function makeCommandCtx(iface, locale, deps) {
|
|
|
39
48
|
if (allAllowed) {
|
|
40
49
|
return deps.applySettings(patch);
|
|
41
50
|
}
|
|
51
|
+
if (keys.some(k => RUNTIME_SELECTION_SETTINGS_KEYS.has(k))) {
|
|
52
|
+
return { ok: false, text: t('cmd.runtimeSelectionInstanceWide', {}, locale) };
|
|
53
|
+
}
|
|
42
54
|
const msgKey = iface === 'discord' ? 'dc.settingsUnsupported'
|
|
43
55
|
: iface === 'slack' ? 'sl.settingsUnsupported'
|
|
44
56
|
: 'tg.settingsUnsupported';
|
|
@@ -48,7 +60,7 @@ export function makeCommandCtx(iface, locale, deps) {
|
|
|
48
60
|
},
|
|
49
61
|
getRuntime: () => ({
|
|
50
62
|
uptimeSec: Math.floor(process.uptime()),
|
|
51
|
-
activeAgent: isAgentBusy(),
|
|
63
|
+
activeAgent: isAgentBusy(currentSessionScope()?.scope ?? 'default'),
|
|
52
64
|
queuePending: messageQueue.length,
|
|
53
65
|
}),
|
|
54
66
|
getSkills: () => getMergedSkills(),
|
|
@@ -56,7 +68,7 @@ export function makeCommandCtx(iface, locale, deps) {
|
|
|
56
68
|
resetSession: deps.resetSession
|
|
57
69
|
? async () => deps.resetSession()
|
|
58
70
|
: async () => deps.clearSession(),
|
|
59
|
-
getCliStatus: () =>
|
|
71
|
+
getCliStatus: () => getCachedCliStatus(),
|
|
60
72
|
// MCP — unified across all interfaces (TG previously returned empty)
|
|
61
73
|
getMcp: () => loadUnifiedMcp(),
|
|
62
74
|
syncMcp: async () => ({ results: syncToAll(loadUnifiedMcp()) }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-context.js","sourceRoot":"","sources":["../../../src/cli/command-context.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,8EAA8E;AAC9E,wEAAwE;AAExE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"command-context.js","sourceRoot":"","sources":["../../../src/cli/command-context.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/compact.js
CHANGED
|
@@ -37,17 +37,12 @@ export async function compactHandler(args, ctx) {
|
|
|
37
37
|
text: 'Compact is available only when the main agent is idle.',
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
|
-
const { isAgentBusy } = await import('../agent/spawn.js');
|
|
41
|
-
if (isAgentBusy()) {
|
|
42
|
-
return {
|
|
43
|
-
ok: false,
|
|
44
|
-
code: 'compact_busy',
|
|
45
|
-
text: 'Compact is available only when the main agent is idle.',
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
40
|
const activeCli = settings?.cli || session?.active_cli || session?.activeCli || 'claude';
|
|
49
41
|
const workingDir = normalizeWorkingDir(settings?.workingDir || null);
|
|
50
|
-
|
|
42
|
+
// Resolved before the harvest, not after: the marker below and the bootstrap built
|
|
43
|
+
// here have to describe the same conversation, and the harvest reads it (073 §2.5a).
|
|
44
|
+
const chatSessionId = getActiveChatSession();
|
|
45
|
+
const slots = harvestBootstrapSlots({ workingDir, instructions, chatSessionId });
|
|
51
46
|
const hasAnyContent = Boolean(slots.recent_turns
|
|
52
47
|
|| slots.tool_context
|
|
53
48
|
|| slots.memory_hits
|
|
@@ -62,18 +57,60 @@ export async function compactHandler(args, ctx) {
|
|
|
62
57
|
}
|
|
63
58
|
const bootstrap = renderBootstrapPrompt(slots);
|
|
64
59
|
const trace = `${BOOTSTRAP_TRACE_PREFIX}\n${bootstrap}`;
|
|
65
|
-
const { insertMessageWithTrace, clearSessionBucket } = await import('../core/db.js');
|
|
66
|
-
const { resolveSessionBucket } = await import('../agent/args.js');
|
|
67
|
-
const { bumpSessionOwnershipGeneration, } = await import('../agent/session-persistence.js');
|
|
60
|
+
const { insertMessageWithTrace, clearSessionBucket, clearSessionBucketsByPrefix } = await import('../core/db.js');
|
|
61
|
+
const { aiEProviderForBucket, resolveSessionBucket } = await import('../agent/args.js');
|
|
68
62
|
const { clearBossSessionOnly, setPendingBootstrapPrompt, } = await import('../core/main-session.js');
|
|
69
63
|
const model = getActiveModel(settings, session, activeCli);
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
64
|
+
const { scopeForChatSession } = await import('../orchestrator/scope.js');
|
|
65
|
+
const { getChatSessionRemoteKey } = await import('../core/chat-sessions.js');
|
|
66
|
+
const scope = scopeForChatSession(chatSessionId, getChatSessionRemoteKey(chatSessionId) ?? undefined, settings?.multiSession?.enabled === true);
|
|
67
|
+
// Every runtime now keys its bucket by scope (073 §2.1), so this compacts the session
|
|
68
|
+
// it was typed into rather than refusing to touch anything. Its marker, its bootstrap
|
|
69
|
+
// and the state it drops all belong to the same session, which is what 072 could not
|
|
70
|
+
// arrange when a non-default scope had no bucket of its own.
|
|
71
|
+
//
|
|
72
|
+
const isCodexApp = activeCli === 'codex-app';
|
|
73
|
+
// ai-e keys its bucket by provider, and a null here would make the bucket infer one
|
|
74
|
+
// from the model name instead. When the configured provider and that inference
|
|
75
|
+
// disagree, the clear lands on a bucket the conversation never used.
|
|
76
|
+
const aiEProvider = aiEProviderForBucket(activeCli, model, settings);
|
|
77
|
+
const base = resolveSessionBucket(activeCli, model, aiEProvider);
|
|
78
|
+
// Always the scoped form, including the default scope. Letting default resolve to the
|
|
79
|
+
// bare name looks harmless until the prefix clear below runs: `claude` plus `claude:%`
|
|
80
|
+
// deletes every other session's bucket for this runtime. Default's own legacy bare row
|
|
81
|
+
// is cleared separately, by exact key.
|
|
82
|
+
const bucket = `${base}:${scope}`;
|
|
83
|
+
insertMessageWithTrace.run('assistant', COMPACT_MARKER_CONTENT, activeCli, model, trace, null, workingDir, chatSessionId);
|
|
84
|
+
const isDefaultScope = scope === 'default';
|
|
85
|
+
// The bootstrap is keyed by scope so the next turn of THIS session picks it up and
|
|
86
|
+
// no other session does. The default scope keeps the bare key it always had.
|
|
87
|
+
setPendingBootstrapPrompt(bootstrap, isDefaultScope ? undefined : scope);
|
|
88
|
+
// Only this session's generation moves. Bumping the global one would make every
|
|
89
|
+
// other session's in-flight turn fail its ownership check and discard the vendor
|
|
90
|
+
// conversation it had just created (073 §2e).
|
|
91
|
+
const { bumpScopeSessionGeneration } = await import('../agent/session-persistence.js');
|
|
92
|
+
bumpScopeSessionGeneration(scope);
|
|
93
|
+
if (isDefaultScope) {
|
|
94
|
+
// The singleton row belongs to the default session, so only its own compact
|
|
95
|
+
// clears it.
|
|
96
|
+
clearBossSessionOnly();
|
|
97
|
+
}
|
|
98
|
+
// The prefix form covers codex-app, whose key folds in lane mode and effort that this
|
|
99
|
+
// command cannot know. The scope is a whole segment of the pattern, so `claude:local:a`
|
|
100
|
+
// plus `claude:local:a:%` cannot reach `claude:local:abc`. For every other runtime the
|
|
101
|
+
// exact key is the only match, so the same call is correct without a branch.
|
|
102
|
+
clearSessionBucketsByPrefix.run(bucket, `${bucket}:`);
|
|
103
|
+
// The default scope also owns the bare legacy name, which is what a session created
|
|
104
|
+
// before 073 resumes from. Clearing it by exact key keeps the neighbours out of it.
|
|
105
|
+
if (isDefaultScope)
|
|
106
|
+
clearSessionBucket.run(base);
|
|
107
|
+
if (isCodexApp) {
|
|
108
|
+
// The rows are half of it: an idle lane keeps its thread in memory and, with no
|
|
109
|
+
// stored thread left to contradict it, the next turn would reuse the very
|
|
110
|
+
// conversation this compact discarded.
|
|
111
|
+
const { invalidateCodexAppLanesForScope } = await import('../agent/codex-host-pool.js');
|
|
112
|
+
invalidateCodexAppLanesForScope(scope);
|
|
113
|
+
}
|
|
77
114
|
return {
|
|
78
115
|
ok: true,
|
|
79
116
|
code: 'compact_done',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compact.js","sourceRoot":"","sources":["../../../src/cli/compact.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,+EAA+E;AAE/E,OAAO,EACH,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"compact.js","sourceRoot":"","sources":["../../../src/cli/compact.ts"],"names":[],"mappings":"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"}
|
|
@@ -228,14 +228,16 @@ export async function steerHandler(args, ctx) {
|
|
|
228
228
|
if (!prompt) {
|
|
229
229
|
return { ok: false, type: 'error', text: t('cmd.steer.noPrompt', {}, L) };
|
|
230
230
|
}
|
|
231
|
+
const { currentSessionScope } = await import('../core/session-context.js');
|
|
232
|
+
const scopeKey = currentSessionScope()?.scope ?? 'default';
|
|
231
233
|
const { isAgentBusy, killActiveAgent, waitForProcessEnd, getSteerWaitMsForActiveAgent } = await import('../agent/spawn.js');
|
|
232
|
-
if (!isAgentBusy()) {
|
|
234
|
+
if (!isAgentBusy(scopeKey)) {
|
|
233
235
|
return { ok: false, type: 'error', text: t('cmd.steer.noAgent', {}, L) };
|
|
234
236
|
}
|
|
235
237
|
// Kill running agent (or cancel retry timer) and wait for clean exit
|
|
236
|
-
const steerWaitMs = getSteerWaitMsForActiveAgent();
|
|
237
|
-
killActiveAgent('steer');
|
|
238
|
-
await waitForProcessEnd(steerWaitMs);
|
|
238
|
+
const steerWaitMs = getSteerWaitMsForActiveAgent(scopeKey);
|
|
239
|
+
killActiveAgent(scopeKey, 'steer');
|
|
240
|
+
await waitForProcessEnd(scopeKey, steerWaitMs);
|
|
239
241
|
// Remote interfaces: clear stale session before re-orchestrate
|
|
240
242
|
const iface = ctx.interface || 'cli';
|
|
241
243
|
if (iface === 'telegram' || iface === 'discord' || iface === 'slack') {
|