cli-jaw 2.2.16 → 2.2.18-preview.20260812121016
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 +14 -1
- package/dist/bin/cli-jaw.js +9 -1
- 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/ask.js +245 -0
- package/dist/bin/commands/ask.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/chat.js +41 -3
- package/dist/bin/commands/chat.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/dispatch.js +210 -167
- package/dist/bin/commands/dispatch.js.map +1 -1
- package/dist/bin/commands/doctor.js +33 -10
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/init.js +45 -4
- 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/slack.js +128 -4
- 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/raw-pipe-mode.js +90 -0
- package/dist/bin/commands/tui/raw-pipe-mode.js.map +1 -0
- package/dist/bin/commands/tui/simple-mode.js +11 -2
- package/dist/bin/commands/tui/simple-mode.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 +70 -48
- 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 +45 -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/pi-runtime.js +10 -2
- package/dist/src/agent/pi-runtime.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 +340 -162
- package/dist/src/agent/spawn/queue.js.map +1 -1
- package/dist/src/agent/spawn.js +596 -270
- 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 +141 -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 +15 -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/cli/tui/jawcode-render.js +18 -5
- package/dist/src/cli/tui/jawcode-render.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 +534 -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/exec-name.js +55 -0
- package/dist/src/core/exec-name.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 +173 -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 +39 -6
- 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/lib/tui/bun-shim.mjs +75 -0
- 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/bootstrap.js +8 -1
- package/dist/src/memory/bootstrap.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 +24 -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 +157 -32
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +59 -21
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/request-registry.js +116 -0
- package/dist/src/orchestrator/request-registry.js.map +1 -0
- 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 +138 -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 +168 -4
- 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 +24 -4
- 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 +154 -40
- package/dist/src/slack/bot.js.map +1 -1
- package/dist/src/slack/commands.js +52 -8
- package/dist/src/slack/commands.js.map +1 -1
- package/dist/src/slack/events.js +16 -2
- package/dist/src/slack/events.js.map +1 -1
- package/dist/src/slack/history.js +115 -0
- package/dist/src/slack/history.js.map +1 -0
- package/dist/src/slack/identity.js +553 -0
- package/dist/src/slack/identity.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 +182 -0
- package/dist/src/slack/ingress.js.map +1 -0
- package/dist/src/slack/manifest.js +95 -68
- package/dist/src/slack/manifest.js.map +1 -1
- package/dist/src/slack/roster.js +180 -0
- package/dist/src/slack/roster.js.map +1 -0
- 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 +4 -3
- package/public/css/session-hub.css +266 -0
- package/public/css/sidebar.css +29 -51
- package/public/dist/assets/AdvancedExport-c41zCkwB.js +1 -0
- package/public/dist/assets/Agent-nMPZsMfN.js +1 -0
- package/public/dist/assets/ChannelsSlack-CVNKtoo4.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-DqSJmDwP.js +55 -0
- package/public/dist/assets/{app-DX4e6isX.css → app-DuyLYRC6.css} +1 -1
- package/public/dist/assets/bgtask-badge-CjWz0F6U.js +1 -0
- package/public/dist/assets/{bgtask-badge-qMkKOZx0.js → bgtask-badge-D6XYRFI5.js} +4 -4
- package/public/dist/assets/{employees-BnobWM_2.js → employees-B_wKPfTO.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-D1-zDg8V.js} +12 -12
- package/public/dist/assets/iframe-renderer-qRVLHPnT.js +1 -0
- package/public/dist/assets/manager-Bjuh1jpq.js +13 -0
- package/public/dist/assets/manager-LkGs6qEJ.css +1 -0
- package/public/dist/assets/{memory-DF4kPwwC.js → memory-CNUpXWEC.js} +11 -11
- package/public/dist/assets/memory-CcWGiPy_.js +1 -0
- package/public/dist/assets/message-history-BamMPUnL.js +1 -0
- package/public/dist/assets/message-history-DB1rynP-.js +1 -0
- package/public/dist/assets/pi-settings-5HVg1sXJ.js +1 -0
- package/public/dist/assets/render-DXwQzjsJ.js +157 -0
- package/public/dist/assets/settings-CXndjCad.js +56 -0
- package/public/dist/assets/settings-RGpifFHy.js +1 -0
- package/public/dist/assets/settings-core-X_5UHfr3.js +1 -0
- package/public/dist/assets/settings-core-t5yYVRrv.js +162 -0
- package/public/dist/assets/sidebar-DgIj-LuT.js +49 -0
- package/public/dist/assets/skills-CbwIimit.js +1 -0
- package/public/dist/assets/{skills-IGquen_j.js → skills-QqxjqDHg.js} +6 -6
- package/public/dist/assets/{slash-commands-ZRDOL99E.js → slash-commands-B2V_jngP.js} +1 -1
- package/public/dist/assets/slash-commands-tCNRlNTC.js +1 -0
- package/public/dist/assets/{trace-drawer-D8To8fYt.js → trace-drawer-CBe9nRjS.js} +1 -1
- package/public/dist/assets/{ui-Hx_mNoDf.js → ui-CDozpEQt.js} +1 -1
- package/public/dist/assets/ui-o-VpvrSv.js +1 -0
- package/public/dist/assets/{wiki-link-suggestions-DZQc78gj.js → wiki-link-suggestions-Dp6kBQVu.js} +1 -1
- package/public/dist/index.html +15 -34
- package/public/dist/manager/index.html +2 -2
- package/public/index.html +14 -32
- package/public/js/event-channel.ts +25 -0
- package/public/js/features/channel-onboarding-flow.ts +41 -3
- package/public/js/features/channel-onboarding.ts +127 -6
- 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 +40 -12
- package/public/js/features/settings-core.ts +72 -3
- package/public/js/features/settings-slack.ts +127 -29
- package/public/js/features/settings-types.ts +41 -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 +59 -8
- package/public/locales/ja.json +59 -8
- package/public/locales/ko.json +59 -8
- package/public/locales/zh.json +59 -8
- 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 +13 -2
- package/public/manager/src/settings/pages/Agent.tsx +122 -1
- package/public/manager/src/settings/pages/ChannelsSlack.tsx +13 -1
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +1 -1
- package/scripts/atomic-build.sh +10 -3
- 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/release-preview.sh +16 -1
- package/scripts/verify-dist-assets.sh +53 -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/ChannelsSlack-ybvupgdK.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
package/README.md
CHANGED
|
@@ -32,6 +32,11 @@ Windows users should use the WSL install path below. A native PowerShell install
|
|
|
32
32
|
irm https://raw.githubusercontent.com/lidge-jun/cli-jaw/main/scripts/install.ps1 | iex
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
+
Either way cli-jaw now tells the two apart precisely: `jaw doctor --json` reports
|
|
36
|
+
`platform` as `windows-native` or `wsl`, and each gets its own diagnostics. Native
|
|
37
|
+
Windows no longer receives "reinstall inside WSL" advice just because WSL interop
|
|
38
|
+
is configured on the machine.
|
|
39
|
+
|
|
35
40
|
</details>
|
|
36
41
|
|
|
37
42
|
```bash
|
|
@@ -394,7 +399,11 @@ No per-token API billing. Route through subscriptions you already pay for.
|
|
|
394
399
|
|
|
395
400
|
GPT 5.5 and Claude Opus 4.8 are enabled from Pro-tier subscriptions and higher. Starting in June, select `claude-e` when you want CLI-JAW to use the Claude allowance bundled with the subscription plan.
|
|
396
401
|
|
|
397
|
-
|
|
402
|
+
On a new install, CLI-JAW prefers **Codex App** when the local `app-server` entrypoint and Codex authentication are ready. Existing installations keep their saved runtime until the one-time Settings notice is explicitly accepted; choosing “keep” preserves the current runtime. Set `CLI_JAW_DEFAULT_CLI=claude` to override the clean-install policy.
|
|
403
|
+
|
|
404
|
+
OpenCodex routing remains owned by Codex's root `openai_base_url` setting. CLI-JAW only compares that read-only URL with the live OpenCodex runtime-port and `/healthz` fingerprint for diagnostics; it does not rewrite Codex config or inject an execution endpoint.
|
|
405
|
+
|
|
406
|
+
The quota/status panel keeps the same runtime keyset as the registry. Cold status requests return a neutral “checking” snapshot immediately while binary, authentication, and capability probes run in a bounded child process. Wrapper runtimes (`ai-e`, `claude-e`, `codex-app`) delegate to their underlying provider, while Pi/AGY/Cursor/OpenCode are shown as auth/status-only when their CLIs do not expose quota windows. Grok uses the current Grok CLI auth store for the SuperGrok weekly usage pool and falls back to legacy monthly credits when the weekly endpoint is unavailable.
|
|
398
407
|
|
|
399
408
|
**Fallback chain**: if one engine is rate-limited, the next picks up. Configure with `/fallback [cli1 cli2...]`.
|
|
400
409
|
|
|
@@ -515,6 +524,8 @@ Socket Mode bot with the same shared command catalog — mentions, DMs, slash co
|
|
|
515
524
|
|
|
516
525
|
Why not OAuth one-click? Slack issues the app-level token (`xapp-`, required for Socket Mode) only from the app settings UI, and the PKCE localhost flow bans bot scopes — a browser click cannot configure a self-hosted Socket Mode bot. The wizard is the shortest honest path.
|
|
517
526
|
|
|
527
|
+
For Docker/Kubernetes deployments, `SLACK_BOT_TOKEN`, `SLACK_APP_TOKEN`, `SLACK_TEAM_ID`, and `SLACK_CHANNEL_IDS` are runtime-only owners of their matching fields. While any are present, Settings keeps connection editing/reset read-only as a group and the CLI setup paths refuse mixed input; remove the variables and restart cli-jaw before changing the connection there. Persistence strips only fields owned by configured variables, so environment values are never copied into `settings.json` and metadata-only overrides do not erase file-backed tokens. Delivery preferences such as mention/thread/forwarding behavior remain editable.
|
|
528
|
+
|
|
518
529
|
</details>
|
|
519
530
|
|
|
520
531
|
### Voice & STT
|
|
@@ -548,6 +559,8 @@ jaw dashboard # launch manager dashboard
|
|
|
548
559
|
jaw serve # start server (http://localhost:3457)
|
|
549
560
|
jaw chat # terminal chat UI
|
|
550
561
|
jaw chat search "query" # search chat history
|
|
562
|
+
jaw ask "question" # one prompt, one answer — no TTY needed
|
|
563
|
+
echo "question" | jaw ask - # same, reading the prompt from stdin
|
|
551
564
|
jaw doctor # installation and runtime diagnostics
|
|
552
565
|
jaw slack setup # guided Slack app setup (manifest + token validation)
|
|
553
566
|
|
package/dist/bin/cli-jaw.js
CHANGED
|
@@ -35,7 +35,7 @@ const _homeEqArg = process.argv.find(a => a.startsWith('--home='));
|
|
|
35
35
|
if (_homeIdx !== -1 && process.argv[_homeIdx + 1]) {
|
|
36
36
|
const _homeVal = process.argv[_homeIdx + 1];
|
|
37
37
|
// Guard: if the "value" looks like a known subcommand, user forgot the path
|
|
38
|
-
const _knownCmds = ['serve', 'init', 'doctor', 'chat', 'employee', 'reset', 'mcp', 'skill', 'status', 'browser', 'design', 'memory', 'hooks', 'launchd', 'clone', 'service', 'dashboard', 'connector', 'reminders', 'orchestrate', 'dispatch', 'worker', 'project', 'goal', 'task', 'bgtask', 'jwc', 'provider', 'slack'];
|
|
38
|
+
const _knownCmds = ['serve', 'init', 'doctor', 'chat', 'ask', 'employee', 'reset', 'mcp', 'skill', 'status', 'browser', 'design', 'memory', 'hooks', 'launchd', 'clone', 'service', 'dashboard', 'connector', 'reminders', 'orchestrate', 'dispatch', 'worker', 'project', 'goal', 'task', 'bgtask', 'jwc', 'provider', 'slack'];
|
|
39
39
|
if (_knownCmds.includes(_homeVal)) {
|
|
40
40
|
console.error(` ❌ --home requires a path argument (got subcommand '${_homeVal}')`);
|
|
41
41
|
console.error(` Usage: jaw --home <path> ${_homeVal}`);
|
|
@@ -237,6 +237,9 @@ switch (command) {
|
|
|
237
237
|
case 'provider':
|
|
238
238
|
await import('./commands/provider.js');
|
|
239
239
|
break;
|
|
240
|
+
case 'ask':
|
|
241
|
+
await import('./commands/ask.js');
|
|
242
|
+
break;
|
|
240
243
|
case 'chat':
|
|
241
244
|
if (process.argv[3] === 'search') {
|
|
242
245
|
await import('./commands/chat-search.js');
|
|
@@ -246,6 +249,11 @@ switch (command) {
|
|
|
246
249
|
await import('./commands/chat.js');
|
|
247
250
|
}
|
|
248
251
|
break;
|
|
252
|
+
case 'ask':
|
|
253
|
+
// Non-interactive prompt path for headless hosts (#276). No TTY, no
|
|
254
|
+
// star prompt — a script is on the other end.
|
|
255
|
+
await import('./commands/ask.js');
|
|
256
|
+
break;
|
|
249
257
|
case 'employee':
|
|
250
258
|
await import('./commands/employee.js');
|
|
251
259
|
break;
|
package/dist/bin/cli-jaw.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-jaw.js","sourceRoot":"","sources":["../../bin/cli-jaw.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAElG,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAK1D,SAAS,eAAe,CAAC,OAAe;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAY,CAAC;IACpE,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;AACtF,CAAC;AAED,IAAI,GAAgB,CAAC;AACrB,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACxC,IAAI,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAClD,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAAC,MAAM,CAAC;IACL,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAClD,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAChD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AACnE,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAE,CAAC;IAC7C,4EAA4E;IAC5E,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-jaw.js","sourceRoot":"","sources":["../../bin/cli-jaw.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// One way to call the dashboard, shared by the commands that do (devlog 034).
|
|
2
|
+
//
|
|
3
|
+
// Two copies of this existed, identical down to the truncation of the error body, and
|
|
4
|
+
// each carried its own hardcoded base path. A caller now says which surface it wants and
|
|
5
|
+
// what to call itself in an error, so the two cannot drift apart again.
|
|
6
|
+
import { DASHBOARD_DEFAULT_PORT } from '../../../src/manager/constants.js';
|
|
7
|
+
// Re-exported so a command can name the default port in its help text without reaching
|
|
8
|
+
// past this module for it.
|
|
9
|
+
export { DASHBOARD_DEFAULT_PORT };
|
|
10
|
+
export function dashboardPort() {
|
|
11
|
+
const fromEnv = Number(process.env["DASHBOARD_PORT"]);
|
|
12
|
+
return Number.isFinite(fromEnv) && fromEnv > 0 ? fromEnv : Number(DASHBOARD_DEFAULT_PORT);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Calls the dashboard and returns the parsed JSON, or throws with a message that names
|
|
16
|
+
* the command the user actually ran.
|
|
17
|
+
*/
|
|
18
|
+
export async function callDashboard(options) {
|
|
19
|
+
const port = dashboardPort();
|
|
20
|
+
const url = `http://127.0.0.1:${port}${options.basePath}${options.path}`;
|
|
21
|
+
const doFetch = options.fetchImpl ?? fetch;
|
|
22
|
+
const hasBody = options.body !== undefined;
|
|
23
|
+
let res;
|
|
24
|
+
try {
|
|
25
|
+
res = await doFetch(url, {
|
|
26
|
+
...(hasBody ? { method: 'POST', body: JSON.stringify(options.body) } : {}),
|
|
27
|
+
headers: {
|
|
28
|
+
host: `127.0.0.1:${port}`,
|
|
29
|
+
...(hasBody ? { 'Content-Type': 'application/json' } : {}),
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
throw new Error(`${options.label} unreachable at :${port} — run \`jaw dashboard serve\` first. (${err.message})`);
|
|
35
|
+
}
|
|
36
|
+
if (!res.ok) {
|
|
37
|
+
const text = await res.text().catch(() => '');
|
|
38
|
+
throw new Error(`${options.label} ${options.path} → ${res.status}: ${text.slice(0, 200)}`);
|
|
39
|
+
}
|
|
40
|
+
return res.json();
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=dashboard-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-client.js","sourceRoot":"","sources":["../../../../bin/commands/_shared/dashboard-client.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,sFAAsF;AACtF,yFAAyF;AACzF,wEAAwE;AAExE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,uFAAuF;AACvF,2BAA2B;AAC3B,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,MAAM,UAAU,aAAa;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAC9F,CAAC;AAaD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAI,OAAyB;IAC5D,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,oBAAoB,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;IAE3C,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACD,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;YACrB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,OAAO,EAAE;gBACL,IAAI,EAAE,aAAa,IAAI,EAAE;gBACzB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7D;SACJ,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACX,GAAG,OAAO,CAAC,KAAK,oBAAoB,IAAI,0CAA2C,GAAa,CAAC,OAAO,GAAG,CAC9G,CAAC;IACN,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,MAAM,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Shared rendering for the search commands (devlog 034).
|
|
2
|
+
//
|
|
3
|
+
// Two shapes, deliberately kept apart. The dashboard commands search across instances, so
|
|
4
|
+
// they carry a hit count, an instance label and warnings; the local ones search one place
|
|
5
|
+
// and have none of those. Giving the local pair a header would mean inventing instances
|
|
6
|
+
// and warnings where neither exists, so what they share is one line of body text.
|
|
7
|
+
/** Body text ceiling. The two local commands used to disagree, at 200 and 300, for no reason. */
|
|
8
|
+
export const CHAT_BODY_LIMIT = 300;
|
|
9
|
+
/**
|
|
10
|
+
* Renders a cross-instance result.
|
|
11
|
+
*
|
|
12
|
+
* The per-hit renderer is supplied by the caller: a memory hit points at a file and line
|
|
13
|
+
* while a chat hit points at a moment in a conversation, and flattening the two would
|
|
14
|
+
* serve neither.
|
|
15
|
+
*/
|
|
16
|
+
export function formatFederatedResult(data, renderHit) {
|
|
17
|
+
const lines = [
|
|
18
|
+
`# ${data.hits.length} hits across ${data.instancesSucceeded}/${data.instancesQueried} instances`,
|
|
19
|
+
];
|
|
20
|
+
for (const hit of data.hits)
|
|
21
|
+
lines.push(...renderHit(hit));
|
|
22
|
+
if (data.warnings.length) {
|
|
23
|
+
lines.push('\n--- warnings ---');
|
|
24
|
+
for (const warning of data.warnings) {
|
|
25
|
+
lines.push(`[${warning.instanceId}] ${warning.code}: ${warning.message}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return lines.join('\n');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* One line of a local chat hit.
|
|
32
|
+
*
|
|
33
|
+
* Callers wrap this differently — one adds a context block and a separator, the other a
|
|
34
|
+
* heading and an indent — and those differences are theirs to keep.
|
|
35
|
+
*/
|
|
36
|
+
export function renderLocalChatHit(hit, limit = CHAT_BODY_LIMIT) {
|
|
37
|
+
const content = String(hit.content ?? '').slice(0, limit);
|
|
38
|
+
return `[${String(hit.created_at ?? '')}] (${String(hit.role ?? '')}) ${content}`;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=search-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-format.js","sourceRoot":"","sources":["../../../../bin/commands/_shared/search-format.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,0FAA0F;AAC1F,0FAA0F;AAC1F,wFAAwF;AACxF,kFAAkF;AAElF,iGAAiG;AACjG,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AAWnC;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACjC,IAA0B,EAC1B,SAAiC;IAEjC,MAAM,KAAK,GAAa;QACpB,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,gBAAgB,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,gBAAgB,YAAY;KACpG,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAQD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAiB,EAAE,KAAK,GAAG,eAAe;IACzE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1D,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,OAAO,EAAE,CAAC;AACtF,CAAC"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `jaw ask` — one prompt in, one answer out, no TTY required.
|
|
4
|
+
*
|
|
5
|
+
* Issue #276: on a headless host there was no CLI path that could send a prompt
|
|
6
|
+
* and get the answer back. The TUI needs a terminal, and `POST /api/message`
|
|
7
|
+
* only ACKs — it returns a requestId and leaves the caller to figure out when
|
|
8
|
+
* the work finished.
|
|
9
|
+
*
|
|
10
|
+
* Two things make this correct, and both are easy to get wrong:
|
|
11
|
+
*
|
|
12
|
+
* 1. SUBSCRIBE BEFORE SUBMITTING. The event stream does not replay for a
|
|
13
|
+
* client that connects without a cursor, so posting first and connecting
|
|
14
|
+
* second loses any answer that arrives in between — which is exactly what
|
|
15
|
+
* happens on a fast reply or an immediate error.
|
|
16
|
+
*
|
|
17
|
+
* 2. WAIT ON `request_settled`, NOT `orchestrate_done`. A busy server steers
|
|
18
|
+
* the prompt into the turn already running, and that turn never emits a
|
|
19
|
+
* completion event for the new id. Waiting on orchestrate_done hangs there
|
|
20
|
+
* until timeout. The settlement contract reports `steered` instead, so this
|
|
21
|
+
* command can say what actually happened.
|
|
22
|
+
*/
|
|
23
|
+
import { getServerUrl } from '../../src/core/config.js';
|
|
24
|
+
import { authHeaders } from '../../src/cli/api-auth.js';
|
|
25
|
+
const EXIT_OK = 0;
|
|
26
|
+
const EXIT_FAILED = 1;
|
|
27
|
+
const EXIT_USAGE = 2;
|
|
28
|
+
const EXIT_TIMEOUT = 124;
|
|
29
|
+
function usage() {
|
|
30
|
+
console.error('Usage: jaw ask "<prompt>" send a prompt and print the answer');
|
|
31
|
+
console.error(' echo "<prompt>" | jaw ask - read the prompt from stdin');
|
|
32
|
+
console.error('');
|
|
33
|
+
console.error(' --json print one JSON object instead of plain text');
|
|
34
|
+
console.error(' --timeout <sec> give up after N seconds (default 300)');
|
|
35
|
+
console.error(' --port <port> server port (default from settings)');
|
|
36
|
+
process.exit(EXIT_USAGE);
|
|
37
|
+
}
|
|
38
|
+
function parseArgs(argv) {
|
|
39
|
+
const rest = [];
|
|
40
|
+
let port = '';
|
|
41
|
+
let json = false;
|
|
42
|
+
let timeoutSec = 300;
|
|
43
|
+
for (let i = 0; i < argv.length; i++) {
|
|
44
|
+
const arg = argv[i];
|
|
45
|
+
if (arg === '--json') {
|
|
46
|
+
json = true;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (arg === '--timeout') {
|
|
50
|
+
timeoutSec = Number(argv[++i]) || timeoutSec;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (arg === '--port') {
|
|
54
|
+
port = String(argv[++i] ?? '');
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (arg === '--help' || arg === '-h')
|
|
58
|
+
usage();
|
|
59
|
+
rest.push(arg);
|
|
60
|
+
}
|
|
61
|
+
return { prompt: rest.join(' '), port, json, timeoutMs: Math.max(1, timeoutSec) * 1000 };
|
|
62
|
+
}
|
|
63
|
+
async function readStdin() {
|
|
64
|
+
const chunks = [];
|
|
65
|
+
for await (const chunk of process.stdin)
|
|
66
|
+
chunks.push(Buffer.from(chunk));
|
|
67
|
+
return Buffer.concat(chunks).toString('utf8').trim();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Open the stream and resolve once the server has acknowledged the connection,
|
|
71
|
+
* so the caller can submit knowing nothing will be missed. Frames are handed to
|
|
72
|
+
* `onFrame` as they arrive.
|
|
73
|
+
*/
|
|
74
|
+
async function openEventStream(apiUrl, onFrame, signal) {
|
|
75
|
+
const res = await fetch(`${apiUrl}/api/events`, {
|
|
76
|
+
headers: { ...authHeaders(), Accept: 'text/event-stream' },
|
|
77
|
+
signal,
|
|
78
|
+
});
|
|
79
|
+
if (!res.ok || !res.body)
|
|
80
|
+
throw new Error(`event stream failed: HTTP ${res.status}`);
|
|
81
|
+
const reader = res.body.getReader();
|
|
82
|
+
const decoder = new TextDecoder();
|
|
83
|
+
let buffer = '';
|
|
84
|
+
void (async () => {
|
|
85
|
+
try {
|
|
86
|
+
for (;;) {
|
|
87
|
+
const { done, value } = await reader.read();
|
|
88
|
+
if (done)
|
|
89
|
+
return;
|
|
90
|
+
buffer += decoder.decode(value, { stream: true });
|
|
91
|
+
let sep = buffer.indexOf('\n\n');
|
|
92
|
+
while (sep !== -1) {
|
|
93
|
+
const block = buffer.slice(0, sep);
|
|
94
|
+
buffer = buffer.slice(sep + 2);
|
|
95
|
+
for (const line of block.split('\n')) {
|
|
96
|
+
if (!line.startsWith('data:'))
|
|
97
|
+
continue;
|
|
98
|
+
const payload = line.slice(5).trim();
|
|
99
|
+
if (!payload)
|
|
100
|
+
continue;
|
|
101
|
+
try {
|
|
102
|
+
onFrame(JSON.parse(payload));
|
|
103
|
+
}
|
|
104
|
+
catch { /* not our frame */ }
|
|
105
|
+
}
|
|
106
|
+
sep = buffer.indexOf('\n\n');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch { /* aborted or closed; the caller owns the outcome */ }
|
|
111
|
+
})();
|
|
112
|
+
}
|
|
113
|
+
/** Exported for testing: outcome -> exit code is the contract scripts depend on. */
|
|
114
|
+
export function exitCodeForOutcome(outcome) {
|
|
115
|
+
// `steered` is a success: the prompt reached a turn that was already
|
|
116
|
+
// running. There is no separate answer, but nothing failed either.
|
|
117
|
+
return outcome === 'completed' || outcome === 'steered' ? EXIT_OK : EXIT_FAILED;
|
|
118
|
+
}
|
|
119
|
+
export function renderOutcome(frame, json) {
|
|
120
|
+
if (json) {
|
|
121
|
+
console.log(JSON.stringify({
|
|
122
|
+
ok: frame.outcome === 'completed' || frame.outcome === 'steered',
|
|
123
|
+
requestId: frame.requestId,
|
|
124
|
+
outcome: frame.outcome,
|
|
125
|
+
...(frame.text !== undefined ? { text: frame.text } : {}),
|
|
126
|
+
...(frame.error !== undefined ? { error: frame.error } : {}),
|
|
127
|
+
...(frame.mergedInto !== undefined ? { mergedInto: frame.mergedInto } : {}),
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
switch (frame.outcome) {
|
|
132
|
+
case 'completed':
|
|
133
|
+
if (frame.text)
|
|
134
|
+
console.log(frame.text);
|
|
135
|
+
break;
|
|
136
|
+
case 'steered':
|
|
137
|
+
// Honest reporting matters here: the prompt reached a turn that
|
|
138
|
+
// was already running, so there is no separate answer to wait for.
|
|
139
|
+
console.error('Delivered to the in-progress turn; no separate reply.');
|
|
140
|
+
break;
|
|
141
|
+
case 'failed':
|
|
142
|
+
console.error(frame.error || 'request failed');
|
|
143
|
+
break;
|
|
144
|
+
default:
|
|
145
|
+
console.error(`request ${frame.outcome}${frame.reason ? `: ${frame.reason}` : ''}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return exitCodeForOutcome(frame.outcome);
|
|
149
|
+
}
|
|
150
|
+
/** Exported for testing: SSE says `event`, the WebSocket fallback says `type`. */
|
|
151
|
+
export function isSettlementFrame(frame) {
|
|
152
|
+
return (frame.event ?? frame.type) === 'request_settled';
|
|
153
|
+
}
|
|
154
|
+
async function main() {
|
|
155
|
+
const opts = parseArgs(process.argv.slice(3));
|
|
156
|
+
const prompt = opts.prompt === '-' || !opts.prompt ? await readStdin() : opts.prompt;
|
|
157
|
+
if (!prompt)
|
|
158
|
+
usage();
|
|
159
|
+
const apiUrl = getServerUrl(opts.port || undefined);
|
|
160
|
+
const controller = new AbortController();
|
|
161
|
+
// Track the id we care about. It is only known after the POST, so frames
|
|
162
|
+
// that arrive before then are buffered rather than dropped.
|
|
163
|
+
let requestId = null;
|
|
164
|
+
const buffered = [];
|
|
165
|
+
let settle = () => { };
|
|
166
|
+
const settled = new Promise((resolve) => { settle = resolve; });
|
|
167
|
+
const onFrame = (frame) => {
|
|
168
|
+
if (!isSettlementFrame(frame))
|
|
169
|
+
return;
|
|
170
|
+
if (requestId === null) {
|
|
171
|
+
buffered.push(frame);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (frame.requestId === requestId)
|
|
175
|
+
settle(frame);
|
|
176
|
+
};
|
|
177
|
+
try {
|
|
178
|
+
await openEventStream(apiUrl, onFrame, controller.signal);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
182
|
+
if (opts.json)
|
|
183
|
+
console.log(JSON.stringify({ ok: false, error: `cannot reach ${apiUrl}`, detail: message }));
|
|
184
|
+
else
|
|
185
|
+
console.error(`Cannot reach ${apiUrl} — run \`cli-jaw serve\` first.`);
|
|
186
|
+
return EXIT_FAILED;
|
|
187
|
+
}
|
|
188
|
+
const res = await fetch(`${apiUrl}/api/message`, {
|
|
189
|
+
method: 'POST',
|
|
190
|
+
headers: { ...authHeaders({ 'Content-Type': 'application/json' }) },
|
|
191
|
+
body: JSON.stringify({ prompt }),
|
|
192
|
+
}).catch((err) => err);
|
|
193
|
+
if (res instanceof Error) {
|
|
194
|
+
if (opts.json)
|
|
195
|
+
console.log(JSON.stringify({ ok: false, error: res.message }));
|
|
196
|
+
else
|
|
197
|
+
console.error(res.message);
|
|
198
|
+
controller.abort();
|
|
199
|
+
return EXIT_FAILED;
|
|
200
|
+
}
|
|
201
|
+
const body = await res.json().catch(() => ({}));
|
|
202
|
+
if (!res.ok || !body.requestId) {
|
|
203
|
+
const error = body.error || `HTTP ${res.status}`;
|
|
204
|
+
if (opts.json)
|
|
205
|
+
console.log(JSON.stringify({ ok: false, error }));
|
|
206
|
+
else
|
|
207
|
+
console.error(error);
|
|
208
|
+
controller.abort();
|
|
209
|
+
return EXIT_FAILED;
|
|
210
|
+
}
|
|
211
|
+
requestId = body.requestId;
|
|
212
|
+
// Replay anything that settled between connecting and learning our id.
|
|
213
|
+
for (const frame of buffered) {
|
|
214
|
+
if (frame.requestId === requestId)
|
|
215
|
+
settle(frame);
|
|
216
|
+
}
|
|
217
|
+
const timeout = new Promise((resolve) => {
|
|
218
|
+
setTimeout(() => resolve('timeout'), opts.timeoutMs).unref?.();
|
|
219
|
+
});
|
|
220
|
+
const outcome = await Promise.race([settled, timeout]);
|
|
221
|
+
controller.abort();
|
|
222
|
+
if (outcome === 'timeout') {
|
|
223
|
+
if (opts.json)
|
|
224
|
+
console.log(JSON.stringify({ ok: false, requestId, error: 'timeout' }));
|
|
225
|
+
else
|
|
226
|
+
console.error(`Timed out after ${opts.timeoutMs / 1000}s (request ${requestId} may still be running).`);
|
|
227
|
+
return EXIT_TIMEOUT;
|
|
228
|
+
}
|
|
229
|
+
return renderOutcome(outcome, opts.json);
|
|
230
|
+
}
|
|
231
|
+
// Only run when invoked as the command, so tests can import the pure helpers
|
|
232
|
+
// without the module trying to reach a server.
|
|
233
|
+
const isEntryPoint = process.argv[1]?.endsWith('cli-jaw.js')
|
|
234
|
+
|| process.argv[1]?.endsWith('cli-jaw.ts')
|
|
235
|
+
|| process.argv[1]?.endsWith('ask.js')
|
|
236
|
+
|| process.argv[1]?.endsWith('ask.ts');
|
|
237
|
+
if (isEntryPoint) {
|
|
238
|
+
main()
|
|
239
|
+
.then((code) => { process.exitCode = code; })
|
|
240
|
+
.catch((err) => {
|
|
241
|
+
console.error(err.message);
|
|
242
|
+
process.exitCode = EXIT_FAILED;
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=ask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../../bin/commands/ask.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { parseArgs } from 'node:util';
|
|
6
6
|
import { getServerUrl, loadSettings } from '../../src/core/config.js';
|
|
7
7
|
import { getCliAuthToken, authHeaders } from '../../src/cli/api-auth.js';
|
|
8
|
+
import { renderLocalChatHit } from './_shared/search-format.js';
|
|
8
9
|
loadSettings();
|
|
9
10
|
const SERVER = getServerUrl();
|
|
10
11
|
await getCliAuthToken();
|
|
@@ -52,13 +53,14 @@ try {
|
|
|
52
53
|
process.exit(0);
|
|
53
54
|
}
|
|
54
55
|
for (const match of data) {
|
|
55
|
-
|
|
56
|
-
console.log(`[${match['created_at']}] (${match['role']}) ${content}`);
|
|
56
|
+
console.log(renderLocalChatHit(match));
|
|
57
57
|
const ctx = match['context'];
|
|
58
58
|
if (ctx && Array.isArray(ctx)) {
|
|
59
59
|
for (const c of ctx) {
|
|
60
60
|
const prefix = c['id'] === match['id'] ? '>> ' : ' ';
|
|
61
|
-
|
|
61
|
+
// Context lines stay tighter than the hit itself: they are there for
|
|
62
|
+
// orientation, not for reading.
|
|
63
|
+
console.log(`${prefix}${renderLocalChatHit(c, 200)}`);
|
|
62
64
|
}
|
|
63
65
|
}
|
|
64
66
|
console.log('---');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-search.js","sourceRoot":"","sources":["../../../bin/commands/chat-search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-search.js","sourceRoot":"","sources":["../../../bin/commands/chat-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -100,8 +100,20 @@ try {
|
|
|
100
100
|
ws = await connectChannel(values.port);
|
|
101
101
|
}
|
|
102
102
|
catch {
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
// A piped --raw caller is a program parsing this stream, so the failure has
|
|
104
|
+
// to be machine-readable too — ANSI-decorated prose would just be noise it
|
|
105
|
+
// cannot act on (#275).
|
|
106
|
+
if (values.raw && !process.stdin.isTTY) {
|
|
107
|
+
console.error(JSON.stringify({
|
|
108
|
+
type: 'error',
|
|
109
|
+
error: `cannot connect to ${apiUrl}`,
|
|
110
|
+
hint: 'run `cli-jaw serve` first',
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
console.error(`\n ${c.red}x${c.reset} Cannot connect to ${apiUrl}/api/events or ${wsUrl}`);
|
|
115
|
+
console.error(` Run ${c.cyan}cli-jaw serve${c.reset} first\n`);
|
|
116
|
+
}
|
|
105
117
|
process.exit(1);
|
|
106
118
|
}
|
|
107
119
|
// ─── Fetch info ──────────────────────────────
|
|
@@ -225,9 +237,35 @@ if (values.verbose) {
|
|
|
225
237
|
ctx.store.transcript.liveToolsExpanded = true;
|
|
226
238
|
}
|
|
227
239
|
// ─── Mode branch ─────────────────────────────
|
|
228
|
-
|
|
240
|
+
// `--raw` is documented as "JSON protocol mode (for UI integration)" and issue
|
|
241
|
+
// #275 scripts it as `echo '{...}' | jaw chat --raw`. A pipe has no TTY, so the
|
|
242
|
+
// rich branch below would call setRawMode() and die with
|
|
243
|
+
// `process.stdin.setRawMode is not a function`. Piped --raw gets a dedicated
|
|
244
|
+
// NDJSON protocol mode: verbatim frames out, no banner, no ANSI, and an exit
|
|
245
|
+
// that waits for the turn to finish instead of quitting at EOF.
|
|
246
|
+
// A --raw session on a real TTY keeps its existing interactive behavior.
|
|
247
|
+
const rawPiped = ctx.isRaw && !process.stdin.isTTY;
|
|
248
|
+
if (rawPiped) {
|
|
249
|
+
const { runRawPipeMode } = await import('./tui/raw-pipe-mode.js');
|
|
250
|
+
await runRawPipeMode(ctx);
|
|
251
|
+
}
|
|
252
|
+
else if (values.simple) {
|
|
229
253
|
await runSimpleMode(ctx);
|
|
230
254
|
}
|
|
255
|
+
else if (!process.stdin.isTTY) {
|
|
256
|
+
// Every remaining path puts stdin in raw mode. The display mode is chosen
|
|
257
|
+
// from stdout, so a piped stdin on a real terminal still lands here, and
|
|
258
|
+
// setRawMode() on a pipe throws. Fail with direction instead.
|
|
259
|
+
console.error('jaw chat needs an interactive stdin.');
|
|
260
|
+
console.error('Non-interactive alternatives: jaw chat --raw, jaw chat --simple');
|
|
261
|
+
// The channel opened at startup keeps the event loop alive, so setting
|
|
262
|
+
// exitCode alone would hang here forever instead of failing fast.
|
|
263
|
+
try {
|
|
264
|
+
ws.close();
|
|
265
|
+
}
|
|
266
|
+
catch { /* already closed */ }
|
|
267
|
+
process.exit(2);
|
|
268
|
+
}
|
|
231
269
|
else {
|
|
232
270
|
if (!ctx.isRaw)
|
|
233
271
|
await initHighlight(); // interactive rich TUI only; --simple & --raw untouched
|