@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
|
@@ -356,48 +356,53 @@ function formatLeafAmbiguous(leaf, matches) {
|
|
|
356
356
|
const ids = matches.map(memoryDocId).join(', ');
|
|
357
357
|
return `ambiguous memory document: ${leaf} matches multiple documents: ${ids}`;
|
|
358
358
|
}
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
359
|
+
function loadMemorySources(scope) {
|
|
360
|
+
// Quiet: a targeted read must not spew other docs' frontmatter warnings
|
|
361
|
+
// before its own result (esp. a not_found) — corpus health is `lint`'s job.
|
|
362
|
+
return memorySourcesInPrecedence(scope).map((source) => ({
|
|
363
|
+
source,
|
|
364
|
+
docs: sourceMemoryDocs(source, true),
|
|
365
|
+
}));
|
|
366
|
+
}
|
|
367
|
+
export function createMemoryDocSnapshot() {
|
|
368
|
+
const defaultSources = loadMemorySources();
|
|
369
|
+
const sourcesByScope = new Map([[undefined, defaultSources]]);
|
|
370
|
+
const sourceFor = (scope) => {
|
|
371
|
+
let sources = sourcesByScope.get(scope);
|
|
372
|
+
if (sources === undefined) {
|
|
373
|
+
sources = loadMemorySources(scope);
|
|
374
|
+
sourcesByScope.set(scope, sources);
|
|
375
|
+
}
|
|
376
|
+
return sources;
|
|
377
|
+
};
|
|
378
|
+
return {
|
|
379
|
+
docs: defaultSources.flatMap(({ docs }) => docs),
|
|
380
|
+
resolve: (names) => {
|
|
381
|
+
const resolved = new Map();
|
|
382
|
+
for (const rawName of names) {
|
|
383
|
+
try {
|
|
384
|
+
const parsed = parseSkillQualifier(rawName);
|
|
385
|
+
resolved.set(rawName, resolveMemoryDocFromSources(rawName, {}, sourceFor(parsed.scope)));
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
// A command registration reports its own body-read failure below; one
|
|
389
|
+
// malformed/stale identity must not suppress every other slash command.
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return resolved;
|
|
393
|
+
},
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
function resolveMemoryDocFromSources(rawName, opts, sources) {
|
|
385
397
|
const parsed = parseSkillQualifier(rawName);
|
|
386
398
|
if (parsed.scope && opts.scope && parsed.scope !== opts.scope) {
|
|
387
399
|
throw usage(`scope conflict: identifier "${rawName}" uses scope "${parsed.scope}" but --scope is "${opts.scope}"`);
|
|
388
400
|
}
|
|
389
|
-
const effectiveScope = opts.scope ?? parsed.scope;
|
|
390
401
|
const name = parsed.segments.join('/');
|
|
391
402
|
if (name === '')
|
|
392
403
|
throw usage(`memory document name required`);
|
|
393
404
|
const segments = name.split('/');
|
|
394
405
|
const isLeafQuery = !name.includes('/');
|
|
395
|
-
// Quiet: a targeted read must not spew other docs' frontmatter warnings
|
|
396
|
-
// before its own result (esp. a not_found) — corpus health is `lint`'s job.
|
|
397
|
-
const sources = memorySourcesInPrecedence(effectiveScope).map((source) => ({
|
|
398
|
-
source,
|
|
399
|
-
docs: sourceMemoryDocs(source, true),
|
|
400
|
-
}));
|
|
401
406
|
const kindOk = (d) => opts.kind === undefined || effectiveDocKind(d) === opts.kind;
|
|
402
407
|
// Strong matches across the full scope stack come first. This preserves
|
|
403
408
|
// nearest-scope shadowing for canonical/direct collisions without allowing a
|
|
@@ -437,3 +442,16 @@ export function resolveMemoryDoc(rawName, opts = {}) {
|
|
|
437
442
|
scope: parsed.scope,
|
|
438
443
|
});
|
|
439
444
|
}
|
|
445
|
+
/** Resolve several unqualified names over one memory-source snapshot. Failed
|
|
446
|
+
* names are omitted so callers can preserve their per-document error behavior. */
|
|
447
|
+
export function resolveMemoryDocs(names) {
|
|
448
|
+
return createMemoryDocSnapshot().resolve(names);
|
|
449
|
+
}
|
|
450
|
+
export function resolveMemoryDoc(rawName, opts = {}) {
|
|
451
|
+
const parsed = parseSkillQualifier(rawName);
|
|
452
|
+
if (parsed.scope && opts.scope && parsed.scope !== opts.scope) {
|
|
453
|
+
throw usage(`scope conflict: identifier "${rawName}" uses scope "${parsed.scope}" but --scope is "${opts.scope}"`);
|
|
454
|
+
}
|
|
455
|
+
const effectiveScope = opts.scope ?? parsed.scope;
|
|
456
|
+
return resolveMemoryDocFromSources(rawName, opts, loadMemorySources(effectiveScope));
|
|
457
|
+
}
|
|
@@ -52,8 +52,23 @@ export interface InitialModelRouteSelection<Model extends {
|
|
|
52
52
|
reason: ProviderCandidateRejection;
|
|
53
53
|
}>;
|
|
54
54
|
}
|
|
55
|
+
export interface UnregisteredConcreteModel {
|
|
56
|
+
request: Extract<ModelRequest, {
|
|
57
|
+
kind: 'concrete' | 'exact';
|
|
58
|
+
}>;
|
|
59
|
+
candidate: RoutedCandidate;
|
|
60
|
+
reason: 'unregistered';
|
|
61
|
+
}
|
|
55
62
|
/** Expand config-derived route order only. Availability never affects rank. */
|
|
56
63
|
export declare function expandModelCandidates(request: ModelRequest, cwd?: string, profileId?: string | null): RoutedCandidate[];
|
|
64
|
+
/** Identify the one permanently invalid recipe shape: a concrete/exact request
|
|
65
|
+
* whose requested provider/model is absent from the serving registry. Auth and
|
|
66
|
+
* cooldown are deliberately outside this discriminator so callers retain their
|
|
67
|
+
* existing policy for those transient states. */
|
|
68
|
+
export declare function unregisteredConcreteModel(request: ModelRequest | undefined, registry: ModelRegistryLike, options?: {
|
|
69
|
+
cwd?: string;
|
|
70
|
+
profileId?: string | null;
|
|
71
|
+
}): UnregisteredConcreteModel | undefined;
|
|
57
72
|
/** Probe the common availability facts consumed unchanged by resolveProviderCandidates. */
|
|
58
73
|
export declare function probeRouteAvailability(candidate: RoutedCandidate, registry: ModelRegistryLike, now?: number): RouteAvailability;
|
|
59
74
|
/** Select the first viable route for a new SDK session. Route declarations own
|
|
@@ -110,6 +110,18 @@ export function expandModelCandidates(request, cwd, profileId) {
|
|
|
110
110
|
}
|
|
111
111
|
return emitted.map((candidate, rank) => ({ ...candidate, rank }));
|
|
112
112
|
}
|
|
113
|
+
/** Identify the one permanently invalid recipe shape: a concrete/exact request
|
|
114
|
+
* whose requested provider/model is absent from the serving registry. Auth and
|
|
115
|
+
* cooldown are deliberately outside this discriminator so callers retain their
|
|
116
|
+
* existing policy for those transient states. */
|
|
117
|
+
export function unregisteredConcreteModel(request, registry, options = {}) {
|
|
118
|
+
if (request === undefined || request.kind === 'logical')
|
|
119
|
+
return undefined;
|
|
120
|
+
const candidate = expandModelCandidates(request, options.cwd, options.profileId)[0];
|
|
121
|
+
if (candidate === undefined || registry.find(candidate.providerId, candidate.modelId) !== undefined)
|
|
122
|
+
return undefined;
|
|
123
|
+
return { request, candidate, reason: 'unregistered' };
|
|
124
|
+
}
|
|
113
125
|
/** Probe the common availability facts consumed unchanged by resolveProviderCandidates. */
|
|
114
126
|
export function probeRouteAvailability(candidate, registry, now = Date.now()) {
|
|
115
127
|
const model = registry.find(candidate.providerId, candidate.modelId);
|
|
@@ -89,7 +89,7 @@ export class PoolCredentialStore {
|
|
|
89
89
|
const existing = await this.read(providerId);
|
|
90
90
|
if (existing !== undefined)
|
|
91
91
|
return this.auth.modify(providerId, fn);
|
|
92
|
-
throw new Error(`${getProviderLabel(providerId)} has no account to update — add one with \`crtr sys
|
|
92
|
+
throw new Error(`${getProviderLabel(providerId)} has no account to update — add one with \`crtr sys settings\` or \`/provider-sub ${providerId} add\`.`);
|
|
93
93
|
}
|
|
94
94
|
const committed = await modifyElectedSubscription(providerId, (pool) => electFrom(pool), async (entry) => {
|
|
95
95
|
const next = await fn(toCredential(entry));
|
|
@@ -5,9 +5,8 @@
|
|
|
5
5
|
// This file has NO imports. The attach viewer is bundled as a separate
|
|
6
6
|
// esbuild process from the one that runs a leaf, so it cannot read a leaf's
|
|
7
7
|
// command-owned `preview` field directly — walking the live command tree
|
|
8
|
-
// to find it would pull every subtree's module graph
|
|
9
|
-
//
|
|
10
|
-
// bundle. A flat, zero-dependency static map avoids that entirely.
|
|
8
|
+
// to find it would pull every subtree's module graph into the attach bundle.
|
|
9
|
+
// A flat, zero-dependency static map avoids that entirely.
|
|
11
10
|
//
|
|
12
11
|
// Source of truth: this Set must mirror every leaf that declares
|
|
13
12
|
// `help.preview.suppressOutput: true` in its own command file (currently
|
|
@@ -157,10 +156,10 @@ const LEAF_ICON_CP = {
|
|
|
157
156
|
'search answer': 0xf075,
|
|
158
157
|
'search contents': 0xf0f6,
|
|
159
158
|
'surface attach to': 0xf1e6,
|
|
160
|
-
'surface web serve': 0xf0ac,
|
|
161
159
|
'sys config get': 0xf019,
|
|
162
160
|
'sys config set': 0xf040,
|
|
163
161
|
'sys config path': 0xf07b,
|
|
162
|
+
'sys settings': 0xf013,
|
|
164
163
|
'sys setup': 0xf0ad,
|
|
165
164
|
'sys doctor': 0xf0f1,
|
|
166
165
|
'sys sysprompt': 0xf15c,
|
|
@@ -1142,7 +1141,7 @@ function summarizeNodeWaitDeadline(text) {
|
|
|
1142
1141
|
{ text: id, tone: 'muted' },
|
|
1143
1142
|
];
|
|
1144
1143
|
}
|
|
1145
|
-
/** `crtr node yield` (src/commands/node.ts
|
|
1144
|
+
/** `crtr node yield` (`src/commands/node/lifecycle.ts`) has no custom `render`;
|
|
1146
1145
|
* the generic renderer bullets `{node_id, promoted, model?, will_refresh}`
|
|
1147
1146
|
* — none of these names are PROSE_FIELDS. `will_refresh` is documented
|
|
1148
1147
|
* "Always true" (the command has no path that returns false), so
|
|
@@ -1167,7 +1166,7 @@ function summarizeNodeYield(text) {
|
|
|
1167
1166
|
lines.push({ text: extras.join(' · '), tone: 'muted' });
|
|
1168
1167
|
return lines;
|
|
1169
1168
|
}
|
|
1170
|
-
/** `crtr node lifecycle close` (nodeClose.render
|
|
1169
|
+
/** `crtr node lifecycle close` (`nodeClose.render` in `src/commands/node/lifecycle.ts`):
|
|
1171
1170
|
* `Closed ${id} and its exclusive subtree — ${count} node(s)
|
|
1172
1171
|
* closed${spared>0 ? ", ${spared} spared..." : ''}.` on success, or a
|
|
1173
1172
|
* short failure line — left as null there, the generic fallback is fine for
|
|
@@ -2235,7 +2234,7 @@ function summarizeSearchContents(text) {
|
|
|
2235
2234
|
* raw ANSI curses frames never match any marker below, so this summarizer
|
|
2236
2235
|
* safely returns null in that case). In the headless/agent path
|
|
2237
2236
|
* (src/commands/sys/setup.ts's `!process.stdout.isTTY` branch,
|
|
2238
|
-
* `
|
|
2237
|
+
* `renderSetupStaticInstructions` in setup-core.ts — the shape every
|
|
2239
2238
|
* bash-tool call to this leaf actually produces) it instead prints a
|
|
2240
2239
|
* static inventory: the headline `crtr sys setup (non-interactive)`, a
|
|
2241
2240
|
* `Packages:` section (`- <name> — <description> (installed|not
|
|
@@ -2589,7 +2588,7 @@ function summarizeSysLogs(text) {
|
|
|
2589
2588
|
if (lines.length === 0 || lines.some((line) => line === ''))
|
|
2590
2589
|
return null;
|
|
2591
2590
|
for (const line of lines) {
|
|
2592
|
-
const event = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2}) (DEBUG|INFO|WARN|ERROR) (daemon|broker
|
|
2591
|
+
const event = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2}) (DEBUG|INFO|WARN|ERROR) (daemon|broker) \S+ op=[0-9a-f]{32}(?: \{.*\})?$/.exec(line);
|
|
2593
2592
|
if (event !== null) {
|
|
2594
2593
|
componentCounts.set(event[2], (componentCounts.get(event[2]) ?? 0) + 1);
|
|
2595
2594
|
if (event[1] === 'ERROR')
|
|
@@ -2609,7 +2608,7 @@ function summarizeSysLogs(text) {
|
|
|
2609
2608
|
}
|
|
2610
2609
|
raw++;
|
|
2611
2610
|
}
|
|
2612
|
-
const componentDigest = summarizeOrderedCounts(componentCounts, ['daemon', 'broker'
|
|
2611
|
+
const componentDigest = summarizeOrderedCounts(componentCounts, ['daemon', 'broker']);
|
|
2613
2612
|
const aside = [componentDigest, raw > 0 ? `${raw} raw` : ''].filter((part) => part !== '').join(' · ');
|
|
2614
2613
|
return summarizeHealthStatus(lines.length, errors, warnings, aside === '' ? 'no component detail' : aside);
|
|
2615
2614
|
}
|
|
@@ -3,7 +3,7 @@ import assert from 'node:assert/strict';
|
|
|
3
3
|
import { existsSync, mkdtempSync, rmSync } from 'node:fs';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
-
import {
|
|
6
|
+
import { loadProfileManifest, profileRoot, ROOT_PROFILE_ID } from '../manifest.js';
|
|
7
7
|
import { selectProfileForCwd } from '../select.js';
|
|
8
8
|
import { resetScopeCache } from '../../scope.js';
|
|
9
9
|
let home;
|
|
@@ -45,19 +45,9 @@ after(() => {
|
|
|
45
45
|
process.env.HOME = previousHome;
|
|
46
46
|
resetScopeCache();
|
|
47
47
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
assert.equal(first.profileId, ROOT_PROFILE_ID);
|
|
52
|
-
assert.equal(second.profileId, ROOT_PROFILE_ID);
|
|
53
|
-
assert.deepEqual(second, first);
|
|
54
|
-
assert.equal(first.manifest.name, 'root');
|
|
55
|
-
assert.deepEqual(first.manifest.projects, []);
|
|
56
|
-
assert.equal(existsSync(profileRoot(ROOT_PROFILE_ID)), true);
|
|
57
|
-
assert.equal(existsSync(profileManifestPath(ROOT_PROFILE_ID)), true);
|
|
58
|
-
assert.equal(existsSync(profileMemoryDir(ROOT_PROFILE_ID)), true);
|
|
59
|
-
assert.deepEqual(listProfiles().map(({ profileId }) => profileId), [ROOT_PROFILE_ID]);
|
|
60
|
-
});
|
|
48
|
+
// A headless node spawn in an uncovered cwd must never prompt: `isTTY` is
|
|
49
|
+
// forced false above, so a regression that reached for the interactive picker
|
|
50
|
+
// would hang this test the same way it would hang the spawn.
|
|
61
51
|
test('selectProfileForCwd falls back to the stable root profile when nothing covers cwd', async () => {
|
|
62
52
|
const profileId = await selectProfileForCwd(cwd);
|
|
63
53
|
assert.equal(profileId, ROOT_PROFILE_ID);
|
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
import type { NodeStatus } from '../canvas/types.js';
|
|
2
1
|
import { type ReviewRecord } from './types.js';
|
|
3
2
|
/**
|
|
4
3
|
* Finish a committed binding without ever recapturing its origin. Each step is
|
|
5
4
|
* safe to repeat after a crash; review.json is the final visibility switch.
|
|
6
5
|
*/
|
|
7
6
|
export declare function realizeReview(reviewId: string): Promise<ReviewRecord>;
|
|
8
|
-
/**
|
|
9
|
-
* Reopen one already-open companion when needed. The surface only attaches to
|
|
10
|
-
* the returned node; it never owns a second revive path.
|
|
11
|
-
*/
|
|
12
|
-
export declare function openExistingReview(reviewId: string): Promise<{
|
|
13
|
-
review: ReviewRecord;
|
|
14
|
-
disposition: 'terminal';
|
|
15
|
-
} | {
|
|
16
|
-
review: ReviewRecord;
|
|
17
|
-
companion_status: NodeStatus;
|
|
18
|
-
disposition: 'open';
|
|
19
|
-
}>;
|
|
@@ -5,7 +5,6 @@ import { withCanvasWrite } from '../canvas/db.js';
|
|
|
5
5
|
import { atomicWriteJson } from '../human/convention.js';
|
|
6
6
|
import { ticketDir } from '../human/root.js';
|
|
7
7
|
import { submitReview } from '../human/tickets.js';
|
|
8
|
-
import { isBrokerLive } from '../runtime/model-swap.js';
|
|
9
8
|
import { NodeIdConflictError, spawnNode } from '../runtime/nodes.js';
|
|
10
9
|
import { transition } from '../runtime/lifecycle.js';
|
|
11
10
|
import { reviveNode } from '../runtime/revive.js';
|
|
@@ -122,18 +121,6 @@ function realizeBridge(review) {
|
|
|
122
121
|
ensureBridgeSubscription(current, current.bridge_node_id);
|
|
123
122
|
return current;
|
|
124
123
|
}
|
|
125
|
-
async function awaitAttachableCompanion(nodeId, deadlineMs) {
|
|
126
|
-
const deadline = Date.now() + deadlineMs;
|
|
127
|
-
for (;;) {
|
|
128
|
-
const companion = getNode(nodeId);
|
|
129
|
-
if (companion !== null && isBrokerLive(companion))
|
|
130
|
-
return true;
|
|
131
|
-
const remaining = deadline - Date.now();
|
|
132
|
-
if (remaining <= 0)
|
|
133
|
-
return false;
|
|
134
|
-
await new Promise((resolveWait) => setTimeout(resolveWait, Math.min(100, remaining)));
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
124
|
function publishTicket(review) {
|
|
138
125
|
if (review.bridge_node_id === null)
|
|
139
126
|
throw bridgeUnsubscribed(review, '');
|
|
@@ -188,30 +175,3 @@ export async function realizeReview(reviewId) {
|
|
|
188
175
|
}
|
|
189
176
|
return requireReview(reviewId);
|
|
190
177
|
}
|
|
191
|
-
/**
|
|
192
|
-
* Reopen one already-open companion when needed. The surface only attaches to
|
|
193
|
-
* the returned node; it never owns a second revive path.
|
|
194
|
-
*/
|
|
195
|
-
export async function openExistingReview(reviewId) {
|
|
196
|
-
const review = requireReview(reviewId);
|
|
197
|
-
if (review.state === 'binding')
|
|
198
|
-
throw unknownReview(reviewId);
|
|
199
|
-
if (review.state !== 'open')
|
|
200
|
-
return { review, disposition: 'terminal' };
|
|
201
|
-
const companion = getNode(review.companion_node_id);
|
|
202
|
-
if (companion === null)
|
|
203
|
-
throw companionUnbound(review.review_id, 0);
|
|
204
|
-
if (!isBrokerLive(companion))
|
|
205
|
-
reviveNode(companion.node_id, { resume: true });
|
|
206
|
-
if (!await awaitAttachableCompanion(review.companion_node_id, COMPANION_BIND_DEADLINE_MS)) {
|
|
207
|
-
throw companionUnbound(review.review_id, COMPANION_BIND_DEADLINE_MS);
|
|
208
|
-
}
|
|
209
|
-
const attachable = getNode(review.companion_node_id);
|
|
210
|
-
if (attachable === null)
|
|
211
|
-
throw companionUnbound(review.review_id, 0);
|
|
212
|
-
return {
|
|
213
|
-
review: requireReview(reviewId),
|
|
214
|
-
companion_status: attachable.status,
|
|
215
|
-
disposition: 'open',
|
|
216
|
-
};
|
|
217
|
-
}
|
|
@@ -9,7 +9,7 @@ export type ReviewOriginKind = 'ticket' | 'inline';
|
|
|
9
9
|
export type CommentStatus = 'open' | 'resolved' | 'deleted';
|
|
10
10
|
export type CommentAuthorKind = 'human' | 'node';
|
|
11
11
|
export type CommentEventKind = 'created' | 'edited' | 'resolved' | 'reopened' | 'deleted' | 'reanchored' | 'notified' | 'notify_failed';
|
|
12
|
-
export type ReviewErrorCode = 'review_origin_missing' | 'review_origin_unforkable' | 'review_origin_unstable' | 'review_branch_unavailable' | 'branch_lost' | 'review_companion_unbound' | 'review_bridge_unsubscribed' | 'review_target_unreviewable' | 'source_unreadable' | 'delivery_unroutable' | 'unknown_review' | '
|
|
12
|
+
export type ReviewErrorCode = 'review_origin_missing' | 'review_origin_unforkable' | 'review_origin_unstable' | 'review_branch_unavailable' | 'branch_lost' | 'review_companion_unbound' | 'review_bridge_unsubscribed' | 'review_target_unreviewable' | 'source_unreadable' | 'delivery_unroutable' | 'unknown_review' | 'review_terminal' | 'review_required' | 'stale_document' | 'unknown_comment' | 'comment_deleted' | 'invalid_anchor' | 'anchor_out_of_range' | 'text_too_long' | 'comment_limit_reached' | 'stale_comment' | 'range_batch_incomplete' | 'range_batch_stale';
|
|
13
13
|
/** Limits */
|
|
14
14
|
export declare const COMMENT_TEXT_MAX = 8000;
|
|
15
15
|
export declare const COMMENT_QUOTE_MAX = 4000;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Run with: node --import tsx/esm --test src/core/runtime/__tests__/engine-route.test.ts
|
|
2
2
|
//
|
|
3
|
-
// Regression lock for resolveEngineRoute (broker.ts): the broker is
|
|
3
|
+
// Regression lock for resolveEngineRoute (broker/frame-dispatch.ts): the broker is
|
|
4
4
|
// authoritative over prompt/follow_up routing against the LIVE session state.
|
|
5
5
|
// m-C is the load-bearing case — a `follow_up` delivered to an IDLE session
|
|
6
6
|
// used to be handed to pi's followUp(), whose queue only drains inside a
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// session). An idle follow_up must run as a prompt.
|
|
10
10
|
import { test } from 'node:test';
|
|
11
11
|
import assert from 'node:assert/strict';
|
|
12
|
-
import { resolveEngineRoute } from '../broker.js';
|
|
12
|
+
import { resolveEngineRoute } from '../broker/frame-dispatch.js';
|
|
13
13
|
const IMAGES = [{ type: 'image', data: 'aGk=', mimeType: 'image/png' }];
|
|
14
14
|
test('m-C: follow_up on an IDLE session escalates to prompt (no streamingBehavior)', () => {
|
|
15
15
|
const route = resolveEngineRoute({ type: 'follow_up' }, false);
|
|
@@ -18,6 +18,7 @@ import { cadenceDisplay } from '../wake.js';
|
|
|
18
18
|
import { renderKnowledgeBlock, renderWorkspaceOpenDocs } from '../substrate/index.js';
|
|
19
19
|
import { loadProfileManifest } from '../profiles/manifest.js';
|
|
20
20
|
import { situationalContextBlock } from './situational-context.js';
|
|
21
|
+
import { statusRank } from '../canvas/node-order.js';
|
|
21
22
|
/** The bearings custom type is shared with every attached renderer. */
|
|
22
23
|
export { CONTEXT_INTRO_CUSTOM_TYPE } from '../../shared/generated-context.js';
|
|
23
24
|
function escapeAttribute(value) {
|
|
@@ -183,17 +184,6 @@ export function orchestratorContextNote(nodeId) {
|
|
|
183
184
|
// first) and who is directly below it (its immediate children + their statuses).
|
|
184
185
|
// Not the full subtree — just the load-bearing spine up and one level down.
|
|
185
186
|
// ---------------------------------------------------------------------------
|
|
186
|
-
/** Live-first sibling ordering, so running children surface above finished ones. */
|
|
187
|
-
function statusRank(status) {
|
|
188
|
-
switch (status) {
|
|
189
|
-
case 'active': return 0;
|
|
190
|
-
case 'idle': return 1;
|
|
191
|
-
case 'done': return 2;
|
|
192
|
-
case 'canceled': return 3;
|
|
193
|
-
case 'dead': return 4;
|
|
194
|
-
default: return 5;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
187
|
/** One relative's line in the map: `<id> — <kind> · <status>`, plus the node's
|
|
198
188
|
* task description when it carries one (orientation: what that relative is for). */
|
|
199
189
|
function relativeLabel(meta) {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Socket } from 'node:net';
|
|
2
|
+
import { FrameDecoder, type BrokerSnapshot, type BrokerToClient, type ClientRole } from '../broker-protocol.js';
|
|
3
|
+
export interface BrokerClient {
|
|
4
|
+
id: string;
|
|
5
|
+
role: ClientRole;
|
|
6
|
+
socket: Socket;
|
|
7
|
+
decoder: FrameDecoder;
|
|
8
|
+
helloed: boolean;
|
|
9
|
+
pendingBytes: number;
|
|
10
|
+
queuedFrames: number;
|
|
11
|
+
}
|
|
12
|
+
/** Owns connected viewers, their outbound backpressure, and durable attach presence. */
|
|
13
|
+
export declare class BrokerClientRegistry {
|
|
14
|
+
private readonly nodeId;
|
|
15
|
+
private readonly attachPath;
|
|
16
|
+
private readonly clients;
|
|
17
|
+
private readonly displayStatuses;
|
|
18
|
+
private readonly displayWidgets;
|
|
19
|
+
private displayTitle;
|
|
20
|
+
constructor(nodeId: string);
|
|
21
|
+
create(socket: Socket): BrokerClient;
|
|
22
|
+
writableClients(): BrokerClient[];
|
|
23
|
+
persistAttachState(): void;
|
|
24
|
+
dropClient(client: BrokerClient, reason: string): void;
|
|
25
|
+
removeClient(client: BrokerClient): void;
|
|
26
|
+
sendFrame(client: BrokerClient, frame: BrokerToClient, bypassHwm?: boolean): void;
|
|
27
|
+
broadcast(frame: BrokerToClient): void;
|
|
28
|
+
broadcastUi(frame: BrokerToClient): void;
|
|
29
|
+
displaySnapshot(): BrokerSnapshot['display'];
|
|
30
|
+
forEachHelloed(fn: (client: BrokerClient) => void): void;
|
|
31
|
+
dispose(): void;
|
|
32
|
+
clearAttachState(): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { jobDir } from '../../canvas/paths.js';
|
|
3
|
+
import { emitEvent } from '../../events/emit.js';
|
|
4
|
+
import { encodeFrame, FrameDecoder, BROKER_READ_CAPS, } from '../broker-protocol.js';
|
|
5
|
+
/** Per-viewer outbound high-water mark. Slow viewers are shed rather than allowed to backpressure the shared engine indefinitely. */
|
|
6
|
+
const MAX_QUEUED_FRAMES = 1000;
|
|
7
|
+
const MAX_PENDING_BYTES = 32 * 1024 * 1024;
|
|
8
|
+
/** Owns connected viewers, their outbound backpressure, and durable attach presence. */
|
|
9
|
+
export class BrokerClientRegistry {
|
|
10
|
+
nodeId;
|
|
11
|
+
attachPath;
|
|
12
|
+
clients = new Set();
|
|
13
|
+
displayStatuses = new Map();
|
|
14
|
+
displayWidgets = new Map();
|
|
15
|
+
displayTitle;
|
|
16
|
+
constructor(nodeId) {
|
|
17
|
+
this.nodeId = nodeId;
|
|
18
|
+
this.attachPath = `${jobDir(nodeId)}/attach.json`;
|
|
19
|
+
}
|
|
20
|
+
create(socket) {
|
|
21
|
+
const client = {
|
|
22
|
+
id: '',
|
|
23
|
+
role: 'observer',
|
|
24
|
+
socket,
|
|
25
|
+
decoder: new FrameDecoder(BROKER_READ_CAPS),
|
|
26
|
+
helloed: false,
|
|
27
|
+
pendingBytes: 0,
|
|
28
|
+
queuedFrames: 0,
|
|
29
|
+
};
|
|
30
|
+
this.clients.add(client);
|
|
31
|
+
return client;
|
|
32
|
+
}
|
|
33
|
+
writableClients() {
|
|
34
|
+
const out = [];
|
|
35
|
+
for (const client of this.clients) {
|
|
36
|
+
if (!client.helloed || client.role !== 'controller')
|
|
37
|
+
continue;
|
|
38
|
+
if (client.socket.destroyed || client.socket.readableEnded || !client.socket.writable)
|
|
39
|
+
continue;
|
|
40
|
+
out.push(client);
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
persistAttachState() {
|
|
45
|
+
try {
|
|
46
|
+
let viewers = 0;
|
|
47
|
+
for (const client of this.clients)
|
|
48
|
+
if (client.helloed)
|
|
49
|
+
viewers += 1;
|
|
50
|
+
const dir = jobDir(this.nodeId);
|
|
51
|
+
if (!existsSync(dir))
|
|
52
|
+
mkdirSync(dir, { recursive: true });
|
|
53
|
+
writeFileSync(this.attachPath, JSON.stringify({ viewers, updated: new Date().toISOString() }, null, 2), 'utf8');
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
/* presence is best-effort; never crash the broker */
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
dropClient(client, reason) {
|
|
60
|
+
if (!this.clients.has(client))
|
|
61
|
+
return;
|
|
62
|
+
emitEvent({
|
|
63
|
+
level: 'info',
|
|
64
|
+
event: 'broker.runtime.diagnostic',
|
|
65
|
+
fields: { message: `dropping viewer ${client.id || '(pre-hello)'} — ${reason}` },
|
|
66
|
+
});
|
|
67
|
+
this.removeClient(client);
|
|
68
|
+
try {
|
|
69
|
+
client.socket.destroy();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
/* ignore */
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
removeClient(client) {
|
|
76
|
+
this.clients.delete(client);
|
|
77
|
+
this.persistAttachState();
|
|
78
|
+
}
|
|
79
|
+
sendFrame(client, frame, bypassHwm = false) {
|
|
80
|
+
let data;
|
|
81
|
+
try {
|
|
82
|
+
data = encodeFrame(frame);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const bytes = Buffer.byteLength(data);
|
|
88
|
+
if (!bypassHwm && (client.queuedFrames + 1 > MAX_QUEUED_FRAMES || client.pendingBytes + bytes > MAX_PENDING_BYTES)) {
|
|
89
|
+
this.dropClient(client, `backpressure high-water mark exceeded (queued=${client.queuedFrames}, pending=${client.pendingBytes}B)`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
client.queuedFrames += 1;
|
|
93
|
+
client.pendingBytes += bytes;
|
|
94
|
+
try {
|
|
95
|
+
client.socket.write(data, () => {
|
|
96
|
+
client.queuedFrames -= 1;
|
|
97
|
+
client.pendingBytes -= bytes;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
client.queuedFrames -= 1;
|
|
102
|
+
client.pendingBytes -= bytes;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
broadcast(frame) {
|
|
106
|
+
for (const client of this.clients)
|
|
107
|
+
if (client.helloed)
|
|
108
|
+
this.sendFrame(client, frame);
|
|
109
|
+
}
|
|
110
|
+
broadcastUi(frame) {
|
|
111
|
+
if (frame.type === 'extension_ui_request') {
|
|
112
|
+
if (frame.method === 'setStatus') {
|
|
113
|
+
this.displayStatuses.delete(frame.statusKey);
|
|
114
|
+
if (frame.statusText !== undefined)
|
|
115
|
+
this.displayStatuses.set(frame.statusKey, frame.statusText);
|
|
116
|
+
}
|
|
117
|
+
else if (frame.method === 'setWidget') {
|
|
118
|
+
this.displayWidgets.delete(frame.widgetKey);
|
|
119
|
+
if (frame.widgetLines !== undefined) {
|
|
120
|
+
this.displayWidgets.set(frame.widgetKey, {
|
|
121
|
+
lines: [...frame.widgetLines],
|
|
122
|
+
placement: frame.widgetPlacement ?? 'aboveEditor',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (frame.method === 'setTitle') {
|
|
127
|
+
this.displayTitle = frame.title;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
this.broadcast(frame);
|
|
131
|
+
}
|
|
132
|
+
displaySnapshot() {
|
|
133
|
+
return {
|
|
134
|
+
statuses: Object.fromEntries(this.displayStatuses),
|
|
135
|
+
widgets: Object.fromEntries([...this.displayWidgets].map(([key, widget]) => [key, { lines: [...widget.lines], placement: widget.placement }])),
|
|
136
|
+
title: this.displayTitle,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
forEachHelloed(fn) {
|
|
140
|
+
for (const client of this.clients)
|
|
141
|
+
if (client.helloed)
|
|
142
|
+
fn(client);
|
|
143
|
+
}
|
|
144
|
+
dispose() {
|
|
145
|
+
for (const client of this.clients) {
|
|
146
|
+
try {
|
|
147
|
+
client.socket.destroy();
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
/* ignore */
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
this.clients.clear();
|
|
154
|
+
}
|
|
155
|
+
clearAttachState() {
|
|
156
|
+
try {
|
|
157
|
+
if (existsSync(this.attachPath))
|
|
158
|
+
unlinkSync(this.attachPath);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
/* ignore */
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BrokerExtensionStateDTO, BrokerGeneratedNameRequest, BrokerGeneratedNameResultDTO, BrokerInboxCursorDirective, BrokerInboxCursorRequest, BrokerModelCommitRequest, BrokerModelCommitResultDTO, BrokerPersonaAckRequest, BrokerSessionBoundRequest, BrokerSessionBoundResultDTO, BrokerSettleDirective, BrokerSettleRequest } from '../../../api/dto/broker-ops.js';
|
|
2
|
+
import type { RelaunchRootResultDTO } from '../../../api/dto/lifecycle.js';
|
|
3
|
+
import type { PushReportRequest } from '../../../api/dto/reports.js';
|
|
4
|
+
export declare function bindBrokerSession(nodeId: string, request: BrokerSessionBoundRequest): Promise<BrokerSessionBoundResultDTO>;
|
|
5
|
+
export declare function settleBroker(nodeId: string, request: BrokerSettleRequest): Promise<BrokerSettleDirective>;
|
|
6
|
+
export declare function advanceBrokerInboxCursor(nodeId: string, request: BrokerInboxCursorRequest): Promise<BrokerInboxCursorDirective>;
|
|
7
|
+
/** Fixed canvas projection for broker extension rendering. It deliberately
|
|
8
|
+
* exposes no generic node/database facade. */
|
|
9
|
+
export declare function commitBrokerModel(nodeId: string, request: BrokerModelCommitRequest): Promise<BrokerModelCommitResultDTO>;
|
|
10
|
+
export declare function brokerExtensionState(nodeId: string): Promise<BrokerExtensionStateDTO>;
|
|
11
|
+
export declare function commitBrokerGeneratedName(nodeId: string, request: BrokerGeneratedNameRequest): Promise<BrokerGeneratedNameResultDTO>;
|
|
12
|
+
export declare function commitBrokerPersonaAck(nodeId: string, request: BrokerPersonaAckRequest): Promise<void>;
|
|
13
|
+
/** Reports still use the canonical daemon report handler; this broker adapter
|
|
14
|
+
* only preserves terminal structured output's idempotent finalization result. */
|
|
15
|
+
export declare function publishBrokerReport(nodeId: string, request: PushReportRequest): Promise<void>;
|
|
16
|
+
/** Root `/new` remains on the dedicated relaunch operation because it launches
|
|
17
|
+
* a replacement broker and tears down this broker. Callers must not await it
|
|
18
|
+
* from Pi's session-start dispatch. */
|
|
19
|
+
export declare function relaunchBrokerRoot(nodeId: string): Promise<RelaunchRootResultDTO>;
|