@north-light/crouter 0.3.172 → 0.3.174
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/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +106 -177
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +55 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +198 -0
- package/dist/commands/node/create.d.ts +23 -0
- package/dist/commands/node/create.js +207 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +302 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +415 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +164 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +82 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +159 -0
- package/dist/commands/node-lifecycle-revive.js +10 -57
- package/dist/commands/node.d.ts +0 -42
- package/dist/commands/node.js +11 -2065
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +67 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +46 -0
- package/dist/commands/surface/node/placement.js +124 -0
- package/dist/commands/surface-node.js +4 -1
- package/dist/commands/surface-reload.js +1 -2
- package/dist/commands/surface-tmux-spread.js +1 -1
- package/dist/commands/surface.js +5 -20
- package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
- package/dist/commands/sys/config.js +6 -6
- package/dist/commands/sys/logs.js +1 -1
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
- package/dist/commands/sys/panels/keys-panel.js +60 -0
- package/dist/commands/sys/panels/models-panel.d.ts +77 -0
- package/dist/commands/sys/panels/models-panel.js +647 -0
- package/dist/commands/sys/panels/panel.d.ts +45 -0
- package/dist/commands/sys/panels/panel.js +137 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +80 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
- package/dist/commands/sys/panels/prefs-panel.js +85 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
- package/dist/commands/sys/panels/provider-panel.js +538 -0
- package/dist/commands/sys/settings-shell.d.ts +55 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +31 -0
- package/dist/commands/sys/setup-core.d.ts +3 -33
- package/dist/commands/sys/setup-core.js +27 -78
- package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
- package/dist/commands/sys/setup-settings-runner.js +63 -0
- package/dist/commands/sys/setup-wizard.d.ts +26 -125
- package/dist/commands/sys/setup-wizard.js +209 -2473
- package/dist/commands/sys/setup.js +5 -7
- package/dist/commands/sys.js +3 -2
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
- package/dist/core/__tests__/broker-preflight.test.js +1 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
- package/dist/core/__tests__/canvas.test.js +2 -36
- package/dist/core/__tests__/close.test.js +14 -3
- package/dist/core/__tests__/context-intro.test.js +32 -143
- package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
- package/dist/core/__tests__/daemon-boot.test.js +2 -20
- package/dist/core/__tests__/daemon-wedge.test.js +1 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +4 -98
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
- package/dist/core/__tests__/helpers/broker-clients.js +0 -14
- package/dist/core/__tests__/helpers/harness.d.ts +0 -8
- package/dist/core/__tests__/helpers/harness.js +7 -87
- package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
- package/dist/core/__tests__/kickoff.test.js +1 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
- package/dist/core/__tests__/migration.test.js +35 -48
- package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
- package/dist/core/__tests__/passive-subscription.test.js +26 -49
- package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
- package/dist/core/__tests__/prune.test.js +94 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -32
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
- package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
- package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
- package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
- package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
- package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
- package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
- package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
- package/dist/core/__tests__/secrets.test.js +1 -7
- package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
- package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
- package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
- package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
- package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
- package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
- package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
- package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
- package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
- package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
- package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
- package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
- package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
- package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
- package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
- package/dist/core/__tests__/session-model.test.js +0 -18
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
- package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
- package/dist/core/broker-client/client.d.ts +2 -2
- package/dist/core/broker-client/client.js +4 -7
- package/dist/core/broker-client/transport-relay.d.ts +13 -19
- package/dist/core/broker-client/transport-relay.js +19 -34
- package/dist/core/broker-client/transport-socket.d.ts +2 -2
- package/dist/core/broker-client/transport-socket.js +9 -2
- package/dist/core/broker-client/transport.d.ts +7 -3
- package/dist/core/broker-client/transport.js +4 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -18
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
- package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
- package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
- package/dist/core/canvas/browse/app.d.ts +2 -17
- package/dist/core/canvas/browse/app.js +16 -88
- package/dist/core/canvas/browse/model.d.ts +0 -4
- package/dist/core/canvas/browse/model.js +1 -12
- package/dist/core/canvas/browse/render.js +6 -3
- package/dist/core/canvas/crons.d.ts +8 -5
- package/dist/core/canvas/crons.js +7 -6
- package/dist/core/canvas/extensions.d.ts +7 -3
- package/dist/core/canvas/extensions.js +16 -4
- package/dist/core/canvas/nav-model.d.ts +0 -4
- package/dist/core/canvas/nav-model.js +2 -14
- package/dist/core/canvas/node-order.d.ts +3 -0
- package/dist/core/canvas/node-order.js +12 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
- package/dist/core/canvas/remote-canvas-source.js +8 -15
- package/dist/core/command.js +11 -4
- package/dist/core/config.js +3 -1
- package/dist/core/events/envelope.js +1 -1
- package/dist/core/events/read.js +7 -21
- package/dist/core/events/source.d.ts +0 -2
- package/dist/core/events/source.js +0 -16
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/fault-classifier.d.ts +1 -1
- package/dist/core/feed/passive.d.ts +0 -11
- package/dist/core/feed/passive.js +1 -62
- package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
- package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
- package/dist/core/keybindings/background-bash.js +3 -4
- package/dist/core/keybindings/catalog.js +1 -1
- package/dist/core/memory/inline-ref-grammar.js +3 -3
- package/dist/core/memory-resolver.d.ts +11 -25
- package/dist/core/memory-resolver.js +51 -33
- package/dist/core/model-routes.d.ts +15 -0
- package/dist/core/model-routes.js +12 -0
- package/dist/core/pool-credential-store.js +1 -1
- package/dist/core/preview-registry.js +8 -9
- package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
- package/dist/core/review/realize.d.ts +0 -13
- package/dist/core/review/realize.js +0 -40
- package/dist/core/review/types.d.ts +1 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
- package/dist/core/runtime/bearings.js +1 -11
- package/dist/core/runtime/broker/client-registry.d.ts +33 -0
- package/dist/core/runtime/broker/client-registry.js +164 -0
- package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
- package/dist/core/runtime/broker/daemon-ops.js +49 -0
- package/dist/core/runtime/broker/event-projection.d.ts +42 -0
- package/dist/core/runtime/broker/event-projection.js +178 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
- package/dist/core/runtime/broker/fault-retry.js +277 -0
- package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
- package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
- package/dist/core/runtime/broker/inbox.d.ts +22 -0
- package/dist/core/runtime/broker/inbox.js +167 -0
- package/dist/core/runtime/broker/passive.d.ts +16 -0
- package/dist/core/runtime/broker/passive.js +44 -0
- package/dist/core/runtime/broker/read-ops.d.ts +23 -0
- package/dist/core/runtime/broker/read-ops.js +150 -0
- package/dist/core/runtime/broker/rebind.d.ts +74 -0
- package/dist/core/runtime/broker/rebind.js +211 -0
- package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
- package/dist/core/runtime/broker/tool-groups.js +244 -0
- package/dist/core/runtime/broker-extension-render.d.ts +11 -0
- package/dist/core/runtime/broker-extension-render.js +181 -0
- package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
- package/dist/core/runtime/broker-persona-guidance.js +58 -0
- package/dist/core/runtime/broker-protocol.d.ts +1 -1
- package/dist/core/runtime/broker-protocol.js +1 -1
- package/dist/core/runtime/broker.d.ts +5 -196
- package/dist/core/runtime/broker.js +276 -3059
- package/dist/core/runtime/canvas-extensions.js +11 -2
- package/dist/core/runtime/fault.js +1 -1
- package/dist/core/runtime/model-selection.d.ts +9 -0
- package/dist/core/runtime/model-selection.js +12 -0
- package/dist/core/runtime/model-swap.d.ts +3 -3
- package/dist/core/runtime/model-swap.js +33 -25
- package/dist/core/runtime/placement-tmux.d.ts +3 -14
- package/dist/core/runtime/placement-tmux.js +11 -80
- package/dist/core/runtime/placement.d.ts +4 -2
- package/dist/core/runtime/placement.js +7 -12
- package/dist/core/runtime/promote.d.ts +14 -1
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +8 -0
- package/dist/core/runtime/spawn.js +36 -6
- package/dist/core/runtime/stop-guard.d.ts +4 -3
- package/dist/core/runtime/stop-guard.js +36 -18
- package/dist/core/runtime/stop-signals.d.ts +4 -1
- package/dist/core/runtime/stream-watchdog.js +4 -5
- package/dist/core/runtime/structured-output.d.ts +15 -2
- package/dist/core/runtime/structured-output.js +35 -12
- package/dist/core/runtime/tmux-bindings.d.ts +25 -0
- package/dist/core/runtime/tmux-bindings.js +682 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -1
- package/dist/core/runtime/tmux-chrome.js +3 -2
- package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
- package/dist/core/runtime/tmux-driver.js +598 -0
- package/dist/core/runtime/view-socket.d.ts +14 -0
- package/dist/core/runtime/view-socket.js +83 -0
- package/dist/core/session-model/session-state.d.ts +1 -2
- package/dist/core/session-model/session-state.js +5 -8
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +2 -2
- package/dist/core/substrate/gate.d.ts +1 -1
- package/dist/core/substrate/on-read-pure.d.ts +7 -0
- package/dist/core/substrate/on-read-pure.js +272 -0
- package/dist/core/termrender/termrender.js +32 -2
- package/dist/core/user-settings.d.ts +23 -1
- package/dist/core/user-settings.js +18 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
- package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
- package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
- package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
- package/dist/daemon/api/bridge.js +40 -81
- package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
- package/dist/daemon/api/handlers/broker-ops.js +383 -0
- package/dist/daemon/api/handlers/crons.js +9 -4
- package/dist/daemon/api/handlers/files.js +6 -7
- package/dist/daemon/api/handlers/inbox.js +2 -340
- package/dist/daemon/api/handlers/nodes.d.ts +10 -1
- package/dist/daemon/api/handlers/nodes.js +74 -39
- package/dist/daemon/api/handlers/review-comments.js +5 -1
- package/dist/daemon/api/handlers/reviews.js +0 -19
- package/dist/daemon/api/map.js +25 -4
- package/dist/daemon/api/router.js +2 -3
- package/dist/daemon/api/server.js +5 -7
- package/dist/daemon/cron-run.d.ts +4 -0
- package/dist/daemon/cron-run.js +30 -13
- package/dist/daemon/crtrd.d.ts +3 -58
- package/dist/daemon/crtrd.js +28 -1244
- package/dist/daemon/manage.js +0 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
- package/dist/daemon/reconcilers/broker-supervision.js +549 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
- package/dist/daemon/reconcilers/cron-lane.js +32 -0
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
- package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
- package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
- package/dist/daemon/review/finish.js +2 -5
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
- package/dist/pi-extensions/broker-local.d.ts +20 -0
- package/dist/pi-extensions/broker-local.js +89 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
- package/dist/pi-extensions/canvas-context-intro.js +22 -11
- package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
- package/dist/pi-extensions/canvas-goal-capture.js +7 -12
- package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
- package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
- package/dist/pi-extensions/canvas-passive-context.js +22 -18
- package/dist/pi-extensions/canvas-recap.d.ts +2 -2
- package/dist/pi-extensions/canvas-recap.js +48 -21
- package/dist/pi-extensions/canvas-review-boundary.js +10 -4
- package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
- package/dist/pi-extensions/canvas-stophook.js +149 -431
- package/dist/pi-extensions/canvas-structured-output.js +52 -30
- package/dist/pi-extensions/envelope-merge.d.ts +13 -0
- package/dist/pi-extensions/envelope-merge.js +29 -0
- package/dist/shared/working-activity.d.ts +3 -2
- package/dist/shared/working-activity.js +3 -2
- package/dist/types.d.ts +6 -5
- package/dist/types.js +2 -2
- package/docs/compat/hearth-crtr-v1.md +4 -12
- package/docs/compat/hearth-crtr-v2.md +3 -11
- package/docs/compat/hearth-crtr-v3.md +4 -12
- package/docs/compat/hearth-crtr-v4.md +3 -11
- package/docs/compat/hearth-crtr-v5.md +3 -11
- package/docs/public-api.md +3 -7
- package/package.json +7 -49
- package/runtime.lock.json +2766 -14533
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
- package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
- package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
- package/dist/clients/conversation/conversation.d.ts +0 -65
- package/dist/clients/conversation/conversation.js +0 -318
- package/dist/clients/conversation/frames.d.ts +0 -30
- package/dist/clients/conversation/frames.js +0 -52
- package/dist/clients/conversation/region.d.ts +0 -51
- package/dist/clients/conversation/region.js +0 -265
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
- package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
- package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
- package/dist/clients/inbox/review/columns.d.ts +0 -22
- package/dist/clients/inbox/review/columns.js +0 -40
- package/dist/clients/inbox/review/composition.d.ts +0 -60
- package/dist/clients/inbox/review/composition.js +0 -278
- package/dist/clients/inbox/review/document-region.d.ts +0 -120
- package/dist/clients/surfaces/region.d.ts +0 -16
- package/dist/clients/web/__tests__/push-engine.test.js +0 -158
- package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
- package/dist/clients/web/__tests__/push-registry.test.js +0 -177
- package/dist/clients/web/dev-server.d.ts +0 -7
- package/dist/clients/web/dev-server.js +0 -46
- package/dist/clients/web/events.d.ts +0 -19
- package/dist/clients/web/events.js +0 -163
- package/dist/clients/web/push-engine.d.ts +0 -44
- package/dist/clients/web/push-engine.js +0 -125
- package/dist/clients/web/push-registry.d.ts +0 -85
- package/dist/clients/web/push-registry.js +0 -373
- package/dist/clients/web/server.d.ts +0 -19
- package/dist/clients/web/server.js +0 -661
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
- package/dist/clients/web/web-client/shared/protocol.js +0 -8
- package/dist/clients/web/web-cmd.d.ts +0 -2
- package/dist/clients/web/web-cmd.js +0 -141
- package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
- package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
- package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
- package/dist/commands/__tests__/canvas-config.test.js +0 -107
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
- package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
- package/dist/commands/__tests__/search-contents.test.js +0 -52
- package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/lint.test.js +0 -15
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
- package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
- package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
- package/dist/core/__tests__/finalization-migration.test.js +0 -38
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
- package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
- package/dist/core/__tests__/fork.test.d.ts +0 -1
- package/dist/core/__tests__/fork.test.js +0 -108
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
- package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
- package/dist/core/__tests__/full/cascade-close.test.js +0 -240
- package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/detach-focus.test.js +0 -126
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
- package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.js +0 -60
- package/dist/core/__tests__/model-routes.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes.test.js +0 -41
- package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-identity.test.js +0 -61
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
- package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
- package/dist/core/__tests__/prune-to-limit.test.js +0 -126
- package/dist/core/__tests__/reset.test.d.ts +0 -1
- package/dist/core/__tests__/reset.test.js +0 -69
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
- package/dist/core/__tests__/steer-note.test.d.ts +0 -1
- package/dist/core/__tests__/steer-note.test.js +0 -41
- package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
- package/dist/core/__tests__/subcommand-tier.test.js +0 -99
- package/dist/core/__tests__/subscription-delivery.test.js +0 -211
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
- package/dist/core/__tests__/tmux-surface.test.js +0 -484
- package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
- package/dist/core/__tests__/wake-bearings.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
- package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
- package/dist/core/canvas/remote-event-stream.d.ts +0 -24
- package/dist/core/canvas/remote-event-stream.js +0 -94
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
- package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
- package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
- package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
- package/dist/core/human/__tests__/visible-paths.test.js +0 -28
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
- package/dist/core/review/__tests__/project.test.d.ts +0 -1
- package/dist/core/review/__tests__/project.test.js +0 -71
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
- package/dist/core/runtime/tmux.js +0 -1314
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
- package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/inbox.test.js +0 -489
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
- package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +0 -17
- package/dist/web-client/manifest.webmanifest +0 -1
- package/dist/web-client/sw.js +0 -1
- /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
- /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
- /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
- /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
- /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
- /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
- /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
- /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
- /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
- /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// `crtr node new` — creation commands and persona-kind helpers.
|
|
2
|
+
import { defineLeaf } from '../../core/command.js';
|
|
3
|
+
import { InputError } from '../../core/io.js';
|
|
4
|
+
import { mark } from '../../core/timing.js';
|
|
5
|
+
import { parseOutputSchemaValue } from '../../core/runtime/structured-output.js';
|
|
6
|
+
import { readMergedLaunchConfig } from '../../core/config.js';
|
|
7
|
+
import { profilesStateBlock } from '../../core/profiles/state-block.js';
|
|
8
|
+
import { stateBlock } from '../../core/help.js';
|
|
9
|
+
import { cliClient, getNodeOrNull, rethrowAsCliError } from '../api-client.js';
|
|
10
|
+
import { openSpawnViewer } from '../surface/node/placement.js';
|
|
11
|
+
const YIELD_NUDGE_THRESHOLD = 100_000;
|
|
12
|
+
const STD_CHILD_FOLLOW_UP = "Do not wait, poll, or duplicate this child's assignment in your own context — there is no result to await, stopping will not strand you, and duplicated work wastes the delegated context. You're auto-subscribed, so its finish wakes you on its own. Two moves only: do other independent work right now, or stop and end your turn — the wake brings you back.";
|
|
13
|
+
/** Decision road sign for a managed (non-root) child. Normally STD_CHILD_FOLLOW_UP,
|
|
14
|
+
* but when the SPAWNER is an orchestrator whose context has already grown past
|
|
15
|
+
* YIELD_NUDGE_THRESHOLD, steer it to yield now and let its fresh revive handle
|
|
16
|
+
* the child's result. */
|
|
17
|
+
export async function childFollowUp(spawnerId) {
|
|
18
|
+
if (spawnerId === undefined || spawnerId === '')
|
|
19
|
+
return STD_CHILD_FOLLOW_UP;
|
|
20
|
+
const spawner = await getNodeOrNull(spawnerId);
|
|
21
|
+
if (spawner === null || spawner.mode !== 'orchestrator')
|
|
22
|
+
return STD_CHILD_FOLLOW_UP;
|
|
23
|
+
const ctxTokens = spawner.context_tokens ?? null;
|
|
24
|
+
if (ctxTokens === null || ctxTokens < YIELD_NUDGE_THRESHOLD)
|
|
25
|
+
return STD_CHILD_FOLLOW_UP;
|
|
26
|
+
const k = Math.round(ctxTokens / 1000);
|
|
27
|
+
return `Child spawned — you're auto-subscribed, so its finish wakes you on its own; never wait, poll, or duplicate the child's assignment in your own context. But you're an orchestrator already carrying ~${k}k of context: rather than hold this window open for the result, checkpoint context/roadmap.md and \`crtr node yield\` now. Yielding ends this turn, and the child's completion then revives you fresh against your roadmap — let that clean revive absorb the result instead of this bloated context.`;
|
|
28
|
+
}
|
|
29
|
+
/** Validate a `--kind` against the installed personas; throws a listing InputError. */
|
|
30
|
+
export function assertKind(kind) {
|
|
31
|
+
const kinds = Object.keys(readMergedLaunchConfig().kinds).sort();
|
|
32
|
+
if (!kinds.includes(kind)) {
|
|
33
|
+
throw new InputError({ error: 'unknown_kind', message: `unknown kind: ${kind}`, field: 'kind', next: `Valid kinds: ${kinds.join(', ')}.` });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** A live `<kinds count=N>` state element — one `<kind> — <whenToUse>` line per
|
|
37
|
+
* installed top-level persona kind (project > user > builtin), lazily built so
|
|
38
|
+
* it reflects the caller's cwd/project scope. Appended to `node new -h` and
|
|
39
|
+
* `node promote -h` so custom kinds appear in help. Soft-fails via the renderer.
|
|
40
|
+
*
|
|
41
|
+
* Keep this block cheap and caller-agnostic: help should not depend on the
|
|
42
|
+
* running node's current persona env, which can lag after polymorph. Sub-kinds
|
|
43
|
+
* (e.g. `plan/reviewers/security`) are OMITTED here — `KindConfig.availableTo`
|
|
44
|
+
* defaults to the sub-kind's own top-level ancestor, and this generic block has
|
|
45
|
+
* no single ancestor to check against, so only an explicit `availableTo: ['*']`
|
|
46
|
+
* sub-kind (universally available) earns a place in this list. A direct launch
|
|
47
|
+
* by full sub-kind string is always valid regardless (visibility-only
|
|
48
|
+
* filtering) — discover the roster for a specific kind via
|
|
49
|
+
* `crtr sys prompt-review --list --kind <kind>`. */
|
|
50
|
+
export function kindsStateBlock() {
|
|
51
|
+
const registry = readMergedLaunchConfig().kinds;
|
|
52
|
+
const kinds = Object.keys(registry)
|
|
53
|
+
.filter((k) => {
|
|
54
|
+
const slash = k.indexOf('/');
|
|
55
|
+
if (slash === -1)
|
|
56
|
+
return true;
|
|
57
|
+
const availableTo = registry[k]?.availableTo ?? [k.slice(0, slash)];
|
|
58
|
+
return availableTo.includes('*');
|
|
59
|
+
})
|
|
60
|
+
.sort();
|
|
61
|
+
const lines = kinds
|
|
62
|
+
.map((k) => {
|
|
63
|
+
const w = registry[k]?.whenToUse ?? '';
|
|
64
|
+
return w ? `${k} — ${w}` : k;
|
|
65
|
+
})
|
|
66
|
+
.join('\n');
|
|
67
|
+
return stateBlock('kinds', { count: kinds.length }, lines);
|
|
68
|
+
}
|
|
69
|
+
function nodeNewParams() {
|
|
70
|
+
return [
|
|
71
|
+
{ kind: 'stdin', name: 'prompt', required: false, constraint: 'First user message. Required unless --no-kickoff is given.' },
|
|
72
|
+
{ kind: 'flag', name: 'kind', type: 'string', required: false, default: 'general', constraint: 'Persona kind. The <kinds> list below names every top-level installable kind.' },
|
|
73
|
+
{ kind: 'flag', name: 'mode', type: 'enum', choices: ['base', 'orchestrator'], required: false, default: 'base', constraint: 'Persona mode. base for hands-on work; orchestrator when the unit itself needs decomposition across children.' },
|
|
74
|
+
{ kind: 'flag', name: 'cwd', type: 'path', required: false, constraint: 'Directory the node is pinned to. Defaults to the caller cwd.' },
|
|
75
|
+
{ kind: 'flag', name: 'name', type: 'string', required: false, constraint: 'Display name. Defaults to the kind.' },
|
|
76
|
+
{ kind: 'flag', name: 'parent', type: 'string', required: false, constraint: 'Parent node id. Defaults to the calling node.' },
|
|
77
|
+
{ kind: 'flag', name: 'node-id', type: 'string', required: false, constraint: 'Exact id for the new node; lowercase letters, digits, and hyphens only, at most 128 characters. Rejected if already present.' },
|
|
78
|
+
{ kind: 'flag', name: 'root', type: 'bool', required: false, constraint: 'Spawn an independent resident root with no parent or subscription. Mutually exclusive with --worktree.' },
|
|
79
|
+
{ kind: 'flag', name: 'worktree', type: 'string', required: false, constraint: 'Local base branch for a crouter-managed worktree for this child. Mutually exclusive with --root.' },
|
|
80
|
+
{ kind: 'flag', name: 'fork-from', type: 'string', required: false, constraint: 'Fork the new node from an existing node id, absolute session path, or partial pi session uuid.' },
|
|
81
|
+
{ kind: 'flag', name: 'model', type: 'string', required: false, constraint: 'Durable model override: provider/id; provider/tier where provider is anthropic|openai and tier is ultra|strong|medium|light; bare tier (ultra|strong|medium|light); or family alias (opus|sonnet|haiku).' },
|
|
82
|
+
{ kind: 'flag', name: 'profile', type: 'string', required: false, constraint: 'Profile id or unique profile name. Omit to inherit the caller profile.' },
|
|
83
|
+
{ kind: 'flag', name: 'situational-context', type: 'string', required: false, constraint: 'Hidden ambient context appended to injected bearings, never visible chat.' },
|
|
84
|
+
{ kind: 'flag', name: 'no-kickoff', type: 'bool', required: false, constraint: 'With --root, start the broker and session idle without a first message or model turn. Mutually exclusive with a prompt and --mode orchestrator.' },
|
|
85
|
+
{ kind: 'flag', name: 'output-schema', type: 'string', required: false, constraint: 'Path to a JSON Schema file, or inline JSON beginning with `{`. The node must submit a conforming result to finish.' },
|
|
86
|
+
];
|
|
87
|
+
}
|
|
88
|
+
function nodeNewOutput() {
|
|
89
|
+
return [
|
|
90
|
+
{ name: 'node_id', type: 'string', required: true, constraint: 'New node id.' },
|
|
91
|
+
{ name: 'name', type: 'string', required: true, constraint: 'Display name.' },
|
|
92
|
+
{ name: 'status', type: 'string', required: true, constraint: 'Always "active".' },
|
|
93
|
+
{ name: 'window', type: 'string', required: false, constraint: 'tmux window id when a viewer opens.' },
|
|
94
|
+
{ name: 'session', type: 'string', required: false, constraint: 'tmux session when a viewer opens.' },
|
|
95
|
+
{ name: 'follow_up', type: 'string', required: true, constraint: 'Managed child: continue unrelated work or stop; its final report wakes you. Root: hand it off; no report wakes you.' },
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
async function runNodeCreation(input) {
|
|
99
|
+
const prompt = input['prompt'] ?? '';
|
|
100
|
+
const noKickoff = input['noKickoff'] === true;
|
|
101
|
+
if (!noKickoff && prompt.trim() === '') {
|
|
102
|
+
throw new InputError({ error: 'empty_prompt', message: 'a prompt is required (stdin or positional)', next: 'Pipe a task on stdin or pass it as an argument, or pass --no-kickoff to spawn an idle node with none.' });
|
|
103
|
+
}
|
|
104
|
+
if (noKickoff && prompt.trim() !== '') {
|
|
105
|
+
throw new InputError({ error: 'no_kickoff_with_prompt', message: '--no-kickoff cannot be combined with a prompt', field: 'no-kickoff', next: 'Drop --no-kickoff, or drop the prompt.' });
|
|
106
|
+
}
|
|
107
|
+
const kind = input['kind'] ?? 'general';
|
|
108
|
+
const mode = (input['mode'] ?? 'base');
|
|
109
|
+
const cwd = input['cwd'] ?? process.cwd();
|
|
110
|
+
const name = input['name'];
|
|
111
|
+
const parent = input['parent'];
|
|
112
|
+
const root = input['root'] === true;
|
|
113
|
+
const worktreeBaseRaw = input['worktree'];
|
|
114
|
+
if (worktreeBaseRaw !== undefined && worktreeBaseRaw.trim() === '') {
|
|
115
|
+
throw new InputError({ error: 'worktree_base_required', message: '--worktree requires a base branch', field: 'worktree', next: 'Pass an existing local branch that landing can fast-forward.' });
|
|
116
|
+
}
|
|
117
|
+
const worktreeBase = worktreeBaseRaw?.trim();
|
|
118
|
+
const forkFrom = input['forkFrom'];
|
|
119
|
+
const modelSpec = input['model']?.trim();
|
|
120
|
+
if (modelSpec === '') {
|
|
121
|
+
throw new InputError({ error: 'empty_spec', message: 'a model spec is required', field: 'model', next: 'Pass a provider/id, provider/tier where provider is anthropic|openai and tier is ultra|strong|medium|light, a bare tier (ultra|strong|medium|light), or a family alias (opus|sonnet|haiku).' });
|
|
122
|
+
}
|
|
123
|
+
const profile = input['profile'];
|
|
124
|
+
const situationalContextRaw = input['situationalContext']?.trim();
|
|
125
|
+
const situationalContext = situationalContextRaw !== undefined && situationalContextRaw !== '' ? situationalContextRaw : undefined;
|
|
126
|
+
const outputSchemaParsed = parseOutputSchemaValue(input['outputSchema']);
|
|
127
|
+
const outputSchema = outputSchemaParsed !== null ? JSON.stringify(outputSchemaParsed) : null;
|
|
128
|
+
const nodeId = input['nodeId']?.trim();
|
|
129
|
+
if (root && worktreeBase !== undefined) {
|
|
130
|
+
throw new InputError({ error: 'worktree_root_conflict', message: '--worktree is mutually exclusive with --root', field: 'worktree', next: 'Drop either --root or --worktree.' });
|
|
131
|
+
}
|
|
132
|
+
if (noKickoff && !root) {
|
|
133
|
+
throw new InputError({ error: 'no_kickoff_requires_root', message: '--no-kickoff is only valid with --root', field: 'no-kickoff', next: 'Add --root, or drop --no-kickoff and provide a prompt.' });
|
|
134
|
+
}
|
|
135
|
+
if (noKickoff && mode === 'orchestrator') {
|
|
136
|
+
throw new InputError({ error: 'no_kickoff_orchestrator_unsupported', message: '--no-kickoff cannot be combined with --mode orchestrator', field: 'no-kickoff', next: 'Drop --no-kickoff and provide a prompt, or spawn in base mode.' });
|
|
137
|
+
}
|
|
138
|
+
const parentId = parent ?? process.env['CRTR_NODE_ID'];
|
|
139
|
+
mark('node_new.create_start', { root });
|
|
140
|
+
const detail = await cliClient().createNode({
|
|
141
|
+
kind,
|
|
142
|
+
mode,
|
|
143
|
+
cwd,
|
|
144
|
+
...(name !== undefined ? { name } : {}),
|
|
145
|
+
prompt,
|
|
146
|
+
...(root ? { root: true } : { parent: parentId ?? null }),
|
|
147
|
+
...(worktreeBase !== undefined ? { worktree: worktreeBase } : {}),
|
|
148
|
+
...(forkFrom !== undefined ? { fork_from: forkFrom } : {}),
|
|
149
|
+
...(modelSpec !== undefined ? { model: modelSpec } : {}),
|
|
150
|
+
...(profile !== undefined ? { profile } : {}),
|
|
151
|
+
...(situationalContext !== undefined ? { situational_context: situationalContext } : {}),
|
|
152
|
+
...(noKickoff ? { no_kickoff: true } : {}),
|
|
153
|
+
...(outputSchema !== null ? { output_schema: outputSchema } : {}),
|
|
154
|
+
...(nodeId !== undefined && nodeId !== '' ? { node_id: nodeId } : {}),
|
|
155
|
+
// A bare `--root --no-kickoff` create is exactly what the warm pool holds
|
|
156
|
+
// ready; every other shape is rejected server-side and cold-spawns.
|
|
157
|
+
...(root ? { prefer_warm: true } : {}),
|
|
158
|
+
}).catch(rethrowAsCliError);
|
|
159
|
+
mark('node_new.node_created', { node: detail.node_id });
|
|
160
|
+
let placement = {};
|
|
161
|
+
if (root)
|
|
162
|
+
placement = openSpawnViewer(detail.node_id, detail.cwd, detail.name);
|
|
163
|
+
if (root)
|
|
164
|
+
mark('node_new.viewer_window_opened');
|
|
165
|
+
const result = {
|
|
166
|
+
node_id: detail.node_id,
|
|
167
|
+
name: detail.name,
|
|
168
|
+
window: placement.window,
|
|
169
|
+
session: placement.session,
|
|
170
|
+
status: detail.status,
|
|
171
|
+
follow_up: root
|
|
172
|
+
? (noKickoff
|
|
173
|
+
? 'Independent root spawned idle. No kickoff turn ran; hand it off or attach and prompt it. No report wakes you.'
|
|
174
|
+
: 'Independent root spawned. You are not subscribed, so its finish does not wake you; hand it off and move on.')
|
|
175
|
+
: await childFollowUp(parentId),
|
|
176
|
+
};
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
export const nodeNew = defineLeaf({
|
|
180
|
+
name: 'new',
|
|
181
|
+
description: 'create and start a node immediately',
|
|
182
|
+
whenToUse: 'you need a managed child or independent root to start immediately',
|
|
183
|
+
tier: 'important',
|
|
184
|
+
help: {
|
|
185
|
+
name: 'node new',
|
|
186
|
+
summary: 'create a node immediately and start its detached broker',
|
|
187
|
+
params: nodeNewParams(),
|
|
188
|
+
output: nodeNewOutput(),
|
|
189
|
+
dynamicState: () => [kindsStateBlock(), profilesStateBlock()].join('\n'),
|
|
190
|
+
outputKind: 'object',
|
|
191
|
+
effects: [
|
|
192
|
+
'Creates nodes/<id>/ in the canvas home, indexes the node in canvas.db, and starts its detached broker engine.',
|
|
193
|
+
'A managed child creates an active parent subscription; its pushes wake the parent. --root creates an independent node with spawned_by provenance and no parent subscription.',
|
|
194
|
+
'--worktree creates a managed worktree at ~/.crouter/canvas/worktrees/<node-id>/ on a new crtr/<node-id> branch. --output-schema writes nodes/<id>/output-schema.json. --no-kickoff starts an idle root without a first model turn.',
|
|
195
|
+
'An in-tmux root opens a viewer in the current tmux session. When auto_open_child_viewers is true, a managed child opens beside a live spawner viewer; false leaves it running in the background.',
|
|
196
|
+
],
|
|
197
|
+
},
|
|
198
|
+
run: (input) => runNodeCreation(input),
|
|
199
|
+
render: (r) => {
|
|
200
|
+
const win = r['window'] ? ` in window ${r['window']}` : '';
|
|
201
|
+
const lines = [`Spawned "${r['name']}" (${r['node_id']}) — ${r['status']}${win}.`];
|
|
202
|
+
if (r['session'])
|
|
203
|
+
lines.push(`- session: ${r['session']}`);
|
|
204
|
+
lines.push('', String(r['follow_up']));
|
|
205
|
+
return lines.join('\n');
|
|
206
|
+
},
|
|
207
|
+
});
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
// `crtr node inspect` — roster, detail, and conversation fork reads.
|
|
2
|
+
import { defineBranch, defineLeaf } from '../../core/command.js';
|
|
3
|
+
import { InputError } from '../../core/io.js';
|
|
4
|
+
import { isPidAlive } from '../../core/canvas/pid.js';
|
|
5
|
+
import { fullName } from '../../core/canvas/labels.js';
|
|
6
|
+
import { fuzzyMatch } from '../../core/canvas/browse/model.js';
|
|
7
|
+
import { loadProfileManifest } from '../../core/profiles/manifest.js';
|
|
8
|
+
import { profilesStateBlock } from '../../core/profiles/state-block.js';
|
|
9
|
+
import { nodeSnapshotLeaf } from '../node-snapshot.js';
|
|
10
|
+
import { nodeTranscriptLeaf } from '../node-transcript.js';
|
|
11
|
+
import { nodeContextLeaf } from '../node-context.js';
|
|
12
|
+
import { nodeArtifactsLeaf } from '../node-inspect-artifacts.js';
|
|
13
|
+
import { cliClient, cliCanvasSource, rethrowAsCliError } from '../api-client.js';
|
|
14
|
+
import { RemoteCanvasSource } from '../../core/canvas/remote-canvas-source.js';
|
|
15
|
+
import { kindsStateBlock } from './create.js';
|
|
16
|
+
import { focusViewer, nodeInPane } from '../surface/node/placement.js';
|
|
17
|
+
const nodeList = defineLeaf({
|
|
18
|
+
name: 'list',
|
|
19
|
+
description: 'list nodes on the canvas',
|
|
20
|
+
whenToUse: 'you want a flat roster of the nodes on the canvas, sliced by displayed name, status, kind, mode, lifecycle, profile, cwd, and graph scope (--under a node, for that node plus its subscription descendants). The filters AND together. Use `node inspect show` instead to drill into one node and its spine neighbors, `canvas dashboard` for the tree shape, and `canvas attention` to find nodes blocked on a human',
|
|
21
|
+
help: {
|
|
22
|
+
name: 'node inspect list',
|
|
23
|
+
summary: 'list nodes on the canvas, filtered by any combination of attribute slices and a graph-scope (--under) that AND together',
|
|
24
|
+
params: [
|
|
25
|
+
{ kind: 'flag', name: 'status', type: 'string', required: false, constraint: 'Filter status (comma-separated for several; accepted values: active, idle, done, dead, canceled). NOTE: `active` means the engine process is live (never closed), NOT that the node is generating right now — an active node is usually dormant between turns. To tell working-vs-idle, check the pi session-file mtime or CPU, not status.' },
|
|
26
|
+
{ kind: 'flag', name: 'kind', type: 'string', required: false, constraint: 'Filter by persona kind (comma-separated for several). The <kinds> list below names every top-level installable kind; a sub-kind (e.g. plan/reviewers/security) filters too even though it is not listed.' },
|
|
27
|
+
{ kind: 'flag', name: 'mode', type: 'string', required: false, constraint: 'Filter by mode (comma-separated for several; accepted values: base, orchestrator).' },
|
|
28
|
+
{ kind: 'flag', name: 'lifecycle', type: 'string', required: false, constraint: 'Filter by lifecycle (comma-separated for several; accepted values: terminal, resident).' },
|
|
29
|
+
{ kind: 'flag', name: 'profile', type: 'string', required: false, constraint: 'Filter by profile. On the local canvas, accepts an exact profile id or a unique manifest name from the <profiles> list below. Against a remote canvas, pass the exact profile id carried by its node rows.' },
|
|
30
|
+
{ kind: 'flag', name: 'name', type: 'string', required: false, constraint: 'Filter by the displayed node label (handle plus generated description) with the canvas browser’s case-insensitive fuzzy subsequence match.' },
|
|
31
|
+
{ kind: 'flag', name: 'cwd', type: 'string', required: false, constraint: 'Filter to nodes pinned to this exact cwd (absolute path). Roster is canvas-wide (all cwds) by default.' },
|
|
32
|
+
{ kind: 'flag', name: 'under', type: 'string', required: false, constraint: 'Graph scope: restrict to this node and its subscription descendants (the sub-DAG reachable downward — its reports, theirs, …). This is "one initiative / my subtree". ANDs with every attribute filter above, narrowing any of them to this subtree.' },
|
|
33
|
+
{ kind: 'flag', name: 'canvas', type: 'string', required: false, constraint: 'Read from the named remote canvas target (see `crtr canvas config list`) instead of the local canvas. Overrides `crtr canvas use`.' },
|
|
34
|
+
],
|
|
35
|
+
output: [
|
|
36
|
+
{ name: 'nodes', type: 'object[]', required: true, constraint: 'Rows include {node_id, name, kind, mode, lifecycle, status, cwd, profile_id, parent, created}. `name` is the displayed node label searched by --name and shown in canvas views. `profile_id` is the stable profile-directory id (null only for historical no-profile nodes).' },
|
|
37
|
+
],
|
|
38
|
+
outputKind: 'object',
|
|
39
|
+
dynamicState: () => [kindsStateBlock(), profilesStateBlock()].join('\n'),
|
|
40
|
+
effects: ['Read-only: lists nodes through the daemon API.'],
|
|
41
|
+
},
|
|
42
|
+
run: async (input) => {
|
|
43
|
+
const csv = (k) => {
|
|
44
|
+
const raw = input[k];
|
|
45
|
+
return raw !== undefined && raw !== '' ? raw.split(',').map((s) => s.trim()).filter((s) => s !== '') : undefined;
|
|
46
|
+
};
|
|
47
|
+
const status = csv('status');
|
|
48
|
+
const kinds = csv('kind');
|
|
49
|
+
const modes = csv('mode');
|
|
50
|
+
const lifecycles = csv('lifecycle');
|
|
51
|
+
const profile = input['profile'];
|
|
52
|
+
const name = input['name'];
|
|
53
|
+
const cwd = input['cwd'];
|
|
54
|
+
const under = input['under'];
|
|
55
|
+
const canvasSource = cliCanvasSource({ canvasName: input['canvas'] });
|
|
56
|
+
// The selected source owns roster filtering, graph scope, missing-node
|
|
57
|
+
// checks, and node-name hydration for both local and remote canvases. Local
|
|
58
|
+
// profiles remain the one command-side compatibility lookup: remote guests
|
|
59
|
+
// cannot resolve this machine's manifest names.
|
|
60
|
+
const profileId = canvasSource instanceof RemoteCanvasSource
|
|
61
|
+
? profile
|
|
62
|
+
: profile === undefined ? undefined : loadProfileManifest(profile).profileId;
|
|
63
|
+
let scope;
|
|
64
|
+
if (under !== undefined && under !== '') {
|
|
65
|
+
if (await canvasSource.getNode(under).catch(rethrowAsCliError) === null) {
|
|
66
|
+
throw new InputError({ error: 'not_found', message: `no node: ${under}`, next: 'List nodes with `crtr node inspect list`, then pass a real id to --under.' });
|
|
67
|
+
}
|
|
68
|
+
scope = new Set([under, ...(await canvasSource.view(under))]);
|
|
69
|
+
}
|
|
70
|
+
const rows = (await canvasSource.listNodes(status !== undefined ? { status } : undefined).catch(rethrowAsCliError)).filter((row) => {
|
|
71
|
+
if (scope !== undefined && !scope.has(row.node_id))
|
|
72
|
+
return false;
|
|
73
|
+
if (kinds !== undefined && !kinds.includes(row.kind))
|
|
74
|
+
return false;
|
|
75
|
+
if (modes !== undefined && !modes.includes(row.mode))
|
|
76
|
+
return false;
|
|
77
|
+
if (lifecycles !== undefined && !lifecycles.includes(row.lifecycle))
|
|
78
|
+
return false;
|
|
79
|
+
if (profileId !== undefined && row.profile_id !== profileId)
|
|
80
|
+
return false;
|
|
81
|
+
if (cwd !== undefined && cwd !== '' && row.cwd !== cwd)
|
|
82
|
+
return false;
|
|
83
|
+
return true;
|
|
84
|
+
});
|
|
85
|
+
const nodes = (await Promise.all(rows.map(async (row) => {
|
|
86
|
+
const detail = await canvasSource.getNode(row.node_id).catch(rethrowAsCliError);
|
|
87
|
+
return { ...row, name: fullName(detail ?? row) };
|
|
88
|
+
}))).filter((row) => name === undefined || name === '' || fuzzyMatch(name, row.name));
|
|
89
|
+
return { nodes };
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// node inspect show — a node + its place in the spine
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// The renderer receives only the command result, while JSON output bypasses it.
|
|
96
|
+
// Keep remote provenance out of the returned DTO-shaped object without adding a
|
|
97
|
+
// second wire field or mutating the remote response.
|
|
98
|
+
const remoteShowResults = new WeakSet();
|
|
99
|
+
// Enrich a declared source edge so a debugger reads who a report/manager is
|
|
100
|
+
// without rebuilding a NodeMeta compatibility object.
|
|
101
|
+
async function enrichNeighbor(source, ref) {
|
|
102
|
+
const node = await source.getNode(ref.node_id).catch(rethrowAsCliError);
|
|
103
|
+
return {
|
|
104
|
+
node_id: ref.node_id,
|
|
105
|
+
name: node ? fullName(node) : '(missing)',
|
|
106
|
+
kind: node?.kind ?? '?',
|
|
107
|
+
status: node ? (node.intent ? `${node.status}/${node.intent}` : node.status) : '?',
|
|
108
|
+
active: ref.active,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const nodeShow = defineLeaf({
|
|
112
|
+
name: 'show',
|
|
113
|
+
description: 'show a node + its spine neighbors, artifacts, and drill-in pointers',
|
|
114
|
+
whenToUse: 'you want one node in depth — the debugging entrypoint: a glanceable meta slice, named spine neighbors, artifact and pending-cron counts, and exact drill-in paths. Use `node inspect list` for the flat roster or `canvas dashboard` for the whole-tree shape',
|
|
115
|
+
help: {
|
|
116
|
+
name: 'node inspect show',
|
|
117
|
+
summary: 'show a node in depth — meta slice, named neighbors, artifact/pending-cron counts, and drill-in pointers',
|
|
118
|
+
params: [
|
|
119
|
+
{ kind: 'positional', name: 'node', required: true, constraint: 'Node id.' },
|
|
120
|
+
{ kind: 'flag', name: 'canvas', type: 'string', required: false, constraint: 'Read from the named remote canvas target (see `crtr canvas config list`) instead of the local canvas. Overrides `crtr canvas use`.' },
|
|
121
|
+
],
|
|
122
|
+
output: [
|
|
123
|
+
{ name: 'node', type: 'object', required: true, constraint: 'The full node meta (system prompt + every telemetry field). The render surfaces a glanceable slice; `--json` carries the complete dump.' },
|
|
124
|
+
{ name: 'reports', type: 'object[]', required: true, constraint: 'Who this node subscribes to (its reports/down), each enriched with {node_id, name, kind, status, active} — these are typically its spawned children.' },
|
|
125
|
+
{ name: 'managers', type: 'object[]', required: true, constraint: 'Who subscribes to this node (its managers/up), same enriched shape.' },
|
|
126
|
+
{ name: 'artifacts', type: 'object', required: true, constraint: 'Counts of what the node left on disk by corpus: {report, doc, roadmap}. Enumerate them with `node inspect artifacts <id>`.' },
|
|
127
|
+
{ name: 'pending_crons', type: 'number', required: true, constraint: 'How many pending crons were created by this node. Inspect with `crtr cron list`.' },
|
|
128
|
+
{ name: 'paths', type: 'object', required: true, constraint: 'Resolved on-disk locations: {context_dir, reports_dir, session_file} — read these directly to debug.' },
|
|
129
|
+
{ name: 'follow_up', type: 'string', required: true, constraint: 'The concrete next commands to drill deeper.' },
|
|
130
|
+
],
|
|
131
|
+
outputKind: 'object',
|
|
132
|
+
effects: ['Read-only: reads the node, its edges and artifacts, and pending crons through crtrd.'],
|
|
133
|
+
// The node meta object inlines the full system prompt + every telemetry
|
|
134
|
+
// field — a machine-readable dump we suppress from the viewer preview; the
|
|
135
|
+
// render below surfaces only a glanceable slice. Same preview rationale as
|
|
136
|
+
// canvas snapshot / node inspect snapshot.
|
|
137
|
+
preview: { suppressOutput: true },
|
|
138
|
+
},
|
|
139
|
+
run: async (input) => {
|
|
140
|
+
const id = input['node'];
|
|
141
|
+
const canvasName = input['canvas'];
|
|
142
|
+
const canvasSource = cliCanvasSource({ canvasName });
|
|
143
|
+
// The remote source declares this exact command-read operation; preserve
|
|
144
|
+
// its guest-computed artifact/path fields instead of deriving them locally.
|
|
145
|
+
if (canvasSource instanceof RemoteCanvasSource) {
|
|
146
|
+
const result = await canvasSource.rawShow(id);
|
|
147
|
+
if (result === null) {
|
|
148
|
+
throw new InputError({ error: 'not_found', message: `no node: ${id}`, next: 'List nodes with `crtr node inspect list --canvas <name>`.' });
|
|
149
|
+
}
|
|
150
|
+
const shown = { ...result };
|
|
151
|
+
remoteShowResults.add(shown);
|
|
152
|
+
return shown;
|
|
153
|
+
}
|
|
154
|
+
// The source owns existence and topology. Locally its detail projection is
|
|
155
|
+
// the daemon DTO that carries the path fields used below.
|
|
156
|
+
const sourceNode = await canvasSource.getNode(id).catch((err) => rethrowAsCliError(err, 'List nodes with `crtr node inspect list`.'));
|
|
157
|
+
if (sourceNode === null) {
|
|
158
|
+
throw new InputError({ error: 'not_found', message: `no node: ${id}`, next: 'List nodes with `crtr node inspect list`.' });
|
|
159
|
+
}
|
|
160
|
+
const node = sourceNode;
|
|
161
|
+
const client = cliClient();
|
|
162
|
+
const reports = await Promise.all((await canvasSource.subscriptionsOf(id)).map((ref) => enrichNeighbor(canvasSource, ref)));
|
|
163
|
+
const managers = await Promise.all((await canvasSource.subscribersOf(id)).map((ref) => enrichNeighbor(canvasSource, ref)));
|
|
164
|
+
const arts = await client.getArtifacts(id);
|
|
165
|
+
const artifacts = {
|
|
166
|
+
report: arts.artifacts.filter((a) => a.source.startsWith('report')).length,
|
|
167
|
+
doc: arts.artifacts.filter((a) => a.source === 'doc').length,
|
|
168
|
+
roadmap: arts.artifacts.filter((a) => a.source === 'roadmap').length,
|
|
169
|
+
};
|
|
170
|
+
const pending_crons = (await client.listCrons().catch(rethrowAsCliError)).filter((cron) => cron.created_by === id).length;
|
|
171
|
+
const paths = {
|
|
172
|
+
context_dir: node.paths.context_dir,
|
|
173
|
+
reports_dir: node.paths.reports_dir,
|
|
174
|
+
...(node.pi_session_file !== undefined ? { session_file: node.pi_session_file } : {}),
|
|
175
|
+
};
|
|
176
|
+
// Auto-gathered drill-in pointers: the exact commands a debugger reaches for
|
|
177
|
+
// next, populated only when there is actually something behind them.
|
|
178
|
+
const hints = [];
|
|
179
|
+
const artTotal = artifacts.report + artifacts.doc + artifacts.roadmap;
|
|
180
|
+
if (artTotal > 0)
|
|
181
|
+
hints.push(`Read its ${artTotal} artifact(s): \`crtr node inspect artifacts ${id}\` → each ref feeds \`crtr canvas history read <ref>\`.`);
|
|
182
|
+
hints.push(`Browse its context + reports dirs (and its subscriptions') in nvim: \`crtr node inspect context ${id}\`.`);
|
|
183
|
+
if (paths.session_file)
|
|
184
|
+
hints.push(`Read the raw conversation transcript: ${paths.session_file}`);
|
|
185
|
+
hints.push(`On-disk context dir (ls/read directly): ${paths.context_dir}`);
|
|
186
|
+
if (pending_crons > 0)
|
|
187
|
+
hints.push(`It created ${pending_crons} pending cron(s): \`crtr cron list\`.`);
|
|
188
|
+
if (reports.length > 0)
|
|
189
|
+
hints.push(`Drill into a child/report: \`crtr node inspect show <node_id>\` (${reports.map((r) => r['node_id']).join(', ')}).`);
|
|
190
|
+
hints.push(`Full machine dump (system prompt + all telemetry): \`crtr --json node inspect show ${id}\`.`);
|
|
191
|
+
return { node, reports, managers, artifacts, pending_crons, paths, follow_up: hints.join('\n') };
|
|
192
|
+
},
|
|
193
|
+
render: (r) => {
|
|
194
|
+
const node = r['node'];
|
|
195
|
+
const id = String(node['node_id']);
|
|
196
|
+
const pid = node['pi_pid'];
|
|
197
|
+
const isRemoteShow = remoteShowResults.has(r);
|
|
198
|
+
const alive = isRemoteShow ? 'remote (liveness not checked locally)' : (isPidAlive(pid) ? 'alive' : 'dead');
|
|
199
|
+
const intent = node['intent'] ? `/${String(node['intent'])}` : '';
|
|
200
|
+
const parts = [];
|
|
201
|
+
// 1) Glanceable meta slice — the debug-critical fields, not the full dump.
|
|
202
|
+
parts.push(`# ${fullName(node)} (${id})`);
|
|
203
|
+
const meta = [
|
|
204
|
+
`- kind/mode/lifecycle: ${node['kind']} / ${node['mode']} / ${node['lifecycle']}`,
|
|
205
|
+
`- status: ${node['status']}${intent}`,
|
|
206
|
+
`- broker pid: ${pid ?? '(none)'} — ${alive}`,
|
|
207
|
+
`- cwd: ${node['cwd']}`,
|
|
208
|
+
`- host: ${node['host_kind']}` + (node['profile_id'] ? ` · profile ${node['profile_id']}` : ''),
|
|
209
|
+
`- cycles: ${node['cycles']} · created ${node['created']}`,
|
|
210
|
+
];
|
|
211
|
+
if (node['parent'])
|
|
212
|
+
meta.push(`- parent: ${node['parent']}`);
|
|
213
|
+
if (node['waiting_for'])
|
|
214
|
+
meta.push(`- waiting for message: ${node['waiting_for']}`);
|
|
215
|
+
parts.push(meta.join('\n'));
|
|
216
|
+
// 2) Neighbor tables (reports down, managers up), pre-enriched with names.
|
|
217
|
+
const table = (label, rows) => {
|
|
218
|
+
if (rows.length === 0)
|
|
219
|
+
return `${label}: none`;
|
|
220
|
+
const cols = ['node_id', 'name', 'kind', 'status', 'active'];
|
|
221
|
+
const head = `| ${cols.join(' | ')} |`;
|
|
222
|
+
const sep = `| ${cols.map(() => '---').join(' | ')} |`;
|
|
223
|
+
const body = rows.map((row) => `| ${cols.map((c) => String(row[c] ?? '').replace(/\|/g, '\\|').replace(/\n/g, ' ')).join(' | ')} |`).join('\n');
|
|
224
|
+
return `${rows.length} ${label}:\n\n${head}\n${sep}\n${body}`;
|
|
225
|
+
};
|
|
226
|
+
parts.push(table('reports (down — subscriptions, usually children)', r['reports']));
|
|
227
|
+
parts.push(table('managers (up — subscribers)', r['managers']));
|
|
228
|
+
// 3) On-disk footprint at a glance.
|
|
229
|
+
const a = r['artifacts'];
|
|
230
|
+
parts.push(`artifacts: ${a['report']} report(s), ${a['doc']} doc(s), ${a['roadmap']} roadmap · ${r['pending_crons']} pending cron(s)`);
|
|
231
|
+
// 4) Auto-gathered drill-in pointers.
|
|
232
|
+
parts.push(`Drill deeper:\n${String(r['follow_up'])}`);
|
|
233
|
+
return parts.join('\n\n');
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
// node fork — branch a conversation + durable context into an idle root
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
export const nodeFork = defineLeaf({
|
|
240
|
+
name: 'fork',
|
|
241
|
+
description: 'fork a node into an independent idle root with the same conversation and durable context',
|
|
242
|
+
whenToUse: 'a conversation has already accumulated the context you want, and you want a new human-driven branch beside it without sending a prompt or inheriting any graph-management responsibility. This copies the conversation and durable context, then waits for the fork’s first real user message to supply its mandate. Use `node new --fork-from` instead when spawning a managed worker with an immediate task',
|
|
243
|
+
help: {
|
|
244
|
+
name: 'node fork',
|
|
245
|
+
summary: 'create an independent resident root from a node’s conversation and durable context, with no kickoff prompt or model turn',
|
|
246
|
+
params: [
|
|
247
|
+
{ kind: 'flag', name: 'node', type: 'string', required: false, constraint: 'Source node id. Mutually exclusive with --pane; one of them is required.' },
|
|
248
|
+
{ kind: 'flag', name: 'pane', type: 'string', required: false, constraint: 'tmux pane showing the source node. Mutually exclusive with --node; one of them is required. The prefix menu passes this for you and the new viewer splits beside this pane.' },
|
|
249
|
+
],
|
|
250
|
+
output: [
|
|
251
|
+
{ name: 'node_id', type: 'string', required: true, constraint: 'The new independent root id.' },
|
|
252
|
+
{ name: 'focused', type: 'boolean', required: true, constraint: 'True when a new viewer pane opened beside the caller; false outside tmux.' },
|
|
253
|
+
{ name: 'session', type: 'string', required: false, constraint: 'The tmux session containing the new viewer, when one opened.' },
|
|
254
|
+
],
|
|
255
|
+
outputKind: 'object',
|
|
256
|
+
effects: [
|
|
257
|
+
'Creates a resident base-mode root with the source node’s copied pi conversation, cwd, profile, kind, model override, and durable context files. Top-level initial-prompt.md, yield-message.md, and result.json are omitted.',
|
|
258
|
+
'Copies no parent, subscriptions, subscribers, children, crons, worktree, situational context, or lifecycle responsibility. Sends no prompt and consumes no model turn; the first real user message becomes the fork’s mandate.',
|
|
259
|
+
'Inside tmux, opens and focuses a surface-attach viewer as an even-horizontal split in the source pane’s window. Outside tmux, the root is still created but no interactive fallback opens.',
|
|
260
|
+
],
|
|
261
|
+
},
|
|
262
|
+
run: async (input) => {
|
|
263
|
+
const pane = input['pane'];
|
|
264
|
+
const explicitNode = input['node'];
|
|
265
|
+
if (explicitNode !== undefined && pane !== undefined) {
|
|
266
|
+
throw new InputError({ error: 'conflicting_target', message: '--node and --pane are mutually exclusive', next: 'Pass the source node id or its viewer pane, not both.' });
|
|
267
|
+
}
|
|
268
|
+
let sourceId = explicitNode;
|
|
269
|
+
if (sourceId === undefined && pane !== undefined)
|
|
270
|
+
sourceId = nodeInPane(pane);
|
|
271
|
+
if (sourceId === undefined || sourceId === '') {
|
|
272
|
+
throw new InputError({ error: 'no_node', message: 'no source node was provided or found in the pane', next: 'Pass --node <id>, or --pane <pane-id> for a pane showing a node.' });
|
|
273
|
+
}
|
|
274
|
+
const detail = await cliClient().forkNode(sourceId).catch(rethrowAsCliError);
|
|
275
|
+
const placement = await focusViewer(detail.node_id, {
|
|
276
|
+
cwd: detail.cwd,
|
|
277
|
+
name: detail.name,
|
|
278
|
+
...(pane !== undefined ? { pane } : {}),
|
|
279
|
+
newPane: true,
|
|
280
|
+
});
|
|
281
|
+
return { node_id: detail.node_id, focused: placement.focused, session: placement.session };
|
|
282
|
+
},
|
|
283
|
+
render: (result) => {
|
|
284
|
+
const placement = result['focused'] === true
|
|
285
|
+
? ` Viewer opened beside the source${result['session'] ? ` in session ${result['session']}` : ''}.`
|
|
286
|
+
: ' No viewer opened because no tmux pane was available.';
|
|
287
|
+
return `Forked independent idle root ${result['node_id']}.${placement} It will make no model call until its first real user message.`;
|
|
288
|
+
},
|
|
289
|
+
});
|
|
290
|
+
// ---------------------------------------------------------------------------
|
|
291
|
+
// node inspect — read the graph (list, show, context)
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
export const nodeInspect = defineBranch({
|
|
294
|
+
name: 'inspect',
|
|
295
|
+
description: 'read one node — its graph position, context, and artifacts',
|
|
296
|
+
whenToUse: 'reading everything about ONE node you can name: enumerate the roster (`list`), inspect a node and its spine neighbors (`show`), browse its on-disk context dir (`context`), or list its reports/docs as refs (`artifacts`). Use `canvas dashboard` instead to render the whole tree SHAPE, or `canvas attention` to find which nodes are blocked on a human',
|
|
297
|
+
help: {
|
|
298
|
+
name: 'node inspect',
|
|
299
|
+
summary: 'read one node (or the roster) — topology, context dir, and artifacts',
|
|
300
|
+
},
|
|
301
|
+
children: [nodeList, nodeShow, nodeSnapshotLeaf, nodeTranscriptLeaf, nodeContextLeaf, nodeArtifactsLeaf],
|
|
302
|
+
});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const nodeConfig: import("../../core/command.js").LeafDef;
|
|
2
|
+
export declare const nodePromote: import("../../core/command.js").LeafDef;
|
|
3
|
+
export declare const nodeLifecycle: import("../../core/command.js").BranchDef;
|
|
4
|
+
export declare const nodeYield: import("../../core/command.js").LeafDef;
|