@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,79 @@
|
|
|
1
|
+
// The node-subtree slash command is provisioned with the node family.
|
|
2
|
+
export const pyramidSlash = {
|
|
3
|
+
name: 'pyramid',
|
|
4
|
+
description: 'Explain a topic as a live-building Minto pyramid diagram, backed by parallel explore agents.',
|
|
5
|
+
argumentHint: '<topic to explain>',
|
|
6
|
+
body: [
|
|
7
|
+
'# Pyramid explanation',
|
|
8
|
+
'',
|
|
9
|
+
'Explain **$ARGUMENTS** as a *pyramid*: lead with the answer, support it with a few key pillars, ground each pillar in evidence. You build this as a LIVE termrender diagram that fills in as parallel research lands — the user watches the skeleton grow into a complete picture.',
|
|
10
|
+
'',
|
|
11
|
+
'## The pyramid (Minto principle)',
|
|
12
|
+
'- **Apex** — ONE crisp sentence: the single governing answer/claim, the thing worth remembering.',
|
|
13
|
+
'- **Pillars** — 2–4 MECE supporting arguments that together prove the apex.',
|
|
14
|
+
'- **Base** — concrete evidence under each pillar (mechanisms, `file:line` refs, numbers, sources).',
|
|
15
|
+
'',
|
|
16
|
+
'Top-down: the reader gets the conclusion first, then descends for as much support as they want.',
|
|
17
|
+
'',
|
|
18
|
+
'## Workflow',
|
|
19
|
+
'',
|
|
20
|
+
'1. **Frame it.** Restate the topic in one line and commit to a *working* apex hypothesis (you will sharpen it). Name the 2–4 pillars you expect to need.',
|
|
21
|
+
'',
|
|
22
|
+
'2. **Scaffold the live diagram FIRST.** Write the termrender skeleton below to `./pyramid-<slug>.md` (apex = your hypothesis, pillars = titles, every base entry marked `[?]` pending). Then open it live so the user watches it build:',
|
|
23
|
+
' ```bash',
|
|
24
|
+
' termrender pane open ./pyramid-<slug>.md --watch # detached tmux side-pane; re-renders on every save',
|
|
25
|
+
' ```',
|
|
26
|
+
' Not in tmux? Tell the user to run `termrender doc watch ./pyramid-<slug>.md` in another terminal, then continue regardless.',
|
|
27
|
+
'',
|
|
28
|
+
'3. **Investigate in parallel — do not block.** Fan out ONE explore agent per pillar/unknown AND dig into what you can answer yourself, concurrently:',
|
|
29
|
+
' ```bash',
|
|
30
|
+
' crtr node new "Investigate: <focused question for this pillar>. Report findings with sources / file:line refs." --kind explore',
|
|
31
|
+
' ```',
|
|
32
|
+
' You auto-subscribe; each finish wakes you. Never poll or wait — kick them all off, then start filling in what you already know.',
|
|
33
|
+
'',
|
|
34
|
+
'4. **Live-update as findings land.** Every time you learn something — your own digging or an explore report — EDIT the diagram file: flip a `[?]` to `[x]` (or `[!]` for a caveat/risk), add evidence under the right pillar, sharpen or rewrite the apex, drop a pillar that did not hold. Each save re-renders the pane. The diagram visibly grows skeleton → complete.',
|
|
35
|
+
'',
|
|
36
|
+
'5. **Land it.** When the apex is one crisp sentence, the pillars are MECE, and the base is concrete, do a final pass for accuracy, then give the user a 3–4 sentence spoken summary that mirrors apex → pillars. Tell them the diagram file path.',
|
|
37
|
+
'',
|
|
38
|
+
'## termrender skeleton (write this verbatim, then keep editing it)',
|
|
39
|
+
'',
|
|
40
|
+
'Apex panel on top, a divider, then the pillars as a row of boxes below — a literal pyramid: 1 claim over N supports.',
|
|
41
|
+
'```markdown',
|
|
42
|
+
':::panel{title="<TOPIC>" color="cyan"}',
|
|
43
|
+
'**<one-line apex answer — your governing claim>**',
|
|
44
|
+
':::',
|
|
45
|
+
'',
|
|
46
|
+
':::divider{label="why"}',
|
|
47
|
+
':::',
|
|
48
|
+
'',
|
|
49
|
+
'::::::columns',
|
|
50
|
+
':::::col{width="33%"}',
|
|
51
|
+
'::::panel{title="Pillar 1 — <claim>" color="green"}',
|
|
52
|
+
':::tree',
|
|
53
|
+
'evidence A [x]',
|
|
54
|
+
'evidence B [?]',
|
|
55
|
+
':::',
|
|
56
|
+
'::::',
|
|
57
|
+
':::::',
|
|
58
|
+
':::::col{width="33%"}',
|
|
59
|
+
'::::panel{title="Pillar 2 — <claim>" color="green"}',
|
|
60
|
+
':::tree',
|
|
61
|
+
'evidence C [?]',
|
|
62
|
+
':::',
|
|
63
|
+
'::::',
|
|
64
|
+
':::::',
|
|
65
|
+
':::::col{width="34%"}',
|
|
66
|
+
'::::panel{title="Pillar 3 — <claim>" color="green"}',
|
|
67
|
+
':::tree',
|
|
68
|
+
'evidence D [?]',
|
|
69
|
+
':::',
|
|
70
|
+
'::::',
|
|
71
|
+
':::::',
|
|
72
|
+
'::::::',
|
|
73
|
+
'```',
|
|
74
|
+
'',
|
|
75
|
+
'**Nesting rule (termrender will reject the file otherwise): an OUTER directive needs strictly MORE colons than the directive nested inside it.** Hence `::::::columns` (6) wraps `:::::col` (5) wraps `::::panel` (4) wraps `:::tree` (3). Every block closes with a bare run of its OWN colon count on its own line. Run `termrender doc check ./pyramid-<slug>.md` after each edit — if it errors, fix the colon counts before re-saving.',
|
|
76
|
+
'',
|
|
77
|
+
'Markers inside a tree: `[x]` → ✔ confirmed, `[!]` → ⚠ caveat/risk; `[?]` is not a marker and stays literal — use it for still-pending. Write structure only — termrender draws every box, border, and guide line; never hand-draw ASCII. Keep the apex to one sentence; push all detail into the base.',
|
|
78
|
+
].join('\n'),
|
|
79
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const nodeSubscription: import("../../core/command.js").BranchDef;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// `crtr node subscription` — push-delivery edge controls.
|
|
2
|
+
import { defineBranch, defineLeaf } from '../../core/command.js';
|
|
3
|
+
import { InputError } from '../../core/io.js';
|
|
4
|
+
import { cliClient, rethrowAsCliError } from '../api-client.js';
|
|
5
|
+
function resolveSubscriber(input) {
|
|
6
|
+
const sub = input['subscriber'] ?? process.env['CRTR_NODE_ID'];
|
|
7
|
+
if (sub === undefined || sub === '') {
|
|
8
|
+
throw new InputError({ error: 'no_subscriber', message: 'no subscriber (set CRTR_NODE_ID or pass --subscriber)', field: 'subscriber', next: 'Run from inside a node, or pass --subscriber <id>.' });
|
|
9
|
+
}
|
|
10
|
+
return sub;
|
|
11
|
+
}
|
|
12
|
+
const nodeSubscribe = defineLeaf({
|
|
13
|
+
name: 'add',
|
|
14
|
+
description: 'wire a subscribes_to edge between any pair (active or --passive)',
|
|
15
|
+
whenToUse: 'you want to make one node receive another node’s pushes, actively or passively. Managed-child creation already adds its active edge; use this for other subscriber-to-publisher pairs',
|
|
16
|
+
help: {
|
|
17
|
+
name: 'node subscription add',
|
|
18
|
+
summary: 'wire a subscribes_to edge so one node receives another\'s pushes — the subscriber can be you (default) or, with --subscriber, ANY node, to ANY publisher. Re-running flips an existing edge\'s active/passive mode.',
|
|
19
|
+
params: [
|
|
20
|
+
{ kind: 'positional', name: 'publisher', required: true, constraint: 'The node to subscribe TO — whose pushes get delivered to the subscriber.' },
|
|
21
|
+
{ kind: 'flag', name: 'subscriber', type: 'string', required: false, constraint: 'Who receives the pushes. Defaults to the calling node (CRTR_NODE_ID). Pass any node id to wire a third party.' },
|
|
22
|
+
{ kind: 'flag', name: 'passive', type: 'bool', required: false, constraint: 'Passive subscription: pushes ACCUMULATE without waking the subscriber, then auto-inject as timestamped XML pre-text on its next message. Omit for an active (wake-on-push) subscription.' },
|
|
23
|
+
],
|
|
24
|
+
output: [
|
|
25
|
+
{ name: 'subscribed', type: 'boolean', required: true, constraint: 'True when the edge was created/updated.' },
|
|
26
|
+
{ name: 'subscriber', type: 'string', required: true, constraint: 'The receiving node.' },
|
|
27
|
+
{ name: 'publisher', type: 'string', required: true, constraint: 'The node being subscribed to.' },
|
|
28
|
+
{ name: 'mode', type: 'string', required: true, constraint: '"active" (wakes on push) or "passive" (accumulates, no wake).' },
|
|
29
|
+
],
|
|
30
|
+
outputKind: 'object',
|
|
31
|
+
effects: ['Upserts a subscribes_to edge in canvas.db (active flag set from --passive).', 'Passive edges never wake the subscriber and do not hold it alive (excluded from the stop-guard).'],
|
|
32
|
+
},
|
|
33
|
+
run: async (input) => {
|
|
34
|
+
const publisher = input['publisher'];
|
|
35
|
+
const subscriber = resolveSubscriber(input);
|
|
36
|
+
const passive = input['passive'] === true;
|
|
37
|
+
if (subscriber === publisher) {
|
|
38
|
+
throw new InputError({ error: 'self_subscribe', message: 'a node cannot subscribe to itself', next: 'Pick a different publisher.' });
|
|
39
|
+
}
|
|
40
|
+
await cliClient()
|
|
41
|
+
.subscribe(subscriber, { target: publisher, active: !passive })
|
|
42
|
+
.catch((err) => rethrowAsCliError(err));
|
|
43
|
+
return { subscribed: true, subscriber, publisher, mode: passive ? 'passive' : 'active' };
|
|
44
|
+
},
|
|
45
|
+
render: (r) => `Subscribed ${r['subscriber']} → ${r['publisher']} (${r['mode']}).`,
|
|
46
|
+
});
|
|
47
|
+
const nodeUnsubscribe = defineLeaf({
|
|
48
|
+
name: 'remove',
|
|
49
|
+
description: 'drop a subscribes_to edge',
|
|
50
|
+
whenToUse: 'you want to stop one node receiving a publisher’s pushes; removal is idempotent',
|
|
51
|
+
help: {
|
|
52
|
+
name: 'node subscription remove',
|
|
53
|
+
summary: 'drop a subscribes_to edge — the subscriber (you by default, or any node via --subscriber) stops receiving the publisher\'s pushes.',
|
|
54
|
+
params: [
|
|
55
|
+
{ kind: 'positional', name: 'publisher', required: true, constraint: 'The node to stop subscribing to.' },
|
|
56
|
+
{ kind: 'flag', name: 'subscriber', type: 'string', required: false, constraint: 'Who to detach. Defaults to the calling node (CRTR_NODE_ID).' },
|
|
57
|
+
],
|
|
58
|
+
output: [
|
|
59
|
+
{ name: 'unsubscribed', type: 'boolean', required: true, constraint: 'True when the edge was removed (idempotent — also true if none existed).' },
|
|
60
|
+
{ name: 'subscriber', type: 'string', required: true, constraint: 'The detached node.' },
|
|
61
|
+
{ name: 'publisher', type: 'string', required: true, constraint: 'The node it stopped subscribing to.' },
|
|
62
|
+
],
|
|
63
|
+
outputKind: 'object',
|
|
64
|
+
effects: ['Deletes the subscribes_to edge from canvas.db.'],
|
|
65
|
+
},
|
|
66
|
+
run: async (input) => {
|
|
67
|
+
const publisher = input['publisher'];
|
|
68
|
+
const subscriber = resolveSubscriber(input);
|
|
69
|
+
await cliClient()
|
|
70
|
+
.unsubscribe(subscriber, publisher)
|
|
71
|
+
.catch((err) => rethrowAsCliError(err));
|
|
72
|
+
return { unsubscribed: true, subscriber, publisher };
|
|
73
|
+
},
|
|
74
|
+
render: (r) => `Unsubscribed ${r['subscriber']} from ${r['publisher']}.`,
|
|
75
|
+
});
|
|
76
|
+
export const nodeSubscription = defineBranch({
|
|
77
|
+
name: 'subscription',
|
|
78
|
+
description: 'manage push-delivery edges between nodes',
|
|
79
|
+
whenToUse: 'you need an ongoing active or passive subscriber-to-publisher delivery edge that spawn did not create, or need to remove one',
|
|
80
|
+
help: { name: 'node subscription', summary: 'add or remove subscriber-to-publisher push-delivery edges' },
|
|
81
|
+
children: [nodeSubscribe, nodeUnsubscribe],
|
|
82
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const nodeWaitBranch: import("../../core/command.js").BranchDef;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// `crtr node wait` — durable controller and deadline waits.
|
|
2
|
+
import { defineBranch, defineLeaf } from '../../core/command.js';
|
|
3
|
+
import { InputError } from '../../core/io.js';
|
|
4
|
+
import { parseWhen } from '../../core/wake.js';
|
|
5
|
+
import { cliClient, getNodeOrNull, rethrowAsCliError } from '../api-client.js';
|
|
6
|
+
import { shellQuote } from '../surface/node/placement.js';
|
|
7
|
+
function armerId() {
|
|
8
|
+
const id = process.env['CRTR_NODE_ID'];
|
|
9
|
+
if (id === undefined || id === '') {
|
|
10
|
+
throw new InputError({ error: 'no_node', message: 'no node to anchor a deadline cron (CRTR_NODE_ID unset)', next: 'Run from inside a node.' });
|
|
11
|
+
}
|
|
12
|
+
return id;
|
|
13
|
+
}
|
|
14
|
+
/** Build ParseOpts, including `tz` only when actually provided. */
|
|
15
|
+
function parseOpts(now, tz) {
|
|
16
|
+
return tz !== undefined && tz.trim() !== '' ? { tz, now } : { now };
|
|
17
|
+
}
|
|
18
|
+
/** Map a time-grammar error to the rendered error block. */
|
|
19
|
+
function throwTimeError(e) {
|
|
20
|
+
const next = {
|
|
21
|
+
wake_in_past: 'Pick a future instant — a positive duration ("5m","2h") or an ISO time later than now.',
|
|
22
|
+
bad_when: 'Use a duration ("5m","1h30m"), a zoned ISO ("2026-06-07T09:00:00Z"), or a bare ISO ("2026-06-07T09:00").',
|
|
23
|
+
bad_cadence: 'Use a duration ("6h"), a 5-field cron ("0 9 * * *"), or an @alias ("@daily").',
|
|
24
|
+
unknown_zone: 'Pass --tz with an IANA zone name (e.g. "America/New_York").',
|
|
25
|
+
cadence_too_fast: 'Use a cadence of at least 60s (e.g. "1m","5m","1h").',
|
|
26
|
+
};
|
|
27
|
+
throw new InputError({ error: e.code, message: e.message, received: e.received, next: next[e.code] ?? 'Fix the time value and retry.' });
|
|
28
|
+
}
|
|
29
|
+
/** A human ETA hint like " (~5m)" from a fire-at ISO relative to now. '' if past. */
|
|
30
|
+
function etaHint(fireAt, now) {
|
|
31
|
+
const ms = new Date(fireAt).getTime() - now.getTime();
|
|
32
|
+
if (!Number.isFinite(ms) || ms <= 0)
|
|
33
|
+
return '';
|
|
34
|
+
const mins = Math.round(ms / 60_000);
|
|
35
|
+
if (mins < 60)
|
|
36
|
+
return ` (~${mins}m)`;
|
|
37
|
+
const hrs = Math.round(ms / 3_600_000);
|
|
38
|
+
if (hrs < 48)
|
|
39
|
+
return ` (~${hrs}h)`;
|
|
40
|
+
return ` (~${Math.round(ms / 86_400_000)}d)`;
|
|
41
|
+
}
|
|
42
|
+
function deadlineHeredoc(body, nodeId) {
|
|
43
|
+
let delimiter = 'CRTR_DEADLINE';
|
|
44
|
+
let suffix = 0;
|
|
45
|
+
const lines = new Set(body.split('\n'));
|
|
46
|
+
while (lines.has(delimiter))
|
|
47
|
+
delimiter = `CRTR_DEADLINE_${++suffix}`;
|
|
48
|
+
return `crtr node message send --to ${shellQuote(nodeId)} --tier urgent <<'${delimiter}'\n${body}\n${delimiter}`;
|
|
49
|
+
}
|
|
50
|
+
const nodeWaitDeadline = defineLeaf({
|
|
51
|
+
name: 'deadline',
|
|
52
|
+
description: 'race this node’s next wake against one urgent deadline cron',
|
|
53
|
+
whenToUse: 'you are waiting on an event nothing can push for, so a self-scheduled deadline must settle the wait',
|
|
54
|
+
help: {
|
|
55
|
+
name: 'node wait deadline',
|
|
56
|
+
summary: 'arm one cancel-on-wake deadline cron for this node',
|
|
57
|
+
params: [
|
|
58
|
+
{ kind: 'stdin', name: 'body', required: true, constraint: 'Policy delivered urgently to this node if the deadline fires first.' },
|
|
59
|
+
{ kind: 'flag', name: 'until', type: 'string', required: true, constraint: 'Future duration, zoned ISO timestamp, or bare ISO timestamp interpreted in --tz or host-local time.' },
|
|
60
|
+
{ kind: 'flag', name: 'tz', type: 'string', required: false, constraint: 'IANA timezone for a bare ISO --until value.' },
|
|
61
|
+
],
|
|
62
|
+
output: [
|
|
63
|
+
{ name: 'id', type: 'string', required: true, constraint: 'The armed cron id.' },
|
|
64
|
+
{ name: 'name', type: 'string', required: true, constraint: 'The cron label.' },
|
|
65
|
+
{ name: 'fires_at', type: 'string', required: true, constraint: 'Absolute UTC deadline.' },
|
|
66
|
+
{ name: 'guidance', type: 'string', required: true, constraint: 'How to inspect the cron and dorm.' },
|
|
67
|
+
],
|
|
68
|
+
outputKind: 'object',
|
|
69
|
+
effects: [
|
|
70
|
+
'Arms one anchored cancel-on-wake cron. Any wake of this node cancels it; otherwise it urgently sends the body to this node at the deadline.',
|
|
71
|
+
'Re-arming replaces this node’s pending deadline rather than stacking a second.',
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
run: async (input) => {
|
|
75
|
+
const self = armerId();
|
|
76
|
+
const body = typeof input['body'] === 'string' ? input['body'].trim() : '';
|
|
77
|
+
if (body === '')
|
|
78
|
+
throw new InputError({ error: 'empty_body', message: 'a deadline body is required', field: 'body', next: 'Pass the timeout policy on stdin.' });
|
|
79
|
+
const until = typeof input['until'] === 'string' ? input['until'].trim() : '';
|
|
80
|
+
if (until === '')
|
|
81
|
+
throw new InputError({ error: 'missing_until', message: '--until is required', field: 'until', next: 'Pass a future duration or timestamp.' });
|
|
82
|
+
const tz = typeof input['tz'] === 'string' && input['tz'].trim() !== '' ? input['tz'] : undefined;
|
|
83
|
+
const now = new Date();
|
|
84
|
+
const parsed = parseWhen(until, parseOpts(now, tz));
|
|
85
|
+
if ('error' in parsed)
|
|
86
|
+
throwTimeError(parsed.error);
|
|
87
|
+
const profile = process.env['CRTR_PROFILE_ID'];
|
|
88
|
+
// One deadline per node: the arm seam REPLACES this node's pending
|
|
89
|
+
// cancel-on-wake cron rather than stacking a second one (see armCron in
|
|
90
|
+
// core/canvas/crons.ts, where the invariant is enforced for every caller).
|
|
91
|
+
const cron = await cliClient().armCron({
|
|
92
|
+
name: `deadline:${self}`,
|
|
93
|
+
command: deadlineHeredoc(body, self),
|
|
94
|
+
fire_at: parsed.fireAt,
|
|
95
|
+
recur: null,
|
|
96
|
+
tz: tz ?? null,
|
|
97
|
+
created_by: self,
|
|
98
|
+
cwd: process.cwd(),
|
|
99
|
+
profile: profile !== undefined && profile !== '' ? profile : null,
|
|
100
|
+
scope: 'profile',
|
|
101
|
+
on_output: 'on-failure',
|
|
102
|
+
sink: null,
|
|
103
|
+
tier: 'normal',
|
|
104
|
+
expires_at: null,
|
|
105
|
+
anchor_node: self,
|
|
106
|
+
cancel_on_wake: true,
|
|
107
|
+
run_timeout_s: 300,
|
|
108
|
+
overlap: 'skip',
|
|
109
|
+
}).catch(rethrowAsCliError);
|
|
110
|
+
const guidance = `Deadline cron armed for ${cron.fire_at}${etaHint(cron.fire_at, now)}. End your turn to dorm; any earlier wake cancels it. Inspect pending schedules with \`crtr cron list\`.`;
|
|
111
|
+
return { id: cron.cron_id, name: cron.name, fires_at: cron.fire_at, guidance };
|
|
112
|
+
},
|
|
113
|
+
render: (r) => `Deadline cron armed — ${r['name']} (${r['id']}), fires ${r['fires_at']}.\n\n${r['guidance']}`,
|
|
114
|
+
});
|
|
115
|
+
const nodeWait = defineLeaf({
|
|
116
|
+
name: 'controller',
|
|
117
|
+
description: 'wait durably for a named controller message',
|
|
118
|
+
whenToUse: 'you are a terminal node blocked on one specific live parent or controller and have no managed-child subscription whose report will wake you',
|
|
119
|
+
help: {
|
|
120
|
+
name: 'node wait controller',
|
|
121
|
+
summary: 'declare that your next stop may dorm only until one live controller delivers an inbox message',
|
|
122
|
+
params: [
|
|
123
|
+
{ kind: 'positional', name: 'controller', type: 'string', required: true, constraint: 'Live node id expected to send the message. It may be your parent or another named controller, but cannot be yourself.' },
|
|
124
|
+
],
|
|
125
|
+
output: [
|
|
126
|
+
{ name: 'node_id', type: 'string', required: true, constraint: 'The terminal node that declared the wait.' },
|
|
127
|
+
{ name: 'controller', type: 'string', required: true, constraint: 'The named live sender whose next inbox delivery clears this wait.' },
|
|
128
|
+
],
|
|
129
|
+
outputKind: 'object',
|
|
130
|
+
effects: ['Durably records the controller on this node. The stop guard permits dormancy only while that controller remains active or idle; its next inbox delivery clears the record before the delivery wakes this node.'],
|
|
131
|
+
},
|
|
132
|
+
run: async (input) => {
|
|
133
|
+
const nodeId = process.env['CRTR_NODE_ID'];
|
|
134
|
+
if (nodeId === undefined || nodeId === '')
|
|
135
|
+
throw new InputError({ error: 'no_node', message: 'no node to wait (CRTR_NODE_ID unset)', next: 'Run from inside the terminal node that is blocked.' });
|
|
136
|
+
const node = await getNodeOrNull(nodeId);
|
|
137
|
+
if (node === null)
|
|
138
|
+
throw new InputError({ error: 'not_found', message: `no node: ${nodeId}`, next: 'Run from a live canvas node.' });
|
|
139
|
+
if (node.lifecycle !== 'terminal')
|
|
140
|
+
throw new InputError({ error: 'resident_node', message: `node ${nodeId} is resident and may already dorm on its inbox`, next: 'Use this only from a terminal node that needs the stop guard to recognize a controller dependency.' });
|
|
141
|
+
const controller = String(input['controller']).trim();
|
|
142
|
+
if (controller === nodeId)
|
|
143
|
+
throw new InputError({ error: 'self_controller', message: 'a node cannot wait for its own message', field: 'controller', next: 'Name the parent or external controller expected to send the message.' });
|
|
144
|
+
// The server validates the controller exists + is live and records the wait
|
|
145
|
+
// (handleWait); a 404/422 surfaces as the clean CLI error.
|
|
146
|
+
await cliClient()
|
|
147
|
+
.waitNode(nodeId, { controller })
|
|
148
|
+
.catch((err) => rethrowAsCliError(err));
|
|
149
|
+
return { node_id: nodeId, controller };
|
|
150
|
+
},
|
|
151
|
+
render: (r) => `Waiting for controller ${r['controller']}. End your turn to dorm; its next message wakes you and clears this wait.`,
|
|
152
|
+
});
|
|
153
|
+
export const nodeWaitBranch = defineBranch({
|
|
154
|
+
name: 'wait',
|
|
155
|
+
description: 'declare a durable controller or deadline wait',
|
|
156
|
+
whenToUse: 'a terminal node must dorm for one named controller, or race its inbox against a self-scheduled deadline',
|
|
157
|
+
help: { name: 'node wait', summary: 'declare durable wait state; choose the event that settles it' },
|
|
158
|
+
children: [nodeWait, nodeWaitDeadline],
|
|
159
|
+
});
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
// The mass-recovery form — reconnect EVERY disconnected node at once after a
|
|
16
16
|
// reboot/crash — is genuinely graph-wide and stays at `canvas revive --all`
|
|
17
17
|
// (src/commands/revive.ts).
|
|
18
|
-
import { createConnection } from 'node:net';
|
|
19
18
|
import { existsSync } from 'node:fs';
|
|
20
19
|
import { join } from 'node:path';
|
|
21
20
|
import { defineLeaf } from '../core/command.js';
|
|
@@ -28,15 +27,16 @@ import { cliClient, rethrowAsCliError } from './api-client.js';
|
|
|
28
27
|
// imported from a db-free module: `recordedPidLiveness` (pid.js → fs/ps only),
|
|
29
28
|
// `readFault` (fault.js → paths.js pure helpers + events), `faultNeedsYou`
|
|
30
29
|
// (status-glyph.js → fault.js), and `fullName` from labels.js DIRECTLY (NOT the
|
|
31
|
-
// canvas barrel `index.js`, which re-exports `openDb`). `
|
|
32
|
-
//
|
|
33
|
-
// `assertReopenGate`/`waitForBrokerViewSocket`/`isBusy`
|
|
34
|
-
// db barrel and are replaced by the client call +
|
|
30
|
+
// canvas barrel `index.js`, which re-exports `openDb`). `jobDir` is a pure path
|
|
31
|
+
// helper, and view-socket readiness comes from the db-free probe owner. The former
|
|
32
|
+
// direct `reviveNode`/`getNode`/`assertReopenGate`/`waitForBrokerViewSocket`/`isBusy`
|
|
33
|
+
// imports all reached the db barrel and are replaced by the client call + helpers below.
|
|
35
34
|
import { recordedPidLiveness } from '../core/canvas/pid.js';
|
|
36
35
|
import { readFault } from '../core/runtime/fault.js';
|
|
37
36
|
import { fullName } from '../core/canvas/labels.js';
|
|
38
37
|
import { faultNeedsYou } from '../core/canvas/status-glyph.js';
|
|
39
|
-
import {
|
|
38
|
+
import { jobDir } from '../core/canvas/paths.js';
|
|
39
|
+
import { waitForViewSocketReady } from '../core/runtime/view-socket.js';
|
|
40
40
|
/** --now eligibility for a live, non-busy fault: a daemon-owned AUTO retry
|
|
41
41
|
* (kick it early instead of waiting out the schedule), or any fault the
|
|
42
42
|
* canvas dashboard flags "needs you" (`faultNeedsYou`, status-glyph.ts) — the
|
|
@@ -55,59 +55,12 @@ export function isNowEligibleFault(fault) {
|
|
|
55
55
|
// ---------------------------------------------------------------------------
|
|
56
56
|
// Local, db-free helpers (inlined so the leaf never imports the canvas barrel)
|
|
57
57
|
// ---------------------------------------------------------------------------
|
|
58
|
-
const VIEW_SOCKET_WAIT_MS = 30_000;
|
|
59
|
-
const VIEW_SOCKET_RETRY_MS = 100;
|
|
60
|
-
function sleep(ms) {
|
|
61
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
62
|
-
}
|
|
63
58
|
/** Inlined from `runtime/busy.ts` (which reaches the canvas barrel via `jobDir`):
|
|
64
|
-
*
|
|
65
|
-
*
|
|
59
|
+
* is the node mid-turn right now? `<jobDir>/busy` exists for the span pi is
|
|
60
|
+
* inside a run. `jobDir` here is the pure path helper from paths.js. */
|
|
66
61
|
function nodeIsBusy(nodeId) {
|
|
67
62
|
return existsSync(join(jobDir(nodeId), 'busy'));
|
|
68
63
|
}
|
|
69
|
-
/** Copy of `placement.ts`'s `probeBrokerViewSocket` (placement reaches the canvas
|
|
70
|
-
* barrel, so it cannot be imported here): resolve true iff the socket accepts a
|
|
71
|
-
* connection within `timeoutMs`. */
|
|
72
|
-
function probeViewSocket(sockPath, timeoutMs) {
|
|
73
|
-
return new Promise((resolve) => {
|
|
74
|
-
let settled = false;
|
|
75
|
-
let socket = null;
|
|
76
|
-
const finish = (ok) => {
|
|
77
|
-
if (settled)
|
|
78
|
-
return;
|
|
79
|
-
settled = true;
|
|
80
|
-
if (socket !== null)
|
|
81
|
-
socket.destroy();
|
|
82
|
-
resolve(ok);
|
|
83
|
-
};
|
|
84
|
-
try {
|
|
85
|
-
socket = createConnection(sockPath);
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
finish(false);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
socket.once('connect', () => finish(true));
|
|
92
|
-
socket.once('error', () => finish(false));
|
|
93
|
-
socket.setTimeout(timeoutMs, () => finish(false));
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
/** Drop-in for `placement.ts`'s `waitForBrokerViewSocket` (sans the broker-exit
|
|
97
|
-
* race — the CLI leaf drives the revive over the daemon and holds no launch
|
|
98
|
-
* handle). Poll the node's view.sock until it accepts a connection or the
|
|
99
|
-
* deadline passes; a `connect` (not mere file existence) proves a live listener,
|
|
100
|
-
* so the caller can attach/dial immediately on return. */
|
|
101
|
-
async function waitForViewSocketReady(nodeId) {
|
|
102
|
-
const sockPath = viewSocketPath(nodeId);
|
|
103
|
-
const deadline = Date.now() + VIEW_SOCKET_WAIT_MS;
|
|
104
|
-
while (Date.now() <= deadline) {
|
|
105
|
-
if (await probeViewSocket(sockPath, VIEW_SOCKET_RETRY_MS))
|
|
106
|
-
return true;
|
|
107
|
-
await sleep(VIEW_SOCKET_RETRY_MS);
|
|
108
|
-
}
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
64
|
export const nodeReviveLeaf = defineLeaf({
|
|
112
65
|
name: 'revive',
|
|
113
66
|
description: 'reopen a window for a done/idle/dead/canceled node',
|
|
@@ -270,8 +223,8 @@ export const nodeReviveLeaf = defineLeaf({
|
|
|
270
223
|
rethrowAsCliError(e);
|
|
271
224
|
}
|
|
272
225
|
// The revive route returns once the broker process is launched, which can be
|
|
273
|
-
// seconds before its view.sock listens.
|
|
274
|
-
//
|
|
226
|
+
// seconds before its view.sock listens. Clients that attach immediately on
|
|
227
|
+
// return need this leaf to wait until the socket accepts.
|
|
275
228
|
const ready = await waitForViewSocketReady(nodeId);
|
|
276
229
|
return {
|
|
277
230
|
// Always null (broker headless, no tmux window); `undefined` omits it from
|
package/dist/commands/node.d.ts
CHANGED
|
@@ -1,44 +1,2 @@
|
|
|
1
1
|
import { type BranchDef } from '../core/command.js';
|
|
2
|
-
/** Decision road sign for a managed (non-root) child. Normally STD_CHILD_FOLLOW_UP,
|
|
3
|
-
* but when the SPAWNER is an orchestrator whose context has already grown past
|
|
4
|
-
* YIELD_NUDGE_THRESHOLD, steer it to yield now and let its fresh revive handle
|
|
5
|
-
* the child's result. */
|
|
6
|
-
export declare function childFollowUp(spawnerId: string | undefined): Promise<string>;
|
|
7
|
-
interface FocusViewerOpts {
|
|
8
|
-
cwd: string;
|
|
9
|
-
name: string;
|
|
10
|
-
pane?: string;
|
|
11
|
-
newPane?: boolean;
|
|
12
|
-
inPlace?: boolean;
|
|
13
|
-
}
|
|
14
|
-
interface FocusViewerResult {
|
|
15
|
-
focused: boolean;
|
|
16
|
-
session: string | null;
|
|
17
|
-
inPlace: boolean;
|
|
18
|
-
revived: boolean;
|
|
19
|
-
}
|
|
20
|
-
/** Bring a node's ONE viewer forefront beside (or navigated to) the caller —
|
|
21
|
-
* the pure-tmux port of placement.ts `focus()`. The server (`ensureAttach`)
|
|
22
|
-
* owns the broker revive + the view.sock accept-wait; the `@crtr_node` pane tag
|
|
23
|
-
* is the viewer registry. crtr is tmux-only: no caller pane ⇒ not focused. */
|
|
24
|
-
export declare function focusViewer(nodeId: string, opts: FocusViewerOpts): Promise<FocusViewerResult>;
|
|
25
|
-
export declare const surfaceNodeFocusLeaf: import("../core/command.js").LeafDef;
|
|
26
|
-
/** The node "in front of you" in a tmux pane, resolved PURELY from the pane's
|
|
27
|
-
* `@crtr_node` tag. Defaults to $TMUX_PANE / the caller's current pane when
|
|
28
|
-
* `pane` is omitted — shared by `node lifecycle recycle` / `node lifecycle
|
|
29
|
-
* demote` / `node config --lifecycle` / `node lifecycle close` / `surface node cycle`,
|
|
30
|
-
* and the `canvas chord` leaf.
|
|
31
|
-
*
|
|
32
|
-
* A `crtr surface attach` viewer self-tags its pane with the node it views
|
|
33
|
-
* (`@crtr_node`) — the tag IS the handle (a broker engine runs DETACHED with
|
|
34
|
-
* window=null, so there is no window→node fallback). Kept SYNC + tag-only: the
|
|
35
|
-
* re-plumbed CLI no longer reads canvas state to confirm the tagged node is
|
|
36
|
-
* still live, so a stale tag (attach SIGKILLed without clearing) resolves until
|
|
37
|
-
* the pane is respawned. Callers that mutate then re-validate the id via the
|
|
38
|
-
* API (getNode 404 → clean error). */
|
|
39
|
-
export declare function nodeInPane(pane?: string): string | undefined;
|
|
40
|
-
export declare const surfaceNodeIdLeaf: import("../core/command.js").LeafDef;
|
|
41
|
-
export declare const surfaceNodePinLeaf: import("../core/command.js").LeafDef;
|
|
42
|
-
export declare const surfaceNodeCycleLeaf: import("../core/command.js").LeafDef;
|
|
43
2
|
export declare function registerNode(): BranchDef;
|
|
44
|
-
export {};
|