@namzu/cli 26.3.0 → 28.0.0
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/CHANGELOG.md +271 -0
- package/README.md +67 -46
- package/dist/bin.js +7 -0
- package/dist/bin.js.map +1 -1
- package/dist/checkpoints/store.d.ts +17 -4
- package/dist/checkpoints/store.d.ts.map +1 -1
- package/dist/checkpoints/store.js +20 -5
- package/dist/checkpoints/store.js.map +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +124 -14
- package/dist/cli.js.map +1 -1
- package/dist/commands/acp.d.ts +23 -1
- package/dist/commands/acp.d.ts.map +1 -1
- package/dist/commands/acp.js +41 -2
- package/dist/commands/acp.js.map +1 -1
- package/dist/commands/drain.d.ts +69 -2
- package/dist/commands/drain.d.ts.map +1 -1
- package/dist/commands/drain.js +216 -136
- package/dist/commands/drain.js.map +1 -1
- package/dist/commands/eval.js +1 -1
- package/dist/commands/eval.js.map +1 -1
- package/dist/commands/{run-flags.d.ts → exec-flags.d.ts} +36 -28
- package/dist/commands/exec-flags.d.ts.map +1 -0
- package/dist/commands/{run-flags.js → exec-flags.js} +35 -27
- package/dist/commands/exec-flags.js.map +1 -0
- package/dist/commands/exec-json.d.ts +75 -0
- package/dist/commands/exec-json.d.ts.map +1 -0
- package/dist/commands/exec-json.js +473 -0
- package/dist/commands/exec-json.js.map +1 -0
- package/dist/commands/exec.d.ts +42 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +683 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/host-queries.d.ts +12 -0
- package/dist/commands/host-queries.d.ts.map +1 -0
- package/dist/commands/host-queries.js +149 -0
- package/dist/commands/host-queries.js.map +1 -0
- package/dist/commands/prior-messages.js +1 -1
- package/dist/commands/prior-messages.js.map +1 -1
- package/dist/commands/provider-wait.d.ts +5 -5
- package/dist/commands/provider-wait.d.ts.map +1 -1
- package/dist/commands/provider-wait.js +2 -2
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +2 -0
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/resident-flags.d.ts +2 -2
- package/dist/commands/resident-flags.d.ts.map +1 -1
- package/dist/commands/resident-flags.js +4 -2
- package/dist/commands/resident-flags.js.map +1 -1
- package/dist/commands/resident-learning.js +1 -1
- package/dist/commands/resident-learning.js.map +1 -1
- package/dist/commands/resident.d.ts.map +1 -1
- package/dist/commands/resident.js +3 -2
- package/dist/commands/resident.js.map +1 -1
- package/dist/commands/serve.js +2 -2
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/skills.js +1 -1
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/state.js +8 -8
- package/dist/commands/state.js.map +1 -1
- package/dist/commands/stdin.d.ts +5 -5
- package/dist/commands/stdin.js +5 -5
- package/dist/commands/types.d.ts +2 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/config/load.d.ts +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +36 -5
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +59 -20
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/config/tool-result-screens.js +1 -1
- package/dist/config/turn-guards.d.ts +23 -0
- package/dist/config/turn-guards.d.ts.map +1 -0
- package/dist/config/turn-guards.js +46 -0
- package/dist/config/turn-guards.js.map +1 -0
- package/dist/context/directories.d.ts +37 -0
- package/dist/context/directories.d.ts.map +1 -0
- package/dist/context/directories.js +69 -0
- package/dist/context/directories.js.map +1 -0
- package/dist/context/environment.d.ts +55 -0
- package/dist/context/environment.d.ts.map +1 -1
- package/dist/context/environment.js +96 -0
- package/dist/context/environment.js.map +1 -1
- package/dist/context/project-tracker.d.ts +3 -3
- package/dist/context/project-tracker.d.ts.map +1 -1
- package/dist/context/project-tracker.js +3 -3
- package/dist/context/project-tracker.js.map +1 -1
- package/dist/context/project.d.ts +2 -2
- package/dist/context/project.js +2 -2
- package/dist/context/sandbox.d.ts +22 -3
- package/dist/context/sandbox.d.ts.map +1 -1
- package/dist/context/sandbox.js +42 -4
- package/dist/context/sandbox.js.map +1 -1
- package/dist/doctor/checks/chain.d.ts +1 -1
- package/dist/doctor/checks/chain.js +7 -7
- package/dist/doctor/checks/chain.js.map +1 -1
- package/dist/doctor/checks/invariants.d.ts +2 -2
- package/dist/doctor/checks/invariants.js +5 -5
- package/dist/doctor/checks/invariants.js.map +1 -1
- package/dist/doctor/checks/logging.js +1 -1
- package/dist/doctor/checks/logging.js.map +1 -1
- package/dist/doctor/checks/sandbox.js +1 -1
- package/dist/doctor/checks/sandbox.js.map +1 -1
- package/dist/doctor/checks/session-export.d.ts +1 -1
- package/dist/doctor/checks/session-export.js +2 -2
- package/dist/doctor/checks/session-export.js.map +1 -1
- package/dist/doctor/checks/telemetry.d.ts +1 -1
- package/dist/doctor/checks/telemetry.js +1 -1
- package/dist/doctor/registry.js +2 -2
- package/dist/doctor/registry.js.map +1 -1
- package/dist/exit-codes.d.ts +2 -2
- package/dist/exit-codes.js +2 -2
- package/dist/integrations/mcp/servers.d.ts +1 -1
- package/dist/integrations/providers/access.d.ts +4 -1
- package/dist/integrations/providers/access.d.ts.map +1 -1
- package/dist/integrations/providers/access.js +6 -3
- package/dist/integrations/providers/access.js.map +1 -1
- package/dist/integrations/providers/chain-capabilities.d.ts +6 -6
- package/dist/integrations/providers/chain-capabilities.js +8 -8
- package/dist/integrations/providers/chain-capabilities.js.map +1 -1
- package/dist/integrations/providers/register.d.ts +1 -1
- package/dist/integrations/providers/register.js +1 -1
- package/dist/integrations/providers/registry.d.ts +1 -1
- package/dist/integrations/providers/zen-catalogue.d.ts +100 -0
- package/dist/integrations/providers/zen-catalogue.d.ts.map +1 -0
- package/dist/integrations/providers/zen-catalogue.js +196 -0
- package/dist/integrations/providers/zen-catalogue.js.map +1 -0
- package/dist/integrations/resident/inspection.d.ts +4 -1
- package/dist/integrations/resident/inspection.d.ts.map +1 -1
- package/dist/integrations/resident/inspection.js +53 -34
- package/dist/integrations/resident/inspection.js.map +1 -1
- package/dist/integrations/resident/learning-storage.d.ts +7 -2
- package/dist/integrations/resident/learning-storage.d.ts.map +1 -1
- package/dist/integrations/resident/learning-storage.js +12 -8
- package/dist/integrations/resident/learning-storage.js.map +1 -1
- package/dist/integrations/resident/runner-launch.d.ts +3 -3
- package/dist/integrations/resident/runner-launch.d.ts.map +1 -1
- package/dist/integrations/resident/runner-store.d.ts +1 -1
- package/dist/integrations/resident/runner-store.d.ts.map +1 -1
- package/dist/integrations/resident/runner-store.js +5 -2
- package/dist/integrations/resident/runner-store.js.map +1 -1
- package/dist/integrations/resident/runner-worker.js +23 -0
- package/dist/integrations/resident/runner-worker.js.map +1 -1
- package/dist/integrations/resident/session-log-reads.d.ts +37 -0
- package/dist/integrations/resident/session-log-reads.d.ts.map +1 -0
- package/dist/integrations/resident/session-log-reads.js +125 -0
- package/dist/integrations/resident/session-log-reads.js.map +1 -0
- package/dist/integrations/resident/session-step.d.ts +4 -2
- package/dist/integrations/resident/session-step.d.ts.map +1 -1
- package/dist/integrations/resident/session-step.js +16 -14
- package/dist/integrations/resident/session-step.js.map +1 -1
- package/dist/integrations/resident/storage.d.ts +23 -1
- package/dist/integrations/resident/storage.d.ts.map +1 -1
- package/dist/integrations/resident/storage.js +60 -17
- package/dist/integrations/resident/storage.js.map +1 -1
- package/dist/integrations/resident/tool-evidence.d.ts +4 -2
- package/dist/integrations/resident/tool-evidence.d.ts.map +1 -1
- package/dist/integrations/resident/tool-evidence.js +36 -30
- package/dist/integrations/resident/tool-evidence.js.map +1 -1
- package/dist/integrations/resident/verification.d.ts +2 -2
- package/dist/integrations/resident/verification.d.ts.map +1 -1
- package/dist/integrations/resident/verification.js +4 -4
- package/dist/integrations/resident/verification.js.map +1 -1
- package/dist/integrations/sessions/checkpoint-view.d.ts +13 -0
- package/dist/integrations/sessions/checkpoint-view.d.ts.map +1 -0
- package/dist/integrations/sessions/checkpoint-view.js +48 -0
- package/dist/integrations/sessions/checkpoint-view.js.map +1 -0
- package/dist/integrations/sessions/context-inventory.js +1 -1
- package/dist/integrations/sessions/context-inventory.js.map +1 -1
- package/dist/integrations/sessions/conversation-search.d.ts +16 -20
- package/dist/integrations/sessions/conversation-search.d.ts.map +1 -1
- package/dist/integrations/sessions/conversation-search.js +305 -731
- package/dist/integrations/sessions/conversation-search.js.map +1 -1
- package/dist/integrations/sessions/evidence-page-validation.d.ts +4 -4
- package/dist/integrations/sessions/evidence-page-validation.d.ts.map +1 -1
- package/dist/integrations/sessions/evidence-page-validation.js +1 -1
- package/dist/integrations/sessions/evidence-page-validation.js.map +1 -1
- package/dist/integrations/sessions/evidence-recall.d.ts +40 -2
- package/dist/integrations/sessions/evidence-recall.d.ts.map +1 -1
- package/dist/integrations/sessions/evidence-recall.js +41 -97
- package/dist/integrations/sessions/evidence-recall.js.map +1 -1
- package/dist/integrations/sessions/store.d.ts +153 -85
- package/dist/integrations/sessions/store.d.ts.map +1 -1
- package/dist/integrations/sessions/store.js +414 -484
- package/dist/integrations/sessions/store.js.map +1 -1
- package/dist/integrations/sessions/task-context.d.ts +15 -2
- package/dist/integrations/sessions/task-context.d.ts.map +1 -1
- package/dist/integrations/sessions/task-context.js +34 -11
- package/dist/integrations/sessions/task-context.js.map +1 -1
- package/dist/integrations/sessions/transcript-export.d.ts +13 -6
- package/dist/integrations/sessions/transcript-export.d.ts.map +1 -1
- package/dist/integrations/sessions/transcript-export.js +148 -263
- package/dist/integrations/sessions/transcript-export.js.map +1 -1
- package/dist/integrations/state/home.d.ts +4 -16
- package/dist/integrations/state/home.d.ts.map +1 -1
- package/dist/integrations/state/home.js +6 -42
- package/dist/integrations/state/home.js.map +1 -1
- package/dist/integrations/state/project.d.ts +6 -7
- package/dist/integrations/state/project.d.ts.map +1 -1
- package/dist/integrations/state/project.js +7 -9
- package/dist/integrations/state/project.js.map +1 -1
- package/dist/integrations/state/report.d.ts +27 -41
- package/dist/integrations/state/report.d.ts.map +1 -1
- package/dist/integrations/state/report.js +172 -464
- package/dist/integrations/state/report.js.map +1 -1
- package/dist/integrations/state/retention.d.ts +18 -0
- package/dist/integrations/state/retention.d.ts.map +1 -0
- package/dist/integrations/state/retention.js +18 -0
- package/dist/integrations/state/retention.js.map +1 -0
- package/dist/integrations/subagents/activity.d.ts +36 -31
- package/dist/integrations/subagents/activity.d.ts.map +1 -1
- package/dist/integrations/subagents/activity.js +27 -23
- package/dist/integrations/subagents/activity.js.map +1 -1
- package/dist/integrations/subagents/batches.d.ts +91 -0
- package/dist/integrations/subagents/batches.d.ts.map +1 -0
- package/dist/integrations/subagents/batches.js +172 -0
- package/dist/integrations/subagents/batches.js.map +1 -0
- package/dist/integrations/subagents/parent.d.ts +26 -11
- package/dist/integrations/subagents/parent.d.ts.map +1 -1
- package/dist/integrations/subagents/parent.js +13 -28
- package/dist/integrations/subagents/parent.js.map +1 -1
- package/dist/integrations/subagents/policy.d.ts +2 -2
- package/dist/integrations/subagents/policy.d.ts.map +1 -1
- package/dist/integrations/subagents/policy.js +2 -2
- package/dist/integrations/subagents/policy.js.map +1 -1
- package/dist/integrations/subagents/replay.d.ts +91 -26
- package/dist/integrations/subagents/replay.d.ts.map +1 -1
- package/dist/integrations/subagents/replay.js +216 -114
- package/dist/integrations/subagents/replay.js.map +1 -1
- package/dist/integrations/subagents/runtime.d.ts +50 -26
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +132 -126
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/subagents/saved-agents.d.ts +57 -0
- package/dist/integrations/subagents/saved-agents.d.ts.map +1 -0
- package/dist/integrations/subagents/saved-agents.js +102 -0
- package/dist/integrations/subagents/saved-agents.js.map +1 -0
- package/dist/integrations/subagents/slash.d.ts +55 -0
- package/dist/integrations/subagents/slash.d.ts.map +1 -0
- package/dist/integrations/subagents/slash.js +45 -0
- package/dist/integrations/subagents/slash.js.map +1 -0
- package/dist/integrations/telemetry/session-export.d.ts +6 -6
- package/dist/integrations/telemetry/session-export.d.ts.map +1 -1
- package/dist/integrations/telemetry/session-export.js +2 -2
- package/dist/integrations/web/search.d.ts +1 -1
- package/dist/logging.d.ts +5 -5
- package/dist/logging.js +6 -6
- package/dist/memory/presentation.d.ts +11 -0
- package/dist/memory/presentation.d.ts.map +1 -1
- package/dist/memory/presentation.js +25 -0
- package/dist/memory/presentation.js.map +1 -1
- package/dist/memory/store.d.ts +13 -7
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +37 -11
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/typed.d.ts +116 -0
- package/dist/memory/typed.d.ts.map +1 -0
- package/dist/memory/typed.js +336 -0
- package/dist/memory/typed.js.map +1 -0
- package/dist/permissions/checks.d.ts +1 -1
- package/dist/permissions/checks.js +1 -1
- package/dist/permissions/headless-trust.d.ts +4 -4
- package/dist/permissions/headless-trust.d.ts.map +1 -1
- package/dist/permissions/headless-trust.js +6 -6
- package/dist/permissions/headless-trust.js.map +1 -1
- package/dist/permissions/mode.d.ts +4 -4
- package/dist/permissions/mode.js +1 -1
- package/dist/permissions/rules.d.ts +1 -1
- package/dist/permissions/rules.js +1 -1
- package/dist/termination.d.ts +75 -0
- package/dist/termination.d.ts.map +1 -0
- package/dist/termination.js +143 -0
- package/dist/termination.js.map +1 -0
- package/dist/tui/AgentExplorer.d.ts +2 -2
- package/dist/tui/AgentExplorer.js +4 -4
- package/dist/tui/AgentExplorer.js.map +1 -1
- package/dist/tui/App.d.ts +9 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +456 -307
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/LiveActivity.d.ts +1 -1
- package/dist/tui/LiveActivity.d.ts.map +1 -1
- package/dist/tui/PermissionOverlay.d.ts +8 -0
- package/dist/tui/PermissionOverlay.d.ts.map +1 -1
- package/dist/tui/PermissionOverlay.js +25 -2
- package/dist/tui/PermissionOverlay.js.map +1 -1
- package/dist/tui/Picker.js +1 -1
- package/dist/tui/agent.d.ts +211 -135
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +535 -316
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/conversation-evidence-view.js +3 -3
- package/dist/tui/conversation-evidence-view.js.map +1 -1
- package/dist/tui/conversation-history.d.ts +4 -21
- package/dist/tui/conversation-history.d.ts.map +1 -1
- package/dist/tui/conversation-history.js +4 -28
- package/dist/tui/conversation-history.js.map +1 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +27 -1
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/log-pane.js +1 -1
- package/dist/tui/markdownParser.d.ts +1 -1
- package/dist/tui/markdownParser.js +1 -1
- package/dist/tui/permission-review.d.ts +16 -0
- package/dist/tui/permission-review.d.ts.map +1 -1
- package/dist/tui/permission-review.js +25 -2
- package/dist/tui/permission-review.js.map +1 -1
- package/dist/tui/slashCommands.d.ts +30 -41
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +75 -66
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/status-panel-layout.js +1 -1
- package/dist/tui/status-panel-layout.js.map +1 -1
- package/dist/tui/{run-interruption.d.ts → turn-interruption.d.ts} +4 -4
- package/dist/tui/turn-interruption.d.ts.map +1 -0
- package/dist/tui/{run-interruption.js → turn-interruption.js} +20 -20
- package/dist/tui/turn-interruption.js.map +1 -0
- package/dist/tui/turn-limits-settings.d.ts +39 -0
- package/dist/tui/turn-limits-settings.d.ts.map +1 -0
- package/dist/tui/{run-limits-settings.js → turn-limits-settings.js} +18 -18
- package/dist/tui/turn-limits-settings.js.map +1 -0
- package/dist/tui/types.d.ts +3 -3
- package/dist/tui/types.d.ts.map +1 -1
- package/dist/user-commands/store.d.ts +4 -4
- package/dist/user-commands/store.js +5 -5
- package/dist/user-commands/store.js.map +1 -1
- package/package.json +6 -6
- package/dist/commands/run-flags.d.ts.map +0 -1
- package/dist/commands/run-flags.js.map +0 -1
- package/dist/commands/run-stream.d.ts +0 -65
- package/dist/commands/run-stream.d.ts.map +0 -1
- package/dist/commands/run-stream.js +0 -603
- package/dist/commands/run-stream.js.map +0 -1
- package/dist/commands/run.d.ts +0 -39
- package/dist/commands/run.d.ts.map +0 -1
- package/dist/commands/run.js +0 -533
- package/dist/commands/run.js.map +0 -1
- package/dist/config/run-limits.d.ts +0 -11
- package/dist/config/run-limits.d.ts.map +0 -1
- package/dist/config/run-limits.js +0 -64
- package/dist/config/run-limits.js.map +0 -1
- package/dist/integrations/sessions/compaction-evidence.d.ts +0 -5
- package/dist/integrations/sessions/compaction-evidence.d.ts.map +0 -1
- package/dist/integrations/sessions/compaction-evidence.js +0 -59
- package/dist/integrations/sessions/compaction-evidence.js.map +0 -1
- package/dist/integrations/sessions/database.d.ts +0 -5
- package/dist/integrations/sessions/database.d.ts.map +0 -1
- package/dist/integrations/sessions/database.js +0 -34
- package/dist/integrations/sessions/database.js.map +0 -1
- package/dist/integrations/sessions/paths.d.ts +0 -7
- package/dist/integrations/sessions/paths.d.ts.map +0 -1
- package/dist/integrations/sessions/paths.js +0 -14
- package/dist/integrations/sessions/paths.js.map +0 -1
- package/dist/integrations/sessions/run-discovery.d.ts +0 -24
- package/dist/integrations/sessions/run-discovery.d.ts.map +0 -1
- package/dist/integrations/sessions/run-discovery.js +0 -142
- package/dist/integrations/sessions/run-discovery.js.map +0 -1
- package/dist/integrations/sessions/turn-evidence.d.ts +0 -129
- package/dist/integrations/sessions/turn-evidence.d.ts.map +0 -1
- package/dist/integrations/sessions/turn-evidence.js +0 -517
- package/dist/integrations/sessions/turn-evidence.js.map +0 -1
- package/dist/integrations/subagents/history.d.ts +0 -26
- package/dist/integrations/subagents/history.d.ts.map +0 -1
- package/dist/integrations/subagents/history.js +0 -76
- package/dist/integrations/subagents/history.js.map +0 -1
- package/dist/integrations/subagents/runs.d.ts +0 -72
- package/dist/integrations/subagents/runs.d.ts.map +0 -1
- package/dist/integrations/subagents/runs.js +0 -155
- package/dist/integrations/subagents/runs.js.map +0 -1
- package/dist/tui/run-interruption.d.ts.map +0 -1
- package/dist/tui/run-interruption.js.map +0 -1
- package/dist/tui/run-limits-settings.d.ts +0 -39
- package/dist/tui/run-limits-settings.d.ts.map +0 -1
- package/dist/tui/run-limits-settings.js.map +0 -1
|
@@ -1,603 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `namzu run-stream [--session <key>] "<prompt>"` — headless STREAMING
|
|
3
|
-
* one-shot. Same engine as `run`, but instead of buffering the final text it
|
|
4
|
-
* emits one compact NDJSON line per `AgentEvent` to stdout
|
|
5
|
-
* (`{"kind":"delta","text":…}`, `{"kind":"tool-start",…}`,
|
|
6
|
-
* `{"kind":"error","message":…}`, `{"kind":"done"}`). A host process — a
|
|
7
|
-
* desktop app embedding namzu, say — line-scans stdout and renders the turn
|
|
8
|
-
* live: the equivalent of the TUI, driven from another runtime.
|
|
9
|
-
*
|
|
10
|
-
* History: with `--session <key>` the turn is bound to a persisted
|
|
11
|
-
* conversation in the central application-home Project associated with the
|
|
12
|
-
* canonical cwd (keyed by the embedder's own session id), so prior turns are
|
|
13
|
-
* loaded as context and the kernel's exact
|
|
14
|
-
* settled conversation projection is published — including opaque reasoning
|
|
15
|
-
* and complete tool turns, excluding its fresh per-run system floor. That's
|
|
16
|
-
* what lets a reopened session show and replay its past messages (`namzu
|
|
17
|
-
* history --session <key>`). Without `--session`,
|
|
18
|
-
* prior history may be supplied on stdin as a JSON `Message[]` and nothing is
|
|
19
|
-
* persisted (stateless one-shot).
|
|
20
|
-
*
|
|
21
|
-
* Status lines go to stderr as NDJSON (LOG-05), never stdout, so every
|
|
22
|
-
* stdout line is a valid JSON event, and EVERY failure is reported in band,
|
|
23
|
-
* including the ones that also carry an exit code.
|
|
24
|
-
*
|
|
25
|
-
* ## What the exit code means
|
|
26
|
-
*
|
|
27
|
-
* It used to be explained as "a run that STARTED and failed exits 0; a refusal
|
|
28
|
-
* to start exits non-zero", and that rule did not sort the cases it was applied
|
|
29
|
-
* to. An unknown option, a missing prompt, a `--cwd` that is not there and a
|
|
30
|
-
* tool server that will not connect are all refusals to start, and all four
|
|
31
|
-
* exited 0 while an untrusted folder exited 77. Neither does the retry argument
|
|
32
|
-
* the old comment appealed to: retrying an unknown option is exactly as
|
|
33
|
-
* pointless as retrying an untrusted folder.
|
|
34
|
-
*
|
|
35
|
-
* The axis that does sort them:
|
|
36
|
-
*
|
|
37
|
-
* CAN THE CALLER REACH THE RUN IT ASKED FOR BY CHANGING WHAT IT SENDS?
|
|
38
|
-
*
|
|
39
|
-
* - **Yes → `0`.** The host reads the `error` event and fixes its own
|
|
40
|
-
* invocation. An unknown option, no prompt, a `--cwd` that does not exist, a
|
|
41
|
-
* `--permission-mode` that is not a mode, an interactive command named
|
|
42
|
-
* headlessly, a provider id that is not a provider.
|
|
43
|
-
* - **A run that started and failed → `0`.** Unchanged: that is an outcome to
|
|
44
|
-
* render, and possibly to retry.
|
|
45
|
-
* - **No → non-zero, because a person has to go and do something.** `77` when
|
|
46
|
-
* the folder is untrusted — kept to that one condition, because being
|
|
47
|
-
* unambiguous is its entire justification. `1` for everything else in this
|
|
48
|
-
* group: a conversation that cannot be opened, no provider available, a
|
|
49
|
-
* credential or driver the session needs, a declared tool server that is not
|
|
50
|
-
* there, a command file that will not parse.
|
|
51
|
-
*
|
|
52
|
-
* `1` rather than a new code because `namzu run` — the same one-shot, differing
|
|
53
|
-
* only in how it prints — already exits `1` for these conditions and `77` for
|
|
54
|
-
* trust. A host that shells to one for a script and the other for a UI must not
|
|
55
|
-
* be handed two tables for one fact.
|
|
56
|
-
*
|
|
57
|
-
* Dropping `--session` is NOT "the caller fixing it": it abandons what was
|
|
58
|
-
* asked for rather than achieving it.
|
|
59
|
-
*/
|
|
60
|
-
import { asSessionId, generateSessionId, isEntityId, jsonLinesSink, } from '@namzu/sdk';
|
|
61
|
-
import { resolveTrustedProjectContext } from '../config/trusted-project-context.js';
|
|
62
|
-
import { EXIT_FAIL, EXIT_OK, EXIT_UNTRUSTED } from '../exit-codes.js';
|
|
63
|
-
import { appendMessages, findMappedConversation, listRecent, loadConversation, openSessions, replaceConversation, resolveConversation, } from '../integrations/sessions/store.js';
|
|
64
|
-
import { contextLogging, installCliLogging } from '../logging.js';
|
|
65
|
-
import { decideHeadlessTrust } from '../permissions/headless-trust.js';
|
|
66
|
-
import { resolvePermissionMode } from '../permissions/mode.js';
|
|
67
|
-
import { compilePermissions } from '../permissions/rules.js';
|
|
68
|
-
import { planTurnPublication } from '../tui/conversation-history.js';
|
|
69
|
-
import { hostCommandNames } from '../tui/slashCommands.js';
|
|
70
|
-
import { expandHeadlessCommand } from '../user-commands/store.js';
|
|
71
|
-
import { parsePriorMessages } from './prior-messages.js';
|
|
72
|
-
import { applyProviderFlags, buildGate, loadSkillsContext, parseRunFlags, resolveWorkingDirectory, unknownOptionMessage, } from './run-flags.js';
|
|
73
|
-
import { readStdin } from './stdin.js';
|
|
74
|
-
function defaultPrefs(detected) {
|
|
75
|
-
const first = detected[0];
|
|
76
|
-
return first
|
|
77
|
-
? {
|
|
78
|
-
version: 3,
|
|
79
|
-
providers: [{ id: first.entry.id }],
|
|
80
|
-
subagents: { active: [] },
|
|
81
|
-
}
|
|
82
|
-
: null;
|
|
83
|
-
}
|
|
84
|
-
export const runStreamCommand = {
|
|
85
|
-
name: 'run-stream',
|
|
86
|
-
description: 'Run a single prompt and stream AgentEvents as NDJSON (for host UIs)',
|
|
87
|
-
passThrough: true,
|
|
88
|
-
help: [
|
|
89
|
-
'Usage: namzu run-stream <prompt...> [--session <id>] [--cwd <path>]',
|
|
90
|
-
'',
|
|
91
|
-
'Run a single prompt and stream one JSON event per line as the turn',
|
|
92
|
-
'unfolds — text deltas, tool starts and ends, usage, then a terminal',
|
|
93
|
-
'event. Built for a host UI that renders progress rather than waiting',
|
|
94
|
-
'for a final string.',
|
|
95
|
-
'The terminal done.text is the settled answer. Earlier deltas may include',
|
|
96
|
-
'progress or answers later rejected by verification.',
|
|
97
|
-
'',
|
|
98
|
-
'Takes the same options as `namzu run`, including --effort, --permission-mode and',
|
|
99
|
-
'the [permissions] table from the config file.',
|
|
100
|
-
'',
|
|
101
|
-
'History is bound with --session <id>. --continue and --resume are `run`',
|
|
102
|
-
'options and are refused here rather than ignored.',
|
|
103
|
-
'Without --session, optional stdin must be one complete JSON Message[];',
|
|
104
|
-
'invalid or provider-incomplete tool history is refused before a run.',
|
|
105
|
-
'',
|
|
106
|
-
'The folder has to be trusted: run `namzu` here once and accept the',
|
|
107
|
-
'prompt, or pass --trust for one run. An untrusted folder emits an error',
|
|
108
|
-
'event and exits 77 without running anything.',
|
|
109
|
-
'',
|
|
110
|
-
'Needs a provider. Set a credential in the environment, or run namzu',
|
|
111
|
-
'once to pick one interactively.',
|
|
112
|
-
'',
|
|
113
|
-
'Every failure is an event on stdout. The exit code says whether YOU can',
|
|
114
|
-
'do anything about it: 0 when changing what you send would reach the run',
|
|
115
|
-
'(a wrong option, no prompt, a bad --cwd) and when a run started and',
|
|
116
|
-
'failed; 1 when it would not (no provider, a tool server that is not',
|
|
117
|
-
'there, a conversation that cannot be opened); 77 when the folder has not',
|
|
118
|
-
'been trusted, which only a person can change.',
|
|
119
|
-
].join('\n'),
|
|
120
|
-
handler: async ({ ctx: bootstrapCtx, rawArgs }) => {
|
|
121
|
-
let ctx = bootstrapCtx;
|
|
122
|
-
const write = (o) => {
|
|
123
|
-
process.stdout.write(`${JSON.stringify(o)}\n`);
|
|
124
|
-
};
|
|
125
|
-
/**
|
|
126
|
-
* Report and stop.
|
|
127
|
-
*
|
|
128
|
-
* Always in band, always terminated with `done`, and the code says only
|
|
129
|
-
* whether the caller can reach the run by sending something else. The
|
|
130
|
-
* argument for each case is in this file's header; the two spellings exist
|
|
131
|
-
* so that every call site below has to state which side it is on rather
|
|
132
|
-
* than inheriting a default nobody re-reads.
|
|
133
|
-
*/
|
|
134
|
-
const fail = (message) => {
|
|
135
|
-
write({ kind: 'error', message });
|
|
136
|
-
write({ kind: 'done' });
|
|
137
|
-
return EXIT_OK;
|
|
138
|
-
};
|
|
139
|
-
const refuse = (message) => {
|
|
140
|
-
write({ kind: 'error', message });
|
|
141
|
-
write({ kind: 'done' });
|
|
142
|
-
return EXIT_FAIL;
|
|
143
|
-
};
|
|
144
|
-
const flags = parseRunFlags(rawArgs);
|
|
145
|
-
// The run's leash: the config file's limits, with a flag overriding each.
|
|
146
|
-
const limitsFromFlags = {
|
|
147
|
-
...(flags.maxIterations !== null ? { maxIterations: flags.maxIterations } : {}),
|
|
148
|
-
...(flags.tokenBudget !== null ? { tokenBudget: flags.tokenBudget } : {}),
|
|
149
|
-
};
|
|
150
|
-
if (flags.unknown.length > 0)
|
|
151
|
-
return fail(unknownOptionMessage(flags.unknown));
|
|
152
|
-
// `--continue` and `--resume` parse here because the two commands share one
|
|
153
|
-
// parser, and this command reads neither. Accepting a flag and doing
|
|
154
|
-
// nothing with it is the failure mode the shared parser was introduced to
|
|
155
|
-
// end: a host that asked to reopen a conversation was given a stateless
|
|
156
|
-
// run, reported as an ordinary success, and the next turn had no history
|
|
157
|
-
// with nothing anywhere connecting the two. Refused instead, and named,
|
|
158
|
-
// because a host CAN fix this — `--session` is the flag it wanted.
|
|
159
|
-
if (flags.continueLast || flags.resume !== null) {
|
|
160
|
-
return fail('run-stream does not take --continue or --resume; they are `namzu run` options. Bind history with --session <id>, which keys a persisted conversation in this folder.');
|
|
161
|
-
}
|
|
162
|
-
// Same reasoning for the wait budget: this command streams a pause to its
|
|
163
|
-
// host as an event and the host decides when to resume; a flag it accepted
|
|
164
|
-
// and ignored would promise a wait that never happens.
|
|
165
|
-
if (flags.waitForProviderMs !== null) {
|
|
166
|
-
return fail('run-stream does not take --wait-for-provider; it is a `namzu run` option. A host reads the paused event and resumes when it chooses.');
|
|
167
|
-
}
|
|
168
|
-
const sessionKey = flags.session;
|
|
169
|
-
const prompt = flags.rest.join(' ').trim();
|
|
170
|
-
if (!prompt)
|
|
171
|
-
return fail('no prompt — pass it as an argument');
|
|
172
|
-
const resolved = resolveWorkingDirectory(flags.cwd);
|
|
173
|
-
if ('error' in resolved)
|
|
174
|
-
return fail(resolved.error);
|
|
175
|
-
const requestedCwd = resolved.cwd;
|
|
176
|
-
// Before the session store is opened, before anything is read or run in
|
|
177
|
-
// that directory.
|
|
178
|
-
//
|
|
179
|
-
// Reported BOTH ways, which is the one place this command departs from
|
|
180
|
-
// its "every failure is an in-band event and the exit code is 0" rule.
|
|
181
|
-
// That rule is about a run that STARTED and failed, which a host should
|
|
182
|
-
// render and may sensibly retry. This is a refusal to start at all, and
|
|
183
|
-
// a host that cannot tell the two apart will retry the one that must not
|
|
184
|
-
// be retried — so the event carries the explanation and the exit code
|
|
185
|
-
// carries the fact that nothing ran.
|
|
186
|
-
const trust = decideHeadlessTrust({
|
|
187
|
-
cwd: requestedCwd,
|
|
188
|
-
trustFlag: flags.trust,
|
|
189
|
-
});
|
|
190
|
-
if (!trust.allowed) {
|
|
191
|
-
write({ kind: 'error', message: trust.message ?? 'folder not trusted' });
|
|
192
|
-
write({ kind: 'done' });
|
|
193
|
-
return EXIT_UNTRUSTED;
|
|
194
|
-
}
|
|
195
|
-
const cwd = trust.cwd;
|
|
196
|
-
ctx = resolveTrustedProjectContext(bootstrapCtx, cwd);
|
|
197
|
-
// Project command discovery belongs behind the target folder's trust
|
|
198
|
-
// gate, alongside project config and instructions.
|
|
199
|
-
const expansion = expandHeadlessCommand(prompt, {
|
|
200
|
-
cwd,
|
|
201
|
-
builtins: hostCommandNames(),
|
|
202
|
-
});
|
|
203
|
-
if (expansion.kind === 'refused') {
|
|
204
|
-
return expansion.fixable ? fail(expansion.reason) : refuse(expansion.reason);
|
|
205
|
-
}
|
|
206
|
-
const finalPrompt = expansion.kind === 'expanded' ? expansion.prompt : prompt;
|
|
207
|
-
// Resolve the workspace's central Project for every run. A session key
|
|
208
|
-
// additionally binds a durable conversation; without one, stdin history
|
|
209
|
-
// remains stateless and no Session record is created.
|
|
210
|
-
let cli;
|
|
211
|
-
let conversationId = null;
|
|
212
|
-
let prior = [];
|
|
213
|
-
if (!sessionKey) {
|
|
214
|
-
const parsed = parsePriorMessages(await readStdin({ deadline: true }));
|
|
215
|
-
if (!parsed.ok)
|
|
216
|
-
return fail(`invalid stdin history: ${parsed.error}`);
|
|
217
|
-
prior = [...parsed.messages];
|
|
218
|
-
}
|
|
219
|
-
try {
|
|
220
|
-
cli = await openSessions(cwd);
|
|
221
|
-
if (sessionKey) {
|
|
222
|
-
conversationId = await resolveConversation(cli, sessionKey);
|
|
223
|
-
prior = await loadConversation(cli, conversationId);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
catch (err) {
|
|
227
|
-
if (sessionKey) {
|
|
228
|
-
// Refused, not run stateless.
|
|
229
|
-
//
|
|
230
|
-
// This used to set `cli = null` and fall through to the branch
|
|
231
|
-
// below, which reads prior turns from STDIN — so a caller who named
|
|
232
|
-
// a conversation got a turn answered against a different history,
|
|
233
|
-
// or none, reported as an ordinary success. `run.ts` already
|
|
234
|
-
// refuses the equivalent, in those words: someone who asked for a
|
|
235
|
-
// specific conversation and got a new one that looks the same finds
|
|
236
|
-
// out several turns later, having already acted on it.
|
|
237
|
-
//
|
|
238
|
-
// It cannot be softened into a warning, because we cannot say what
|
|
239
|
-
// was lost. `resolveConversation` creates the key on first use, so
|
|
240
|
-
// a fresh key legitimately has no prior turns — and the failure is
|
|
241
|
-
// exactly what stopped us finding out which case this is. "Could
|
|
242
|
-
// not look" is not "there was nothing there."
|
|
243
|
-
//
|
|
244
|
-
// In band, like every other failure here, because that is what the
|
|
245
|
-
// host reads. No session has been built at this point in the flow,
|
|
246
|
-
// so there is nothing to close on the way out.
|
|
247
|
-
//
|
|
248
|
-
// Non-zero, which is the correction #321 is about. `resolveConversation`
|
|
249
|
-
// CREATES the key on first use, so this cannot be a key the host got
|
|
250
|
-
// wrong — the only way here is the store itself: an unwritable
|
|
251
|
-
// `.namzu`, a corrupt map file. Nothing the host sends changes that,
|
|
252
|
-
// so a host treating 0 as "render the error and move on" would loop
|
|
253
|
-
// on an environment fault it could have raised to a person. Dropping
|
|
254
|
-
// `--session` is not a fix; it abandons what was asked for.
|
|
255
|
-
return refuse(`could not open conversation "${sessionKey}": ${err instanceof Error ? err.message : String(err)}. Nothing ran, because continuing the wrong history is worse than not continuing. Drop --session to run this turn stateless.`);
|
|
256
|
-
}
|
|
257
|
-
return refuse(`could not open workspace state: ${err instanceof Error ? err.message : String(err)}. Nothing ran, because generated state could not be bound to this working directory.`);
|
|
258
|
-
}
|
|
259
|
-
// Always NDJSON on stderr, regardless of --log-format/NAMZU_LOG_FORMAT
|
|
260
|
-
// — this is the machine-read channel §6.6 of the logging design
|
|
261
|
-
// describes, and stdout's own protocol is unaffected by anything the
|
|
262
|
-
// operator passes, so stderr here stays that way too. `{ replace:
|
|
263
|
-
// true }`: see `run.ts`'s identical comment.
|
|
264
|
-
const logging = contextLogging(ctx);
|
|
265
|
-
installCliLogging(jsonLinesSink(process.stderr), logging.level);
|
|
266
|
-
const { probeAgentSession, createAgentSession } = await import('../tui/agent.js');
|
|
267
|
-
const probe = await probeAgentSession();
|
|
268
|
-
let prefs = probe.preferences ?? defaultPrefs(probe.detected);
|
|
269
|
-
if (!prefs) {
|
|
270
|
-
// Nothing detected and nothing configured. `--provider` cannot conjure a
|
|
271
|
-
// credential, so no argument the host changes gets past this line.
|
|
272
|
-
return refuse('no LLM provider available — set a credential (e.g. ANTHROPIC_API_KEY) or run `namzu` to pick one');
|
|
273
|
-
}
|
|
274
|
-
// --provider/--model override the persona's configured provider+model for
|
|
275
|
-
// this run, so the Namzu tab's picks win over ~/.namzu/preferences.json.
|
|
276
|
-
prefs = applyProviderFlags(prefs, flags);
|
|
277
|
-
// The operator's rules and mode reach this command too. They did not:
|
|
278
|
-
// `[permissions]` was compiled for `run` and never for `run-stream`, so a
|
|
279
|
-
// host UI ran with an empty rule list whatever the config said — the same
|
|
280
|
-
// shape as a flag that parses and does nothing, one level larger, and
|
|
281
|
-
// silent in exactly the same way.
|
|
282
|
-
const modeResult = resolvePermissionMode({
|
|
283
|
-
flag: flags.permissionMode,
|
|
284
|
-
skipPermissions: flags.skipPermissions,
|
|
285
|
-
interactive: false,
|
|
286
|
-
});
|
|
287
|
-
if ('error' in modeResult)
|
|
288
|
-
return fail(modeResult.error);
|
|
289
|
-
const permissions = compilePermissions(ctx.config.permissions, ctx.config.permissionChecks);
|
|
290
|
-
for (const d of permissions.diagnostics) {
|
|
291
|
-
const where = d.pattern ? `permissions.${d.tool}."${d.pattern}"` : `permissions.${d.tool}`;
|
|
292
|
-
// In band, because a host line-scanning stdout has no other channel —
|
|
293
|
-
// and a permission the operator believes is in force must never be
|
|
294
|
-
// dropped without saying so.
|
|
295
|
-
write({ kind: 'error', message: `${where}: ${d.message}` });
|
|
296
|
-
}
|
|
297
|
-
// The resolved `--cwd` is what the agent's tools resolve against, not just
|
|
298
|
-
// where the session store lives — a run told to work in another checkout
|
|
299
|
-
// has to glob, read and edit files there.
|
|
300
|
-
const gate = buildGate(flags, cwd);
|
|
301
|
-
const session = await createAgentSession(prefs, probe.detected, {
|
|
302
|
-
cwd,
|
|
303
|
-
scope: {
|
|
304
|
-
sessionId: conversationId ?? generateSessionId(),
|
|
305
|
-
topicId: cli.topicId,
|
|
306
|
-
projectId: cli.projectId,
|
|
307
|
-
tenantId: cli.tenantId,
|
|
308
|
-
},
|
|
309
|
-
stateRoot: cli.root,
|
|
310
|
-
...(conversationId ? { conversationSessions: cli } : {}),
|
|
311
|
-
rules: permissions.rules,
|
|
312
|
-
// The operator's --gate commands, as a standing condition on the
|
|
313
|
-
// answer. Spread rather than passed as undefined so a run without
|
|
314
|
-
// gates is byte-identical to the one that shipped before them.
|
|
315
|
-
...(gate ?? {}),
|
|
316
|
-
permissionMode: modeResult.mode,
|
|
317
|
-
...(ctx.config.mcpServers ? { mcpServers: ctx.config.mcpServers } : {}),
|
|
318
|
-
...(ctx.config.plugins ? { plugins: ctx.config.plugins } : {}),
|
|
319
|
-
...(ctx.config.web ? { web: ctx.config.web } : {}),
|
|
320
|
-
...(ctx.config.hooks ? { hooks: ctx.config.hooks } : {}),
|
|
321
|
-
...(ctx.config.compaction ? { compaction: ctx.config.compaction } : {}),
|
|
322
|
-
...(ctx.config.memory ? { memory: ctx.config.memory } : {}),
|
|
323
|
-
...(Object.keys({ ...ctx.config.limits, ...limitsFromFlags }).length > 0
|
|
324
|
-
? { limits: { ...ctx.config.limits, ...limitsFromFlags } }
|
|
325
|
-
: {}),
|
|
326
|
-
...(ctx.config.sandbox ? { sandbox: ctx.config.sandbox } : {}),
|
|
327
|
-
// `!== undefined`, not truthiness: an empty list is the operator
|
|
328
|
-
// turning the default screen OFF, and a falsy check would drop it.
|
|
329
|
-
...(ctx.config.toolResultScreens !== undefined
|
|
330
|
-
? { toolResultScreens: ctx.config.toolResultScreens }
|
|
331
|
-
: {}),
|
|
332
|
-
});
|
|
333
|
-
if (!session.hasProvider) {
|
|
334
|
-
await session.close();
|
|
335
|
-
// The one branch here that is genuinely BOTH. `createAgentSession`
|
|
336
|
-
// refuses an id that is not a provider — which `--provider` put there,
|
|
337
|
-
// so the host fixes it — and, with the same result object, a missing
|
|
338
|
-
// credential, a driver package that would not load, a chain that
|
|
339
|
-
// contradicts itself, a client that would not construct. None of those
|
|
340
|
-
// four move for any argument.
|
|
341
|
-
//
|
|
342
|
-
// The session says which, in a field. Deciding it here by reading its
|
|
343
|
-
// `errorHint` would be the message-matching that `exit-codes.ts` exists
|
|
344
|
-
// to prevent, and would make that sentence unrewordable.
|
|
345
|
-
const message = session.errorHint ?? 'agent is not ready';
|
|
346
|
-
return session.errorKind === 'invocation' ? fail(message) : refuse(message);
|
|
347
|
-
}
|
|
348
|
-
// A configured tool server that is not here means the turn cannot do what
|
|
349
|
-
// the operator set it up to do, and this command answers a host, not a
|
|
350
|
-
// person who might notice. Refused rather than run short — in band, like
|
|
351
|
-
// every other failure here, because that is what the host reads.
|
|
352
|
-
if (session.mcpFailed.length > 0) {
|
|
353
|
-
const said = session.mcpFailed
|
|
354
|
-
.map((f) => `tool server "${f.name}" is not available: ${f.reason}`)
|
|
355
|
-
.join('; ');
|
|
356
|
-
await session.close();
|
|
357
|
-
// The servers come from `namzu.config.json`, not from the invocation, so
|
|
358
|
-
// there is no argument the host can change to bring one up. `run`
|
|
359
|
-
// already exits 1 here.
|
|
360
|
-
return refuse(said);
|
|
361
|
-
}
|
|
362
|
-
// "Printed on every launch" has to reach a host UI too, or the one caller
|
|
363
|
-
// with no human watching is the one that never hears it. Its own event
|
|
364
|
-
// kind rather than an `error`: the run is proceeding, and a host that
|
|
365
|
-
// treats this as a failure would be wrong.
|
|
366
|
-
for (const notice of session.configNotices) {
|
|
367
|
-
write({ kind: 'notice', message: notice });
|
|
368
|
-
}
|
|
369
|
-
// --skills <a,b,c>: load the named skills' bodies and inject them as the
|
|
370
|
-
// turn's extra system context (the same channel the TUI's /skill uses).
|
|
371
|
-
const extraSystem = await loadSkillsContext(cwd, flags.skills);
|
|
372
|
-
const userMessage = {
|
|
373
|
-
role: 'user',
|
|
374
|
-
content: finalPrompt,
|
|
375
|
-
timestamp: Date.now(),
|
|
376
|
-
};
|
|
377
|
-
const messages = [...prior, userMessage];
|
|
378
|
-
let assistantText = '';
|
|
379
|
-
let conversationMessages;
|
|
380
|
-
let terminalEvent;
|
|
381
|
-
let budget;
|
|
382
|
-
try {
|
|
383
|
-
for await (const event of session.send(messages, {
|
|
384
|
-
...(extraSystem ? { extraSystem } : {}),
|
|
385
|
-
...(flags.effort !== null ? { effort: flags.effort } : {}),
|
|
386
|
-
onConversationMessages: (settled) => {
|
|
387
|
-
conversationMessages = settled;
|
|
388
|
-
},
|
|
389
|
-
})) {
|
|
390
|
-
if (event.kind === 'delta')
|
|
391
|
-
assistantText += event.text;
|
|
392
|
-
if ('budget' in event && event.budget)
|
|
393
|
-
budget = event.budget;
|
|
394
|
-
if (event.kind === 'done') {
|
|
395
|
-
terminalEvent = event;
|
|
396
|
-
// Only used by fallback persistence when the full conversation
|
|
397
|
-
// callback is unavailable. Keep the settled answer here too.
|
|
398
|
-
if (event.text !== undefined)
|
|
399
|
-
assistantText = event.text;
|
|
400
|
-
}
|
|
401
|
-
else
|
|
402
|
-
write(event);
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
catch (err) {
|
|
406
|
-
await session.close();
|
|
407
|
-
return fail(err instanceof Error ? err.message : String(err));
|
|
408
|
-
}
|
|
409
|
-
// A stdio tool server is a child process; a command that returns without
|
|
410
|
-
// closing leaves it running.
|
|
411
|
-
await session.close();
|
|
412
|
-
// Persist the turn so a later `history --session <key>` (and the next
|
|
413
|
-
// turn's context) sees it. Best-effort — a store failure must not lose
|
|
414
|
-
// the reply the user already saw stream.
|
|
415
|
-
//
|
|
416
|
-
// Best-effort is about not FAILING, not about staying quiet. This used to
|
|
417
|
-
// swallow the error entirely, and it is the one failure here that makes a
|
|
418
|
-
// LATER command wrong: the stream ends `done`, the process exits 0, and a
|
|
419
|
-
// host has every reason to believe the turn is stored. Then
|
|
420
|
-
// `history --session` comes back missing a turn the user watched arrive,
|
|
421
|
-
// and the next turn's context silently lacks it — with nothing, anywhere,
|
|
422
|
-
// connecting that to a write that failed minutes earlier.
|
|
423
|
-
//
|
|
424
|
-
// So it is said, on the same channel and in the same shape as the config
|
|
425
|
-
// notices forty lines above, and for the reason written there: a host UI
|
|
426
|
-
// is the caller with no human watching, and its own event kind rather
|
|
427
|
-
// than an `error` because the run did succeed and a host treating this as
|
|
428
|
-
// a failure would be wrong. The consequence is named, not just the fault,
|
|
429
|
-
// because "could not persist" alone does not tell a host that its own
|
|
430
|
-
// later reads are now incomplete.
|
|
431
|
-
if (conversationId) {
|
|
432
|
-
try {
|
|
433
|
-
if (conversationMessages) {
|
|
434
|
-
const publication = planTurnPublication(prior, userMessage, conversationMessages);
|
|
435
|
-
if (publication.kind === 'replace') {
|
|
436
|
-
await replaceConversation(cli, conversationId, publication.messages);
|
|
437
|
-
}
|
|
438
|
-
else {
|
|
439
|
-
await appendMessages(cli, conversationId, publication.messages);
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
const assistant = {
|
|
444
|
-
role: 'assistant',
|
|
445
|
-
content: assistantText,
|
|
446
|
-
timestamp: Date.now(),
|
|
447
|
-
};
|
|
448
|
-
await appendMessages(cli, conversationId, [userMessage, assistant]);
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
catch (err) {
|
|
452
|
-
write({
|
|
453
|
-
kind: 'notice',
|
|
454
|
-
message: `this turn was not saved: ${err instanceof Error ? err.message : String(err)}. The reply above is complete, but history for this session will not include it and the next turn will not have it as context.`,
|
|
455
|
-
});
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
write({
|
|
459
|
-
...(terminalEvent ?? { kind: 'done' }),
|
|
460
|
-
...(budget ? { budget } : {}),
|
|
461
|
-
});
|
|
462
|
-
return 0;
|
|
463
|
-
},
|
|
464
|
-
};
|
|
465
|
-
export const historyCommand = {
|
|
466
|
-
name: 'history',
|
|
467
|
-
description: "Print a session's persisted messages as JSON (for host UIs)",
|
|
468
|
-
passThrough: true,
|
|
469
|
-
help: [
|
|
470
|
-
'Usage: namzu history [--session <id>] [--cwd <path>]',
|
|
471
|
-
'',
|
|
472
|
-
"Print a session's persisted messages as JSON. With no session id the",
|
|
473
|
-
'most recent session for the working directory is used.',
|
|
474
|
-
'',
|
|
475
|
-
'An empty array means the session exists and has no messages yet — it',
|
|
476
|
-
'is not an error.',
|
|
477
|
-
].join('\n'),
|
|
478
|
-
handler: async ({ rawArgs }) => {
|
|
479
|
-
const flags = parseRunFlags(rawArgs);
|
|
480
|
-
const key = flags.session;
|
|
481
|
-
try {
|
|
482
|
-
// `--cwd` is in this command's help too, and picks the central Project
|
|
483
|
-
// the session is read from. Reading the process's own directory
|
|
484
|
-
// instead means a host asking about a session in another checkout is
|
|
485
|
-
// told `[]` — indistinguishable from a session with no messages.
|
|
486
|
-
const resolved = resolveWorkingDirectory(flags.cwd);
|
|
487
|
-
if ('error' in resolved) {
|
|
488
|
-
process.stdout.write('[]\n');
|
|
489
|
-
return 0;
|
|
490
|
-
}
|
|
491
|
-
const cli = await openSessions(resolved.cwd);
|
|
492
|
-
// Host keys and CLI conversation UUIDs are distinct entry points. Both
|
|
493
|
-
// must pass the same workspace membership check before reading content.
|
|
494
|
-
const existing = key
|
|
495
|
-
? ((await findMappedConversation(cli, key)) ??
|
|
496
|
-
(isEntityId(key, 'session') ? asSessionId(key) : null))
|
|
497
|
-
: (await listRecent(cli, 1))[0]?.id;
|
|
498
|
-
if (!existing) {
|
|
499
|
-
process.stdout.write('[]\n');
|
|
500
|
-
return 0;
|
|
501
|
-
}
|
|
502
|
-
const messages = await loadConversation(cli, existing);
|
|
503
|
-
const out = messages
|
|
504
|
-
.filter((m) => (m.role === 'user' || m.role === 'assistant') && m.content)
|
|
505
|
-
.map((m) => ({ role: m.role, content: m.content }));
|
|
506
|
-
process.stdout.write(`${JSON.stringify(out)}\n`);
|
|
507
|
-
return 0;
|
|
508
|
-
}
|
|
509
|
-
catch {
|
|
510
|
-
process.stdout.write('[]\n');
|
|
511
|
-
return 0;
|
|
512
|
-
}
|
|
513
|
-
},
|
|
514
|
-
};
|
|
515
|
-
// skills-json — read-only skill discovery for a host UI (the Namzu tab's skill
|
|
516
|
-
// chips). Prints the cwd-resolved skills as a JSON array of {name, description,
|
|
517
|
-
// source}. Distinct from the milestone-owned `skills` management command; this
|
|
518
|
-
// is the thin enumeration the desktop polls. Empty array on any failure.
|
|
519
|
-
export const skillsJSONCommand = {
|
|
520
|
-
name: 'skills-json',
|
|
521
|
-
description: 'Print discovered skills as JSON (for host UIs)',
|
|
522
|
-
passThrough: true,
|
|
523
|
-
help: [
|
|
524
|
-
'Usage: namzu skills-json [--cwd <path>]',
|
|
525
|
-
'',
|
|
526
|
-
'Print the skills discovered for a working directory as JSON. Project',
|
|
527
|
-
'skills come from that directory; user skills come from the home',
|
|
528
|
-
'directory either way.',
|
|
529
|
-
'',
|
|
530
|
-
'An empty array means no skills were found — it is not an error.',
|
|
531
|
-
].join('\n'),
|
|
532
|
-
handler: async ({ rawArgs }) => {
|
|
533
|
-
// Project skills live under the working directory, so a host listing the
|
|
534
|
-
// skills for one checkout while the process sits in another was shown
|
|
535
|
-
// the wrong project's chips — and then `run-stream --cwd <that
|
|
536
|
-
// checkout> --skills <name>` could not find the skill it had just
|
|
537
|
-
// offered. Same flag, same directory, both ends.
|
|
538
|
-
const resolved = resolveWorkingDirectory(parseRunFlags(rawArgs).cwd);
|
|
539
|
-
if ('error' in resolved) {
|
|
540
|
-
process.stdout.write('[]\n');
|
|
541
|
-
return 0;
|
|
542
|
-
}
|
|
543
|
-
try {
|
|
544
|
-
const { discoverSkills } = await import('../skills/store.js');
|
|
545
|
-
const skills = discoverSkills({ cwd: resolved.cwd }).map((s) => ({
|
|
546
|
-
name: s.name,
|
|
547
|
-
description: s.description,
|
|
548
|
-
source: s.source,
|
|
549
|
-
}));
|
|
550
|
-
process.stdout.write(`${JSON.stringify(skills)}\n`);
|
|
551
|
-
}
|
|
552
|
-
catch {
|
|
553
|
-
process.stdout.write('[]\n');
|
|
554
|
-
}
|
|
555
|
-
return 0;
|
|
556
|
-
},
|
|
557
|
-
};
|
|
558
|
-
// providers-json — read-only provider+model discovery for a host UI (the Namzu
|
|
559
|
-
// tab's provider/model pickers). Emits every PROVIDER_REGISTRY entry with
|
|
560
|
-
// detection state + a best-effort live model list. Distinct from the `providers`
|
|
561
|
-
// profile-management command. Empty models[] → the host falls back to a
|
|
562
|
-
// free-text model field seeded with `default`. Never throws.
|
|
563
|
-
export const providersJSONCommand = {
|
|
564
|
-
name: 'providers-json',
|
|
565
|
-
description: 'Print providers + per-provider models as JSON (for host UIs)',
|
|
566
|
-
passThrough: true,
|
|
567
|
-
handler: async ({ ctx }) => {
|
|
568
|
-
try {
|
|
569
|
-
// Always NDJSON on stderr — same reasoning as run-stream's own sink
|
|
570
|
-
// above; this command answers a host UI polling for a picker list,
|
|
571
|
-
// not a person reading a terminal. installProcessSink/jsonLinesSink
|
|
572
|
-
// are already statically imported at the top of this file, so the
|
|
573
|
-
// dynamic import('@namzu/sdk') this replaced bought nothing — it
|
|
574
|
-
// re-fetched a module already loaded for `Message`.
|
|
575
|
-
const logging = contextLogging(ctx);
|
|
576
|
-
installCliLogging(jsonLinesSink(process.stderr), logging.level);
|
|
577
|
-
const { PROVIDER_REGISTRY, ALL_PROVIDER_IDS, findDetected } = await import('../integrations/providers/index.js');
|
|
578
|
-
const { probeAgentSession, listProviderModels } = await import('../tui/agent.js');
|
|
579
|
-
const probe = await probeAgentSession();
|
|
580
|
-
const out = [];
|
|
581
|
-
for (const id of ALL_PROVIDER_IDS) {
|
|
582
|
-
const entry = PROVIDER_REGISTRY[id];
|
|
583
|
-
const det = findDetected(probe.detected, id) ?? null;
|
|
584
|
-
const models = det ? await listProviderModels(id, det).catch(() => []) : [];
|
|
585
|
-
out.push({
|
|
586
|
-
provider: id,
|
|
587
|
-
label: entry.label,
|
|
588
|
-
detected: Boolean(det),
|
|
589
|
-
default: entry.defaultModel,
|
|
590
|
-
models,
|
|
591
|
-
});
|
|
592
|
-
}
|
|
593
|
-
// Detected providers first, so the picker defaults to a usable one.
|
|
594
|
-
out.sort((a, b) => Number(b.detected) - Number(a.detected));
|
|
595
|
-
process.stdout.write(`${JSON.stringify(out)}\n`);
|
|
596
|
-
}
|
|
597
|
-
catch {
|
|
598
|
-
process.stdout.write('[]\n');
|
|
599
|
-
}
|
|
600
|
-
return 0;
|
|
601
|
-
},
|
|
602
|
-
};
|
|
603
|
-
//# sourceMappingURL=run-stream.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-stream.js","sourceRoot":"","sources":["../../src/commands/run-stream.ts"],"names":[],"mappings":"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"}
|