@north-light/crouter 0.3.172 → 0.3.174
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +106 -177
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +55 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +198 -0
- package/dist/commands/node/create.d.ts +23 -0
- package/dist/commands/node/create.js +207 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +302 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +415 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +164 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +82 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +159 -0
- package/dist/commands/node-lifecycle-revive.js +10 -57
- package/dist/commands/node.d.ts +0 -42
- package/dist/commands/node.js +11 -2065
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +67 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +46 -0
- package/dist/commands/surface/node/placement.js +124 -0
- package/dist/commands/surface-node.js +4 -1
- package/dist/commands/surface-reload.js +1 -2
- package/dist/commands/surface-tmux-spread.js +1 -1
- package/dist/commands/surface.js +5 -20
- package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
- package/dist/commands/sys/config.js +6 -6
- package/dist/commands/sys/logs.js +1 -1
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
- package/dist/commands/sys/panels/keys-panel.js +60 -0
- package/dist/commands/sys/panels/models-panel.d.ts +77 -0
- package/dist/commands/sys/panels/models-panel.js +647 -0
- package/dist/commands/sys/panels/panel.d.ts +45 -0
- package/dist/commands/sys/panels/panel.js +137 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +80 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
- package/dist/commands/sys/panels/prefs-panel.js +85 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
- package/dist/commands/sys/panels/provider-panel.js +538 -0
- package/dist/commands/sys/settings-shell.d.ts +55 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +31 -0
- package/dist/commands/sys/setup-core.d.ts +3 -33
- package/dist/commands/sys/setup-core.js +27 -78
- package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
- package/dist/commands/sys/setup-settings-runner.js +63 -0
- package/dist/commands/sys/setup-wizard.d.ts +26 -125
- package/dist/commands/sys/setup-wizard.js +209 -2473
- package/dist/commands/sys/setup.js +5 -7
- package/dist/commands/sys.js +3 -2
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
- package/dist/core/__tests__/broker-preflight.test.js +1 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
- package/dist/core/__tests__/canvas.test.js +2 -36
- package/dist/core/__tests__/close.test.js +14 -3
- package/dist/core/__tests__/context-intro.test.js +32 -143
- package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
- package/dist/core/__tests__/daemon-boot.test.js +2 -20
- package/dist/core/__tests__/daemon-wedge.test.js +1 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +4 -98
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
- package/dist/core/__tests__/helpers/broker-clients.js +0 -14
- package/dist/core/__tests__/helpers/harness.d.ts +0 -8
- package/dist/core/__tests__/helpers/harness.js +7 -87
- package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
- package/dist/core/__tests__/kickoff.test.js +1 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
- package/dist/core/__tests__/migration.test.js +35 -48
- package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
- package/dist/core/__tests__/passive-subscription.test.js +26 -49
- package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
- package/dist/core/__tests__/prune.test.js +94 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -32
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
- package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
- package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
- package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
- package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
- package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
- package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
- package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
- package/dist/core/__tests__/secrets.test.js +1 -7
- package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
- package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
- package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
- package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
- package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
- package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
- package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
- package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
- package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
- package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
- package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
- package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
- package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
- package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
- package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
- package/dist/core/__tests__/session-model.test.js +0 -18
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
- package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
- package/dist/core/broker-client/client.d.ts +2 -2
- package/dist/core/broker-client/client.js +4 -7
- package/dist/core/broker-client/transport-relay.d.ts +13 -19
- package/dist/core/broker-client/transport-relay.js +19 -34
- package/dist/core/broker-client/transport-socket.d.ts +2 -2
- package/dist/core/broker-client/transport-socket.js +9 -2
- package/dist/core/broker-client/transport.d.ts +7 -3
- package/dist/core/broker-client/transport.js +4 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -18
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
- package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
- package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
- package/dist/core/canvas/browse/app.d.ts +2 -17
- package/dist/core/canvas/browse/app.js +16 -88
- package/dist/core/canvas/browse/model.d.ts +0 -4
- package/dist/core/canvas/browse/model.js +1 -12
- package/dist/core/canvas/browse/render.js +6 -3
- package/dist/core/canvas/crons.d.ts +8 -5
- package/dist/core/canvas/crons.js +7 -6
- package/dist/core/canvas/extensions.d.ts +7 -3
- package/dist/core/canvas/extensions.js +16 -4
- package/dist/core/canvas/nav-model.d.ts +0 -4
- package/dist/core/canvas/nav-model.js +2 -14
- package/dist/core/canvas/node-order.d.ts +3 -0
- package/dist/core/canvas/node-order.js +12 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
- package/dist/core/canvas/remote-canvas-source.js +8 -15
- package/dist/core/command.js +11 -4
- package/dist/core/config.js +3 -1
- package/dist/core/events/envelope.js +1 -1
- package/dist/core/events/read.js +7 -21
- package/dist/core/events/source.d.ts +0 -2
- package/dist/core/events/source.js +0 -16
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/fault-classifier.d.ts +1 -1
- package/dist/core/feed/passive.d.ts +0 -11
- package/dist/core/feed/passive.js +1 -62
- package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
- package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
- package/dist/core/keybindings/background-bash.js +3 -4
- package/dist/core/keybindings/catalog.js +1 -1
- package/dist/core/memory/inline-ref-grammar.js +3 -3
- package/dist/core/memory-resolver.d.ts +11 -25
- package/dist/core/memory-resolver.js +51 -33
- package/dist/core/model-routes.d.ts +15 -0
- package/dist/core/model-routes.js +12 -0
- package/dist/core/pool-credential-store.js +1 -1
- package/dist/core/preview-registry.js +8 -9
- package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
- package/dist/core/review/realize.d.ts +0 -13
- package/dist/core/review/realize.js +0 -40
- package/dist/core/review/types.d.ts +1 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
- package/dist/core/runtime/bearings.js +1 -11
- package/dist/core/runtime/broker/client-registry.d.ts +33 -0
- package/dist/core/runtime/broker/client-registry.js +164 -0
- package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
- package/dist/core/runtime/broker/daemon-ops.js +49 -0
- package/dist/core/runtime/broker/event-projection.d.ts +42 -0
- package/dist/core/runtime/broker/event-projection.js +178 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
- package/dist/core/runtime/broker/fault-retry.js +277 -0
- package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
- package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
- package/dist/core/runtime/broker/inbox.d.ts +22 -0
- package/dist/core/runtime/broker/inbox.js +167 -0
- package/dist/core/runtime/broker/passive.d.ts +16 -0
- package/dist/core/runtime/broker/passive.js +44 -0
- package/dist/core/runtime/broker/read-ops.d.ts +23 -0
- package/dist/core/runtime/broker/read-ops.js +150 -0
- package/dist/core/runtime/broker/rebind.d.ts +74 -0
- package/dist/core/runtime/broker/rebind.js +211 -0
- package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
- package/dist/core/runtime/broker/tool-groups.js +244 -0
- package/dist/core/runtime/broker-extension-render.d.ts +11 -0
- package/dist/core/runtime/broker-extension-render.js +181 -0
- package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
- package/dist/core/runtime/broker-persona-guidance.js +58 -0
- package/dist/core/runtime/broker-protocol.d.ts +1 -1
- package/dist/core/runtime/broker-protocol.js +1 -1
- package/dist/core/runtime/broker.d.ts +5 -196
- package/dist/core/runtime/broker.js +276 -3059
- package/dist/core/runtime/canvas-extensions.js +11 -2
- package/dist/core/runtime/fault.js +1 -1
- package/dist/core/runtime/model-selection.d.ts +9 -0
- package/dist/core/runtime/model-selection.js +12 -0
- package/dist/core/runtime/model-swap.d.ts +3 -3
- package/dist/core/runtime/model-swap.js +33 -25
- package/dist/core/runtime/placement-tmux.d.ts +3 -14
- package/dist/core/runtime/placement-tmux.js +11 -80
- package/dist/core/runtime/placement.d.ts +4 -2
- package/dist/core/runtime/placement.js +7 -12
- package/dist/core/runtime/promote.d.ts +14 -1
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +8 -0
- package/dist/core/runtime/spawn.js +36 -6
- package/dist/core/runtime/stop-guard.d.ts +4 -3
- package/dist/core/runtime/stop-guard.js +36 -18
- package/dist/core/runtime/stop-signals.d.ts +4 -1
- package/dist/core/runtime/stream-watchdog.js +4 -5
- package/dist/core/runtime/structured-output.d.ts +15 -2
- package/dist/core/runtime/structured-output.js +35 -12
- package/dist/core/runtime/tmux-bindings.d.ts +25 -0
- package/dist/core/runtime/tmux-bindings.js +682 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -1
- package/dist/core/runtime/tmux-chrome.js +3 -2
- package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
- package/dist/core/runtime/tmux-driver.js +598 -0
- package/dist/core/runtime/view-socket.d.ts +14 -0
- package/dist/core/runtime/view-socket.js +83 -0
- package/dist/core/session-model/session-state.d.ts +1 -2
- package/dist/core/session-model/session-state.js +5 -8
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +2 -2
- package/dist/core/substrate/gate.d.ts +1 -1
- package/dist/core/substrate/on-read-pure.d.ts +7 -0
- package/dist/core/substrate/on-read-pure.js +272 -0
- package/dist/core/termrender/termrender.js +32 -2
- package/dist/core/user-settings.d.ts +23 -1
- package/dist/core/user-settings.js +18 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
- package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
- package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
- package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
- package/dist/daemon/api/bridge.js +40 -81
- package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
- package/dist/daemon/api/handlers/broker-ops.js +383 -0
- package/dist/daemon/api/handlers/crons.js +9 -4
- package/dist/daemon/api/handlers/files.js +6 -7
- package/dist/daemon/api/handlers/inbox.js +2 -340
- package/dist/daemon/api/handlers/nodes.d.ts +10 -1
- package/dist/daemon/api/handlers/nodes.js +74 -39
- package/dist/daemon/api/handlers/review-comments.js +5 -1
- package/dist/daemon/api/handlers/reviews.js +0 -19
- package/dist/daemon/api/map.js +25 -4
- package/dist/daemon/api/router.js +2 -3
- package/dist/daemon/api/server.js +5 -7
- package/dist/daemon/cron-run.d.ts +4 -0
- package/dist/daemon/cron-run.js +30 -13
- package/dist/daemon/crtrd.d.ts +3 -58
- package/dist/daemon/crtrd.js +28 -1244
- package/dist/daemon/manage.js +0 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
- package/dist/daemon/reconcilers/broker-supervision.js +549 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
- package/dist/daemon/reconcilers/cron-lane.js +32 -0
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
- package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
- package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
- package/dist/daemon/review/finish.js +2 -5
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
- package/dist/pi-extensions/broker-local.d.ts +20 -0
- package/dist/pi-extensions/broker-local.js +89 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
- package/dist/pi-extensions/canvas-context-intro.js +22 -11
- package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
- package/dist/pi-extensions/canvas-goal-capture.js +7 -12
- package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
- package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
- package/dist/pi-extensions/canvas-passive-context.js +22 -18
- package/dist/pi-extensions/canvas-recap.d.ts +2 -2
- package/dist/pi-extensions/canvas-recap.js +48 -21
- package/dist/pi-extensions/canvas-review-boundary.js +10 -4
- package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
- package/dist/pi-extensions/canvas-stophook.js +149 -431
- package/dist/pi-extensions/canvas-structured-output.js +52 -30
- package/dist/pi-extensions/envelope-merge.d.ts +13 -0
- package/dist/pi-extensions/envelope-merge.js +29 -0
- package/dist/shared/working-activity.d.ts +3 -2
- package/dist/shared/working-activity.js +3 -2
- package/dist/types.d.ts +6 -5
- package/dist/types.js +2 -2
- package/docs/compat/hearth-crtr-v1.md +4 -12
- package/docs/compat/hearth-crtr-v2.md +3 -11
- package/docs/compat/hearth-crtr-v3.md +4 -12
- package/docs/compat/hearth-crtr-v4.md +3 -11
- package/docs/compat/hearth-crtr-v5.md +3 -11
- package/docs/public-api.md +3 -7
- package/package.json +7 -49
- package/runtime.lock.json +2766 -14533
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
- package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
- package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
- package/dist/clients/conversation/conversation.d.ts +0 -65
- package/dist/clients/conversation/conversation.js +0 -318
- package/dist/clients/conversation/frames.d.ts +0 -30
- package/dist/clients/conversation/frames.js +0 -52
- package/dist/clients/conversation/region.d.ts +0 -51
- package/dist/clients/conversation/region.js +0 -265
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
- package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
- package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
- package/dist/clients/inbox/review/columns.d.ts +0 -22
- package/dist/clients/inbox/review/columns.js +0 -40
- package/dist/clients/inbox/review/composition.d.ts +0 -60
- package/dist/clients/inbox/review/composition.js +0 -278
- package/dist/clients/inbox/review/document-region.d.ts +0 -120
- package/dist/clients/surfaces/region.d.ts +0 -16
- package/dist/clients/web/__tests__/push-engine.test.js +0 -158
- package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
- package/dist/clients/web/__tests__/push-registry.test.js +0 -177
- package/dist/clients/web/dev-server.d.ts +0 -7
- package/dist/clients/web/dev-server.js +0 -46
- package/dist/clients/web/events.d.ts +0 -19
- package/dist/clients/web/events.js +0 -163
- package/dist/clients/web/push-engine.d.ts +0 -44
- package/dist/clients/web/push-engine.js +0 -125
- package/dist/clients/web/push-registry.d.ts +0 -85
- package/dist/clients/web/push-registry.js +0 -373
- package/dist/clients/web/server.d.ts +0 -19
- package/dist/clients/web/server.js +0 -661
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
- package/dist/clients/web/web-client/shared/protocol.js +0 -8
- package/dist/clients/web/web-cmd.d.ts +0 -2
- package/dist/clients/web/web-cmd.js +0 -141
- package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
- package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
- package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
- package/dist/commands/__tests__/canvas-config.test.js +0 -107
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
- package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
- package/dist/commands/__tests__/search-contents.test.js +0 -52
- package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/lint.test.js +0 -15
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
- package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
- package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
- package/dist/core/__tests__/finalization-migration.test.js +0 -38
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
- package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
- package/dist/core/__tests__/fork.test.d.ts +0 -1
- package/dist/core/__tests__/fork.test.js +0 -108
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
- package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
- package/dist/core/__tests__/full/cascade-close.test.js +0 -240
- package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/detach-focus.test.js +0 -126
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
- package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.js +0 -60
- package/dist/core/__tests__/model-routes.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes.test.js +0 -41
- package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-identity.test.js +0 -61
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
- package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
- package/dist/core/__tests__/prune-to-limit.test.js +0 -126
- package/dist/core/__tests__/reset.test.d.ts +0 -1
- package/dist/core/__tests__/reset.test.js +0 -69
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
- package/dist/core/__tests__/steer-note.test.d.ts +0 -1
- package/dist/core/__tests__/steer-note.test.js +0 -41
- package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
- package/dist/core/__tests__/subcommand-tier.test.js +0 -99
- package/dist/core/__tests__/subscription-delivery.test.js +0 -211
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
- package/dist/core/__tests__/tmux-surface.test.js +0 -484
- package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
- package/dist/core/__tests__/wake-bearings.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
- package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
- package/dist/core/canvas/remote-event-stream.d.ts +0 -24
- package/dist/core/canvas/remote-event-stream.js +0 -94
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
- package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
- package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
- package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
- package/dist/core/human/__tests__/visible-paths.test.js +0 -28
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
- package/dist/core/review/__tests__/project.test.d.ts +0 -1
- package/dist/core/review/__tests__/project.test.js +0 -71
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
- package/dist/core/runtime/tmux.js +0 -1314
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
- package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/inbox.test.js +0 -489
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
- package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +0 -17
- package/dist/web-client/manifest.webmanifest +0 -1
- package/dist/web-client/sw.js +0 -1
- /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
- /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
- /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
- /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
- /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
- /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
- /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
- /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
- /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
- /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { getNode, getRow, subscribersOf, } from '../../core/canvas/index.js';
|
|
2
|
+
import { fullName } from '../../core/canvas/labels.js';
|
|
3
|
+
import { isSafeNodeId } from '../../core/canvas/paths.js';
|
|
4
|
+
import { emitEvent } from '../../core/events/emit.js';
|
|
5
|
+
import { operationIdContext } from '../../core/events/operation-id.js';
|
|
6
|
+
import { appendControllerDeathNotice, readCursor, readInboxSince, } from '../../core/feed/inbox.js';
|
|
7
|
+
import { fanDoctrineWake } from '../../core/runtime/close.js';
|
|
8
|
+
import { transition } from '../../core/runtime/lifecycle.js';
|
|
9
|
+
import { reviveNode } from '../../core/runtime/revive.js';
|
|
10
|
+
// Idle-release/inbox retry cap (2026-07-10 diagnosis, round 2): the SAME
|
|
11
|
+
// livelock shape as the stranded-relaunch case, but on the separate pass that
|
|
12
|
+
// resumes a dormant idle-released node when its inbox gains an unseen entry.
|
|
13
|
+
// The counter is keyed on inbox-cursor progress, not row-state residency or pid
|
|
14
|
+
// liveness: a transiently-live broker does not prove that delivery completed.
|
|
15
|
+
const IDLE_RELEASE_RELAUNCH_MAX_ATTEMPTS = 6;
|
|
16
|
+
const IDLE_RELEASE_RELAUNCH_MAX_BACKOFF_MS = 10 * 60_000;
|
|
17
|
+
const IDLE_RELEASE_RELAUNCH_BASE_MS = 20_000;
|
|
18
|
+
export class ControllerDeathReconciler {
|
|
19
|
+
run(_now, ctx) {
|
|
20
|
+
// Settle every wait whose controller has ended, independent of the waiter's
|
|
21
|
+
// current status. Active and focused terminal nodes own a live inbox
|
|
22
|
+
// watcher; idle-released nodes are revived by the following reconciler.
|
|
23
|
+
for (const row of ctx.rows) {
|
|
24
|
+
const current = getRow(row.node_id);
|
|
25
|
+
const controllerId = current?.waiting_for;
|
|
26
|
+
if (controllerId === null || controllerId === undefined)
|
|
27
|
+
continue;
|
|
28
|
+
// Read-gate before the write boundary: only a dead controller warrants a
|
|
29
|
+
// notice. appendControllerDeathNotice re-checks liveness inside its
|
|
30
|
+
// transaction, so this gate cannot misfire.
|
|
31
|
+
const controller = getRow(controllerId);
|
|
32
|
+
if (controller !== null && (controller.status === 'active' || controller.status === 'idle'))
|
|
33
|
+
continue;
|
|
34
|
+
operationIdContext.fresh(() => {
|
|
35
|
+
appendControllerDeathNotice(row.node_id, controllerId);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class DormantInboxReconciler {
|
|
41
|
+
relaunchState = new Map();
|
|
42
|
+
run(now, ctx) {
|
|
43
|
+
// Re-read each row because live supervision may have mutated it earlier in
|
|
44
|
+
// this tick. A fleet entry is the live engine; no pid probe participates.
|
|
45
|
+
for (const row of ctx.rows) {
|
|
46
|
+
const id = row.node_id;
|
|
47
|
+
let current;
|
|
48
|
+
try {
|
|
49
|
+
current = getRow(id);
|
|
50
|
+
if (current === null) {
|
|
51
|
+
this.relaunchState.delete(id);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
// Do not clear state on status flaps or transient liveness. Only cursor
|
|
55
|
+
// progress, no wake-worthy work, row deletion, or exhaustion ends the
|
|
56
|
+
// stuck-delivery episode.
|
|
57
|
+
if (current.status !== 'idle' || current.intent !== 'idle-release')
|
|
58
|
+
continue;
|
|
59
|
+
if (ctx.fleet.has(id))
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
operationIdContext.fresh(() => {
|
|
64
|
+
emitEvent({
|
|
65
|
+
level: 'error',
|
|
66
|
+
event: 'inbox.poll.failed',
|
|
67
|
+
...(isSafeNodeId(id) ? { node_id: id } : { fields: { affected_node_id: id } }),
|
|
68
|
+
error: err,
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
operationIdContext.fresh(() => {
|
|
74
|
+
try {
|
|
75
|
+
const cursorNow = readCursor(id);
|
|
76
|
+
const entries = readInboxSince(id, cursorNow);
|
|
77
|
+
// Deferred entries ride the next natural cycle. A deferred-only unseen
|
|
78
|
+
// set neither revives the node nor starts a stuck-relaunch episode.
|
|
79
|
+
if (!entries.some((entry) => entry.tier !== 'deferred')) {
|
|
80
|
+
this.relaunchState.delete(id);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const prior = this.relaunchState.get(id);
|
|
84
|
+
const cursorChanged = prior === undefined || prior.cursor !== cursorNow;
|
|
85
|
+
const attempts = cursorChanged ? 0 : prior.attempts;
|
|
86
|
+
if (attempts >= IDLE_RELEASE_RELAUNCH_MAX_ATTEMPTS) {
|
|
87
|
+
this.relaunchState.delete(id);
|
|
88
|
+
const meta = getNode(id);
|
|
89
|
+
emitEvent({
|
|
90
|
+
level: 'warn',
|
|
91
|
+
event: 'broker.idle_release.exhausted',
|
|
92
|
+
...(isSafeNodeId(id) ? { node_id: id } : {}),
|
|
93
|
+
fields: {
|
|
94
|
+
...(isSafeNodeId(id) ? {} : { affected_node_id: id }),
|
|
95
|
+
attempts,
|
|
96
|
+
max_attempts: IDLE_RELEASE_RELAUNCH_MAX_ATTEMPTS,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
transition(id, 'crash');
|
|
100
|
+
if (meta !== null) {
|
|
101
|
+
try {
|
|
102
|
+
fanDoctrineWake(id, subscribersOf(id), `Child crashed — ${fullName(meta)} (${id}) failed to relaunch after ${attempts} attempts while trying to ` +
|
|
103
|
+
`deliver a pending inbox message (no delivery progress across any attempt), and is now dead. It stays ` +
|
|
104
|
+
`dead until you revive it — \`crtr node lifecycle revive ${id}\`.`, { reason: 'child-crashed', child: id });
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
/* best-effort, mirrors the other doctrine fan-outs */
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const lastAttempt = cursorChanged ? undefined : prior?.lastAttempt;
|
|
113
|
+
const backoff = Math.min(IDLE_RELEASE_RELAUNCH_BASE_MS * 2 ** attempts, IDLE_RELEASE_RELAUNCH_MAX_BACKOFF_MS);
|
|
114
|
+
if (lastAttempt !== undefined && now - lastAttempt < backoff)
|
|
115
|
+
return;
|
|
116
|
+
if (!ctx.hasBrokerCapacity())
|
|
117
|
+
return;
|
|
118
|
+
this.relaunchState.set(id, { cursor: cursorNow, attempts: attempts + 1, lastAttempt: now });
|
|
119
|
+
emitEvent({
|
|
120
|
+
level: 'info',
|
|
121
|
+
event: 'broker.revive.idle_release',
|
|
122
|
+
...(isSafeNodeId(id) ? { node_id: id } : {}),
|
|
123
|
+
attempt: attempts + 1,
|
|
124
|
+
fields: {
|
|
125
|
+
...(isSafeNodeId(id) ? {} : { affected_node_id: id }),
|
|
126
|
+
attempts: attempts + 1,
|
|
127
|
+
max_attempts: IDLE_RELEASE_RELAUNCH_MAX_ATTEMPTS,
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
reviveNode(id, { resume: true });
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
emitEvent({
|
|
134
|
+
level: 'error',
|
|
135
|
+
event: 'inbox.poll.failed',
|
|
136
|
+
...(isSafeNodeId(id) ? { node_id: id } : { fields: { affected_node_id: id } }),
|
|
137
|
+
error: err,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const DEAD_REAP_GRACE_MS: number;
|
|
2
|
+
/** Recurring storage cleanup. The in-memory throttle clocks intentionally reset
|
|
3
|
+
* on daemon boot, so the first tick runs both full sweeps. */
|
|
4
|
+
export declare class StorageMaintenanceReconciler {
|
|
5
|
+
private lastPruneAt;
|
|
6
|
+
private lastSpareSweepAt;
|
|
7
|
+
run(now: number): void;
|
|
8
|
+
/** Milliseconds since meta/telemetry was last written. Inbox activity is
|
|
9
|
+
* deliberately excluded: children can keep writing a dead manager's inbox. */
|
|
10
|
+
private msSinceDiskActivity;
|
|
11
|
+
/** Reap only the physical placement residue of long-dead nodes. The durable
|
|
12
|
+
* row, graph, and on-disk state remain available for a later manual revive. */
|
|
13
|
+
private reapDeadResidue;
|
|
14
|
+
/** Delete focus rows whose recorded tmux pane no longer exists. A failed tmux
|
|
15
|
+
* probe is "can't tell" and never authorizes deleting every viewport. */
|
|
16
|
+
private gcStaleFocuses;
|
|
17
|
+
/** Count-based full-canvas prune, throttled to once per hour. Live rows are
|
|
18
|
+
* never deleted by pruneToLimit, so the true floor can exceed AUTO_PRUNE_MAX. */
|
|
19
|
+
private autoPrune;
|
|
20
|
+
/** Collect dead or expired hidden warm-pool spares. */
|
|
21
|
+
private gcWarmPool;
|
|
22
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { closeFocusRow, listFocuses, listNodes, pruneToLimit, } from '../../core/canvas/index.js';
|
|
4
|
+
import { isSafeNodeId, jobDir, nodeDir } from '../../core/canvas/paths.js';
|
|
5
|
+
import { emitEvent } from '../../core/events/emit.js';
|
|
6
|
+
import { operationIdContext } from '../../core/events/operation-id.js';
|
|
7
|
+
import { listLivePanes, tearDownNode } from '../../core/runtime/placement.js';
|
|
8
|
+
import { reapStaleSpares } from '../../core/runtime/warm-pool.js';
|
|
9
|
+
// How long a dead node's on-disk record must be quiet before its leftover
|
|
10
|
+
// placement is reaped. A fresh crash keeps its pane for inspection.
|
|
11
|
+
export const DEAD_REAP_GRACE_MS = 10 * 60_000;
|
|
12
|
+
const AUTO_PRUNE_MAX = 2000;
|
|
13
|
+
const PRUNE_INTERVAL_MS = 60 * 60 * 1000;
|
|
14
|
+
const SPARE_SWEEP_INTERVAL_MS = 60 * 1000;
|
|
15
|
+
/** Recurring storage cleanup. The in-memory throttle clocks intentionally reset
|
|
16
|
+
* on daemon boot, so the first tick runs both full sweeps. */
|
|
17
|
+
export class StorageMaintenanceReconciler {
|
|
18
|
+
lastPruneAt = Number.NEGATIVE_INFINITY;
|
|
19
|
+
lastSpareSweepAt = Number.NEGATIVE_INFINITY;
|
|
20
|
+
run(now) {
|
|
21
|
+
// Placement reap MUST precede focus GC, so GC catches a focus row the reap
|
|
22
|
+
// strands. Both run after dormant-inbox reconciliation, so a same-tick
|
|
23
|
+
// revive has already had the chance to re-anchor its focus.
|
|
24
|
+
this.reapDeadResidue(now);
|
|
25
|
+
this.gcStaleFocuses();
|
|
26
|
+
this.autoPrune(now);
|
|
27
|
+
this.gcWarmPool(now);
|
|
28
|
+
}
|
|
29
|
+
/** Milliseconds since meta/telemetry was last written. Inbox activity is
|
|
30
|
+
* deliberately excluded: children can keep writing a dead manager's inbox. */
|
|
31
|
+
msSinceDiskActivity(nodeId, now) {
|
|
32
|
+
let latest = 0;
|
|
33
|
+
for (const path of [join(nodeDir(nodeId), 'meta.json'), join(jobDir(nodeId), 'telemetry.json')]) {
|
|
34
|
+
try {
|
|
35
|
+
const mtime = statSync(path).mtimeMs;
|
|
36
|
+
if (mtime > latest)
|
|
37
|
+
latest = mtime;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
/* absent — contributes nothing */
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return latest === 0 ? Number.POSITIVE_INFINITY : now - latest;
|
|
44
|
+
}
|
|
45
|
+
/** Reap only the physical placement residue of long-dead nodes. The durable
|
|
46
|
+
* row, graph, and on-disk state remain available for a later manual revive. */
|
|
47
|
+
reapDeadResidue(now) {
|
|
48
|
+
let rows;
|
|
49
|
+
try {
|
|
50
|
+
rows = listNodes({ status: ['dead'] });
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
operationIdContext.fresh(() => {
|
|
54
|
+
emitEvent({ level: 'error', event: 'residue.reap_scan.failed', error: err });
|
|
55
|
+
});
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
for (const row of rows) {
|
|
59
|
+
if (row.pane == null && row.window == null && row.tmux_session == null)
|
|
60
|
+
continue;
|
|
61
|
+
try {
|
|
62
|
+
if (this.msSinceDiskActivity(row.node_id, now) < DEAD_REAP_GRACE_MS)
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
operationIdContext.fresh(() => {
|
|
67
|
+
emitEvent({
|
|
68
|
+
level: 'error',
|
|
69
|
+
event: 'residue.reap.failed',
|
|
70
|
+
...(isSafeNodeId(row.node_id) ? { node_id: row.node_id } : {}),
|
|
71
|
+
error: err,
|
|
72
|
+
fields: {
|
|
73
|
+
...(isSafeNodeId(row.node_id) ? {} : { affected_node_id: row.node_id }),
|
|
74
|
+
pane: row.pane,
|
|
75
|
+
window: row.window,
|
|
76
|
+
tmux_session: row.tmux_session,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
operationIdContext.fresh(() => {
|
|
83
|
+
try {
|
|
84
|
+
emitEvent({
|
|
85
|
+
level: 'info',
|
|
86
|
+
event: 'residue.reaped',
|
|
87
|
+
...(isSafeNodeId(row.node_id) ? { node_id: row.node_id } : {}),
|
|
88
|
+
fields: {
|
|
89
|
+
...(isSafeNodeId(row.node_id) ? {} : { affected_node_id: row.node_id }),
|
|
90
|
+
pane: row.pane,
|
|
91
|
+
window: row.window,
|
|
92
|
+
tmux_session: row.tmux_session,
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
tearDownNode(row.node_id);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
emitEvent({
|
|
99
|
+
level: 'error',
|
|
100
|
+
event: 'residue.reap.failed',
|
|
101
|
+
...(isSafeNodeId(row.node_id) ? { node_id: row.node_id } : {}),
|
|
102
|
+
error: err,
|
|
103
|
+
fields: {
|
|
104
|
+
...(isSafeNodeId(row.node_id) ? {} : { affected_node_id: row.node_id }),
|
|
105
|
+
pane: row.pane,
|
|
106
|
+
window: row.window,
|
|
107
|
+
tmux_session: row.tmux_session,
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Delete focus rows whose recorded tmux pane no longer exists. A failed tmux
|
|
115
|
+
* probe is "can't tell" and never authorizes deleting every viewport. */
|
|
116
|
+
gcStaleFocuses() {
|
|
117
|
+
let rows;
|
|
118
|
+
try {
|
|
119
|
+
rows = listFocuses();
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
operationIdContext.fresh(() => {
|
|
123
|
+
emitEvent({ level: 'error', event: 'focus.gc.failed', error: err });
|
|
124
|
+
});
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (rows.length === 0)
|
|
128
|
+
return;
|
|
129
|
+
let live;
|
|
130
|
+
try {
|
|
131
|
+
live = listLivePanes();
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
operationIdContext.fresh(() => {
|
|
135
|
+
emitEvent({ level: 'error', event: 'focus.gc.failed', error: err });
|
|
136
|
+
});
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (live === null)
|
|
140
|
+
return;
|
|
141
|
+
for (const focus of rows) {
|
|
142
|
+
if (focus.pane === null || live.has(focus.pane))
|
|
143
|
+
continue;
|
|
144
|
+
const removed = operationIdContext.fresh(() => {
|
|
145
|
+
try {
|
|
146
|
+
emitEvent({
|
|
147
|
+
level: 'info',
|
|
148
|
+
event: 'focus.gc.removed',
|
|
149
|
+
...(isSafeNodeId(focus.node_id) ? { node_id: focus.node_id } : {}),
|
|
150
|
+
fields: {
|
|
151
|
+
focus_id: focus.focus_id,
|
|
152
|
+
focus_node_id: focus.node_id,
|
|
153
|
+
pane: focus.pane,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
closeFocusRow(focus.focus_id);
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
emitEvent({ level: 'error', event: 'focus.gc.failed', error: err });
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
if (!removed)
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** Count-based full-canvas prune, throttled to once per hour. Live rows are
|
|
169
|
+
* never deleted by pruneToLimit, so the true floor can exceed AUTO_PRUNE_MAX. */
|
|
170
|
+
autoPrune(now) {
|
|
171
|
+
if (now - this.lastPruneAt < PRUNE_INTERVAL_MS)
|
|
172
|
+
return;
|
|
173
|
+
this.lastPruneAt = now;
|
|
174
|
+
operationIdContext.fresh(() => {
|
|
175
|
+
try {
|
|
176
|
+
const before = listNodes().length;
|
|
177
|
+
const { pruned } = pruneToLimit({ maxNodes: AUTO_PRUNE_MAX });
|
|
178
|
+
if (pruned.length > 0) {
|
|
179
|
+
emitEvent({
|
|
180
|
+
level: 'info',
|
|
181
|
+
event: 'canvas.auto_prune.completed',
|
|
182
|
+
outcome: 'succeeded',
|
|
183
|
+
fields: {
|
|
184
|
+
before_count: before,
|
|
185
|
+
kept_count: before - pruned.length,
|
|
186
|
+
pruned_count: pruned.length,
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
emitEvent({ level: 'error', event: 'canvas.auto_prune.failed', error: err });
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
/** Collect dead or expired hidden warm-pool spares. */
|
|
197
|
+
gcWarmPool(now) {
|
|
198
|
+
if (now - this.lastSpareSweepAt < SPARE_SWEEP_INTERVAL_MS)
|
|
199
|
+
return;
|
|
200
|
+
this.lastSpareSweepAt = now;
|
|
201
|
+
operationIdContext.fresh(() => {
|
|
202
|
+
const reaped = reapStaleSpares();
|
|
203
|
+
if (reaped.length > 0) {
|
|
204
|
+
emitEvent({
|
|
205
|
+
level: 'info',
|
|
206
|
+
event: 'warm_pool.spares_reaped',
|
|
207
|
+
outcome: 'succeeded',
|
|
208
|
+
fields: { reaped_count: reaped.length },
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
@@ -204,8 +204,6 @@ export async function submitReviewApproval(reviewId) {
|
|
|
204
204
|
return terminalConflict(review, 'submit');
|
|
205
205
|
if (review.state === 'approved')
|
|
206
206
|
return { outcome: 'already_settled', review, result: approvedResult(review) };
|
|
207
|
-
if (review.state !== 'open')
|
|
208
|
-
throw new ReviewOperationError('review_not_open', 'review is not open', { review_id: reviewId, state: review.state });
|
|
209
207
|
const snapshot = snapshotCommentsLocked(db, reviewId);
|
|
210
208
|
const at = now();
|
|
211
209
|
const result = buildReviewResult(review, snapshot, source.sha256, at);
|
|
@@ -240,9 +238,8 @@ export async function cancelReview(reviewId, args) {
|
|
|
240
238
|
const review = requireVisibleReview(reviewId);
|
|
241
239
|
if (review.state === 'approved')
|
|
242
240
|
return terminalConflict(review, 'cancel');
|
|
243
|
-
if (review.state !== 'canceled')
|
|
244
|
-
throw new
|
|
245
|
-
}
|
|
241
|
+
if (review.state !== 'canceled')
|
|
242
|
+
throw new Error(`review ${reviewId} did not reach its canceled state`);
|
|
246
243
|
if (winningWrite)
|
|
247
244
|
signalReviewActivity();
|
|
248
245
|
const finished = await serializedFinish(reviewId, () => finishCanceled(review, winningWrite, args));
|
|
@@ -1,18 +1,30 @@
|
|
|
1
1
|
// Run with: node --import tsx/esm --test src/pi-extensions/__tests__/canvas-context-intro.test.ts
|
|
2
2
|
//
|
|
3
|
-
// A
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
import { test, before, after, beforeEach } from 'node:test';
|
|
3
|
+
// A forked crouter branch receives a compact node-scoped update after its
|
|
4
|
+
// inherited baseline, and a resume re-injects nothing — idempotency keyed on
|
|
5
|
+
// the exact node-id stamp, independent of the bearings text.
|
|
6
|
+
import { test, before, after, beforeEach, afterEach } from 'node:test';
|
|
7
7
|
import assert from 'node:assert/strict';
|
|
8
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
8
|
+
import { existsSync, mkdtempSync, mkdirSync, rmSync } from 'node:fs';
|
|
9
9
|
import { tmpdir } from 'node:os';
|
|
10
10
|
import { join } from 'node:path';
|
|
11
|
-
import {
|
|
11
|
+
import { registerCanvasContextIntro, CONTEXT_INTRO_CUSTOM_TYPE, } from '../canvas-context-intro.js';
|
|
12
|
+
import { buildContextBearings as buildContextIntro } from '../../core/runtime/bearings.js';
|
|
12
13
|
import { createNode } from '../../core/canvas/canvas.js';
|
|
14
|
+
import { apiSocketPath } from '../../core/canvas/paths.js';
|
|
15
|
+
import { createApiServer } from '../../daemon/api/server.js';
|
|
13
16
|
import { closeDb } from '../../core/canvas/db.js';
|
|
14
17
|
let home;
|
|
15
18
|
let origNode;
|
|
19
|
+
let server;
|
|
20
|
+
async function waitForSocket(path) {
|
|
21
|
+
for (let i = 0; i < 200; i++) {
|
|
22
|
+
if (existsSync(path))
|
|
23
|
+
return;
|
|
24
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
25
|
+
}
|
|
26
|
+
throw new Error(`api socket never bound at ${path}`);
|
|
27
|
+
}
|
|
16
28
|
function node(id, over = {}) {
|
|
17
29
|
return {
|
|
18
30
|
node_id: id,
|
|
@@ -45,21 +57,27 @@ function makeFakePi() {
|
|
|
45
57
|
registerMessageRenderer() {
|
|
46
58
|
/* display-only; irrelevant here */
|
|
47
59
|
},
|
|
48
|
-
fireSessionStart(entries) {
|
|
49
|
-
handler?.(undefined, { sessionManager: { getEntries: () => entries } });
|
|
60
|
+
async fireSessionStart(entries) {
|
|
61
|
+
await handler?.(undefined, { sessionManager: { getEntries: () => entries } });
|
|
50
62
|
},
|
|
51
63
|
};
|
|
52
64
|
}
|
|
53
65
|
before(() => {
|
|
54
66
|
origNode = process.env['CRTR_NODE_ID'];
|
|
55
67
|
});
|
|
56
|
-
beforeEach(() => {
|
|
68
|
+
beforeEach(async () => {
|
|
57
69
|
closeDb();
|
|
58
70
|
if (home)
|
|
59
71
|
rmSync(home, { recursive: true, force: true });
|
|
60
72
|
home = mkdtempSync(join(tmpdir(), 'crtr-context-intro-'));
|
|
61
73
|
process.env['CRTR_HOME'] = home;
|
|
62
74
|
delete process.env['CRTR_NODE_ID'];
|
|
75
|
+
mkdirSync(home, { recursive: true });
|
|
76
|
+
server = createApiServer();
|
|
77
|
+
await waitForSocket(apiSocketPath());
|
|
78
|
+
});
|
|
79
|
+
afterEach(async () => {
|
|
80
|
+
await server.close();
|
|
63
81
|
});
|
|
64
82
|
after(() => {
|
|
65
83
|
closeDb();
|
|
@@ -71,44 +89,7 @@ after(() => {
|
|
|
71
89
|
else
|
|
72
90
|
process.env['CRTR_NODE_ID'] = origNode;
|
|
73
91
|
});
|
|
74
|
-
test('
|
|
75
|
-
createNode(node('alpha', { name: 'fix-auth', kind: 'developer' }));
|
|
76
|
-
const intro = buildContextIntro('alpha');
|
|
77
|
-
assert.match(intro, /<crtr-bearings>/, 'opens with the bearings section');
|
|
78
|
-
assert.match(intro, /You are node alpha/, 'names the node by its own id');
|
|
79
|
-
assert.match(intro, /kind developer/, 'states the node kind');
|
|
80
|
-
assert.doesNotMatch(intro, /FORK of/, 'a fresh node carries no fork framing');
|
|
81
|
-
// Identity leads the bearings block.
|
|
82
|
-
assert.match(intro, /<crtr-bearings>\nYou are node alpha/, 'identity leads the bearings block');
|
|
83
|
-
assert.ok(intro.indexOf('<crtr-bearings>') < intro.indexOf('<project_context>'), 'bearings precede project context');
|
|
84
|
-
});
|
|
85
|
-
test('fork bearings contain only the new node-scoped facts', () => {
|
|
86
|
-
createNode(node('src7', { name: 'looking-pi-crouter', description: 'monitor-telemetry' }));
|
|
87
|
-
createNode(node('fork9', { fork_from: 'src7', lifecycle: 'resident' }));
|
|
88
|
-
const intro = buildForkContextIntro('fork9');
|
|
89
|
-
assert.match(intro, /You are node fork9/, 'the fork receives its own id');
|
|
90
|
-
assert.match(intro, /new FORK of src7/, 'the fork names its source');
|
|
91
|
-
assert.match(intro, /not src7/, 'the fork does not adopt the source identity');
|
|
92
|
-
assert.match(intro, /looking-pi-crouter/, 'the source label identifies the copied history');
|
|
93
|
-
assert.match(intro, /Lifecycle: resident/, 'the fork receives its current lifecycle');
|
|
94
|
-
assert.match(intro, /independent root/, 'the fork receives its current graph role');
|
|
95
|
-
assert.ok(intro.includes(join(home, 'nodes', 'fork9', 'context')), 'the fork receives its own context path');
|
|
96
|
-
assert.match(intro, /first real user message/, 'the fork waits for its new mandate');
|
|
97
|
-
assert.doesNotMatch(intro, /<memory kind="knowledge">/, 'the inherited knowledge catalog is not repeated');
|
|
98
|
-
assert.doesNotMatch(intro, /<auto-loaded-context>/, 'inherited workspace docs are not repeated');
|
|
99
|
-
assert.doesNotMatch(intro, /<project_context>/, 'the inherited project snapshot is not repeated');
|
|
100
|
-
createNode(node('plain2'));
|
|
101
|
-
const plain = buildContextIntro('plain2');
|
|
102
|
-
assert.match(plain, /You are node plain2/);
|
|
103
|
-
assert.ok(!/FORK of/.test(plain), 'a fresh node carries no fork callout');
|
|
104
|
-
// A path-valued provenance remains an opaque label.
|
|
105
|
-
const pathSource = '/Users/silasrhyneer/.crouter/canvas/human-work/queue/20260717T000000-abc.json';
|
|
106
|
-
createNode(node('fork10', { fork_from: pathSource }));
|
|
107
|
-
const pathIntro = buildForkContextIntro('fork10');
|
|
108
|
-
assert.match(pathIntro, /You are node fork10/);
|
|
109
|
-
assert.match(pathIntro, new RegExp(`new FORK of ${pathSource.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`), 'a path-valued source is named without a node lookup');
|
|
110
|
-
});
|
|
111
|
-
test('session_start appends compact fork bearings after an inherited source baseline', () => {
|
|
92
|
+
test('session_start appends compact fork bearings after an inherited source baseline', async () => {
|
|
112
93
|
createNode(node('srcA'));
|
|
113
94
|
createNode(node('forkB', { fork_from: 'srcA' }));
|
|
114
95
|
// A fork boots with the SOURCE's whole conversation copied in — including the
|
|
@@ -117,7 +98,7 @@ test('session_start appends compact fork bearings after an inherited source base
|
|
|
117
98
|
process.env['CRTR_NODE_ID'] = 'forkB';
|
|
118
99
|
const pi = makeFakePi();
|
|
119
100
|
registerCanvasContextIntro(pi);
|
|
120
|
-
pi.fireSessionStart([inheritedSourceBlock]);
|
|
101
|
+
await pi.fireSessionStart([inheritedSourceBlock]);
|
|
121
102
|
// The inherited baseline belongs to srcA, so forkB receives its own compact update.
|
|
122
103
|
assert.equal(pi.sent.length, 1, 'fork injects its OWN bearings over the inherited source block');
|
|
123
104
|
assert.equal(pi.sent[0].customType, CONTEXT_INTRO_CUSTOM_TYPE);
|
|
@@ -130,10 +111,10 @@ test('session_start appends compact fork bearings after an inherited source base
|
|
|
130
111
|
process.env['CRTR_NODE_ID'] = 'externalF';
|
|
131
112
|
const externalPi = makeFakePi();
|
|
132
113
|
registerCanvasContextIntro(externalPi);
|
|
133
|
-
externalPi.fireSessionStart([]);
|
|
114
|
+
await externalPi.fireSessionStart([]);
|
|
134
115
|
assert.match(externalPi.sent[0].content, /<project_context>/, 'an external-session fork receives the full baseline');
|
|
135
116
|
});
|
|
136
|
-
test('resume idempotency uses the exact details stamp independent of block text', () => {
|
|
117
|
+
test('resume idempotency uses the exact details stamp independent of block text', async () => {
|
|
137
118
|
createNode(node('stampD'));
|
|
138
119
|
// The exact node-id stamp is authoritative even when prose carries no id.
|
|
139
120
|
const stampedNoIdInText = {
|
|
@@ -145,16 +126,16 @@ test('resume idempotency uses the exact details stamp independent of block text'
|
|
|
145
126
|
process.env['CRTR_NODE_ID'] = 'stampD';
|
|
146
127
|
const pi = makeFakePi();
|
|
147
128
|
registerCanvasContextIntro(pi);
|
|
148
|
-
pi.fireSessionStart([stampedNoIdInText]);
|
|
129
|
+
await pi.fireSessionStart([stampedNoIdInText]);
|
|
149
130
|
assert.equal(pi.sent.length, 0, 'exact details-stamp match skips re-injection even when the text omits the id');
|
|
150
131
|
});
|
|
151
|
-
test('session_start stays idempotent on a genuine resume', () => {
|
|
132
|
+
test('session_start stays idempotent on a genuine resume', async () => {
|
|
152
133
|
createNode(node('resumeC'));
|
|
153
134
|
// A resume restores this node's already-stamped bearings.
|
|
154
135
|
const ownBlock = introEntry(buildContextIntro('resumeC'));
|
|
155
136
|
process.env['CRTR_NODE_ID'] = 'resumeC';
|
|
156
137
|
const pi = makeFakePi();
|
|
157
138
|
registerCanvasContextIntro(pi);
|
|
158
|
-
pi.fireSessionStart([ownBlock]);
|
|
139
|
+
await pi.fireSessionStart([ownBlock]);
|
|
159
140
|
assert.equal(pi.sent.length, 0, 'our own bearings already present → no duplicate injection');
|
|
160
141
|
});
|