@north-light/crouter 0.3.173 → 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} +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/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,7 +1,7 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
|
-
import { dirname, join } from 'node:path';
|
|
2
|
+
import { basename, dirname, extname, join } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import { customExtensionPaths } from '../canvas/extensions.js';
|
|
4
|
+
import { customExtensionPaths, isShippedCanvasExtension } from '../canvas/extensions.js';
|
|
5
5
|
function resolveExtension(name) {
|
|
6
6
|
const here = dirname(fileURLToPath(import.meta.url)); // dist/core/runtime or src/core/runtime
|
|
7
7
|
const candidates = [
|
|
@@ -63,7 +63,16 @@ export function mergeCanvasExtensions(persisted) {
|
|
|
63
63
|
export function assertMandatoryCanvasExtensions(extensions) {
|
|
64
64
|
const required = new Set(CANVAS_EXTENSIONS);
|
|
65
65
|
const seen = new Map();
|
|
66
|
+
const canvasBasenames = new Set();
|
|
66
67
|
for (const ext of extensions) {
|
|
68
|
+
if (isShippedCanvasExtension(ext)) {
|
|
69
|
+
const filename = basename(ext.replaceAll('\\', '/'));
|
|
70
|
+
const name = filename.slice(0, filename.length - extname(filename).length);
|
|
71
|
+
if (canvasBasenames.has(name)) {
|
|
72
|
+
throw new Error(`duplicate mandatory canvas extension basename ${name}`);
|
|
73
|
+
}
|
|
74
|
+
canvasBasenames.add(name);
|
|
75
|
+
}
|
|
67
76
|
if (!required.has(ext))
|
|
68
77
|
continue;
|
|
69
78
|
seen.set(ext, (seen.get(ext) ?? 0) + 1);
|
|
@@ -19,7 +19,7 @@ function faultPriority(fault) {
|
|
|
19
19
|
return 2;
|
|
20
20
|
return 1;
|
|
21
21
|
}
|
|
22
|
-
const faultLinks = ['pi→provider', 'viewer↔broker', 'relay↔broker', '
|
|
22
|
+
const faultLinks = ['pi→provider', 'viewer↔broker', 'relay↔broker', 'viewer↔crtrd', 'cli→exa', 'daemon→node', 'crtr→pi'];
|
|
23
23
|
const faultKinds = ['rate-limit', 'overloaded', 'connection', 'auth', 'protocol', 'context-overflow', 'other', 'wedged', 'model-not-found'];
|
|
24
24
|
function parseFault(raw) {
|
|
25
25
|
try {
|
|
@@ -27,6 +27,15 @@ export declare const MODEL_STRENGTHS: ModelStrength[];
|
|
|
27
27
|
* and then fails/falls back through the normal auth-aware launch policy. */
|
|
28
28
|
export declare function configuredLadderProviders(isConfigured: (runtimeProviderId: string) => boolean, ladders?: ScopeConfig['modelLadders']): ModelProvider[];
|
|
29
29
|
export declare const THINKING_SUFFIXES: Set<string>;
|
|
30
|
+
export declare function parseModelSpec<T extends string = string>(spec: string): {
|
|
31
|
+
modelSpec: string;
|
|
32
|
+
thinkingLevel?: T;
|
|
33
|
+
};
|
|
34
|
+
export declare function isUnknownModel(model: {
|
|
35
|
+
provider?: string;
|
|
36
|
+
id?: string;
|
|
37
|
+
api?: string;
|
|
38
|
+
} | null | undefined): boolean;
|
|
30
39
|
export declare function stripThinkingSuffix(spec: string): string;
|
|
31
40
|
export interface PortableModelSelection {
|
|
32
41
|
provider: ModelProvider;
|
|
@@ -61,6 +61,18 @@ export function configuredLadderProviders(isConfigured, ladders = modelLadders()
|
|
|
61
61
|
return kept.length > 0 ? kept : [...MODEL_PROVIDER_KEYS];
|
|
62
62
|
}
|
|
63
63
|
export const THINKING_SUFFIXES = new Set(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max']);
|
|
64
|
+
export function parseModelSpec(spec) {
|
|
65
|
+
const i = spec.lastIndexOf(':');
|
|
66
|
+
if (i <= 0)
|
|
67
|
+
return { modelSpec: spec };
|
|
68
|
+
const suffix = spec.slice(i + 1);
|
|
69
|
+
if (!THINKING_SUFFIXES.has(suffix))
|
|
70
|
+
return { modelSpec: spec };
|
|
71
|
+
return { modelSpec: spec.slice(0, i), thinkingLevel: suffix };
|
|
72
|
+
}
|
|
73
|
+
export function isUnknownModel(model) {
|
|
74
|
+
return model?.provider === 'unknown' && model.id === 'unknown' && model.api === 'unknown';
|
|
75
|
+
}
|
|
64
76
|
export function stripThinkingSuffix(spec) {
|
|
65
77
|
const i = spec.lastIndexOf(':');
|
|
66
78
|
if (i <= 0)
|
|
@@ -4,9 +4,8 @@ import { type NodeMeta } from '../canvas/index.js';
|
|
|
4
4
|
* or a live pid mid-boot before it binds the socket, is NOT a live broker. */
|
|
5
5
|
export declare function isBrokerLive(meta: NodeMeta): boolean;
|
|
6
6
|
/** Swap a LIVE node's model over its view.sock. Connects as a controller,
|
|
7
|
-
* sends `set_model`, and resolves with the broker-resolved
|
|
8
|
-
*
|
|
9
|
-
* only the bare id). Rejects with the broker's message on an `error` frame (e.g.
|
|
7
|
+
* sends `set_model`, and resolves with the broker-resolved durable spec from its
|
|
8
|
+
* `model_changed` frame. Rejects with the broker's message on an `error` frame (e.g.
|
|
10
9
|
* `no model matching '<spec>' in the registry`), on connect failure, or timeout.
|
|
11
10
|
* `pinned` is the durable-pin decision for this change, made by the CALLER from
|
|
12
11
|
* the RAW pre-normalize token (`spec` here is already normalizeModel-resolved,
|
|
@@ -24,4 +23,5 @@ export declare function setModelLive(nodeId: string, spec: string, pinned: boole
|
|
|
24
23
|
* from the RAW pre-normalize token, never re-derived here from `spec`'s shape
|
|
25
24
|
* (a concrete `spec` always reads as "pinned", which would wrongly re-pin a
|
|
26
25
|
* deliberately chosen bare tier that happens to byte-equal a ladder cell). */
|
|
26
|
+
export declare function updateModelRecipe(meta: NodeMeta, spec: string, pinnedOverride: boolean | undefined, userSelected: boolean): NodeMeta;
|
|
27
27
|
export declare function persistDormantModel(nodeId: string, spec: string, pinned: boolean): void;
|
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
//
|
|
5
5
|
// LIVE — the node's broker is up (recorded pi_pid alive AND view.sock
|
|
6
6
|
// present): connect to view.sock as a controller, send `set_model`,
|
|
7
|
-
// await the ack. The broker
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// provider/id from the freshly-updated row.
|
|
7
|
+
// await the ack. The broker commits model_override + launch.model
|
|
8
|
+
// through crtrd before broadcasting the resolved durable spec, so this
|
|
9
|
+
// path never writes or rereads the canvas row itself.
|
|
11
10
|
// DORMANT — no live broker: write the durable recipe directly (mirroring exactly
|
|
12
|
-
//
|
|
11
|
+
// the canonical recipe update) so the next revive picks it up.
|
|
13
12
|
//
|
|
14
13
|
// This complements the in-viewer `/model` slash command for the headless case.
|
|
15
14
|
import { existsSync } from 'node:fs';
|
|
@@ -24,9 +23,8 @@ export function isBrokerLive(meta) {
|
|
|
24
23
|
return isPidAlive(meta.pi_pid) && existsSync(viewSocketPath(meta.node_id));
|
|
25
24
|
}
|
|
26
25
|
/** Swap a LIVE node's model over its view.sock. Connects as a controller,
|
|
27
|
-
* sends `set_model`, and resolves with the broker-resolved
|
|
28
|
-
*
|
|
29
|
-
* only the bare id). Rejects with the broker's message on an `error` frame (e.g.
|
|
26
|
+
* sends `set_model`, and resolves with the broker-resolved durable spec from its
|
|
27
|
+
* `model_changed` frame. Rejects with the broker's message on an `error` frame (e.g.
|
|
30
28
|
* `no model matching '<spec>' in the registry`), on connect failure, or timeout.
|
|
31
29
|
* `pinned` is the durable-pin decision for this change, made by the CALLER from
|
|
32
30
|
* the RAW pre-normalize token (`spec` here is already normalizeModel-resolved,
|
|
@@ -36,20 +34,17 @@ export function isBrokerLive(meta) {
|
|
|
36
34
|
* from the resolved spec. */
|
|
37
35
|
export function setModelLive(nodeId, spec, pinned) {
|
|
38
36
|
// `set_model` carries no frame id, so the ack is matched on `for` alone.
|
|
39
|
-
let
|
|
37
|
+
let resolvedSpec;
|
|
40
38
|
return oneShotControllerRequest({
|
|
41
39
|
nodeId,
|
|
42
40
|
what: 'the model switch',
|
|
43
41
|
ackFor: 'set_model',
|
|
44
42
|
frame: () => ({ type: 'set_model', model: spec, pinned }),
|
|
45
43
|
observe: (frame) => {
|
|
46
|
-
if (frame.type === 'model_changed')
|
|
47
|
-
|
|
44
|
+
if (frame.type === 'model_changed' && frame.spec !== null)
|
|
45
|
+
resolvedSpec = frame.spec;
|
|
48
46
|
},
|
|
49
|
-
|
|
50
|
-
// broadcastModelChanged BEFORE flushing these frames, so the row is
|
|
51
|
-
// authoritative; fall back to the bare id, then the raw spec.
|
|
52
|
-
result: () => getNode(nodeId)?.model_override ?? resolvedId ?? spec,
|
|
47
|
+
result: () => resolvedSpec ?? spec,
|
|
53
48
|
});
|
|
54
49
|
}
|
|
55
50
|
/** Persist a model choice into a DORMANT node's durable recipe — mirrors exactly
|
|
@@ -61,16 +56,29 @@ export function setModelLive(nodeId, spec, pinned) {
|
|
|
61
56
|
* from the RAW pre-normalize token, never re-derived here from `spec`'s shape
|
|
62
57
|
* (a concrete `spec` always reads as "pinned", which would wrongly re-pin a
|
|
63
58
|
* deliberately chosen bare tier that happens to byte-equal a ladder cell). */
|
|
64
|
-
export function
|
|
65
|
-
const meta = getNode(nodeId);
|
|
66
|
-
if (meta === null)
|
|
67
|
-
return;
|
|
59
|
+
export function updateModelRecipe(meta, spec, pinnedOverride, userSelected) {
|
|
68
60
|
const launch = meta.launch === undefined
|
|
69
61
|
? undefined
|
|
70
|
-
:
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
62
|
+
: userSelected
|
|
63
|
+
? (() => {
|
|
64
|
+
const { modelIntent: _modelIntent, env, ...rest } = meta.launch;
|
|
65
|
+
const { CRTR_MODEL_INTENT: _intentEnv, ...remainingEnv } = env;
|
|
66
|
+
return {
|
|
67
|
+
...rest,
|
|
68
|
+
model: spec,
|
|
69
|
+
...(pinnedOverride !== undefined ? { modelProviderPinned: pinnedOverride } : {}),
|
|
70
|
+
env: remainingEnv,
|
|
71
|
+
};
|
|
72
|
+
})()
|
|
73
|
+
: {
|
|
74
|
+
...meta.launch,
|
|
75
|
+
model: spec,
|
|
76
|
+
...(pinnedOverride !== undefined ? { modelProviderPinned: pinnedOverride } : {}),
|
|
77
|
+
};
|
|
78
|
+
return updateNode(meta.node_id, { model_override: spec, ...(launch !== undefined ? { launch } : {}) });
|
|
79
|
+
}
|
|
80
|
+
export function persistDormantModel(nodeId, spec, pinned) {
|
|
81
|
+
const meta = getNode(nodeId);
|
|
82
|
+
if (meta !== null)
|
|
83
|
+
updateModelRecipe(meta, spec, pinned, true);
|
|
76
84
|
}
|
|
@@ -1,17 +1,6 @@
|
|
|
1
|
-
export { paneExists, paneLocation, paneOfNode, paneCurrentPath, ensureSession, openNodeWindow, splitWindow, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, breakPane, inTmux, piCommand, shellQuote,
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* pane is handed. */
|
|
5
|
-
export declare const BROKER_VIEW_SOCKET_WAIT_MS = 30000;
|
|
6
|
-
/** Wait until a broker's view.sock accepts a connection. The launching caller
|
|
7
|
-
* stays async, so the broker's real exit signal can fail fast the wait instead
|
|
8
|
-
* of being masked by a zombie pid. Success proves more than file existence: it
|
|
9
|
-
* is robust to a stale leftover socket the broker has not unlinked yet,
|
|
10
|
-
* because only an accepting listener yields a `connect`. */
|
|
11
|
-
export declare function waitForBrokerViewSocket(nodeId: string, exited?: Promise<{
|
|
12
|
-
code: number | null;
|
|
13
|
-
signal: NodeJS.Signals | null;
|
|
14
|
-
}>): Promise<boolean>;
|
|
1
|
+
export { paneExists, paneLocation, paneOfNode, paneCurrentPath, paneSize, paneRunning, ensureSession, openNodeWindow, splitWindow, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, breakPane, inTmux, piCommand, shellQuote, renameWindow, displayPopup, windowOfPane, respawnPaneSync, respawnPaneInBackground, respawnPaneInPlace, paneStartCommand, panePid, windowAlive, listLivePanes, VIEWER_STAMP_OPTION, stampViewerPaneAsync, liveViewerPanes, sendAttachControl, displayClientMessage, } from './tmux-driver.js';
|
|
2
|
+
export { installTmuxBindings } from './tmux-bindings.js';
|
|
3
|
+
export { BROKER_VIEW_SOCKET_WAIT_MS, waitForBrokerViewSocket } from './view-socket.js';
|
|
15
4
|
/** Env for a `crtr surface attach` VIEWER pane (the focus split, the spawn viewer
|
|
16
5
|
* window, AND recycle's re-attach respawn): propagate CRTR_HOME so the viewer
|
|
17
6
|
* resolves the SAME canvas home — and thus the right view.sock — under a
|
|
@@ -12,88 +12,19 @@
|
|
|
12
12
|
// openViewerWindow composes openViewerPane (here) + registerViewerFocus (the db
|
|
13
13
|
// write, which stays in placement.ts).
|
|
14
14
|
//
|
|
15
|
-
// §5.1 import-lint: placement-tmux.ts is an
|
|
16
|
-
// it is the sanctioned pure-tmux seam, re-exporting the driver
|
|
17
|
-
// modules need so they never import
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
export { paneExists, paneLocation, paneOfNode, paneCurrentPath, ensureSession, openNodeWindow, splitWindow, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, breakPane, inTmux, piCommand, shellQuote, installTmuxBindings, renameWindow, displayPopup, windowOfPane, respawnPaneSync, respawnPaneInPlace, paneStartCommand, panePid, windowAlive, listLivePanes, VIEWER_STAMP_OPTION, stampViewerPaneAsync, liveViewerPanes, sendAttachControl, displayClientMessage, } from './tmux.js';
|
|
15
|
+
// §5.1 import-lint: placement-tmux.ts is an allowed direct importer of
|
|
16
|
+
// tmux-driver.ts — it is the sanctioned pure-tmux seam, re-exporting the driver
|
|
17
|
+
// verbs other modules need so they never import the driver directly.
|
|
18
|
+
import { paneLocation, ensureSession, openNodeWindow, splitWindow, selectLayout, } from './tmux-driver.js';
|
|
19
|
+
import { BROKER_VIEW_SOCKET_WAIT_MS } from './view-socket.js';
|
|
20
|
+
// Re-export the pure tmux driver verbs the CLI/viewer consumers need without
|
|
21
|
+
// exposing the canvas focuses table or sending command modules to the raw driver.
|
|
22
|
+
export { paneExists, paneLocation, paneOfNode, paneCurrentPath, paneSize, paneRunning, ensureSession, openNodeWindow, splitWindow, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, breakPane, inTmux, piCommand, shellQuote, renameWindow, displayPopup, windowOfPane, respawnPaneSync, respawnPaneInBackground, respawnPaneInPlace, paneStartCommand, panePid, windowAlive, listLivePanes, VIEWER_STAMP_OPTION, stampViewerPaneAsync, liveViewerPanes, sendAttachControl, displayClientMessage, } from './tmux-driver.js';
|
|
23
|
+
export { installTmuxBindings } from './tmux-bindings.js';
|
|
25
24
|
// ---------------------------------------------------------------------------
|
|
26
25
|
// view.sock readiness — the one shared broker-cold-start primitive
|
|
27
26
|
// ---------------------------------------------------------------------------
|
|
28
|
-
|
|
29
|
-
const BROKER_FOCUS_SOCKET_RETRY_MS = 100;
|
|
30
|
-
/** The shared cold-start deadline (ms) a freshly-opened viewer waits for its
|
|
31
|
-
* broker's view.sock — one source of truth for the CRTR_ATTACH_WAIT_MS a viewer
|
|
32
|
-
* pane is handed. */
|
|
33
|
-
export const BROKER_VIEW_SOCKET_WAIT_MS = BROKER_FOCUS_SOCKET_WAIT_MS;
|
|
34
|
-
function sleep(ms) {
|
|
35
|
-
return new Promise((resolve) => {
|
|
36
|
-
setTimeout(resolve, ms);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
function probeBrokerViewSocket(sockPath, timeoutMs) {
|
|
40
|
-
return new Promise((resolve) => {
|
|
41
|
-
let settled = false;
|
|
42
|
-
let socket = null;
|
|
43
|
-
const finish = (ok) => {
|
|
44
|
-
if (settled)
|
|
45
|
-
return;
|
|
46
|
-
settled = true;
|
|
47
|
-
if (socket !== null)
|
|
48
|
-
socket.destroy();
|
|
49
|
-
resolve(ok);
|
|
50
|
-
};
|
|
51
|
-
try {
|
|
52
|
-
socket = createConnection(sockPath);
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
finish(false);
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
socket.once('connect', () => finish(true));
|
|
59
|
-
socket.once('error', () => finish(false));
|
|
60
|
-
socket.setTimeout(timeoutMs, () => finish(false));
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
/** Wait until a broker's view.sock accepts a connection. The launching caller
|
|
64
|
-
* stays async, so the broker's real exit signal can fail fast the wait instead
|
|
65
|
-
* of being masked by a zombie pid. Success proves more than file existence: it
|
|
66
|
-
* is robust to a stale leftover socket the broker has not unlinked yet,
|
|
67
|
-
* because only an accepting listener yields a `connect`. */
|
|
68
|
-
export async function waitForBrokerViewSocket(nodeId, exited) {
|
|
69
|
-
const sockPath = viewSocketPath(nodeId);
|
|
70
|
-
const deadline = Date.now() + BROKER_FOCUS_SOCKET_WAIT_MS;
|
|
71
|
-
const exitSeen = exited?.then(() => 'exit');
|
|
72
|
-
while (Date.now() <= deadline) {
|
|
73
|
-
const remaining = Math.max(0, deadline - Date.now());
|
|
74
|
-
const probe = probeBrokerViewSocket(sockPath, Math.min(BROKER_FOCUS_SOCKET_RETRY_MS, remaining)).then((ok) => (ok ? 'ready' : 'retry'));
|
|
75
|
-
// Race the probe against the broker's real exit ONLY when we have one. With
|
|
76
|
-
// no exit promise, an `?? Promise.resolve('retry')` would settle instantly
|
|
77
|
-
// and always beat the probe, so readiness could never observe a `connect`.
|
|
78
|
-
const outcome = exitSeen === undefined ? await probe : await Promise.race([probe, exitSeen]);
|
|
79
|
-
if (outcome === 'ready')
|
|
80
|
-
return true;
|
|
81
|
-
if (outcome === 'exit')
|
|
82
|
-
return false;
|
|
83
|
-
if (exitSeen !== undefined) {
|
|
84
|
-
const sleptOrExit = await Promise.race([
|
|
85
|
-
sleep(BROKER_FOCUS_SOCKET_RETRY_MS).then(() => 'sleep'),
|
|
86
|
-
exitSeen,
|
|
87
|
-
]);
|
|
88
|
-
if (sleptOrExit === 'exit')
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
await sleep(BROKER_FOCUS_SOCKET_RETRY_MS);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
27
|
+
export { BROKER_VIEW_SOCKET_WAIT_MS, waitForBrokerViewSocket } from './view-socket.js';
|
|
97
28
|
// ---------------------------------------------------------------------------
|
|
98
29
|
// Viewer pane opener (tmux half, NO focus-row write)
|
|
99
30
|
// ---------------------------------------------------------------------------
|
|
@@ -126,7 +57,7 @@ export function openViewerPane(nodeId, session, opts = {}) {
|
|
|
126
57
|
// a literal duplicated at the call site.
|
|
127
58
|
const env = {
|
|
128
59
|
...viewerSplitEnv(),
|
|
129
|
-
...(opts.waitForBroker === true ? { CRTR_ATTACH_WAIT_MS: String(
|
|
60
|
+
...(opts.waitForBroker === true ? { CRTR_ATTACH_WAIT_MS: String(BROKER_VIEW_SOCKET_WAIT_MS) } : {}),
|
|
130
61
|
...(opts.initialWhip === true ? { CRTR_ATTACH_INITIAL_WHIP: '1' } : {}),
|
|
131
62
|
};
|
|
132
63
|
const cwd = opts.cwd ?? process.cwd();
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { type FocusRow } from '../canvas/index.js';
|
|
2
2
|
export type { FocusRow };
|
|
3
|
-
export { splitWindow, breakPane, selectLayout, selectPane, focusWindow, selectWindow, switchClient, openNodeWindow, ensureSession, paneLocation, paneExists, paneRunning, paneCurrentPath, currentTmux, inTmux, paneOfNode,
|
|
4
|
-
export type { RespawnPaneOpts
|
|
3
|
+
export { splitWindow, breakPane, selectLayout, selectPane, focusWindow, selectWindow, switchClient, openNodeWindow, ensureSession, paneLocation, paneExists, paneRunning, paneCurrentPath, currentTmux, inTmux, paneOfNode, setPaneOption, getPaneOption, piCommand, shellQuote, respawnPaneSync, closePane, displayPopup, windowOfPane, renameWindow, paneOfWindow, windowAlive, listLivePanes, } from './tmux-driver.js';
|
|
4
|
+
export type { RespawnPaneOpts } from './tmux-driver.js';
|
|
5
|
+
export { installTmuxBindings } from './tmux-bindings.js';
|
|
6
|
+
export type { TmuxInstalledPair, TmuxInstallDiagnostic, TmuxInstallResult } from './tmux-bindings.js';
|
|
5
7
|
/** The viewer a node has on screen, or null. UNIQUE(node_id) ⇒ at most one. */
|
|
6
8
|
export declare function focusOf(nodeId: string): FocusRow | null;
|
|
7
9
|
/** Does this node have a live viewer on screen? */
|
|
@@ -20,13 +20,12 @@
|
|
|
20
20
|
// row registrar used by BOTH spawn (a background viewer window) and focus.
|
|
21
21
|
// • tearDownNode / detachToBackground — close a node's viewer pane + row.
|
|
22
22
|
// • The chrome/viewer tmux re-exports (§2.1): placement stays the sanctioned
|
|
23
|
-
// model-over-driver
|
|
24
|
-
// tmux
|
|
25
|
-
// driver verbs through here.
|
|
23
|
+
// model-over-driver. Raw driver access is confined to placement, its pure
|
|
24
|
+
// tmux half, the bindings owner, and tmux chrome.
|
|
26
25
|
import { getNode, fullName, deleteNode, listNodes, openFocusRow, closeFocusRow, getFocusByNode, getFocusByPane, getFocusById, listFocuses as listFocusRows, } from '../canvas/index.js';
|
|
27
26
|
import { nodeHasAssistantMessage, isNodeStreaming } from '../canvas/render.js';
|
|
28
27
|
import { headlessBrokerHost } from './host.js';
|
|
29
|
-
import { paneExists, paneLocation, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, respawnPaneSync, windowOfPane, renameWindow, } from './tmux.js';
|
|
28
|
+
import { paneExists, paneLocation, closePane, currentTmux, switchClient, selectWindow, selectLayout, selectPane, getPaneOption, setPaneOption, respawnPaneSync, windowOfPane, renameWindow, } from './tmux-driver.js';
|
|
30
29
|
// The PURE tmux + broker-socket half now lives in placement-tmux.ts. placement
|
|
31
30
|
// composes the viewer OPENER over openViewerPane (tmux) + registerViewerFocus
|
|
32
31
|
// (the db write). viewerSplitEnv + waitForBrokerViewSocket are re-exported here
|
|
@@ -36,8 +35,7 @@ import { openViewerPane, viewerSplitEnv, waitForBrokerViewSocket } from './place
|
|
|
36
35
|
import { newJobId } from './nodes.js';
|
|
37
36
|
import { isPidAlive } from '../canvas/pid.js';
|
|
38
37
|
// Placement is the sanctioned model-over-driver (§2.1): non-placement runtime /
|
|
39
|
-
// command modules that legitimately need a raw driver verb get it from here
|
|
40
|
-
// the §5.1 lint can hold "only placement.ts / tmux-chrome.ts import tmux.ts".
|
|
38
|
+
// command modules that legitimately need a raw driver verb get it from here.
|
|
41
39
|
// These are the chrome + viewer verbs that survive the cut (the engine-in-pane
|
|
42
40
|
// verbs — respawnPane, respawnPaneDetached, swapPaneInPlace, breakPaneToSession,
|
|
43
41
|
// joinPane, setWindowOption, setRemainOnExit — are deleted). `breakPane` +
|
|
@@ -46,12 +44,9 @@ import { isPidAlive } from '../canvas/pid.js';
|
|
|
46
44
|
// viewer pane into its own window and tiles sibling viewers beside it.
|
|
47
45
|
// `piCommand`, `paneCurrentPath`, and `shellQuote` remain available to command
|
|
48
46
|
// modules that need to build or inspect tmux pane commands without importing
|
|
49
|
-
// tmux.ts directly
|
|
50
|
-
|
|
51
|
-
export {
|
|
52
|
-
// Compile seam for viewer.ts, which still calls installMenuBinding();
|
|
53
|
-
// deleted when the attach unit imports installTmuxBindings directly.
|
|
54
|
-
installTmuxBindings as installMenuBinding, setPaneOption, getPaneOption, piCommand, shellQuote, respawnPaneSync, closePane, displayPopup, windowOfPane, renameWindow, paneOfWindow, windowAlive, listLivePanes, } from './tmux.js';
|
|
47
|
+
// tmux-driver.ts directly.
|
|
48
|
+
export { splitWindow, breakPane, selectLayout, selectPane, focusWindow, selectWindow, switchClient, openNodeWindow, ensureSession, paneLocation, paneExists, paneRunning, paneCurrentPath, currentTmux, inTmux, paneOfNode, setPaneOption, getPaneOption, piCommand, shellQuote, respawnPaneSync, closePane, displayPopup, windowOfPane, renameWindow, paneOfWindow, windowAlive, listLivePanes, } from './tmux-driver.js';
|
|
49
|
+
export { installTmuxBindings } from './tmux-bindings.js';
|
|
55
50
|
// ---------------------------------------------------------------------------
|
|
56
51
|
// Viewer registry reads — COMPOSE over the canvas focuses table (§2.3/§4).
|
|
57
52
|
//
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type NodeMeta } from '../canvas/index.js';
|
|
1
|
+
import { type NodeMeta, type Mode, type Lifecycle } from '../canvas/index.js';
|
|
2
2
|
export interface PromoteResult {
|
|
3
3
|
meta: NodeMeta;
|
|
4
4
|
roadmapWritten: boolean;
|
|
@@ -7,6 +7,19 @@ export interface PromoteResult {
|
|
|
7
7
|
/** Absolute path to the node's goal doc (context/initial-prompt.md). */
|
|
8
8
|
goalPath: string;
|
|
9
9
|
}
|
|
10
|
+
/** Shared reshape machinery: rewrite kind and/or model tier — and, when the
|
|
11
|
+
* caller supplies them, mode/lifecycle — by rebuilding the launch spec so the
|
|
12
|
+
* change is durable across a future revive. MODE-PRESERVING by default (omit
|
|
13
|
+
* `mode`/`lifecycle` and the node's own current values carry through) — this
|
|
14
|
+
* is what a plain `crtr node yield --kind/--model` reshape rides, with no
|
|
15
|
+
* mode flip and no roadmap seeding. `promote()` below is a thin wrapper that
|
|
16
|
+
* also forces mode→orchestrator and seeds the roadmap. */
|
|
17
|
+
export declare function reshapeNode(nodeId: string, opts?: {
|
|
18
|
+
kind?: string;
|
|
19
|
+
model?: string;
|
|
20
|
+
mode?: Mode;
|
|
21
|
+
lifecycle?: Lifecycle;
|
|
22
|
+
}, beforePersist?: () => void): NodeMeta;
|
|
10
23
|
/** Promote a node to an orchestrator (mode→orchestrator), optionally
|
|
11
24
|
* specializing its kind (e.g. a `general` worker becoming a
|
|
12
25
|
* `developer.orchestrator`) and optionally also making it resident. Idempotent:
|
|
@@ -31,7 +31,7 @@ import { readGoal, goalPath } from './kickoff.js';
|
|
|
31
31
|
* is what a plain `crtr node yield --kind/--model` reshape rides, with no
|
|
32
32
|
* mode flip and no roadmap seeding. `promote()` below is a thin wrapper that
|
|
33
33
|
* also forces mode→orchestrator and seeds the roadmap. */
|
|
34
|
-
function reshapeNode(nodeId, opts = {}, beforePersist) {
|
|
34
|
+
export function reshapeNode(nodeId, opts = {}, beforePersist) {
|
|
35
35
|
const node = getNode(nodeId);
|
|
36
36
|
if (node === null)
|
|
37
37
|
throw new Error(`unknown node: ${nodeId}`);
|
|
@@ -12,7 +12,7 @@ import { respawnPaneSync } from './placement.js';
|
|
|
12
12
|
* general quit→done rule does NOT auto-resolve a force-killed descendant — we
|
|
13
13
|
* mark it `canceled` here via the same `cancel` event the close cascade uses. */
|
|
14
14
|
export declare function reapDescendants(rootId: string): string[];
|
|
15
|
-
/** Injectable host/viewer seam, so the
|
|
15
|
+
/** Injectable host/viewer seam, so the ordinary source test drives relaunchRoot's pure
|
|
16
16
|
* DB transitions without a real broker or tmux. Each field defaults to its
|
|
17
17
|
* production verb. */
|
|
18
18
|
export interface RelaunchDeps {
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// first refresh-with-open-work). Leaf/terminal workers write nothing.
|
|
10
10
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
11
11
|
import { join } from 'node:path';
|
|
12
|
-
import { contextDir } from '../canvas/
|
|
12
|
+
import { contextDir } from '../canvas/paths.js';
|
|
13
13
|
export function roadmapPath(nodeId) {
|
|
14
14
|
return join(contextDir(nodeId), 'roadmap.md');
|
|
15
15
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type WakeOrigin } from './bearings.js';
|
|
2
2
|
import { type NodeMeta, type Mode, type Lifecycle } from '../canvas/index.js';
|
|
3
|
+
import { type ModelRegistryLike, type ModelRequest } from '../model-routes.js';
|
|
3
4
|
export interface SpawnChildOpts {
|
|
4
5
|
kind: string;
|
|
5
6
|
mode?: Mode;
|
|
@@ -88,6 +89,13 @@ export declare function resolveForkSource(value: string): string;
|
|
|
88
89
|
* the same startup selector the front door uses (MRU covering `cwd`, else the
|
|
89
90
|
* root-profile prompt/default). */
|
|
90
91
|
export declare function resolveProfileId(explicit: string | null | undefined, spawner: string | null, cwd: string): Promise<string | null>;
|
|
92
|
+
/** Reject a permanently invalid launch recipe against the registry that will
|
|
93
|
+
* serve it. Registered-but-unauthenticated/cooling requests intentionally pass
|
|
94
|
+
* this authoring check so broker policy for transient availability is unchanged. */
|
|
95
|
+
export declare function assertLaunchModelRegistered(request: ModelRequest | undefined, options: {
|
|
96
|
+
cwd: string;
|
|
97
|
+
profileId: string | null;
|
|
98
|
+
}, registry?: ModelRegistryLike): Promise<void>;
|
|
91
99
|
export interface SpawnChildResult {
|
|
92
100
|
node: NodeMeta;
|
|
93
101
|
/** The viewer window opened for a --root in tmux; null otherwise (a managed
|
|
@@ -31,6 +31,8 @@ import { piSessionsRoot } from './pi-vendored.js';
|
|
|
31
31
|
import { headlessBrokerHost } from './host.js';
|
|
32
32
|
import { ensureDaemon } from '../../daemon/manage.js';
|
|
33
33
|
import { readConfig } from '../config.js';
|
|
34
|
+
import { modelRequestFromConfig, unregisteredConcreteModel } from '../model-routes.js';
|
|
35
|
+
import { openModelRegistry } from './model-registry.js';
|
|
34
36
|
// ---------------------------------------------------------------------------
|
|
35
37
|
// Shared broker-launch wrapper — catch launch/preflight failures at the call
|
|
36
38
|
// site, mark the node crashed, then rethrow a clear error.
|
|
@@ -161,6 +163,26 @@ export async function resolveProfileId(explicit, spawner, cwd) {
|
|
|
161
163
|
return getNode(spawner)?.profile_id ?? null;
|
|
162
164
|
return selectProfileForCwd(cwd);
|
|
163
165
|
}
|
|
166
|
+
function requestFromLaunch(launch) {
|
|
167
|
+
const intent = launch.modelIntent === undefined
|
|
168
|
+
? undefined
|
|
169
|
+
: `${launch.modelIntent.family}/${launch.modelIntent.strength}`;
|
|
170
|
+
return modelRequestFromConfig(launch.model, intent, launch.modelExact === true);
|
|
171
|
+
}
|
|
172
|
+
/** Reject a permanently invalid launch recipe against the registry that will
|
|
173
|
+
* serve it. Registered-but-unauthenticated/cooling requests intentionally pass
|
|
174
|
+
* this authoring check so broker policy for transient availability is unchanged. */
|
|
175
|
+
export async function assertLaunchModelRegistered(request, options, registry) {
|
|
176
|
+
if (request === undefined || request.kind === 'logical')
|
|
177
|
+
return;
|
|
178
|
+
const unknown = unregisteredConcreteModel(request, registry ?? await openModelRegistry(), options);
|
|
179
|
+
if (unknown === undefined)
|
|
180
|
+
return;
|
|
181
|
+
throw usage(`model '${unknown.request.spec}' is not registered in this daemon.`, {
|
|
182
|
+
received: unknown.request.spec,
|
|
183
|
+
next: 'Pass a registered provider/id, provider/tier where provider is anthropic|openai and tier is ultra|strong|medium|light, a bare tier (ultra|strong|medium|light), or a family alias (opus|sonnet|haiku).',
|
|
184
|
+
});
|
|
185
|
+
}
|
|
164
186
|
/** Resolve who a spawn is attributed to. A managed child needs a spine parent
|
|
165
187
|
* (explicit `--parent` or the calling node's CRTR_NODE_ID). A --root spawn
|
|
166
188
|
* does not: it is top-level by definition and the spawner identity is
|
|
@@ -200,8 +222,9 @@ export async function spawnChildPrepared(opts, beforeBrokerLaunch) {
|
|
|
200
222
|
const wantsWorktree = opts.worktree === true;
|
|
201
223
|
const nodeId = wantsWorktree ? (opts.nodeId ?? newNodeId()) : opts.nodeId;
|
|
202
224
|
// Preflight: resolve every fallible input BEFORE creating the worktree or the
|
|
203
|
-
// node. `--fork-from <bad>` (resolveForkSource)
|
|
204
|
-
// (resolveProfileId)
|
|
225
|
+
// node. `--fork-from <bad>` (resolveForkSource), an invalid `--profile`
|
|
226
|
+
// (resolveProfileId), and an unregistered concrete `--model` must fail HERE,
|
|
227
|
+
// before anything exists to clean up or
|
|
205
228
|
// strand — catching them later (after the worktree/node are created) is what
|
|
206
229
|
// let `--worktree --fork-from <bad>` leave an active node pinned to a deleted
|
|
207
230
|
// cwd with an open managed_worktree. A caller-supplied `--node-id` joins this
|
|
@@ -215,6 +238,8 @@ export async function spawnChildPrepared(opts, beforeBrokerLaunch) {
|
|
|
215
238
|
if (opts.nodeId !== undefined)
|
|
216
239
|
preflightNodeId(opts.nodeId);
|
|
217
240
|
const profileId = await resolveProfileId(opts.profile, spawner, opts.cwd);
|
|
241
|
+
const preflightLaunch = buildLaunchSpec(opts.kind, mode, { lifecycle, hasManager: !root, model: opts.model, cwd: opts.cwd, profileId }).launch;
|
|
242
|
+
await assertLaunchModelRegistered(requestFromLaunch(preflightLaunch), { cwd: opts.cwd, profileId });
|
|
218
243
|
const forkFrom = opts.forkFrom !== undefined ? resolveForkSource(opts.forkFrom) : undefined;
|
|
219
244
|
let managedWorktree;
|
|
220
245
|
let spawnCwd = opts.cwd;
|
|
@@ -230,7 +255,12 @@ export async function spawnChildPrepared(opts, beforeBrokerLaunch) {
|
|
|
230
255
|
// model/tools resolve against the CHILD's own profile + project stack, not
|
|
231
256
|
// this process's ambient scope (a front-door shell has no CRTR_PROFILE_ID,
|
|
232
257
|
// which silently hid every profile-scope kind override).
|
|
233
|
-
const
|
|
258
|
+
const launch = wantsWorktree
|
|
259
|
+
? buildLaunchSpec(opts.kind, mode, { lifecycle, hasManager: !root, model: opts.model, cwd: spawnCwd, profileId }).launch
|
|
260
|
+
: preflightLaunch;
|
|
261
|
+
if (wantsWorktree) {
|
|
262
|
+
await assertLaunchModelRegistered(requestFromLaunch(launch), { cwd: spawnCwd, profileId });
|
|
263
|
+
}
|
|
234
264
|
const meta = spawnNode({
|
|
235
265
|
kind: opts.kind,
|
|
236
266
|
mode,
|
|
@@ -319,9 +349,9 @@ export async function spawnChildPrepared(opts, beforeBrokerLaunch) {
|
|
|
319
349
|
throw brokerLaunchFailed(`failed to launch the broker engine for ${meta.node_id} (${meta.name}) — the node was not started.`, `Inspect the broker log for the underlying cause (${jobDir(meta.node_id)}/broker.log) and verify the pi engine can start in this environment.`);
|
|
320
350
|
}
|
|
321
351
|
recordPid(meta.node_id, placed.pid);
|
|
322
|
-
//
|
|
323
|
-
//
|
|
324
|
-
//
|
|
352
|
+
// A root created through `node new --root` must accept viewers before the
|
|
353
|
+
// command returns because its caller may attach immediately. Only that root
|
|
354
|
+
// waits — a managed child (and every cron-launched
|
|
325
355
|
// birth) stays launch-immediate so the daemon never blocks its serialized
|
|
326
356
|
// supervision loop on a birth, no matter what forwards the readiness field.
|
|
327
357
|
if (attendedRoot && opts.readiness === 'await' && !await waitForBrokerViewSocket(meta.node_id, placed.exited)) {
|
|
@@ -13,6 +13,7 @@ export type StopAction = {
|
|
|
13
13
|
reason: 'stalled';
|
|
14
14
|
message: string;
|
|
15
15
|
};
|
|
16
|
-
/** Decide what to do when a node stops.
|
|
17
|
-
*
|
|
18
|
-
|
|
16
|
+
/** Decide what to do when a node stops. crtrd supplies every current-canvas
|
|
17
|
+
* fact; the broker contributes only whether its Pi-owned background job registry
|
|
18
|
+
* is still running work. */
|
|
19
|
+
export declare function evaluateStop(nodeId: string, signals: StopSignals, backgroundJobsRunning?: boolean): StopAction;
|