@north-light/crouter 0.3.173 → 0.3.175
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} +27 -179
- 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 +7 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
- 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/memory/write.js +13 -12
- 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
|
@@ -1,31 +1,16 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
1
|
+
// Regression: a caller passing BOTH a positional AND piped stdin (e.g.
|
|
2
|
+
// `crtr node new --kind x "title" < prompt.md`, or `crtr human ask -
|
|
3
|
+
// <<EOF`) used to have the positional silently win, with the entire piped
|
|
4
|
+
// body dropped on the floor. `-` must always mean "read stdin", and any
|
|
5
|
+
// OTHER positional alongside genuinely piped, non-empty stdin must error
|
|
6
|
+
// loudly rather than silently pick one.
|
|
3
7
|
//
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
import { test, describe, beforeEach, afterEach } from 'node:test';
|
|
8
|
+
// Run with: node --import tsx/esm --test 'src/commands/__tests__/human.test.ts'
|
|
9
|
+
import { test, describe } from 'node:test';
|
|
7
10
|
import assert from 'node:assert/strict';
|
|
8
|
-
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
9
|
-
import { tmpdir } from 'node:os';
|
|
10
|
-
import { join } from 'node:path';
|
|
11
|
-
import { randomBytes } from 'node:crypto';
|
|
12
11
|
import { Readable } from 'node:stream';
|
|
13
|
-
import { parseArgv
|
|
14
|
-
import {
|
|
15
|
-
import { humanAsk, sourceStamp } from '../human/prompts.js';
|
|
16
|
-
import { humanReviewBranch } from '../human/review.js';
|
|
17
|
-
import { registerHuman } from '../human.js';
|
|
18
|
-
import { coerceSingleSelectAgainst } from '../human/queue.js';
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
// Helper: write a temp JSON file and return its path.
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
function tmpJson(obj) {
|
|
23
|
-
const dir = join(tmpdir(), `crtr-human-test-${randomBytes(4).toString('hex')}`);
|
|
24
|
-
mkdirSync(dir, { recursive: true });
|
|
25
|
-
const p = join(dir, 'deck.json');
|
|
26
|
-
writeFileSync(p, JSON.stringify(obj));
|
|
27
|
-
return p;
|
|
28
|
-
}
|
|
12
|
+
import { parseArgv } from '../../core/command.js';
|
|
13
|
+
import { humanAsk } from '../human/prompts.js';
|
|
29
14
|
async function withPipedStdin(body, fn) {
|
|
30
15
|
const original = process.stdin;
|
|
31
16
|
const stdin = Readable.from([Buffer.from(body)]);
|
|
@@ -38,178 +23,7 @@ async function withPipedStdin(body, fn) {
|
|
|
38
23
|
Object.defineProperty(process, 'stdin', { value: original, configurable: true });
|
|
39
24
|
}
|
|
40
25
|
}
|
|
41
|
-
|
|
42
|
-
// human review new — positional file (path) + required --subtitle + optional --output
|
|
43
|
-
// ---------------------------------------------------------------------------
|
|
44
|
-
describe('human review command branch', () => {
|
|
45
|
-
const review = registerHuman().children.find((child) => child.name === 'review');
|
|
46
|
-
const newLeaf = humanReviewBranch.children.find((child) => child.name === 'new' && child.kind === 'leaf');
|
|
47
|
-
test('registers the canonical review branch', () => {
|
|
48
|
-
assert.equal(review, humanReviewBranch);
|
|
49
|
-
assert.deepEqual(humanReviewBranch.children.map((child) => child.name), ['new', 'comment']);
|
|
50
|
-
});
|
|
51
|
-
test('bare review names valid children rather than accepting the legacy file positional', () => {
|
|
52
|
-
const error = unknownPathError(humanReviewBranch, ['human', 'review'], '/tmp/plan.md');
|
|
53
|
-
assert.equal(error.code, 'unknown_path');
|
|
54
|
-
assert.match(error.message, /unknown subcommand: \/tmp\/plan\.md/);
|
|
55
|
-
assert.match(String(error.details?.next), /Valid children: new, comment/);
|
|
56
|
-
});
|
|
57
|
-
test('new parses file + required subtitle', async () => {
|
|
58
|
-
assert.ok(newLeaf);
|
|
59
|
-
const result = await parseArgv(newLeaf.help.params ?? [], ['/tmp/plan.md', '--subtitle', 'Review this plan so implementation can begin safely.']);
|
|
60
|
-
assert.equal(result['file'], '/tmp/plan.md');
|
|
61
|
-
assert.equal(result['subtitle'], 'Review this plan so implementation can begin safely.');
|
|
62
|
-
});
|
|
63
|
-
test('new parses file + subtitle + --output', async () => {
|
|
64
|
-
assert.ok(newLeaf);
|
|
65
|
-
const result = await parseArgv(newLeaf.help.params ?? [], ['/tmp/plan.md', '--subtitle', 'Review this plan so implementation can begin safely.', '--output', '/tmp/fb.json']);
|
|
66
|
-
assert.equal(result['file'], '/tmp/plan.md');
|
|
67
|
-
assert.equal(result['output'], '/tmp/fb.json');
|
|
68
|
-
});
|
|
69
|
-
// Validation is complete, never first-failure: one invocation yields ONE
|
|
70
|
-
// error naming every missing required parameter, and its Next: mandates the
|
|
71
|
-
// schema read rather than patching the first field.
|
|
72
|
-
test('new missing file AND subtitle throws ONE missing_parameter naming both', async () => {
|
|
73
|
-
assert.ok(newLeaf);
|
|
74
|
-
await assert.rejects(() => parseArgv(newLeaf.help.params ?? [], [], { leafPath: ['human', 'review', 'new'] }), (err) => {
|
|
75
|
-
assert.match(err.message, /required parameters are missing: positional FILE, --subtitle/);
|
|
76
|
-
assert.equal(err.details?.field, 'file, subtitle');
|
|
77
|
-
assert.match(err.details?.next ?? '', /Run `crtr human review new -h` and read the full schema before re-issuing/);
|
|
78
|
-
return true;
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
// ---------------------------------------------------------------------------
|
|
83
|
-
// human notify — positional title + required --subtitle + optional --body
|
|
84
|
-
// ---------------------------------------------------------------------------
|
|
85
|
-
describe('human notify: params', () => {
|
|
86
|
-
const params = [
|
|
87
|
-
{ kind: 'positional', name: 'title', type: 'string', required: true, constraint: 'Headline.' },
|
|
88
|
-
{ kind: 'flag', name: 'subtitle', type: 'string', required: true, constraint: 'Status and stakes.' },
|
|
89
|
-
{ kind: 'flag', name: 'body', type: 'string', required: false, constraint: 'Markdown body.' },
|
|
90
|
-
];
|
|
91
|
-
test('parses positional title + required subtitle', async () => {
|
|
92
|
-
const result = await parseArgv(params, ['Build done', '--subtitle', 'The build passed, so the change is ready to review.']);
|
|
93
|
-
assert.equal(result['title'], 'Build done');
|
|
94
|
-
assert.equal(result['subtitle'], 'The build passed, so the change is ready to review.');
|
|
95
|
-
});
|
|
96
|
-
test('parses title + subtitle + --body', async () => {
|
|
97
|
-
const result = await parseArgv(params, ['Done', '--subtitle', 'All tests passed, so deployment can proceed.', '--body', 'All tests pass.']);
|
|
98
|
-
assert.equal(result['title'], 'Done');
|
|
99
|
-
assert.equal(result['body'], 'All tests pass.');
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
// ---------------------------------------------------------------------------
|
|
103
|
-
// human show — positional path + --watch bool + --window enum
|
|
104
|
-
// ---------------------------------------------------------------------------
|
|
105
|
-
describe('human show: params', () => {
|
|
106
|
-
const params = [
|
|
107
|
-
{ kind: 'positional', name: 'path', type: 'path', required: true, constraint: 'File to render.' },
|
|
108
|
-
{ kind: 'flag', name: 'watch', type: 'bool', required: false, constraint: 'Presence = true.' },
|
|
109
|
-
{ kind: 'flag', name: 'window', type: 'enum', choices: ['auto', 'split', 'new'], required: false, default: 'auto', constraint: 'Placement.' },
|
|
110
|
-
];
|
|
111
|
-
test('parses positional path', async () => {
|
|
112
|
-
const result = await parseArgv(params, ['/tmp/doc.md']);
|
|
113
|
-
assert.equal(result['path'], '/tmp/doc.md');
|
|
114
|
-
});
|
|
115
|
-
test('--watch absent → false (presence-only bool default)', async () => {
|
|
116
|
-
const result = await parseArgv(params, ['/tmp/doc.md']);
|
|
117
|
-
assert.equal(result['watch'], false);
|
|
118
|
-
});
|
|
119
|
-
test('--watch present → true', async () => {
|
|
120
|
-
const result = await parseArgv(params, ['/tmp/doc.md', '--watch']);
|
|
121
|
-
assert.equal(result['watch'], true);
|
|
122
|
-
});
|
|
123
|
-
test('--watch=true is rejected (bool takes no value)', async () => {
|
|
124
|
-
await assert.rejects(() => parseArgv(params, ['/tmp/doc.md', '--watch=true']), (err) => { assert.match(err.message, /takes no value/); return true; });
|
|
125
|
-
});
|
|
126
|
-
test('--window default is auto', async () => {
|
|
127
|
-
const result = await parseArgv(params, ['/tmp/doc.md']);
|
|
128
|
-
assert.equal(result['window'], 'auto');
|
|
129
|
-
});
|
|
130
|
-
test('--window accepts valid enum value', async () => {
|
|
131
|
-
const result = await parseArgv(params, ['/tmp/doc.md', '--window', 'split']);
|
|
132
|
-
assert.equal(result['window'], 'split');
|
|
133
|
-
});
|
|
134
|
-
test('--window rejects invalid value', async () => {
|
|
135
|
-
await assert.rejects(() => parseArgv(params, ['/tmp/doc.md', '--window', 'float']), (err) => { assert.match(err.message, /must be one of/); return true; });
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
// ---------------------------------------------------------------------------
|
|
139
|
-
// human ask — --context-file (context-file kind, key=deckFile)
|
|
140
|
-
//
|
|
141
|
-
// NOTE: The argv parser hardcodes the CLI token as `--context-file` regardless
|
|
142
|
-
// of the param's `name` field. The `name` field ("deckFile") becomes the key
|
|
143
|
-
// in the input record. So the correct invocation is:
|
|
144
|
-
// crtr human ask --context-file deck.json
|
|
145
|
-
// not --deck-file. Tests use --context-file accordingly.
|
|
146
|
-
// ---------------------------------------------------------------------------
|
|
147
|
-
describe('human ask: params', () => {
|
|
148
|
-
const params = [
|
|
149
|
-
{ kind: 'context-file', name: 'deckFile', required: true, constraint: 'Humanloop deck JSON.' },
|
|
150
|
-
];
|
|
151
|
-
test('--context-file parses JSON file and yields input.deckFile', async () => {
|
|
152
|
-
const deck = { interactions: [{ id: 'q', title: 'Go?', subtitle: 'Approve going ahead so the work can continue.', options: [{ id: 'yes', label: 'Yes' }] }] };
|
|
153
|
-
const path = tmpJson(deck);
|
|
154
|
-
const result = await parseArgv(params, ['--context-file', path]);
|
|
155
|
-
assert.deepEqual(result['deckFile'], deck);
|
|
156
|
-
});
|
|
157
|
-
test('--context-file missing → missing_parameter', async () => {
|
|
158
|
-
await assert.rejects(() => parseArgv(params, []), (err) => { assert.match(err.message, /required parameter is missing/); return true; });
|
|
159
|
-
});
|
|
160
|
-
test('--context-file with nonexistent file → invalid_type', async () => {
|
|
161
|
-
await assert.rejects(() => parseArgv(params, ['--context-file', '/no/such/deck.json']), (err) => { assert.match(err.message, /cannot read file/); return true; });
|
|
162
|
-
});
|
|
163
|
-
test('--context-file with non-JSON file → invalid_type', async () => {
|
|
164
|
-
const dir = join(tmpdir(), `crtr-human-test-${randomBytes(4).toString('hex')}`);
|
|
165
|
-
mkdirSync(dir, { recursive: true });
|
|
166
|
-
const p = join(dir, 'bad.json');
|
|
167
|
-
writeFileSync(p, 'not json at all');
|
|
168
|
-
await assert.rejects(() => parseArgv(params, ['--context-file', p]), (err) => { assert.match(err.message, /not valid JSON/); return true; });
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
// ---------------------------------------------------------------------------
|
|
172
|
-
// human ask — stdin question + strict --context-file deck
|
|
173
|
-
// ---------------------------------------------------------------------------
|
|
174
|
-
describe('human ask: stdin question + strict deck', () => {
|
|
175
|
-
test('help requires an explicit title with the literal stdin body', () => {
|
|
176
|
-
const out = renderLeafArgv(humanAsk.help);
|
|
177
|
-
assert.match(out, /^ --title TITLE\s+string, optional\. Required with stdin:/m);
|
|
178
|
-
assert.match(out, /^ --subtitle SUBTITLE\s+string, optional\. Required with stdin:/m);
|
|
179
|
-
assert.match(out, /^ stdin\s+optional\. Simple open-text ask body\./m);
|
|
180
|
-
assert.match(out, /single-quoted heredoc/);
|
|
181
|
-
assert.match(out, /--context-file PATH/);
|
|
182
|
-
assert.match(out, /bodyPath is a relative path to the body file, resolved from the directory containing the deck JSON/);
|
|
183
|
-
assert.match(out, /paths escaping with \.\. or symlinks are rejected; absolute paths are unsupported/);
|
|
184
|
-
assert.doesNotMatch(out, /crtr human ask "<question>"/);
|
|
185
|
-
});
|
|
186
|
-
test('reads an explicit title and literal question bytes', async () => {
|
|
187
|
-
const question = 'Literal `backticks`, $dollars, $(command), ; semicolon, * glob\nsecond line\n';
|
|
188
|
-
const result = await withPipedStdin(question, () => parseArgv(humanAsk.help.params ?? [], ['--title', 'Release decision', '--subtitle', 'Choose whether to release now so the launch can proceed.']));
|
|
189
|
-
assert.equal(result['title'], 'Release decision');
|
|
190
|
-
assert.equal(result['subtitle'], 'Choose whether to release now so the launch can proceed.');
|
|
191
|
-
assert.equal(result['question'], question);
|
|
192
|
-
});
|
|
193
|
-
test('required stdin errors prescribe stdin rather than a positional payload', async () => {
|
|
194
|
-
const params = [{ kind: 'stdin', name: 'body', required: true, constraint: 'Markdown.' }];
|
|
195
|
-
await assert.rejects(() => withPipedStdin('', () => parseArgv(params, [])), (err) => {
|
|
196
|
-
assert.match(err.message, /required parameter is missing: stdin/);
|
|
197
|
-
assert.equal(err.details?.field, 'body');
|
|
198
|
-
assert.match(err.details?.next ?? '', /read the full schema before re-issuing/);
|
|
199
|
-
assert.doesNotMatch(err.details?.next ?? '', /positional argument/);
|
|
200
|
-
return true;
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
test('retains positional input compatibility without advertising it to agents', async () => {
|
|
204
|
-
const result = await parseArgv(humanAsk.help.params ?? [], ['Should we ship today?']);
|
|
205
|
-
assert.equal(result['question'], 'Should we ship today?');
|
|
206
|
-
});
|
|
207
|
-
// Regression: a caller passing BOTH a positional AND piped stdin (e.g.
|
|
208
|
-
// `crtr node new --kind x "title" < prompt.md`, or `crtr human ask -
|
|
209
|
-
// <<EOF`) used to have the positional silently win, with the entire piped
|
|
210
|
-
// body dropped on the floor. `-` must always mean "read stdin", and any
|
|
211
|
-
// OTHER positional alongside genuinely piped, non-empty stdin must error
|
|
212
|
-
// loudly rather than silently pick one.
|
|
26
|
+
describe('human ask: positional vs piped stdin', () => {
|
|
213
27
|
test('`-` positional reads stdin instead of taking the literal value', async () => {
|
|
214
28
|
const body = 'Should we ship today?\nmulti-line brief\n';
|
|
215
29
|
const result = await withPipedStdin(body, () => parseArgv(humanAsk.help.params ?? [], ['-']));
|
|
@@ -230,129 +44,4 @@ describe('human ask: stdin question + strict deck', () => {
|
|
|
230
44
|
const result = await withPipedStdin('', () => parseArgv(humanAsk.help.params ?? [], ['Should we ship today?']));
|
|
231
45
|
assert.equal(result['question'], 'Should we ship today?');
|
|
232
46
|
});
|
|
233
|
-
test('parses --context-file into input.deck while keeping the strict deck path', async () => {
|
|
234
|
-
const deck = {
|
|
235
|
-
title: 'Choose a path',
|
|
236
|
-
interactions: [
|
|
237
|
-
{ id: 'q', title: 'Pick one', subtitle: 'Choose the path that best supports the release.', options: [{ id: 'yes', label: 'Yes' }] },
|
|
238
|
-
],
|
|
239
|
-
};
|
|
240
|
-
const path = tmpJson(deck);
|
|
241
|
-
const result = await withPipedStdin('', () => parseArgv(humanAsk.help.params ?? [], ['--context-file', path]));
|
|
242
|
-
assert.deepEqual(result['deck'], deck);
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
// ---------------------------------------------------------------------------
|
|
246
|
-
// human cancel — positional job_id + optional --reason
|
|
247
|
-
// ---------------------------------------------------------------------------
|
|
248
|
-
describe('human cancel: params', () => {
|
|
249
|
-
const params = [
|
|
250
|
-
{ kind: 'positional', name: 'job_id', type: 'string', required: true, constraint: 'Interaction node id.' },
|
|
251
|
-
{ kind: 'flag', name: 'reason', type: 'string', required: false, constraint: 'Why it was retracted.' },
|
|
252
|
-
];
|
|
253
|
-
test('parses positional job_id', async () => {
|
|
254
|
-
const result = await parseArgv(params, ['abc-1234']);
|
|
255
|
-
assert.equal(result['job_id'], 'abc-1234');
|
|
256
|
-
});
|
|
257
|
-
test('parses job_id + --reason', async () => {
|
|
258
|
-
const result = await parseArgv(params, ['abc-1234', '--reason', 'answered myself']);
|
|
259
|
-
assert.equal(result['job_id'], 'abc-1234');
|
|
260
|
-
assert.equal(result['reason'], 'answered myself');
|
|
261
|
-
});
|
|
262
|
-
test('missing job_id throws missing_parameter', async () => {
|
|
263
|
-
await assert.rejects(() => parseArgv(params, []), (err) => { assert.match(err.message, /required parameter is missing/); return true; });
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
// ---------------------------------------------------------------------------
|
|
267
|
-
// sourceStamp — an optional presentation label, nothing more.
|
|
268
|
-
//
|
|
269
|
-
// Ticket identity and attribution come from the bridge node directory and its
|
|
270
|
-
// parent relation, never from deck data — so the stamp carries at most
|
|
271
|
-
// `{sessionName}`, resolved from CRTR_NODE_ID through crtrd. Without a node id,
|
|
272
|
-
// or when crtrd cannot resolve one, the stamp is empty. `human cancel` is not
|
|
273
|
-
// unit-testable in-process for the same reason: it delegates node lookup +
|
|
274
|
-
// cancellation to crtrd, so exercising it needs a live daemon.
|
|
275
|
-
// ---------------------------------------------------------------------------
|
|
276
|
-
describe('sourceStamp: asking-node attribution', () => {
|
|
277
|
-
beforeEach(() => {
|
|
278
|
-
delete process.env['CRTR_NODE_ID'];
|
|
279
|
-
});
|
|
280
|
-
afterEach(() => {
|
|
281
|
-
delete process.env['CRTR_NODE_ID'];
|
|
282
|
-
});
|
|
283
|
-
test('bare shell (no CRTR_NODE_ID) → empty stamp', async () => {
|
|
284
|
-
assert.deepEqual(await sourceStamp(), {});
|
|
285
|
-
});
|
|
286
|
-
test('CRTR_NODE_ID crtrd cannot resolve → empty stamp, never a raw node id', async () => {
|
|
287
|
-
process.env['CRTR_NODE_ID'] = 'ghost-node';
|
|
288
|
-
assert.deepEqual(await sourceStamp(), {});
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
// ---------------------------------------------------------------------------
|
|
292
|
-
// human list — --limit int + --cursor string
|
|
293
|
-
// ---------------------------------------------------------------------------
|
|
294
|
-
describe('human list: params', () => {
|
|
295
|
-
const params = [
|
|
296
|
-
{ kind: 'flag', name: 'limit', type: 'int', required: false, default: 20, constraint: 'Default 20.' },
|
|
297
|
-
{ kind: 'flag', name: 'cursor', type: 'string', required: false, constraint: 'Pagination token.' },
|
|
298
|
-
];
|
|
299
|
-
test('defaults: limit=20, cursor=undefined', async () => {
|
|
300
|
-
const result = await parseArgv(params, []);
|
|
301
|
-
assert.equal(result['limit'], 20);
|
|
302
|
-
assert.equal(result['cursor'], undefined);
|
|
303
|
-
});
|
|
304
|
-
test('--limit parses integer', async () => {
|
|
305
|
-
const result = await parseArgv(params, ['--limit', '5']);
|
|
306
|
-
assert.equal(result['limit'], 5);
|
|
307
|
-
});
|
|
308
|
-
test('--limit rejects non-integer', async () => {
|
|
309
|
-
await assert.rejects(() => parseArgv(params, ['--limit', 'abc']), (err) => { assert.match(err.message, /must be an integer/); return true; });
|
|
310
|
-
});
|
|
311
|
-
test('--cursor passes through as string', async () => {
|
|
312
|
-
const result = await parseArgv(params, ['--cursor', 'tok_abc123']);
|
|
313
|
-
assert.equal(result['cursor'], 'tok_abc123');
|
|
314
|
-
});
|
|
315
|
-
});
|
|
316
|
-
// ---------------------------------------------------------------------------
|
|
317
|
-
// human resolve — web-array → humanloop single-select coercion.
|
|
318
|
-
//
|
|
319
|
-
// Regression: the web always posts `selectedOptionIds` (an array) for every
|
|
320
|
-
// option pick, but humanloop's strict validator rejects an array on a
|
|
321
|
-
// non-multiSelect interaction ("invalid multi-select response"). Every
|
|
322
|
-
// single-select deck resolved from the web — notify acks, yes/no approvals,
|
|
323
|
-
// radio decisions — failed until this coercion. Multi-select and freetext must
|
|
324
|
-
// pass through untouched.
|
|
325
|
-
// ---------------------------------------------------------------------------
|
|
326
|
-
describe('coerceSingleSelectAgainst: web array → humanloop shape', () => {
|
|
327
|
-
const deck = {
|
|
328
|
-
interactions: [
|
|
329
|
-
{ id: 'notify', title: 'n', subtitle: 'Acknowledge this notice so the work can continue.', options: [{ id: 'ok', label: 'OK' }], kind: 'notify' },
|
|
330
|
-
{ id: 'pick', title: 'p', subtitle: 'Choose every applicable option so the plan can continue.', options: [{ id: 'a', label: 'A' }, { id: 'b', label: 'B' }], multiSelect: true },
|
|
331
|
-
{ id: 'ask', title: 'a', subtitle: 'Provide guidance so the work can continue.', options: [], allowFreetext: true },
|
|
332
|
-
],
|
|
333
|
-
};
|
|
334
|
-
test('single-select 1-element array folds to selectedOptionId', () => {
|
|
335
|
-
const [r] = coerceSingleSelectAgainst([{ id: 'notify', selectedOptionIds: ['ok'] }], deck);
|
|
336
|
-
assert.equal(r.selectedOptionId, 'ok');
|
|
337
|
-
assert.equal(r.selectedOptionIds, undefined);
|
|
338
|
-
});
|
|
339
|
-
test('multi-select array passes through untouched', () => {
|
|
340
|
-
const [r] = coerceSingleSelectAgainst([{ id: 'pick', selectedOptionIds: ['a', 'b'] }], deck);
|
|
341
|
-
assert.deepEqual(r.selectedOptionIds, ['a', 'b']);
|
|
342
|
-
assert.equal(r.selectedOptionId, undefined);
|
|
343
|
-
});
|
|
344
|
-
test('single-select multi-element array is left for humanloop to reject', () => {
|
|
345
|
-
const [r] = coerceSingleSelectAgainst([{ id: 'notify', selectedOptionIds: ['ok', 'x'] }], deck);
|
|
346
|
-
assert.deepEqual(r.selectedOptionIds, ['ok', 'x']);
|
|
347
|
-
assert.equal(r.selectedOptionId, undefined);
|
|
348
|
-
});
|
|
349
|
-
test('freetext response passes through untouched', () => {
|
|
350
|
-
const [r] = coerceSingleSelectAgainst([{ id: 'ask', freetext: 'hello' }], deck);
|
|
351
|
-
assert.equal(r.freetext, 'hello');
|
|
352
|
-
assert.equal(r.selectedOptionId, undefined);
|
|
353
|
-
});
|
|
354
|
-
test('already-singular response is preserved', () => {
|
|
355
|
-
const [r] = coerceSingleSelectAgainst([{ id: 'notify', selectedOptionId: 'ok' }], deck);
|
|
356
|
-
assert.equal(r.selectedOptionId, 'ok');
|
|
357
|
-
});
|
|
358
47
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { CrtrClient } from '../api/index.js';
|
|
2
2
|
import type { CanvasSource } from '../core/canvas/source.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { NodeStatus, SubscriptionRef } from '../core/canvas/types.js';
|
|
4
4
|
import type { Scope } from '../types.js';
|
|
5
|
-
import type { NodeDetailDTO } from '../api/dto/nodes.js';
|
|
5
|
+
import type { NodeDetailDTO, NodeSummaryDTO } from '../api/dto/nodes.js';
|
|
6
6
|
/** Rethrow an `ApiError` as the clean structured CLI error agents parse
|
|
7
7
|
* (`core/io` `handle`) — instead of the generic "internal bug" stderr path a
|
|
8
8
|
* raw non-`CrtrError` throw would take. The mapping itself lives in ONE place
|
|
@@ -65,11 +65,11 @@ export declare class ApiCanvasSource implements CanvasSource {
|
|
|
65
65
|
/** Map a 404 from the API to the interface's `null` "not found" contract;
|
|
66
66
|
* re-throw everything else. */
|
|
67
67
|
private orNull;
|
|
68
|
-
getNode(nodeId: string): Promise<
|
|
69
|
-
getRow(nodeId: string): Promise<
|
|
68
|
+
getNode(nodeId: string): Promise<NodeDetailDTO | null>;
|
|
69
|
+
getRow(nodeId: string): Promise<NodeDetailDTO | null>;
|
|
70
70
|
listNodes(filter?: {
|
|
71
71
|
status?: NodeStatus | NodeStatus[];
|
|
72
|
-
}): Promise<
|
|
72
|
+
}): Promise<NodeSummaryDTO[]>;
|
|
73
73
|
subscriptionsOf(subscriber: string): Promise<SubscriptionRef[]>;
|
|
74
74
|
subscribersOf(publisher: string): Promise<SubscriptionRef[]>;
|
|
75
75
|
/** BFS over the active `subscribes_to` edges from `root` (its transitive view),
|
|
@@ -146,88 +146,11 @@ export function cliClient(opts) {
|
|
|
146
146
|
});
|
|
147
147
|
}
|
|
148
148
|
// ---------------------------------------------------------------------------
|
|
149
|
-
// DTO → internal projections
|
|
150
|
-
//
|
|
151
|
-
// The DTO boundary deliberately reshapes internals (spec §3.1), so these are
|
|
152
|
-
// lossy in the read-only direction: fields the API surface does not carry
|
|
153
|
-
// (tmux-presence runtime, per-edge `active`) are defaulted, matching the
|
|
154
|
-
// documented parity bar (structural, not byte-identical). See the mapping notes
|
|
155
|
-
// on each helper.
|
|
156
|
-
// ---------------------------------------------------------------------------
|
|
157
|
-
/** `NodeSummaryDTO` → `NodeRow`. The DTO carries every indexed identity + core
|
|
158
|
-
* runtime column; the four fields it omits are LOCAL tmux-presence /
|
|
159
|
-
* process-identity runtime (`window`/`tmux_session`/`pane`/`pi_pid_identity`),
|
|
160
|
-
* which are meaningless to a remote/pure client and are defaulted to null. A
|
|
161
|
-
* viewer reading canvas STRUCTURE never needs them; local placement reads them
|
|
162
|
-
* from tmux, not the source. */
|
|
163
|
-
function summaryToRow(s) {
|
|
164
|
-
return {
|
|
165
|
-
node_id: s.node_id,
|
|
166
|
-
name: s.name,
|
|
167
|
-
kind: s.kind,
|
|
168
|
-
mode: s.mode,
|
|
169
|
-
lifecycle: s.lifecycle,
|
|
170
|
-
status: s.status,
|
|
171
|
-
cwd: s.cwd,
|
|
172
|
-
host_kind: s.host_kind,
|
|
173
|
-
profile_id: s.profile_id,
|
|
174
|
-
parent: s.parent,
|
|
175
|
-
created: s.created,
|
|
176
|
-
intent: s.intent,
|
|
177
|
-
waiting_for: s.waiting_for,
|
|
178
|
-
final_report: s.final_report ?? null,
|
|
179
|
-
finalized_at: s.finalized_at ?? null,
|
|
180
|
-
pi_pid: s.pi_pid,
|
|
181
|
-
pi_pid_identity: null,
|
|
182
|
-
window: null,
|
|
183
|
-
tmux_session: null,
|
|
184
|
-
pane: null,
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
/** `NodeDetailDTO` → `NodeMeta`. Populates the durable-identity ∪ runtime fields
|
|
188
|
-
* the DTO projects; the durable LAUNCH-RECIPE facts a projection cannot carry
|
|
189
|
-
* (`launch`/`env`, `persona_ack`, `model_override`, `passive_default`,
|
|
190
|
-
* `fork_from`, `pi_session_file`,
|
|
191
|
-
* `cycle_pending`) are left undefined — read-only viewer/inspect consumers
|
|
192
|
-
* (Stage B-7/B-9) never read them; the daemon owns the full meta for revive. */
|
|
193
|
-
function detailToMeta(d) {
|
|
194
|
-
return {
|
|
195
|
-
node_id: d.node_id,
|
|
196
|
-
name: d.name,
|
|
197
|
-
description: d.description,
|
|
198
|
-
icon: d.icon,
|
|
199
|
-
cycles: d.cycles,
|
|
200
|
-
created: d.created,
|
|
201
|
-
cwd: d.cwd,
|
|
202
|
-
host_kind: d.host_kind,
|
|
203
|
-
profile_id: d.profile_id,
|
|
204
|
-
kind: d.kind,
|
|
205
|
-
mode: d.mode,
|
|
206
|
-
lifecycle: d.lifecycle,
|
|
207
|
-
parent: d.parent,
|
|
208
|
-
spawned_by: d.edges.spawned_by,
|
|
209
|
-
pi_session_id: d.pi_session_id ?? null,
|
|
210
|
-
managed_worktree: d.worktree ?? null,
|
|
211
|
-
// Runtime (from the authoritative row, projected onto the DTO).
|
|
212
|
-
status: d.status,
|
|
213
|
-
intent: d.intent,
|
|
214
|
-
waiting_for: d.waiting_for,
|
|
215
|
-
final_report: d.final_report ?? null,
|
|
216
|
-
finalized_at: d.finalized_at ?? null,
|
|
217
|
-
pi_pid: d.pi_pid,
|
|
218
|
-
pi_pid_identity: d.pi_pid_identity ?? null,
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
/** Edge ids → `SubscriptionRef[]`. KNOWN GAP: `NodeEdgesDTO` carries only the
|
|
222
|
-
* peer node ids, not the per-edge `active` flag or `created` timestamp (the
|
|
223
|
-
* `GET /nodes/{id}` projection built in A-1/A-7 does not expose them). We
|
|
224
|
-
* default `active: true` (the SAFE direction — never under-reports a live
|
|
225
|
-
* listener) and `created: ''` (matching `RemoteCanvasSource`'s same-shaped
|
|
226
|
-
* fallback). Fully faithful `active`/`created` needs an additive DTO extension
|
|
227
|
-
* (surface it as objects), which is an A-1/A-7 change, not B-0. */
|
|
228
|
-
// ---------------------------------------------------------------------------
|
|
229
149
|
// ApiCanvasSource — a read CanvasSource backed entirely by the crtrd API
|
|
230
150
|
// ---------------------------------------------------------------------------
|
|
151
|
+
// NodeSummaryDTO now carries every NodeRow field and NodeDetailDTO extends it,
|
|
152
|
+
// so the viewer adapter returns the daemon's typed projections directly. It
|
|
153
|
+
// performs no lossy legacy reconstruction or invented local-presence values.
|
|
231
154
|
// The attach viewer's recurring subtree walk (chrome/canvas-panels.ts + overlays/graph.ts
|
|
232
155
|
// computeActivity/visitActivity) calls subscriptionsOf/subscribersOf once per
|
|
233
156
|
// visited node on every poll tick; each call was previously its own
|
|
@@ -279,12 +202,10 @@ export class ApiCanvasSource {
|
|
|
279
202
|
}
|
|
280
203
|
}
|
|
281
204
|
async getNode(nodeId) {
|
|
282
|
-
|
|
283
|
-
return detail ? detailToMeta(detail) : null;
|
|
205
|
+
return this.orNull(() => this.client.getNode(nodeId));
|
|
284
206
|
}
|
|
285
207
|
async getRow(nodeId) {
|
|
286
|
-
|
|
287
|
-
return detail ? summaryToRow(detail) : null;
|
|
208
|
+
return this.orNull(() => this.client.getNode(nodeId));
|
|
288
209
|
}
|
|
289
210
|
async listNodes(filter) {
|
|
290
211
|
const status = filter?.status;
|
|
@@ -302,7 +223,7 @@ export class ApiCanvasSource {
|
|
|
302
223
|
else {
|
|
303
224
|
rows = await this.client.listNodes();
|
|
304
225
|
}
|
|
305
|
-
return rows
|
|
226
|
+
return rows;
|
|
306
227
|
}
|
|
307
228
|
async subscriptionsOf(subscriber) {
|
|
308
229
|
const roster = await this.roster();
|
|
@@ -7,10 +7,7 @@
|
|
|
7
7
|
// Outside a TTY it prints the static forest and exits 0 (see runBrowse).
|
|
8
8
|
import { defineLeaf } from '../core/command.js';
|
|
9
9
|
import { runBrowse } from '../core/canvas/browse/app.js';
|
|
10
|
-
import {
|
|
11
|
-
import { resolveRemoteCanvasTarget } from '../core/remote-canvas-target.js';
|
|
12
|
-
import { RemoteEventStream } from '../core/canvas/remote-event-stream.js';
|
|
13
|
-
import { readState } from '../core/config.js';
|
|
10
|
+
import { ApiCanvasSource, cliClient } from './api-client.js';
|
|
14
11
|
import { getDefaultProfileId } from '../core/profiles/default-binding.js';
|
|
15
12
|
export const browseLeaf = defineLeaf({
|
|
16
13
|
name: 'browse',
|
|
@@ -41,13 +38,6 @@ export const browseLeaf = defineLeaf({
|
|
|
41
38
|
required: false,
|
|
42
39
|
constraint: 'Exact profile id for the initial profile filter (on by default; P toggles All profiles). Default: the launching node\'s profile via CRTR_PROFILE_ID, then this cwd\'s pinned default profile; absent means All profiles.',
|
|
43
40
|
},
|
|
44
|
-
{
|
|
45
|
-
kind: 'flag',
|
|
46
|
-
name: 'canvas',
|
|
47
|
-
type: 'string',
|
|
48
|
-
required: false,
|
|
49
|
-
constraint: 'Read from the named remote canvas target (see `crtr canvas config list`) instead of the local canvas. Overrides `crtr canvas use`.',
|
|
50
|
-
},
|
|
51
41
|
],
|
|
52
42
|
output: [],
|
|
53
43
|
outputKind: 'object',
|
|
@@ -63,20 +53,7 @@ export const browseLeaf = defineLeaf({
|
|
|
63
53
|
process.env['CRTR_PROFILE_ID'] ??
|
|
64
54
|
getDefaultProfileId(cwd) ??
|
|
65
55
|
undefined;
|
|
66
|
-
const
|
|
67
|
-
const source = cliCanvasSource({ canvasName });
|
|
68
|
-
// The EFFECTIVE remote target name — an explicit --canvas, or (mirroring
|
|
69
|
-
// resolveCanvasSource's own precedence) the durable `crtr canvas use`
|
|
70
|
-
// selection. Only a remote target needs an event stream; resolve its
|
|
71
|
-
// credentials ONCE here (not re-derived inside app.ts, which stays
|
|
72
|
-
// credential-agnostic).
|
|
73
|
-
const effectiveCanvasName = canvasName ?? readState('user').activeCanvas ?? undefined;
|
|
74
|
-
const eventStream = effectiveCanvasName !== undefined
|
|
75
|
-
? (() => {
|
|
76
|
-
const { previewEndpoint, relayToken } = resolveRemoteCanvasTarget(effectiveCanvasName);
|
|
77
|
-
return new RemoteEventStream(previewEndpoint, relayToken);
|
|
78
|
-
})()
|
|
79
|
-
: undefined;
|
|
56
|
+
const source = new ApiCanvasSource();
|
|
80
57
|
// The `x` close-out routes through the daemon API (browse `x` = finish the
|
|
81
58
|
// root to `done`); the callback keeps app.ts off the openDb-reaching
|
|
82
59
|
// runtime/close.js.
|
|
@@ -85,10 +62,7 @@ export const browseLeaf = defineLeaf({
|
|
|
85
62
|
cwd,
|
|
86
63
|
profileId,
|
|
87
64
|
source,
|
|
88
|
-
|
|
89
|
-
viewedNodeIds: effectiveCanvasName === undefined
|
|
90
|
-
? async () => new Set((await cliClient().listFocuses()).map((focus) => focus.node_id))
|
|
91
|
-
: undefined,
|
|
65
|
+
viewedNodeIds: async () => new Set((await cliClient().listFocuses()).map((focus) => focus.node_id)),
|
|
92
66
|
closeNode: (id) => cliClient().closeNode(id, { finish: true }).then((r) => ({ closed: r.closed })),
|
|
93
67
|
});
|
|
94
68
|
},
|
|
@@ -31,7 +31,7 @@ function maskedTarget(name, target, secrets) {
|
|
|
31
31
|
const canvasConfigAdd = defineLeaf({
|
|
32
32
|
name: 'add',
|
|
33
33
|
description: 'register a remote canvas target (preview endpoint + relay token)',
|
|
34
|
-
whenToUse: 'wiring up a remote canvas so `node inspect
|
|
34
|
+
whenToUse: 'wiring up a remote canvas so `node inspect` or `surface attach --canvas` can reach it \u2014 stores the preview endpoint in config.json and the raw relay token in the 0600 secrets store (never together, never persisted to config.json or logged). Re-running with the same name overwrites both.',
|
|
35
35
|
help: {
|
|
36
36
|
name: 'canvas config add',
|
|
37
37
|
summary: 'register (or overwrite) a named remote canvas target',
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// `crtr canvas use` — durably select which
|
|
2
|
-
// (`node inspect list/show
|
|
1
|
+
// `crtr canvas use` — durably select which remote-capable read commands
|
|
2
|
+
// (such as `node inspect list/show`) default onto: a named remote
|
|
3
3
|
// target, or back to local. A single leaf, not a branch — there is exactly
|
|
4
4
|
// one decision here (pick a target, or go local), not a family of verbs.
|
|
5
5
|
import { defineLeaf } from '../core/command.js';
|
|
@@ -10,7 +10,7 @@ const SCOPE = 'user';
|
|
|
10
10
|
export const canvasUseLeaf = defineLeaf({
|
|
11
11
|
name: 'use',
|
|
12
12
|
description: 'select the durable default canvas for read commands (a remote target, or local)',
|
|
13
|
-
whenToUse: 'switching what `node inspect list/show`
|
|
13
|
+
whenToUse: 'switching what remote-capable read commands such as `node inspect list/show` read from by default, without passing `--canvas <name>` on every invocation \u2014 select a remote target registered via `crtr canvas config add`, or switch back to local. A command\u2019s own `--canvas <name>` flag always overrides this for that one call.',
|
|
14
14
|
help: {
|
|
15
15
|
name: 'canvas use',
|
|
16
16
|
summary: 'select the durable default canvas (a registered remote target, or local) for read commands',
|
package/dist/commands/canvas.js
CHANGED
|
@@ -43,7 +43,7 @@ export function registerCanvas() {
|
|
|
43
43
|
help: {
|
|
44
44
|
name: 'canvas',
|
|
45
45
|
summary: 'observe and supervise the whole agent graph',
|
|
46
|
-
model: 'Canvas-wide operations, distinct from per-node work (`node`) and a node\'s own spine write verb (`push`). `dashboard` renders the subscription forest as a tree; `browse` opens an interactive full-screen navigator (tabs/tree/search) over the whole canvas and resumes the chosen node; `attention` aggregates pending human asks across the graph; `revive --all` mass-reconnects every disconnected node (bringing back ONE named node is `node lifecycle revive <id>` instead); `history` searches and recalls the content record (reports + context docs) of past work in a cwd; `prune` bounds growth by deleting terminal nodes past a TTL. `config` registers/lists remote canvas targets (preview endpoint + relay token); `use` switches read commands
|
|
46
|
+
model: 'Canvas-wide operations, distinct from per-node work (`node`) and a node\'s own spine write verb (`push`). `dashboard` renders the subscription forest as a tree; `browse` opens an interactive full-screen navigator (tabs/tree/search) over the whole canvas and resumes the chosen node; `attention` aggregates pending human asks across the graph; `revive --all` mass-reconnects every disconnected node (bringing back ONE named node is `node lifecycle revive <id>` instead); `history` searches and recalls the content record (reports + context docs) of past work in a cwd; `prune` bounds growth by deleting terminal nodes past a TTL. `config` registers/lists remote canvas targets (preview endpoint + relay token); `use` switches remote-capable read commands such as `node inspect` onto a configured target or back to local.',
|
|
47
47
|
},
|
|
48
48
|
children: [dashboardLeaf, canvasSnapshotLeaf, canvasRosterLeaf, browseLeaf, attentionBranch, reviveLeaf, historyBranch, chordLeaf, issueBranch, canvasPruneLeaf, canvasRebuildIndexLeaf, canvasConfigBranch, canvasUseLeaf],
|
|
49
49
|
});
|
package/dist/commands/cron.js
CHANGED
|
@@ -496,8 +496,12 @@ const cancelLeaf = defineLeaf({
|
|
|
496
496
|
},
|
|
497
497
|
run: async (input) => {
|
|
498
498
|
const id = requireCronId(input);
|
|
499
|
+
const runId = process.env['CRTR_RUN_ID'];
|
|
499
500
|
await cliClient()
|
|
500
|
-
.cancelCron(id,
|
|
501
|
+
.cancelCron(id, {
|
|
502
|
+
...scopeQuery(),
|
|
503
|
+
...(runId === undefined || runId === '' ? {} : { run_id: runId }),
|
|
504
|
+
})
|
|
501
505
|
.catch((err) => rethrowAsCliError(err, 'Check the id against `crtr cron list`.'));
|
|
502
506
|
return { canceled: id };
|
|
503
507
|
},
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import type { Deck, InteractionResponse } from '../../core/human/types.js';
|
|
2
1
|
export declare const humanList: import("../../core/command.js").LeafDef;
|
|
3
2
|
export declare const humanDeck: import("../../core/command.js").LeafDef;
|
|
4
|
-
/** Pure core of {@link coerceSingleSelect}, split out so it is testable without
|
|
5
|
-
* a deck.json on disk. */
|
|
6
|
-
export declare function coerceSingleSelectAgainst(responses: InteractionResponse[], deck: Deck): InteractionResponse[];
|
|
7
3
|
export declare const humanResolve: import("../../core/command.js").LeafDef;
|
|
8
4
|
export declare const humanCancel: import("../../core/command.js").LeafDef;
|