@north-light/crouter 0.3.172 → 0.3.174
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +106 -177
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +55 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +198 -0
- package/dist/commands/node/create.d.ts +23 -0
- package/dist/commands/node/create.js +207 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +302 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +415 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +164 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +82 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +159 -0
- package/dist/commands/node-lifecycle-revive.js +10 -57
- package/dist/commands/node.d.ts +0 -42
- package/dist/commands/node.js +11 -2065
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +67 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +46 -0
- package/dist/commands/surface/node/placement.js +124 -0
- package/dist/commands/surface-node.js +4 -1
- package/dist/commands/surface-reload.js +1 -2
- package/dist/commands/surface-tmux-spread.js +1 -1
- package/dist/commands/surface.js +5 -20
- package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
- package/dist/commands/sys/config.js +6 -6
- package/dist/commands/sys/logs.js +1 -1
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
- package/dist/commands/sys/panels/keys-panel.js +60 -0
- package/dist/commands/sys/panels/models-panel.d.ts +77 -0
- package/dist/commands/sys/panels/models-panel.js +647 -0
- package/dist/commands/sys/panels/panel.d.ts +45 -0
- package/dist/commands/sys/panels/panel.js +137 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +80 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
- package/dist/commands/sys/panels/prefs-panel.js +85 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
- package/dist/commands/sys/panels/provider-panel.js +538 -0
- package/dist/commands/sys/settings-shell.d.ts +55 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +31 -0
- package/dist/commands/sys/setup-core.d.ts +3 -33
- package/dist/commands/sys/setup-core.js +27 -78
- package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
- package/dist/commands/sys/setup-settings-runner.js +63 -0
- package/dist/commands/sys/setup-wizard.d.ts +26 -125
- package/dist/commands/sys/setup-wizard.js +209 -2473
- package/dist/commands/sys/setup.js +5 -7
- package/dist/commands/sys.js +3 -2
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
- package/dist/core/__tests__/broker-preflight.test.js +1 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
- package/dist/core/__tests__/canvas.test.js +2 -36
- package/dist/core/__tests__/close.test.js +14 -3
- package/dist/core/__tests__/context-intro.test.js +32 -143
- package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
- package/dist/core/__tests__/daemon-boot.test.js +2 -20
- package/dist/core/__tests__/daemon-wedge.test.js +1 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +4 -98
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
- package/dist/core/__tests__/helpers/broker-clients.js +0 -14
- package/dist/core/__tests__/helpers/harness.d.ts +0 -8
- package/dist/core/__tests__/helpers/harness.js +7 -87
- package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
- package/dist/core/__tests__/kickoff.test.js +1 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
- package/dist/core/__tests__/migration.test.js +35 -48
- package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
- package/dist/core/__tests__/passive-subscription.test.js +26 -49
- package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
- package/dist/core/__tests__/prune.test.js +94 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -32
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
- package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
- package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
- package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
- package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
- package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
- package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
- package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
- package/dist/core/__tests__/secrets.test.js +1 -7
- package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
- package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
- package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
- package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
- package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
- package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
- package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
- package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
- package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
- package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
- package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
- package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
- package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
- package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
- package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
- package/dist/core/__tests__/session-model.test.js +0 -18
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
- package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
- package/dist/core/broker-client/client.d.ts +2 -2
- package/dist/core/broker-client/client.js +4 -7
- package/dist/core/broker-client/transport-relay.d.ts +13 -19
- package/dist/core/broker-client/transport-relay.js +19 -34
- package/dist/core/broker-client/transport-socket.d.ts +2 -2
- package/dist/core/broker-client/transport-socket.js +9 -2
- package/dist/core/broker-client/transport.d.ts +7 -3
- package/dist/core/broker-client/transport.js +4 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -18
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
- package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
- package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
- package/dist/core/canvas/browse/app.d.ts +2 -17
- package/dist/core/canvas/browse/app.js +16 -88
- package/dist/core/canvas/browse/model.d.ts +0 -4
- package/dist/core/canvas/browse/model.js +1 -12
- package/dist/core/canvas/browse/render.js +6 -3
- package/dist/core/canvas/crons.d.ts +8 -5
- package/dist/core/canvas/crons.js +7 -6
- package/dist/core/canvas/extensions.d.ts +7 -3
- package/dist/core/canvas/extensions.js +16 -4
- package/dist/core/canvas/nav-model.d.ts +0 -4
- package/dist/core/canvas/nav-model.js +2 -14
- package/dist/core/canvas/node-order.d.ts +3 -0
- package/dist/core/canvas/node-order.js +12 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
- package/dist/core/canvas/remote-canvas-source.js +8 -15
- package/dist/core/command.js +11 -4
- package/dist/core/config.js +3 -1
- package/dist/core/events/envelope.js +1 -1
- package/dist/core/events/read.js +7 -21
- package/dist/core/events/source.d.ts +0 -2
- package/dist/core/events/source.js +0 -16
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/fault-classifier.d.ts +1 -1
- package/dist/core/feed/passive.d.ts +0 -11
- package/dist/core/feed/passive.js +1 -62
- package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
- package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
- package/dist/core/keybindings/background-bash.js +3 -4
- package/dist/core/keybindings/catalog.js +1 -1
- package/dist/core/memory/inline-ref-grammar.js +3 -3
- package/dist/core/memory-resolver.d.ts +11 -25
- package/dist/core/memory-resolver.js +51 -33
- package/dist/core/model-routes.d.ts +15 -0
- package/dist/core/model-routes.js +12 -0
- package/dist/core/pool-credential-store.js +1 -1
- package/dist/core/preview-registry.js +8 -9
- package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
- package/dist/core/review/realize.d.ts +0 -13
- package/dist/core/review/realize.js +0 -40
- package/dist/core/review/types.d.ts +1 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
- package/dist/core/runtime/bearings.js +1 -11
- package/dist/core/runtime/broker/client-registry.d.ts +33 -0
- package/dist/core/runtime/broker/client-registry.js +164 -0
- package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
- package/dist/core/runtime/broker/daemon-ops.js +49 -0
- package/dist/core/runtime/broker/event-projection.d.ts +42 -0
- package/dist/core/runtime/broker/event-projection.js +178 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
- package/dist/core/runtime/broker/fault-retry.js +277 -0
- package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
- package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
- package/dist/core/runtime/broker/inbox.d.ts +22 -0
- package/dist/core/runtime/broker/inbox.js +167 -0
- package/dist/core/runtime/broker/passive.d.ts +16 -0
- package/dist/core/runtime/broker/passive.js +44 -0
- package/dist/core/runtime/broker/read-ops.d.ts +23 -0
- package/dist/core/runtime/broker/read-ops.js +150 -0
- package/dist/core/runtime/broker/rebind.d.ts +74 -0
- package/dist/core/runtime/broker/rebind.js +211 -0
- package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
- package/dist/core/runtime/broker/tool-groups.js +244 -0
- package/dist/core/runtime/broker-extension-render.d.ts +11 -0
- package/dist/core/runtime/broker-extension-render.js +181 -0
- package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
- package/dist/core/runtime/broker-persona-guidance.js +58 -0
- package/dist/core/runtime/broker-protocol.d.ts +1 -1
- package/dist/core/runtime/broker-protocol.js +1 -1
- package/dist/core/runtime/broker.d.ts +5 -196
- package/dist/core/runtime/broker.js +276 -3059
- package/dist/core/runtime/canvas-extensions.js +11 -2
- package/dist/core/runtime/fault.js +1 -1
- package/dist/core/runtime/model-selection.d.ts +9 -0
- package/dist/core/runtime/model-selection.js +12 -0
- package/dist/core/runtime/model-swap.d.ts +3 -3
- package/dist/core/runtime/model-swap.js +33 -25
- package/dist/core/runtime/placement-tmux.d.ts +3 -14
- package/dist/core/runtime/placement-tmux.js +11 -80
- package/dist/core/runtime/placement.d.ts +4 -2
- package/dist/core/runtime/placement.js +7 -12
- package/dist/core/runtime/promote.d.ts +14 -1
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +8 -0
- package/dist/core/runtime/spawn.js +36 -6
- package/dist/core/runtime/stop-guard.d.ts +4 -3
- package/dist/core/runtime/stop-guard.js +36 -18
- package/dist/core/runtime/stop-signals.d.ts +4 -1
- package/dist/core/runtime/stream-watchdog.js +4 -5
- package/dist/core/runtime/structured-output.d.ts +15 -2
- package/dist/core/runtime/structured-output.js +35 -12
- package/dist/core/runtime/tmux-bindings.d.ts +25 -0
- package/dist/core/runtime/tmux-bindings.js +682 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -1
- package/dist/core/runtime/tmux-chrome.js +3 -2
- package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
- package/dist/core/runtime/tmux-driver.js +598 -0
- package/dist/core/runtime/view-socket.d.ts +14 -0
- package/dist/core/runtime/view-socket.js +83 -0
- package/dist/core/session-model/session-state.d.ts +1 -2
- package/dist/core/session-model/session-state.js +5 -8
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +2 -2
- package/dist/core/substrate/gate.d.ts +1 -1
- package/dist/core/substrate/on-read-pure.d.ts +7 -0
- package/dist/core/substrate/on-read-pure.js +272 -0
- package/dist/core/termrender/termrender.js +32 -2
- package/dist/core/user-settings.d.ts +23 -1
- package/dist/core/user-settings.js +18 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
- package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
- package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
- package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
- package/dist/daemon/api/bridge.js +40 -81
- package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
- package/dist/daemon/api/handlers/broker-ops.js +383 -0
- package/dist/daemon/api/handlers/crons.js +9 -4
- package/dist/daemon/api/handlers/files.js +6 -7
- package/dist/daemon/api/handlers/inbox.js +2 -340
- package/dist/daemon/api/handlers/nodes.d.ts +10 -1
- package/dist/daemon/api/handlers/nodes.js +74 -39
- package/dist/daemon/api/handlers/review-comments.js +5 -1
- package/dist/daemon/api/handlers/reviews.js +0 -19
- package/dist/daemon/api/map.js +25 -4
- package/dist/daemon/api/router.js +2 -3
- package/dist/daemon/api/server.js +5 -7
- package/dist/daemon/cron-run.d.ts +4 -0
- package/dist/daemon/cron-run.js +30 -13
- package/dist/daemon/crtrd.d.ts +3 -58
- package/dist/daemon/crtrd.js +28 -1244
- package/dist/daemon/manage.js +0 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
- package/dist/daemon/reconcilers/broker-supervision.js +549 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
- package/dist/daemon/reconcilers/cron-lane.js +32 -0
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
- package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
- package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
- package/dist/daemon/review/finish.js +2 -5
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
- package/dist/pi-extensions/broker-local.d.ts +20 -0
- package/dist/pi-extensions/broker-local.js +89 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
- package/dist/pi-extensions/canvas-context-intro.js +22 -11
- package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
- package/dist/pi-extensions/canvas-goal-capture.js +7 -12
- package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
- package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
- package/dist/pi-extensions/canvas-passive-context.js +22 -18
- package/dist/pi-extensions/canvas-recap.d.ts +2 -2
- package/dist/pi-extensions/canvas-recap.js +48 -21
- package/dist/pi-extensions/canvas-review-boundary.js +10 -4
- package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
- package/dist/pi-extensions/canvas-stophook.js +149 -431
- package/dist/pi-extensions/canvas-structured-output.js +52 -30
- package/dist/pi-extensions/envelope-merge.d.ts +13 -0
- package/dist/pi-extensions/envelope-merge.js +29 -0
- package/dist/shared/working-activity.d.ts +3 -2
- package/dist/shared/working-activity.js +3 -2
- package/dist/types.d.ts +6 -5
- package/dist/types.js +2 -2
- package/docs/compat/hearth-crtr-v1.md +4 -12
- package/docs/compat/hearth-crtr-v2.md +3 -11
- package/docs/compat/hearth-crtr-v3.md +4 -12
- package/docs/compat/hearth-crtr-v4.md +3 -11
- package/docs/compat/hearth-crtr-v5.md +3 -11
- package/docs/public-api.md +3 -7
- package/package.json +7 -49
- package/runtime.lock.json +2766 -14533
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
- package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
- package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
- package/dist/clients/conversation/conversation.d.ts +0 -65
- package/dist/clients/conversation/conversation.js +0 -318
- package/dist/clients/conversation/frames.d.ts +0 -30
- package/dist/clients/conversation/frames.js +0 -52
- package/dist/clients/conversation/region.d.ts +0 -51
- package/dist/clients/conversation/region.js +0 -265
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
- package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
- package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
- package/dist/clients/inbox/review/columns.d.ts +0 -22
- package/dist/clients/inbox/review/columns.js +0 -40
- package/dist/clients/inbox/review/composition.d.ts +0 -60
- package/dist/clients/inbox/review/composition.js +0 -278
- package/dist/clients/inbox/review/document-region.d.ts +0 -120
- package/dist/clients/surfaces/region.d.ts +0 -16
- package/dist/clients/web/__tests__/push-engine.test.js +0 -158
- package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
- package/dist/clients/web/__tests__/push-registry.test.js +0 -177
- package/dist/clients/web/dev-server.d.ts +0 -7
- package/dist/clients/web/dev-server.js +0 -46
- package/dist/clients/web/events.d.ts +0 -19
- package/dist/clients/web/events.js +0 -163
- package/dist/clients/web/push-engine.d.ts +0 -44
- package/dist/clients/web/push-engine.js +0 -125
- package/dist/clients/web/push-registry.d.ts +0 -85
- package/dist/clients/web/push-registry.js +0 -373
- package/dist/clients/web/server.d.ts +0 -19
- package/dist/clients/web/server.js +0 -661
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
- package/dist/clients/web/web-client/shared/protocol.js +0 -8
- package/dist/clients/web/web-cmd.d.ts +0 -2
- package/dist/clients/web/web-cmd.js +0 -141
- package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
- package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
- package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
- package/dist/commands/__tests__/canvas-config.test.js +0 -107
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
- package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
- package/dist/commands/__tests__/search-contents.test.js +0 -52
- package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/lint.test.js +0 -15
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
- package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
- package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
- package/dist/core/__tests__/finalization-migration.test.js +0 -38
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
- package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
- package/dist/core/__tests__/fork.test.d.ts +0 -1
- package/dist/core/__tests__/fork.test.js +0 -108
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
- package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
- package/dist/core/__tests__/full/cascade-close.test.js +0 -240
- package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/detach-focus.test.js +0 -126
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
- package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.js +0 -60
- package/dist/core/__tests__/model-routes.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes.test.js +0 -41
- package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-identity.test.js +0 -61
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
- package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
- package/dist/core/__tests__/prune-to-limit.test.js +0 -126
- package/dist/core/__tests__/reset.test.d.ts +0 -1
- package/dist/core/__tests__/reset.test.js +0 -69
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
- package/dist/core/__tests__/steer-note.test.d.ts +0 -1
- package/dist/core/__tests__/steer-note.test.js +0 -41
- package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
- package/dist/core/__tests__/subcommand-tier.test.js +0 -99
- package/dist/core/__tests__/subscription-delivery.test.js +0 -211
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
- package/dist/core/__tests__/tmux-surface.test.js +0 -484
- package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
- package/dist/core/__tests__/wake-bearings.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
- package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
- package/dist/core/canvas/remote-event-stream.d.ts +0 -24
- package/dist/core/canvas/remote-event-stream.js +0 -94
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
- package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
- package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
- package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
- package/dist/core/human/__tests__/visible-paths.test.js +0 -28
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
- package/dist/core/review/__tests__/project.test.d.ts +0 -1
- package/dist/core/review/__tests__/project.test.js +0 -71
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
- package/dist/core/runtime/tmux.js +0 -1314
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
- package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/inbox.test.js +0 -489
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
- package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +0 -17
- package/dist/web-client/manifest.webmanifest +0 -1
- package/dist/web-client/sw.js +0 -1
- /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
- /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
- /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
- /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
- /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
- /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
- /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
- /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
- /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
- /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
// transport-relay.test.ts —
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// WS-message wire, the 1011/1008 "gone" close-code classification (and its
|
|
7
|
-
// NOT-gone counterparts), and a non-101 handshake response (bad token) not
|
|
8
|
-
// hanging connect().
|
|
1
|
+
// transport-relay.test.ts — RelayTransport coverage for the remote half of
|
|
2
|
+
// the Transport seam. This fast plain-`ws` stand-in for crtrd's attach endpoint
|
|
3
|
+
// exercises the required route, Authorization header, one-JSON-frame-per-WS-
|
|
4
|
+
// message wire, 1011/1008 unavailable-broker classification, and a failed
|
|
5
|
+
// handshake without booting pi or a broker.
|
|
9
6
|
import assert from 'node:assert/strict';
|
|
10
7
|
import test, { after, before } from 'node:test';
|
|
11
8
|
import { existsSync, mkdtempSync, rmSync } from 'node:fs';
|
|
@@ -15,16 +12,18 @@ import { WebSocketServer } from 'ws';
|
|
|
15
12
|
import { RelayTransport } from '../transport-relay.js';
|
|
16
13
|
import { BrokerUnavailableError } from '../transport.js';
|
|
17
14
|
import { jobDir } from '../../canvas/paths.js';
|
|
18
|
-
/** Stand up a bare `ws`
|
|
19
|
-
*
|
|
20
|
-
*
|
|
15
|
+
/** Stand up a bare `ws` crtrd attach endpoint on an ephemeral loopback port.
|
|
16
|
+
* It records each request URL, Authorization header, and accepted socket so
|
|
17
|
+
* the tests assert the wire contract directly. */
|
|
21
18
|
function startMockRelay() {
|
|
22
19
|
return new Promise((resolve) => {
|
|
23
20
|
const wss = new WebSocketServer({ port: 0 });
|
|
24
21
|
const authHeaders = [];
|
|
22
|
+
const requestUrls = [];
|
|
25
23
|
const sockets = [];
|
|
26
24
|
wss.on('connection', (ws, req) => {
|
|
27
25
|
authHeaders.push(req.headers.authorization ?? '');
|
|
26
|
+
requestUrls.push(req.url ?? '');
|
|
28
27
|
sockets.push(ws);
|
|
29
28
|
});
|
|
30
29
|
wss.once('listening', () => {
|
|
@@ -33,6 +32,7 @@ function startMockRelay() {
|
|
|
33
32
|
resolve({
|
|
34
33
|
target: { previewEndpoint: `http://127.0.0.1:${port}`, relayToken: 'test-token' },
|
|
35
34
|
authHeaders,
|
|
35
|
+
requestUrls,
|
|
36
36
|
sockets,
|
|
37
37
|
close: () => new Promise((res) => wss.close(() => res())),
|
|
38
38
|
});
|
|
@@ -57,10 +57,11 @@ function connectTransport(transport) {
|
|
|
57
57
|
transport.connect();
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
|
-
test('RelayTransport
|
|
60
|
+
test('RelayTransport dials crtrd attach with Authorization: Bearer <token>', async () => {
|
|
61
61
|
const relay = await startMockRelay();
|
|
62
62
|
const transport = new RelayTransport('node-auth', relay.target);
|
|
63
63
|
await connectTransport(transport);
|
|
64
|
+
assert.equal(relay.requestUrls[0], '/v1/nodes/node-auth/attach');
|
|
64
65
|
assert.equal(relay.authHeaders[0], 'Bearer test-token');
|
|
65
66
|
transport.destroy();
|
|
66
67
|
await relay.close();
|
|
@@ -109,10 +110,8 @@ test('a 1000 normal close does NOT surface BrokerUnavailableError', async () =>
|
|
|
109
110
|
await relay.close();
|
|
110
111
|
});
|
|
111
112
|
test('an immediate post-upgrade 1011 "no node <id>" close is still caught by a listener installed BEFORE connect() is dialed', async () => {
|
|
112
|
-
//
|
|
113
|
-
// upgrade
|
|
114
|
-
// no delay from app logic) that the node doesn't exist and closes 1011 —
|
|
115
|
-
// in the SAME tick the 'connection' handler runs. This is the ordering that
|
|
113
|
+
// Simulate a crtrd attach connection that closes 1011 immediately after its
|
|
114
|
+
// WebSocket upgrade. This is the ordering that
|
|
116
115
|
// broke `viewer.ts`'s original startup race: the transport's 'connect'
|
|
117
116
|
// (WS 'open') is structurally guaranteed to fire before any close frame can
|
|
118
117
|
// be parsed (a close can't precede the handshake that establishes the
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync } from 'node:fs';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
import { nodeDir } from '../../canvas/paths.js';
|
|
5
|
+
import { readFault } from '../../runtime/fault.js';
|
|
6
|
+
import { SocketTransport } from '../transport-socket.js';
|
|
7
|
+
test('a missing dormant broker does not leave a viewer↔broker fault', async () => {
|
|
8
|
+
const previousHome = process.env['CRTR_HOME'];
|
|
9
|
+
const home = mkdtempSync('/tmp/crtr-transport-socket-');
|
|
10
|
+
process.env['CRTR_HOME'] = home;
|
|
11
|
+
try {
|
|
12
|
+
const nodeId = 'dormant-node';
|
|
13
|
+
mkdirSync(nodeDir(nodeId), { recursive: true });
|
|
14
|
+
const transport = new SocketTransport(nodeId);
|
|
15
|
+
await assert.rejects(transport.redial());
|
|
16
|
+
assert.equal(readFault(nodeId)?.link, 'viewer↔broker', 'an ordinary failed redial records the outage');
|
|
17
|
+
await assert.rejects(transport.redial({ brokerUnavailableIsExpected: true }));
|
|
18
|
+
assert.equal(readFault(nodeId), null, 'a dormant node with no broker is normal, not a fault');
|
|
19
|
+
transport.destroy();
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
if (previousHome === undefined)
|
|
23
|
+
delete process.env['CRTR_HOME'];
|
|
24
|
+
else
|
|
25
|
+
process.env['CRTR_HOME'] = previousHome;
|
|
26
|
+
rmSync(home, { recursive: true, force: true });
|
|
27
|
+
}
|
|
28
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
2
|
import type { NodeRow } from '../canvas/types.js';
|
|
3
3
|
import type { BrokerDataFrame, BrokerToClient, ClientToBroker, DequeueFrame, GetHumanForkCoordinatesFrame, GetSettingsFrame, GetTreeFrame, ListMemoryRefsFrame, ListModelsFrame, ListScopedModelsFrame, ListSessionsFrame } from '../runtime/broker-protocol.js';
|
|
4
|
-
import { type Transport } from './transport.js';
|
|
4
|
+
import { type RedialOptions, type Transport } from './transport.js';
|
|
5
5
|
export { BrokerUnavailableError, type Transport } from './transport.js';
|
|
6
6
|
export { SocketTransport } from './transport-socket.js';
|
|
7
7
|
export { RelayTransport, type RelayTarget } from './transport-relay.js';
|
|
@@ -76,7 +76,7 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
76
76
|
/** Re-establish the connection after a broker exit (a yield→revive cycle),
|
|
77
77
|
* to the SAME target. Resolves on `connect` (caller re-sends `hello`);
|
|
78
78
|
* rejects on a retryable dial failure. */
|
|
79
|
-
redial(): Promise<void>;
|
|
79
|
+
redial(options?: RedialOptions): Promise<void>;
|
|
80
80
|
/** Encode + send one client→broker frame. No-op on a dead/absent
|
|
81
81
|
* connection; never throws. */
|
|
82
82
|
send(frame: ClientToBroker): void;
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
// client.ts — THE broker protocol client. Every Node process that talks to a
|
|
2
2
|
// node's broker over `view.sock` uses this one class: the `crtr surface attach`
|
|
3
3
|
// viewer, `auth-reload`, `model-swap`, and the human-prompt dequeue path.
|
|
4
|
-
// (The browser has its own module under
|
|
5
|
-
// `clients/web/web-client/` until that is made isomorphic — see the target
|
|
6
|
-
// architecture note; `daemon/api/bridge.ts` is a byte relay, not a client.)
|
|
7
4
|
//
|
|
8
5
|
// The §0 ONE-WRITER INVARIANT lives here: a client has ONLY a Transport
|
|
9
6
|
// (`transport.ts`) to an ALREADY-running headless broker — locally over its
|
|
10
7
|
// unix socket (`SocketTransport`, `nodeDir(id)/view.sock`), or remotely over a
|
|
11
|
-
//
|
|
12
|
-
// `transport-relay.ts`). BrokerClient NEVER spawns pi, NEVER opens the session
|
|
8
|
+
// bearer-authenticated WebSocket to crtrd's preview-served attach endpoint
|
|
9
|
+
// (`RelayTransport`, `transport-relay.ts`). BrokerClient NEVER spawns pi, NEVER opens the session
|
|
13
10
|
// `.jsonl`, NEVER constructs an engine — if the broker is not running, connect
|
|
14
11
|
// fails and the caller exits (focus/revive is what keeps a broker alive, not
|
|
15
12
|
// attach). It also never uses pi's `RpcClient` (which would spawn its own
|
|
@@ -128,8 +125,8 @@ export class BrokerClient extends EventEmitter {
|
|
|
128
125
|
/** Re-establish the connection after a broker exit (a yield→revive cycle),
|
|
129
126
|
* to the SAME target. Resolves on `connect` (caller re-sends `hello`);
|
|
130
127
|
* rejects on a retryable dial failure. */
|
|
131
|
-
redial() {
|
|
132
|
-
return this.transport.redial();
|
|
128
|
+
redial(options) {
|
|
129
|
+
return this.transport.redial(options);
|
|
133
130
|
}
|
|
134
131
|
/** Encode + send one client→broker frame. No-op on a dead/absent
|
|
135
132
|
* connection; never throws. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
2
|
import type { ClientToBroker } from '../runtime/broker-protocol.js';
|
|
3
|
-
import { type Transport } from './transport.js';
|
|
3
|
+
import { type RedialOptions, type Transport } from './transport.js';
|
|
4
4
|
/** A resolved remote canvas target — see `core/remote-canvas-target.ts` for how
|
|
5
5
|
* this is assembled from config (`relayTokenRef`) plus the 0600 secrets store
|
|
6
6
|
* via `resolveRemoteCanvasTarget`. This transport itself never takes the
|
|
@@ -10,7 +10,7 @@ import { type Transport } from './transport.js';
|
|
|
10
10
|
export interface RelayTarget {
|
|
11
11
|
/** The preview endpoint origin, e.g. `https://<hash>.preview.bl.run`. */
|
|
12
12
|
previewEndpoint: string;
|
|
13
|
-
/** The raw
|
|
13
|
+
/** The raw bearer token. NEVER logged, NEVER echoed. */
|
|
14
14
|
relayToken: string;
|
|
15
15
|
}
|
|
16
16
|
export declare class RelayTransport extends EventEmitter implements Transport {
|
|
@@ -22,27 +22,21 @@ export declare class RelayTransport extends EventEmitter implements Transport {
|
|
|
22
22
|
private get url();
|
|
23
23
|
private dial;
|
|
24
24
|
connect(): void;
|
|
25
|
-
/** Re-dial the
|
|
26
|
-
*
|
|
27
|
-
redial(): Promise<void>;
|
|
25
|
+
/** Re-dial the same crtrd attach endpoint — the preview endpoint is the
|
|
26
|
+
* stable remote anchor, as `view.sock` is locally. */
|
|
27
|
+
redial(_options?: RedialOptions): Promise<void>;
|
|
28
28
|
send(frame: ClientToBroker): void;
|
|
29
29
|
destroy(): void;
|
|
30
30
|
private onMessage;
|
|
31
31
|
private onError;
|
|
32
|
-
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* this reason connection-shaped", the OPPOSITE question from "is the
|
|
41
|
-
* broker/node gone", so branching on its `kind` here previously inverted
|
|
42
|
-
* the gone/not-gone decision (a real bug caught by the mock-relay test, see
|
|
43
|
-
* `transport-relay.test.ts`). Everything else (1006 abnormal, 1000 normal,
|
|
44
|
-
* or an unrecognized 1011 reason) is a transient/expected drop the caller
|
|
45
|
-
* may redial. */
|
|
32
|
+
/** A 1008 invalid-id close or a 1011 whose reason starts with "no running
|
|
33
|
+
* broker" or "no node " is a terminal unavailable-broker signal from the
|
|
34
|
+
* crtrd attach bridge. Surface it as BrokerUnavailableError so the reconnect
|
|
35
|
+
* supervisor applies its normal give-up path across transports. `classify`
|
|
36
|
+
* only handles the 1008/protocol case: its 1011 classification answers
|
|
37
|
+
* whether a close is connection-shaped, not whether the broker is gone.
|
|
38
|
+
* Everything else (1006 abnormal, 1000 normal, or an unrecognized 1011
|
|
39
|
+
* reason) is a transient or expected drop that the caller may redial. */
|
|
46
40
|
private onClose;
|
|
47
41
|
/** Emit `error` only when a listener exists — a bare EventEmitter `error`
|
|
48
42
|
* with no listener throws, and this transport must never throw uncaught. */
|
|
@@ -1,20 +1,11 @@
|
|
|
1
|
-
// transport-relay.ts — the REMOTE Transport: a
|
|
2
|
-
// `wss://<previewEndpoint>/
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// (`src/clients/web/server.ts`). One JSON frame per WS message, both
|
|
6
|
-
// directions — no FrameDecoder needed (WS preserves message boundaries).
|
|
1
|
+
// transport-relay.ts — the REMOTE Transport: a bearer-authenticated WebSocket
|
|
2
|
+
// to crtrd's `wss://<previewEndpoint>/v1/nodes/<id>/attach` endpoint. One JSON
|
|
3
|
+
// frame per WS message in both directions; no FrameDecoder is needed because
|
|
4
|
+
// WebSocket preserves message boundaries.
|
|
7
5
|
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// pin — it forwards path verbatim — so this is the only route that reaches an
|
|
12
|
-
// arbitrary node id, which is what makes multi-node remote attach possible.
|
|
13
|
-
//
|
|
14
|
-
// The relay token is the SAME in-guest credential model-auth-front already
|
|
15
|
-
// gates on; holding it is the in-guest trust tier, not a new one. Callers
|
|
16
|
-
// must keep it off argv/shell history (see `core/remote-canvas-target.ts`) — this
|
|
17
|
-
// transport only ever sends it as a request header, never logs it.
|
|
6
|
+
// Callers keep the bearer token off argv and shell history (see
|
|
7
|
+
// `core/remote-canvas-target.ts`). This transport sends it only as a request
|
|
8
|
+
// header and never logs it.
|
|
18
9
|
import { EventEmitter } from 'node:events';
|
|
19
10
|
import { WebSocket } from 'ws';
|
|
20
11
|
import { classify } from '../fault-classifier.js';
|
|
@@ -22,7 +13,7 @@ import { BrokerUnavailableError } from './transport.js';
|
|
|
22
13
|
function relayUrl(target, nodeId) {
|
|
23
14
|
const url = new URL(target.previewEndpoint);
|
|
24
15
|
url.protocol = url.protocol === 'http:' ? 'ws:' : 'wss:';
|
|
25
|
-
url.pathname = `/
|
|
16
|
+
url.pathname = `/v1/nodes/${encodeURIComponent(nodeId)}/attach`;
|
|
26
17
|
url.search = '';
|
|
27
18
|
url.hash = '';
|
|
28
19
|
return url.toString();
|
|
@@ -57,9 +48,9 @@ export class RelayTransport extends EventEmitter {
|
|
|
57
48
|
ws.on('error', (err) => this.onError(err));
|
|
58
49
|
ws.on('close', (code, reason) => this.onClose(code, reason.toString()));
|
|
59
50
|
}
|
|
60
|
-
/** Re-dial the
|
|
61
|
-
*
|
|
62
|
-
redial() {
|
|
51
|
+
/** Re-dial the same crtrd attach endpoint — the preview endpoint is the
|
|
52
|
+
* stable remote anchor, as `view.sock` is locally. */
|
|
53
|
+
redial(_options) {
|
|
63
54
|
this.destroy();
|
|
64
55
|
this.closeEmitted = false;
|
|
65
56
|
return new Promise((resolve, reject) => {
|
|
@@ -132,20 +123,14 @@ export class RelayTransport extends EventEmitter {
|
|
|
132
123
|
this.emitError(new Error(`relay transport error: ${err.message}`));
|
|
133
124
|
// 'close' follows 'error'; teardown converges there.
|
|
134
125
|
}
|
|
135
|
-
/**
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
* this reason connection-shaped", the OPPOSITE question from "is the
|
|
144
|
-
* broker/node gone", so branching on its `kind` here previously inverted
|
|
145
|
-
* the gone/not-gone decision (a real bug caught by the mock-relay test, see
|
|
146
|
-
* `transport-relay.test.ts`). Everything else (1006 abnormal, 1000 normal,
|
|
147
|
-
* or an unrecognized 1011 reason) is a transient/expected drop the caller
|
|
148
|
-
* may redial. */
|
|
126
|
+
/** A 1008 invalid-id close or a 1011 whose reason starts with "no running
|
|
127
|
+
* broker" or "no node " is a terminal unavailable-broker signal from the
|
|
128
|
+
* crtrd attach bridge. Surface it as BrokerUnavailableError so the reconnect
|
|
129
|
+
* supervisor applies its normal give-up path across transports. `classify`
|
|
130
|
+
* only handles the 1008/protocol case: its 1011 classification answers
|
|
131
|
+
* whether a close is connection-shaped, not whether the broker is gone.
|
|
132
|
+
* Everything else (1006 abnormal, 1000 normal, or an unrecognized 1011
|
|
133
|
+
* reason) is a transient or expected drop that the caller may redial. */
|
|
149
134
|
onClose(code, reason) {
|
|
150
135
|
if (this.closeEmitted)
|
|
151
136
|
return;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
2
|
import { type ClientToBroker } from '../runtime/broker-protocol.js';
|
|
3
|
-
import { type Transport } from './transport.js';
|
|
3
|
+
import { type RedialOptions, type Transport } from './transport.js';
|
|
4
4
|
export declare class SocketTransport extends EventEmitter implements Transport {
|
|
5
5
|
private readonly nodeId;
|
|
6
6
|
private socket;
|
|
@@ -17,7 +17,7 @@ export declare class SocketTransport extends EventEmitter implements Transport {
|
|
|
17
17
|
/** Re-establish the socket after a broker exit, on the SAME stable
|
|
18
18
|
* `view.sock` path. Installs a FRESH FrameDecoder (a half-frame from the
|
|
19
19
|
* dead stream must not corrupt the new one). */
|
|
20
|
-
redial(): Promise<void>;
|
|
20
|
+
redial(options?: RedialOptions): Promise<void>;
|
|
21
21
|
send(frame: ClientToBroker): void;
|
|
22
22
|
destroy(): void;
|
|
23
23
|
private onData;
|
|
@@ -62,10 +62,14 @@ export class SocketTransport extends EventEmitter {
|
|
|
62
62
|
/** Re-establish the socket after a broker exit, on the SAME stable
|
|
63
63
|
* `view.sock` path. Installs a FRESH FrameDecoder (a half-frame from the
|
|
64
64
|
* dead stream must not corrupt the new one). */
|
|
65
|
-
redial() {
|
|
65
|
+
redial(options = {}) {
|
|
66
66
|
this.destroy();
|
|
67
67
|
this.decoder = new FrameDecoder(CLIENT_READ_CAPS);
|
|
68
68
|
this.closeEmitted = false;
|
|
69
|
+
if (options.brokerUnavailableIsExpected) {
|
|
70
|
+
this.redialFaultRecorded = false;
|
|
71
|
+
clearFault(this.nodeId, { link: 'viewer↔broker' });
|
|
72
|
+
}
|
|
69
73
|
return new Promise((resolve, reject) => {
|
|
70
74
|
const socket = createConnection(this.socketPath);
|
|
71
75
|
this.socket = socket;
|
|
@@ -86,7 +90,10 @@ export class SocketTransport extends EventEmitter {
|
|
|
86
90
|
return;
|
|
87
91
|
}
|
|
88
92
|
settled = true;
|
|
89
|
-
|
|
93
|
+
const brokerUnavailable = err.code === 'ECONNREFUSED' || err.code === 'ENOENT';
|
|
94
|
+
if (!options.brokerUnavailableIsExpected || !brokerUnavailable) {
|
|
95
|
+
this.recordSocketFault('redial', err);
|
|
96
|
+
}
|
|
90
97
|
try {
|
|
91
98
|
socket.destroy();
|
|
92
99
|
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { EventEmitter } from 'node:events';
|
|
2
2
|
import type { BrokerToClient, ClientToBroker } from '../runtime/broker-protocol.js';
|
|
3
|
+
export interface RedialOptions {
|
|
4
|
+
/** The node is dormant, so no broker at the target is normal until it wakes. */
|
|
5
|
+
brokerUnavailableIsExpected?: boolean;
|
|
6
|
+
}
|
|
3
7
|
export interface Transport extends EventEmitter {
|
|
4
8
|
/** Open the connection. Emits 'connect' on success, 'error' on a fatal
|
|
5
9
|
* connect-time failure. Call once. */
|
|
@@ -7,7 +11,7 @@ export interface Transport extends EventEmitter {
|
|
|
7
11
|
/** Re-establish the connection to the SAME target after a drop. Resolves on
|
|
8
12
|
* a fresh 'connect'; rejects on a retryable dial failure (the caller's
|
|
9
13
|
* reconnect supervisor decides whether to try again). */
|
|
10
|
-
redial(): Promise<void>;
|
|
14
|
+
redial(options?: RedialOptions): Promise<void>;
|
|
11
15
|
/** Encode + send one client→broker frame. No-op on a dead/absent connection;
|
|
12
16
|
* never throws. */
|
|
13
17
|
send(frame: ClientToBroker): void;
|
|
@@ -23,8 +27,8 @@ export interface Transport extends EventEmitter {
|
|
|
23
27
|
off(event: 'error', listener: (err: Error) => void): this;
|
|
24
28
|
}
|
|
25
29
|
/** Surfaced when a Transport's target has no reachable broker — locally, no
|
|
26
|
-
* socket file / nothing listening; remotely, a
|
|
27
|
-
* broker for this node". The command catches this to exit non-zero with a
|
|
30
|
+
* socket file / nothing listening; remotely, a crtrd attach close signaling
|
|
31
|
+
* "no broker for this node". The command catches this to exit non-zero with a
|
|
28
32
|
* focus/revive hint — same meaning regardless of which Transport raised it. */
|
|
29
33
|
export declare class BrokerUnavailableError extends Error {
|
|
30
34
|
readonly nodeId: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// transport.ts — the Transport seam: BrokerClient's broker I/O, abstracted
|
|
2
2
|
// so the SAME correlation/pending/close logic can ride either the LOCAL unix
|
|
3
|
-
// socket (SocketTransport, transport-socket.ts) or a
|
|
4
|
-
// remote
|
|
3
|
+
// socket (SocketTransport, transport-socket.ts) or a WebSocket to crtrd's
|
|
4
|
+
// remote attach endpoint (RelayTransport, transport-relay.ts). Both speak the same
|
|
5
5
|
// broker-protocol JSON frames; only how bytes cross the wire differs.
|
|
6
6
|
//
|
|
7
7
|
// A Transport is a pure duplex frame pump — connect (dial), redial (re-dial
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
// seam — request correlation, the pending map, redial-vs-give-up policy — is
|
|
14
14
|
// BrokerClient's job and never moves into a Transport implementation.
|
|
15
15
|
/** Surfaced when a Transport's target has no reachable broker — locally, no
|
|
16
|
-
* socket file / nothing listening; remotely, a
|
|
17
|
-
* broker for this node". The command catches this to exit non-zero with a
|
|
16
|
+
* socket file / nothing listening; remotely, a crtrd attach close signaling
|
|
17
|
+
* "no broker for this node". The command catches this to exit non-zero with a
|
|
18
18
|
* focus/revive hint — same meaning regardless of which Transport raised it. */
|
|
19
19
|
export class BrokerUnavailableError extends Error {
|
|
20
20
|
nodeId;
|
|
@@ -8,7 +8,7 @@ import { atomicWriteJson, deckPath } from '../../human/convention.js';
|
|
|
8
8
|
import { createNode } from '../canvas.js';
|
|
9
9
|
import { closeDb } from '../db.js';
|
|
10
10
|
import { nodeDir } from '../paths.js';
|
|
11
|
-
import {
|
|
11
|
+
import { ticketCountsForNodes, pendingTicketsForView, invalidateTicketCounts } from '../attention.js';
|
|
12
12
|
function meta(id, cwd, extra) {
|
|
13
13
|
return {
|
|
14
14
|
node_id: id,
|
|
@@ -67,23 +67,6 @@ test('ticketCountsForNodes follows bridge parents even when asking nodes share a
|
|
|
67
67
|
seedDeck('hc');
|
|
68
68
|
assert.deepEqual(ticketCountsForNodes(['a', 'b', 'c']), { a: 2, b: 1, c: 1 });
|
|
69
69
|
});
|
|
70
|
-
test('countTickets counts only tickets asked by that node', () => {
|
|
71
|
-
createNode(meta('a', sharedCwd));
|
|
72
|
-
createNode(meta('b', sharedCwd));
|
|
73
|
-
bridge('ha', 'a', sharedCwd);
|
|
74
|
-
bridge('hb', 'b', sharedCwd);
|
|
75
|
-
seedDeck('ha');
|
|
76
|
-
seedDeck('hb');
|
|
77
|
-
assert.equal(countTickets('a'), 1);
|
|
78
|
-
assert.equal(countTickets('b'), 1);
|
|
79
|
-
});
|
|
80
|
-
test('every requested id is present with 0 when it has no tickets', () => {
|
|
81
|
-
createNode(meta('a', sharedCwd));
|
|
82
|
-
createNode(meta('c', soloCwd));
|
|
83
|
-
bridge('ha', 'a', sharedCwd);
|
|
84
|
-
seedDeck('ha');
|
|
85
|
-
assert.deepEqual(ticketCountsForNodes(['a', 'c']), { a: 1, c: 0 });
|
|
86
|
-
});
|
|
87
70
|
test('pendingTicketsForView returns the asking node rather than a cwd bucket', () => {
|
|
88
71
|
createNode(meta('a', sharedCwd));
|
|
89
72
|
createNode(meta('b', sharedCwd));
|
|
@@ -116,59 +116,6 @@ test('every request POSTs argv leading with --json, and the token appears ONLY i
|
|
|
116
116
|
assert.ok(!String(v).includes('secret-relay-token'), `header ${k} must not carry the token`);
|
|
117
117
|
}
|
|
118
118
|
});
|
|
119
|
-
test('getNode/getRow project the show response correctly', async (t) => {
|
|
120
|
-
const server = await startMockCrtrServer((args) => {
|
|
121
|
-
if (args[3] === 'show')
|
|
122
|
-
return { kind: 'json', body: showResponse('a') };
|
|
123
|
-
return { kind: 'json', status: 500, body: {} };
|
|
124
|
-
});
|
|
125
|
-
t.after(() => server.close());
|
|
126
|
-
const source = new RemoteCanvasSource(server.url, 'tok');
|
|
127
|
-
const node = await source.getNode('a');
|
|
128
|
-
assert.equal(node?.node_id, 'a');
|
|
129
|
-
assert.equal(node?.status, 'active');
|
|
130
|
-
const row = await source.getRow('a');
|
|
131
|
-
assert.equal(row?.node_id, 'a');
|
|
132
|
-
assert.equal(row?.kind, 'general');
|
|
133
|
-
assert.equal(row?.host_kind, null);
|
|
134
|
-
assert.equal(row?.profile_id, null);
|
|
135
|
-
});
|
|
136
|
-
test('listNodes passes --status only when a filter is given', async (t) => {
|
|
137
|
-
const seenArgs = [];
|
|
138
|
-
const server = await startMockCrtrServer((args) => {
|
|
139
|
-
seenArgs.push(args);
|
|
140
|
-
const nodes = [];
|
|
141
|
-
return { kind: 'json', body: { nodes } };
|
|
142
|
-
});
|
|
143
|
-
t.after(() => server.close());
|
|
144
|
-
const source = new RemoteCanvasSource(server.url, 'tok');
|
|
145
|
-
await source.listNodes();
|
|
146
|
-
assert.deepEqual(seenArgs[0], ['--json', 'node', 'inspect', 'list']);
|
|
147
|
-
await source.listNodes({ status: 'active' });
|
|
148
|
-
assert.deepEqual(seenArgs[1], ['--json', 'node', 'inspect', 'list', '--status', 'active']);
|
|
149
|
-
await source.listNodes({ status: ['active', 'idle'] });
|
|
150
|
-
assert.deepEqual(seenArgs[2], ['--json', 'node', 'inspect', 'list', '--status', 'active,idle']);
|
|
151
|
-
});
|
|
152
|
-
test('subscriptionsOf/subscribersOf map reports/managers with created: \'\'', async (t) => {
|
|
153
|
-
const server = await startMockCrtrServer((args) => {
|
|
154
|
-
if (args[3] === 'show') {
|
|
155
|
-
return {
|
|
156
|
-
kind: 'json',
|
|
157
|
-
body: {
|
|
158
|
-
...showResponse(args[4], [{ node_id: 'child', active: true }]),
|
|
159
|
-
managers: [{ node_id: 'boss', name: 'boss', kind: 'general', status: 'active', active: false }],
|
|
160
|
-
},
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
return { kind: 'json', status: 500, body: {} };
|
|
164
|
-
});
|
|
165
|
-
t.after(() => server.close());
|
|
166
|
-
const source = new RemoteCanvasSource(server.url, 'tok');
|
|
167
|
-
const subs = await source.subscriptionsOf('a');
|
|
168
|
-
assert.deepEqual(subs, [{ node_id: 'child', active: true, created: '' }]);
|
|
169
|
-
const managers = await source.subscribersOf('a');
|
|
170
|
-
assert.deepEqual(managers, [{ node_id: 'boss', active: false, created: '' }]);
|
|
171
|
-
});
|
|
172
119
|
test('view BFS traverses subscriptionsOf and is cycle-safe', async (t) => {
|
|
173
120
|
// root -> a -> b -> a (cycle back to a).
|
|
174
121
|
const graph = {
|
|
@@ -237,7 +184,7 @@ test('malformed success JSON (exit 0, wrong shape) degrades cleanly instead of r
|
|
|
237
184
|
// `{}` — no `node` key at all. Without shape validation this would cast
|
|
238
185
|
// through as a truthy "valid" RemoteShowResponse (an object with `.node ===
|
|
239
186
|
// undefined`), and a consumer like `node inspect show`'s remote passthrough
|
|
240
|
-
// branch (src/commands/node.ts) treats any non-null return as found, then
|
|
187
|
+
// branch (src/commands/node/inspect.ts) treats any non-null return as found, then
|
|
241
188
|
// its renderer dereferences fields on `undefined` and throws.
|
|
242
189
|
assert.equal(await source.getNode('empty-object'), null, 'a shape with no node key must degrade to null, not a malformed object');
|
|
243
190
|
assert.equal(await source.rawShow('empty-object'), null);
|
|
@@ -326,12 +273,12 @@ test('isValidShowResponse rejects a payload missing/malformed on artifacts/pendi
|
|
|
326
273
|
assert.equal(await source.rawShow('missing-artifacts'), null, 'a payload with no artifacts key must degrade to null');
|
|
327
274
|
assert.equal(await source.rawShow('artifacts-wrong-type'), null, 'artifacts.report as a string must degrade to null');
|
|
328
275
|
assert.equal(await source.rawShow('missing-pending-crons'), null, 'a payload with no pending_crons key must degrade to null');
|
|
329
|
-
assert.
|
|
276
|
+
assert.notEqual(await source.rawShow('paths-session-file-undefined'), null, 'an omitted session file is valid for a node that has not started a pi session');
|
|
330
277
|
assert.notEqual(await source.rawShow('paths-session-file-null'), null, 'paths.session_file explicitly null (no session yet) must be ACCEPTED');
|
|
331
278
|
assert.equal(await source.rawShow('missing-follow-up'), null, 'a payload with no follow_up key must degrade to null');
|
|
332
279
|
assert.notEqual(await source.rawShow('fully-valid'), null, 'the tightened validator must not false-reject the real, fully-valid shape');
|
|
333
280
|
});
|
|
334
|
-
test('a malformed row element does not crash
|
|
281
|
+
test('a malformed row element does not crash dashboard row or forest rendering', async (t) => {
|
|
335
282
|
const server = await startMockCrtrServer((args) => {
|
|
336
283
|
if (args[3] === 'list') {
|
|
337
284
|
return { kind: 'json', body: { nodes: [null, { node_id: 'partial-only' }, fullNodeRow('good')] } };
|
|
@@ -343,16 +290,15 @@ test('a malformed row element does not crash the browse snapshot path (dashboard
|
|
|
343
290
|
});
|
|
344
291
|
t.after(() => server.close());
|
|
345
292
|
const source = new RemoteCanvasSource(server.url, 'tok');
|
|
346
|
-
// `
|
|
347
|
-
// `
|
|
348
|
-
//
|
|
349
|
-
// `listNodes()` having already dropped the malformed `null` element.
|
|
293
|
+
// `dashboardRowsAllFromSource` reaches the row shape through
|
|
294
|
+
// `dashboardRowFromNodeRow`; it relies on `listNodes()` dropping malformed
|
|
295
|
+
// elements before the renderer consumes them.
|
|
350
296
|
const rows = await dashboardRowsAllFromSource(source);
|
|
351
297
|
assert.deepEqual(rows.map((r) => r.node_id), ['good']);
|
|
352
298
|
const forest = await renderForestFromSource(source);
|
|
353
299
|
assert.ok(forest.includes('good'));
|
|
354
300
|
});
|
|
355
|
-
test('cache coalescing: two getNode calls inside the TTL hit the server once
|
|
301
|
+
test('cache coalescing: two getNode calls inside the TTL hit the server once', async (t) => {
|
|
356
302
|
let hitCount = 0;
|
|
357
303
|
const server = await startMockCrtrServer((args) => {
|
|
358
304
|
if (args[3] === 'show') {
|
|
@@ -366,7 +312,4 @@ test('cache coalescing: two getNode calls inside the TTL hit the server once; in
|
|
|
366
312
|
await source.getNode('a');
|
|
367
313
|
await source.getNode('a');
|
|
368
314
|
assert.equal(hitCount, 1);
|
|
369
|
-
source.invalidate();
|
|
370
|
-
await source.getNode('a');
|
|
371
|
-
assert.equal(hitCount, 2);
|
|
372
315
|
});
|
|
@@ -27,9 +27,8 @@ function startStalledServer() {
|
|
|
27
27
|
}
|
|
28
28
|
test('a stalled endpoint returns a timeout failure within the configured bound instead of hanging forever', async (t) => {
|
|
29
29
|
const server = await startStalledServer();
|
|
30
|
-
// Register the close
|
|
31
|
-
//
|
|
32
|
-
// (see the CI-hang postmortem on rebuild-coalescer.test.ts).
|
|
30
|
+
// Register the close before assertions so a failure cannot leave a listening
|
|
31
|
+
// server holding this test process open.
|
|
33
32
|
t.after(() => server.close());
|
|
34
33
|
const exec = createRemoteExec(server.url, 'tok', 100); // small timeout for the test
|
|
35
34
|
const started = Date.now();
|