@north-light/crouter 0.3.173 → 0.3.175
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/memory/write.js +13 -12
- 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
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
//
|
|
11
11
|
// See harness-design.md §4/§5 and vehicle-and-hooks.md §6 for the architecture
|
|
12
12
|
// this implements. The ONE production seam used is CRTR_PI_BINARY in
|
|
13
|
-
// piCommand (src/core/runtime/tmux.ts) — no production file is modified.
|
|
13
|
+
// piCommand (src/core/runtime/tmux-driver.ts) — no production file is modified.
|
|
14
14
|
//
|
|
15
15
|
// Isolation contract (harness-design.md §4a):
|
|
16
16
|
// • The harness itself runs AS a canvas node, so its OWN process.env carries
|
|
@@ -28,7 +28,6 @@ import { fileURLToPath } from 'node:url';
|
|
|
28
28
|
import { createRequire } from 'node:module';
|
|
29
29
|
import { createNode, getNode, recordPid, subscribersOf, subscriptionsOf, } from '../../canvas/canvas.js';
|
|
30
30
|
import { closeDb } from '../../canvas/db.js';
|
|
31
|
-
import { isFocused } from '../../runtime/placement.js';
|
|
32
31
|
import { reviveNode } from '../../runtime/revive.js';
|
|
33
32
|
import { superviseTick } from '../../../daemon/crtrd.js';
|
|
34
33
|
import { DaemonFleet } from '../../../daemon/fleet.js';
|
|
@@ -57,18 +56,13 @@ const TSX_ESM = COMPILED ? null : createRequire(import.meta.url).resolve('tsx/es
|
|
|
57
56
|
// A multi-word launcher, baked verbatim ahead of the (shell-quoted) argv by the
|
|
58
57
|
// seam. Absolute paths so it works regardless of the spawned window's cwd.
|
|
59
58
|
const FAKE_PI_BINARY = [process.execPath, ...(TSX_ESM === null ? [] : ['--import', TSX_ESM]), FAKE_PI_HOST].join(' ');
|
|
60
|
-
// Every raw `tmux` call the harness/
|
|
59
|
+
// Every raw `tmux` call the harness/compiled-seam tests make against the shared
|
|
61
60
|
// DEFAULT server is synchronous (spawnSync). Node's spawnSync blocks the WHOLE
|
|
62
61
|
// worker (no event loop, no `node --test` timeout can preempt it) until the
|
|
63
|
-
// child exits — with no `timeout` option it can wait
|
|
64
|
-
// starved tmux server
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
// full-tier files each hit the SAME wedged server, every slot eventually gets
|
|
68
|
-
// consumed the same way and the whole suite flatlines with zero further TAP
|
|
69
|
-
// output (confirmed 3/3 in CI, see ci-full-suite-hang-blocker.md). TMUX_TIMEOUT_MS
|
|
70
|
-
// bounds every raw tmux spawnSync call so a wedge fails that ONE call (and the
|
|
71
|
-
// test it belongs to) fast instead of hanging the run.
|
|
62
|
+
// child exits — with no `timeout` option it can wait forever. A wedged or
|
|
63
|
+
// CPU-starved tmux server would consume a serialized seam worker indefinitely.
|
|
64
|
+
// TMUX_TIMEOUT_MS makes that one call and its test fail instead of hanging the
|
|
65
|
+
// whole suite.
|
|
72
66
|
export const TMUX_TIMEOUT_MS = 10_000;
|
|
73
67
|
/** True when a usable tmux is on PATH — tests gate on this and SKIP otherwise. */
|
|
74
68
|
export function hasTmux() {
|
|
@@ -382,7 +376,7 @@ export async function createHarness(opts = {}) {
|
|
|
382
376
|
// count). Scope the scan to "one or more lowercase-alnum segments ending
|
|
383
377
|
// in an 8-hex random suffix" so a stray non-node sibling under nodes/ is
|
|
384
378
|
// never miscounted as a new node dir — e.g. a `reports/` dir created for
|
|
385
|
-
// an empty node id (the rare CI flake on
|
|
379
|
+
// an empty node id (the rare CI flake on compiled-seam run 27459304455 that
|
|
386
380
|
// broke the spawn counters with `expected exactly 1 new node dir, got
|
|
387
381
|
// [<id>, reports]`), or literal `reports` (no hyphen, no hex suffix).
|
|
388
382
|
return readdirSync(join(home, 'nodes')).filter((d) => /^[a-z0-9]+(?:-[a-z0-9]+)*-[0-9a-f]{8}$/.test(d));
|
|
@@ -513,27 +507,6 @@ export async function createHarness(opts = {}) {
|
|
|
513
507
|
closeDb();
|
|
514
508
|
return id;
|
|
515
509
|
},
|
|
516
|
-
async spawnChild(parentId, task, o = {}) {
|
|
517
|
-
const before = new Set(nodeDirs());
|
|
518
|
-
const args = ['node', 'new', task, '--parent', parentId, '--cwd', CROUTER];
|
|
519
|
-
if (o.kind)
|
|
520
|
-
args.push('--kind', o.kind);
|
|
521
|
-
if (o.mode)
|
|
522
|
-
args.push('--mode', o.mode);
|
|
523
|
-
if (o.model)
|
|
524
|
-
args.push('--model', o.model);
|
|
525
|
-
const res = cli(parentId, args);
|
|
526
|
-
if (res.code !== 0) {
|
|
527
|
-
throw new Error(`spawnChild(${parentId}) failed (code ${res.code})\n--stdout--\n${res.stdout}\n--stderr--\n${res.stderr}`);
|
|
528
|
-
}
|
|
529
|
-
const added = nodeDirs().filter((d) => !before.has(d));
|
|
530
|
-
if (added.length !== 1) {
|
|
531
|
-
throw new Error(`spawnChild: expected exactly 1 new node dir, got [${added.join(', ')}]`);
|
|
532
|
-
}
|
|
533
|
-
const childId = added[0];
|
|
534
|
-
await harness.awaitBoot(childId);
|
|
535
|
-
return childId;
|
|
536
|
-
},
|
|
537
510
|
async spawnHeadlessChild(parentId, task, o = {}) {
|
|
538
511
|
const before = new Set(nodeDirs());
|
|
539
512
|
// The synchronous CLI must reach the separate API fixture process, which
|
|
@@ -576,48 +549,12 @@ export async function createHarness(opts = {}) {
|
|
|
576
549
|
await harness.awaitBoot(childId, { minCount: priorBoots + 1 });
|
|
577
550
|
return childId;
|
|
578
551
|
},
|
|
579
|
-
async spawnHeadlessChildNoBoot(parentId, task, o = {}) {
|
|
580
|
-
const before = new Set(nodeDirs());
|
|
581
|
-
const args = ['node', 'new', task, '--parent', parentId, '--cwd', CROUTER];
|
|
582
|
-
if (o.kind)
|
|
583
|
-
args.push('--kind', o.kind);
|
|
584
|
-
if (o.mode)
|
|
585
|
-
args.push('--mode', o.mode);
|
|
586
|
-
if (o.model)
|
|
587
|
-
args.push('--model', o.model);
|
|
588
|
-
const res = cli(parentId, args);
|
|
589
|
-
if (res.code !== 0) {
|
|
590
|
-
throw new Error(`spawnHeadlessChildNoBoot(${parentId}) failed (code ${res.code})\n--stdout--\n${res.stdout}\n--stderr--\n${res.stderr}`);
|
|
591
|
-
}
|
|
592
|
-
const added = nodeDirs().filter((d) => !before.has(d));
|
|
593
|
-
if (added.length !== 1) {
|
|
594
|
-
throw new Error(`spawnHeadlessChildNoBoot: expected exactly 1 new node dir, got [${added.join(', ')}]`);
|
|
595
|
-
}
|
|
596
|
-
return added[0];
|
|
597
|
-
},
|
|
598
552
|
cli,
|
|
599
|
-
async turn(nodeId, text = '') {
|
|
600
|
-
const base = eventCount(nodeId, 'agent_end');
|
|
601
|
-
sendCmd(nodeId, { cmd: 'turn', id: `turn-${Date.now()}`, text });
|
|
602
|
-
await awaitAgentEnd(nodeId, base, `turn agent_end for ${nodeId}`);
|
|
603
|
-
},
|
|
604
553
|
async stop(nodeId, reason = 'stop', errorMessage) {
|
|
605
554
|
const base = eventCount(nodeId, 'agent_end');
|
|
606
555
|
sendCmd(nodeId, { cmd: 'stop', id: `stop-${Date.now()}`, reason, errorMessage });
|
|
607
556
|
await awaitAgentEnd(nodeId, base, `stop agent_end for ${nodeId}`);
|
|
608
557
|
},
|
|
609
|
-
async finish(nodeId, finalText) {
|
|
610
|
-
const res = cli(nodeId, ['push', 'final', finalText]);
|
|
611
|
-
if (res.code !== 0) {
|
|
612
|
-
throw new Error(`finish(${nodeId}): push final failed (code ${res.code})\n${res.stderr}`);
|
|
613
|
-
}
|
|
614
|
-
// Fire agent_end so the now-done node runs the real (b) done branch
|
|
615
|
-
// (null presence + ctx.shutdown → window closes), exactly as real pi would.
|
|
616
|
-
const base = eventCount(nodeId, 'agent_end');
|
|
617
|
-
sendCmd(nodeId, { cmd: 'stop', id: `finish-${Date.now()}` });
|
|
618
|
-
await awaitAgentEnd(nodeId, base, `finish agent_end for ${nodeId}`);
|
|
619
|
-
await harness.waitForPaneGone(nodeId);
|
|
620
|
-
},
|
|
621
558
|
async tick(now) {
|
|
622
559
|
closeDb();
|
|
623
560
|
// On the lane, after every already-enqueued exit job — the same strict
|
|
@@ -632,7 +569,6 @@ export async function createHarness(opts = {}) {
|
|
|
632
569
|
await drainLane();
|
|
633
570
|
closeDb();
|
|
634
571
|
},
|
|
635
|
-
drainFleet: drainLane,
|
|
636
572
|
async awaitFleetExit(nodeId, timeoutMs = 15_000) {
|
|
637
573
|
await waitFor(() => !fleet.has(nodeId), {
|
|
638
574
|
timeoutMs,
|
|
@@ -706,18 +642,6 @@ export async function createHarness(opts = {}) {
|
|
|
706
642
|
}, { timeoutMs: o.timeoutMs ?? 15_000, label: `wake delivery for ${nodeId}` });
|
|
707
643
|
return fresh.map((e) => e.content);
|
|
708
644
|
},
|
|
709
|
-
async waitForStatus(nodeId, status, timeoutMs = 20_000) {
|
|
710
|
-
await waitFor(() => {
|
|
711
|
-
closeDb();
|
|
712
|
-
return getNode(nodeId)?.status === status;
|
|
713
|
-
}, { timeoutMs, label: `status=${status} for ${nodeId}` });
|
|
714
|
-
},
|
|
715
|
-
async waitForPaneGone(nodeId, timeoutMs = 20_000) {
|
|
716
|
-
await waitFor(() => {
|
|
717
|
-
closeDb();
|
|
718
|
-
return !isFocused(nodeId);
|
|
719
|
-
}, { timeoutMs, label: `viewer gone for ${nodeId}` });
|
|
720
|
-
},
|
|
721
645
|
waitFor,
|
|
722
646
|
node(nodeId) {
|
|
723
647
|
closeDb();
|
|
@@ -727,10 +651,6 @@ export async function createHarness(opts = {}) {
|
|
|
727
651
|
closeDb();
|
|
728
652
|
return getNode(nodeId)?.status ?? null;
|
|
729
653
|
},
|
|
730
|
-
paneAlive(nodeId) {
|
|
731
|
-
closeDb();
|
|
732
|
-
return isFocused(nodeId);
|
|
733
|
-
},
|
|
734
654
|
inbox(nodeId) {
|
|
735
655
|
closeDb();
|
|
736
656
|
return readInboxSince(nodeId);
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// onto a tmux pane option that the `crtr surface attach` viewer self-sets once
|
|
5
5
|
// its startup checkpoint clears (`clients/attach/session/pane-tag.ts`). These
|
|
6
6
|
// helpers are the ground truth for "which pane is a node's viewer", shared by
|
|
7
|
-
// every
|
|
7
|
+
// every compiled-seam test that asserts viewer dedup or teardown.
|
|
8
8
|
//
|
|
9
9
|
// The waiter dumps the live pane table AND each pane's rendered screen on
|
|
10
10
|
// failure: when a viewer never tags, the reason is almost always printed inside
|
|
@@ -1,148 +1,19 @@
|
|
|
1
1
|
// Run with: node --import tsx/esm --test src/core/__tests__/inline-memory-refs.test.ts
|
|
2
2
|
//
|
|
3
|
-
// Load-bearing
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// corpus/inventory/guidance cases: `buildRefInventory`'s precedence dedup,
|
|
9
|
-
// both-kinds/gated/slash:false referenceability, INDEX naming, and
|
|
10
|
-
// metadata-only output, plus `buildGuidance`'s exact-match resolution,
|
|
11
|
-
// duplicate collapse, and first-appearance ordering.
|
|
3
|
+
// Load-bearing corpus regression for `buildRefInventory` — the authoritative
|
|
4
|
+
// inventory the broker and terminal attach viewer both resolve inline memory
|
|
5
|
+
// references against. Covers scope precedence dedup, referenceability
|
|
6
|
+
// (both kinds, gated and slash docs), INDEX folding, malformed-doc omission,
|
|
7
|
+
// metadata-only rows, and stable ordering, all over real on-disk fixtures.
|
|
12
8
|
import { test, describe, before, beforeEach, after } from 'node:test';
|
|
13
9
|
import assert from 'node:assert/strict';
|
|
14
10
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
15
11
|
import { tmpdir } from 'node:os';
|
|
16
12
|
import { join } from 'node:path';
|
|
17
|
-
import { findRefTokens, formatRefToken, findRefTokenAtCaret, } from '../memory/inline-ref-grammar.js';
|
|
18
13
|
import { resetScopeCache } from '../scope.js';
|
|
19
14
|
import { clearSessionCache } from '../substrate/session-cache.js';
|
|
20
15
|
import { memoryDir as nodeMemoryDir } from '../runtime/memory.js';
|
|
21
16
|
import { buildRefInventory } from '../memory/inline-ref-inventory.js';
|
|
22
|
-
import { buildGuidance } from '../memory/inline-ref-guidance.js';
|
|
23
|
-
// One compact case table drives `findRefTokens` over the spec §4.1 + §5
|
|
24
|
-
// examples: candidate decoding, punctuation trimming, first-segment-only
|
|
25
|
-
// stops, and ASCII whitespace-boundary rejection.
|
|
26
|
-
const GRAMMAR_CASES = [
|
|
27
|
-
{ text: '/dev', expect: [{ raw: '/dev', candidate: 'dev' }] },
|
|
28
|
-
{ text: 'read /dev before starting', expect: [{ raw: '/dev', candidate: 'dev' }] },
|
|
29
|
-
{ text: '/taste:foo', expect: [{ raw: '/taste:foo', candidate: 'taste/foo' }] },
|
|
30
|
-
{ text: '/a:b:c', expect: [{ raw: '/a:b:c', candidate: 'a/b/c' }] },
|
|
31
|
-
// Trailing punctuation is excluded (never even captured, since it is
|
|
32
|
-
// outside the [A-Za-z0-9_:-] class).
|
|
33
|
-
{ text: 'read /dev. before starting', expect: [{ raw: '/dev', candidate: 'dev' }] },
|
|
34
|
-
{ text: 'see /taste:foo)', expect: [{ raw: '/taste:foo', candidate: 'taste/foo' }] },
|
|
35
|
-
{ text: '/dev,', expect: [{ raw: '/dev', candidate: 'dev' }] },
|
|
36
|
-
// Trailing `:` `-` `_` inside the captured run ARE trimmed (step 3).
|
|
37
|
-
{ text: '/dev:', expect: [{ raw: '/dev', candidate: 'dev' }] },
|
|
38
|
-
{ text: '/dev-', expect: [{ raw: '/dev', candidate: 'dev' }] },
|
|
39
|
-
{ text: '/dev_', expect: [{ raw: '/dev', candidate: 'dev' }] },
|
|
40
|
-
{ text: '/dev__--::', expect: [{ raw: '/dev', candidate: 'dev' }] },
|
|
41
|
-
// Nothing survives the trim -> no token.
|
|
42
|
-
{ text: '/___', expect: [] },
|
|
43
|
-
{ text: '/:::', expect: [] },
|
|
44
|
-
// A first segment only: `/foo/bar` yields the token `/foo`; `/bar` is not
|
|
45
|
-
// at a whitespace boundary.
|
|
46
|
-
{ text: '/foo/bar', expect: [{ raw: '/foo', candidate: 'foo' }] },
|
|
47
|
-
// ASCII boundary rejection: a `/` preceded by any non-whitespace character
|
|
48
|
-
// is not a token start.
|
|
49
|
-
{ text: 'http://example.com', expect: [] },
|
|
50
|
-
{ text: 'and/or', expect: [] },
|
|
51
|
-
{ text: '/usr/local/bin', expect: [{ raw: '/usr', candidate: 'usr' }] },
|
|
52
|
-
// Case sensitivity: candidate preserves original case (no normalization).
|
|
53
|
-
{ text: '/Dev', expect: [{ raw: '/Dev', candidate: 'Dev' }] },
|
|
54
|
-
{ text: '/dev /Dev', expect: [{ raw: '/dev', candidate: 'dev' }, { raw: '/Dev', candidate: 'Dev' }] },
|
|
55
|
-
// No leading text at all: start-of-input is a valid boundary.
|
|
56
|
-
{ text: '/dev fix the build', expect: [{ raw: '/dev', candidate: 'dev' }] },
|
|
57
|
-
// No token characters at all after the slash.
|
|
58
|
-
{ text: 'a / b', expect: [] },
|
|
59
|
-
];
|
|
60
|
-
test('findRefTokens: §4.1 grammar table', () => {
|
|
61
|
-
for (const { text, expect } of GRAMMAR_CASES) {
|
|
62
|
-
const tokens = findRefTokens(text);
|
|
63
|
-
assert.deepEqual(tokens.map((t) => ({ raw: t.raw, candidate: t.candidate })), expect, `findRefTokens(${JSON.stringify(text)})`);
|
|
64
|
-
// start/end must always bound `raw` exactly.
|
|
65
|
-
for (const t of tokens) {
|
|
66
|
-
assert.equal(text.slice(t.start, t.end), t.raw, `span mismatch for ${JSON.stringify(text)}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
test('findRefTokens: nested-decode offsets are exact', () => {
|
|
71
|
-
const text = 'see /taste:foo) now';
|
|
72
|
-
const [tok] = findRefTokens(text);
|
|
73
|
-
assert.equal(tok.start, 4);
|
|
74
|
-
assert.equal(tok.end, 14); // just past 'o' in 'foo', before ')'
|
|
75
|
-
assert.equal(text.slice(tok.start, tok.end), '/taste:foo');
|
|
76
|
-
});
|
|
77
|
-
test('formatRefToken: canonical name -> surface token', () => {
|
|
78
|
-
assert.equal(formatRefToken('dev'), '/dev');
|
|
79
|
-
assert.equal(formatRefToken('taste/foo'), '/taste:foo');
|
|
80
|
-
assert.equal(formatRefToken('a/b/c'), '/a:b:c');
|
|
81
|
-
});
|
|
82
|
-
test('formatRefToken round-trips through findRefTokens candidates', () => {
|
|
83
|
-
for (const name of ['dev', 'taste/foo', 'a/b/c', 'spec-driven-development/spec-writing']) {
|
|
84
|
-
const surface = formatRefToken(name);
|
|
85
|
-
const [tok] = findRefTokens(surface);
|
|
86
|
-
assert.equal(tok?.candidate, name, `round-trip for ${name}`);
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
test('findRefTokenAtCaret: incomplete prefix (no trailing name segment yet)', () => {
|
|
90
|
-
const text = '/taste:';
|
|
91
|
-
const caret = findRefTokenAtCaret(text, text.length);
|
|
92
|
-
assert.deepEqual(caret, { start: 0, end: 7, surfacePrefix: '/taste:' });
|
|
93
|
-
});
|
|
94
|
-
test('findRefTokenAtCaret: caret mid-token is suffix-inclusive', () => {
|
|
95
|
-
const text = 'before /dev after';
|
|
96
|
-
const idx = text.indexOf('/dev') + 2; // caret between 'd' and 'e'
|
|
97
|
-
const caret = findRefTokenAtCaret(text, idx);
|
|
98
|
-
assert.deepEqual(caret, { start: 7, end: 11, surfacePrefix: '/d' });
|
|
99
|
-
assert.equal(text.slice(caret.start, caret.end), '/dev');
|
|
100
|
-
});
|
|
101
|
-
test('findRefTokenAtCaret: caret just after a bare slash', () => {
|
|
102
|
-
const text = 'prose / ';
|
|
103
|
-
const caret = findRefTokenAtCaret(text, text.indexOf('/') + 1);
|
|
104
|
-
assert.deepEqual(caret, { start: 6, end: 7, surfacePrefix: '/' });
|
|
105
|
-
});
|
|
106
|
-
test('findRefTokenAtCaret: no token touching caret -> null', () => {
|
|
107
|
-
assert.equal(findRefTokenAtCaret('plain prose', 3), null);
|
|
108
|
-
assert.equal(findRefTokenAtCaret('and/or here', 6), null); // '/' not a token start
|
|
109
|
-
assert.equal(findRefTokenAtCaret('', 0), null);
|
|
110
|
-
});
|
|
111
|
-
test('findRefTokenAtCaret: caret at start of a leading token', () => {
|
|
112
|
-
const text = '/dev fix this';
|
|
113
|
-
const caret = findRefTokenAtCaret(text, 1); // right after the slash
|
|
114
|
-
assert.deepEqual(caret, { start: 0, end: 4, surfacePrefix: '/' });
|
|
115
|
-
});
|
|
116
|
-
// ---------------------------------------------------------------------------
|
|
117
|
-
// Wave C4 — buildGuidance: pure over (text, names), no filesystem/corpus
|
|
118
|
-
// involved. See the fixture-backed buildRefInventory suite below for the
|
|
119
|
-
// corpus/precedence/metadata cases.
|
|
120
|
-
// ---------------------------------------------------------------------------
|
|
121
|
-
const GUIDANCE_HEADER = 'The human explicitly referenced these memory documents. Before acting on the portion of their message that references each document, run the corresponding command and treat its returned content as authoritative context:';
|
|
122
|
-
test('buildGuidance: single resolved ref emits the exact directive header + one read line', () => {
|
|
123
|
-
const names = new Set(['dev']);
|
|
124
|
-
const result = buildGuidance('read /dev before starting', names);
|
|
125
|
-
assert.equal(result, [GUIDANCE_HEADER, '- crtr memory read dev'].join('\n'));
|
|
126
|
-
});
|
|
127
|
-
test('buildGuidance: nested-name candidates decode back to slash form in the read line', () => {
|
|
128
|
-
const names = new Set(['taste/foo']);
|
|
129
|
-
const result = buildGuidance('see /taste:foo) now', names);
|
|
130
|
-
assert.equal(result, [GUIDANCE_HEADER, '- crtr memory read taste/foo'].join('\n'));
|
|
131
|
-
});
|
|
132
|
-
test('buildGuidance: duplicate refs collapse to one instruction; distinct refs list in first-appearance order', () => {
|
|
133
|
-
const names = new Set(['dev', 'taste/foo']);
|
|
134
|
-
const result = buildGuidance('/dev do X, then /taste:foo, and /dev again', names);
|
|
135
|
-
assert.equal(result, [GUIDANCE_HEADER, '- crtr memory read dev', '- crtr memory read taste/foo'].join('\n'));
|
|
136
|
-
});
|
|
137
|
-
test('buildGuidance: an unresolved/unknown token produces no guidance', () => {
|
|
138
|
-
assert.equal(buildGuidance('/nope has nothing to do with it', new Set(['dev'])), null);
|
|
139
|
-
});
|
|
140
|
-
test('buildGuidance: text with no slash tokens at all returns null', () => {
|
|
141
|
-
assert.equal(buildGuidance('plain prose, nothing to see here', new Set(['dev'])), null);
|
|
142
|
-
});
|
|
143
|
-
test('buildGuidance: exact case-sensitive matching — a differently-cased token does not resolve', () => {
|
|
144
|
-
assert.equal(buildGuidance('/Dev fix this', new Set(['dev'])), null);
|
|
145
|
-
});
|
|
146
17
|
// ---------------------------------------------------------------------------
|
|
147
18
|
// Wave C4 — buildRefInventory: the authoritative corpus builder. Fixture-
|
|
148
19
|
// backed (node/project/user scope docs on disk), since precedence dedup,
|
|
@@ -15,7 +15,7 @@ import { closeDb } from '../canvas/db.js';
|
|
|
15
15
|
import { buildReviveKickoff, clearYieldMessage, drainBearings, readYieldMessage, writeYieldMessage, yieldMessagePath, } from '../runtime/kickoff.js';
|
|
16
16
|
import { appendInbox, readCursor } from '../feed/inbox.js';
|
|
17
17
|
import { appendSituationalContext } from '../runtime/situational-context.js';
|
|
18
|
-
import { buildContextIntro } from '
|
|
18
|
+
import { buildContextBearings as buildContextIntro } from '../runtime/bearings.js';
|
|
19
19
|
let home;
|
|
20
20
|
function node(id) {
|
|
21
21
|
return {
|
|
@@ -20,7 +20,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, realpathSync } from 'nod
|
|
|
20
20
|
import { tmpdir } from 'node:os';
|
|
21
21
|
import { join } from 'node:path';
|
|
22
22
|
import { resetScopeCache } from '../scope.js';
|
|
23
|
-
import { resolveMemoryDoc } from '../memory-resolver.js';
|
|
23
|
+
import { resolveMemoryDoc, resolveMemoryDocs } from '../memory-resolver.js';
|
|
24
24
|
let home;
|
|
25
25
|
let base;
|
|
26
26
|
let root;
|
|
@@ -91,6 +91,18 @@ test('a physical-path query whose nearest match diverged in identity from a fart
|
|
|
91
91
|
process.chdir(prevCwd);
|
|
92
92
|
}
|
|
93
93
|
});
|
|
94
|
+
test('batch resolution preserves direct-path precedence over a farther matching identity', () => {
|
|
95
|
+
process.chdir(child);
|
|
96
|
+
resetScopeCache();
|
|
97
|
+
try {
|
|
98
|
+
const doc = resolveMemoryDocs(['AGENTS']).get('AGENTS');
|
|
99
|
+
assert.equal(doc?.path, join(child, '.crouter', 'memory', 'AGENTS.md'));
|
|
100
|
+
assert.match(doc?.body ?? '', /CHILD AGENTS BODY/);
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
process.chdir(prevCwd);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
94
106
|
test('a migrated nested doc resolves by its explicit slashed identity', () => {
|
|
95
107
|
process.chdir(grandchild);
|
|
96
108
|
resetScopeCache();
|
|
@@ -128,6 +140,22 @@ test('a bare-directory query resolves to that dir\'s INDEX.md, nearest copy firs
|
|
|
128
140
|
process.chdir(prevCwd);
|
|
129
141
|
}
|
|
130
142
|
});
|
|
143
|
+
test("an explicit '<dir>/INDEX' identity resolves to that physical INDEX.md", () => {
|
|
144
|
+
// The assembled memory tree addresses a directory INDEX by its extensionless
|
|
145
|
+
// resolver identity, so `<dir>/INDEX` must resolve to the physical INDEX.md
|
|
146
|
+
// and report back the same identifier it was asked for.
|
|
147
|
+
process.chdir(child);
|
|
148
|
+
resetScopeCache();
|
|
149
|
+
try {
|
|
150
|
+
const doc = resolveMemoryDoc('taste/INDEX');
|
|
151
|
+
assert.equal(doc.path, join(child, '.crouter', 'memory', 'taste', 'INDEX.md'));
|
|
152
|
+
assert.equal(doc.name, 'taste/INDEX');
|
|
153
|
+
assert.match(doc.body, /CHILD TASTE INDEX/);
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
process.chdir(prevCwd);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
131
159
|
test('--kind skips a nearer wrong-kind (frontmatter-less, kind-defaulted) doc and resolves the farther matching-kind doc', () => {
|
|
132
160
|
process.chdir(child);
|
|
133
161
|
resetScopeCache();
|
|
@@ -8,6 +8,7 @@ import { DatabaseSync } from 'node:sqlite';
|
|
|
8
8
|
import { openDb, closeDb, migrate, MIGRATIONS } from '../canvas/db.js';
|
|
9
9
|
import { canvasDbPath, ensureHome } from '../canvas/paths.js';
|
|
10
10
|
import { customExtensionPaths } from '../canvas/extensions.js';
|
|
11
|
+
import { assertMandatoryCanvasExtensions, CANVAS_EXTENSIONS, mergeCanvasExtensions } from '../runtime/canvas-extensions.js';
|
|
11
12
|
import { updateNode } from '../canvas/canvas.js';
|
|
12
13
|
import { spawn, spawnSync } from 'node:child_process';
|
|
13
14
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
@@ -84,6 +85,21 @@ test('a persisted review-boundary canvas prefix is not treated as custom extensi
|
|
|
84
85
|
const persisted = REVIEW_BOUNDARY_CANVAS_EXTENSION_NAMES.map((name) => `/old-generation/pi-extensions/${name}.js`);
|
|
85
86
|
assert.deepEqual(customExtensionPaths(persisted), []);
|
|
86
87
|
});
|
|
88
|
+
test('stale generation hooks are retired structurally without dropping user extensions', () => {
|
|
89
|
+
const stale = [
|
|
90
|
+
'canvas-inbox-watcher', 'canvas-stophook', 'canvas-recap', 'canvas-goal-capture',
|
|
91
|
+
'canvas-passive-context', 'canvas-context-intro', 'canvas-tool-guide',
|
|
92
|
+
'canvas-doc-substrate', 'canvas-structured-output', 'canvas-bash-valve',
|
|
93
|
+
].map((name) => `/Users/silasrhyneer/.crouter/runtime/generations/d3ff9346e6df88f88c44af898a028a8fd6f03466eb216d7cd3b70a734f71a11b/dist/pi-extensions/${name}.js`);
|
|
94
|
+
assert.deepEqual(customExtensionPaths(stale), []);
|
|
95
|
+
assert.deepEqual(customExtensionPaths([...stale, '/Users/silasrhyneer/extensions/canvas-foo.js']), ['/Users/silasrhyneer/extensions/canvas-foo.js']);
|
|
96
|
+
});
|
|
97
|
+
test('a retained custom extension sharing a canvas-hook basename still launches', () => {
|
|
98
|
+
const custom = '/Users/silasrhyneer/extensions/canvas-recap.js';
|
|
99
|
+
assert.deepEqual(customExtensionPaths([custom]), [custom]);
|
|
100
|
+
assert.doesNotThrow(() => assertMandatoryCanvasExtensions(mergeCanvasExtensions([custom])));
|
|
101
|
+
assert.throws(() => assertMandatoryCanvasExtensions([...CANVAS_EXTENSIONS, '/stale-root/pi-extensions/canvas-recap.js']), /duplicate mandatory canvas extension basename canvas-recap/);
|
|
102
|
+
});
|
|
87
103
|
test('a v14 canvas normalizes historical canvas paths while retaining custom launch extras', () => {
|
|
88
104
|
const metaPath = join(home, 'nodes', 'saved', 'meta.json');
|
|
89
105
|
mkdirSync(join(home, 'nodes', 'saved'), { recursive: true });
|
|
@@ -265,54 +281,6 @@ test('v4 migrates a db with a pre-existing orphan edge without throwing', () =>
|
|
|
265
281
|
assert.equal(surviving.from_id, 'n1');
|
|
266
282
|
assert.equal(surviving.to_id, 'n2');
|
|
267
283
|
});
|
|
268
|
-
test('v4 leaves the FK live: an edge to a missing node is rejected', () => {
|
|
269
|
-
const raw = buildV3Db();
|
|
270
|
-
insertNode(raw, 'n1');
|
|
271
|
-
raw.close();
|
|
272
|
-
const db = openDb();
|
|
273
|
-
assert.equal(userVersion(db), MIGRATIONS.length);
|
|
274
|
-
// Inserting an edge whose endpoint has no node row now violates the FK.
|
|
275
|
-
assert.throws(() => db
|
|
276
|
-
.prepare('INSERT INTO edges (type, from_id, to_id, active, created) VALUES (?,?,?,?,?)')
|
|
277
|
-
.run('spawned_by', 'n1', 'missing', 1, '2020-01-01T00:00:00Z'), /FOREIGN KEY|constraint/i);
|
|
278
|
-
// A fully-valid edge (both endpoints present) still inserts fine.
|
|
279
|
-
insertNode(db, 'n3');
|
|
280
|
-
assert.doesNotThrow(() => db
|
|
281
|
-
.prepare('INSERT INTO edges (type, from_id, to_id, active, created) VALUES (?,?,?,?,?)')
|
|
282
|
-
.run('subscribes_to', 'n1', 'n3', 1, '2020-01-01T00:00:00Z'));
|
|
283
|
-
});
|
|
284
|
-
test('v4 deleting a node cascade-deletes its edges', () => {
|
|
285
|
-
const raw = buildV3Db();
|
|
286
|
-
insertNode(raw, 'a');
|
|
287
|
-
insertNode(raw, 'b');
|
|
288
|
-
insertEdge(raw, 'subscribes_to', 'a', 'b');
|
|
289
|
-
insertEdge(raw, 'spawned_by', 'b', 'a');
|
|
290
|
-
raw.close();
|
|
291
|
-
const db = openDb();
|
|
292
|
-
assert.equal(edgeCount(db), 2);
|
|
293
|
-
// Delete one endpoint — every edge touching it cascades away.
|
|
294
|
-
db.prepare('DELETE FROM nodes WHERE node_id = ?').run('a');
|
|
295
|
-
assert.equal(edgeCount(db), 0);
|
|
296
|
-
});
|
|
297
|
-
test('v4 is idempotent on re-open', () => {
|
|
298
|
-
const raw = buildV3Db();
|
|
299
|
-
insertNode(raw, 'n1');
|
|
300
|
-
insertEdge(raw, 'subscribes_to', 'n1', 'n1');
|
|
301
|
-
raw.close();
|
|
302
|
-
const db = openDb();
|
|
303
|
-
assert.equal(userVersion(db), MIGRATIONS.length);
|
|
304
|
-
assert.equal(edgeCount(db), 1);
|
|
305
|
-
// Re-running migrate() directly is a no-op (gate skips applied steps); the
|
|
306
|
-
// edges table is NOT rebuilt again.
|
|
307
|
-
assert.doesNotThrow(() => migrate(db));
|
|
308
|
-
assert.equal(userVersion(db), MIGRATIONS.length);
|
|
309
|
-
assert.equal(edgeCount(db), 1);
|
|
310
|
-
// Re-opening from disk is likewise a no-op — the FK + data persist.
|
|
311
|
-
closeDb();
|
|
312
|
-
const db2 = openDb();
|
|
313
|
-
assert.equal(userVersion(db2), MIGRATIONS.length);
|
|
314
|
-
assert.equal(edgeCount(db2), 1);
|
|
315
|
-
});
|
|
316
284
|
function buildV4DbWithLaterColumns() {
|
|
317
285
|
ensureHome();
|
|
318
286
|
const raw = new DatabaseSync(canvasDbPath());
|
|
@@ -365,6 +333,25 @@ test('bug #99: a stale v4 db with later columns already present migrates cleanly
|
|
|
365
333
|
assert.equal(row.pane, '%9');
|
|
366
334
|
assert.equal(row.host_kind, 'broker');
|
|
367
335
|
});
|
|
336
|
+
test('v16 repairs a v15 database missing canonical finalization columns', () => {
|
|
337
|
+
ensureHome();
|
|
338
|
+
const db = new DatabaseSync(join(home, 'finalization.db'));
|
|
339
|
+
try {
|
|
340
|
+
MIGRATIONS[0](db);
|
|
341
|
+
db.exec('PRAGMA user_version = 15');
|
|
342
|
+
migrate(db);
|
|
343
|
+
const columns = nodeColumns(db);
|
|
344
|
+
assert.ok(columns.includes('final_report'));
|
|
345
|
+
assert.ok(columns.includes('finalized_at'));
|
|
346
|
+
// migrate() always brings a db to the latest schema, not just v16 — assert
|
|
347
|
+
// against the live migration count rather than a version snapshot that will
|
|
348
|
+
// go stale every time a new migration is appended.
|
|
349
|
+
assert.equal(userVersion(db), MIGRATIONS.length);
|
|
350
|
+
}
|
|
351
|
+
finally {
|
|
352
|
+
db.close();
|
|
353
|
+
}
|
|
354
|
+
});
|
|
368
355
|
// --- v22: legacy schedules → crons ------------------------------------------
|
|
369
356
|
function buildV21Db() {
|
|
370
357
|
ensureHome();
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
// On-read context surfaces at most once per conversation. The dedup set lives
|
|
2
2
|
// at nodes/<id>/injected-docs.json so a process resumed onto the same transcript
|
|
3
|
-
// rehydrates it, while a fresh transcript clears it.
|
|
3
|
+
// rehydrates it, while a fresh transcript clears it. The same loader resolves a
|
|
4
|
+
// doc's identity with the explicit-name-then-path-fallback rule the boot resolver
|
|
5
|
+
// uses (schema.ts's resolveDocName), never deriving `name` from the path alone.
|
|
4
6
|
//
|
|
5
7
|
// Run: node --import tsx/esm --test src/core/__tests__/on-read-dedup-resume.test.ts
|
|
6
8
|
import { test, before, beforeEach, after } from 'node:test';
|
|
7
9
|
import assert from 'node:assert/strict';
|
|
8
|
-
import { mkdtempSync, mkdirSync, rmSync, writeFileSync
|
|
10
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
9
11
|
import { tmpdir } from 'node:os';
|
|
10
12
|
import { join } from 'node:path';
|
|
11
13
|
import { closeDb } from '../canvas/db.js';
|
|
12
14
|
import { resetScopeCache } from '../scope.js';
|
|
13
|
-
import { injectedDocsPath } from '../canvas/paths.js';
|
|
14
15
|
import { spawnNode } from '../runtime/nodes.js';
|
|
15
16
|
import { renderOnReadDocs } from '../substrate/on-read.js';
|
|
16
17
|
import { loadInjectedDocs, saveInjectedDocs, clearInjectedDocs, } from '../substrate/injected-store.js';
|
|
@@ -44,15 +45,6 @@ after(() => {
|
|
|
44
45
|
else
|
|
45
46
|
process.env['HOME'] = prevHomeEnv;
|
|
46
47
|
});
|
|
47
|
-
test('injected-store round-trips and clears', () => {
|
|
48
|
-
const node = spawnNode({ kind: 'general', cwd: work, parent: null }).node_id;
|
|
49
|
-
assert.deepEqual([...loadInjectedDocs(node)], [], 'cold load is empty');
|
|
50
|
-
saveInjectedDocs(node, new Set(['/a', '/b']));
|
|
51
|
-
assert.deepEqual([...loadInjectedDocs(node)].sort(), ['/a', '/b'], 'save then load round-trips');
|
|
52
|
-
clearInjectedDocs(node);
|
|
53
|
-
assert.ok(!existsSync(injectedDocsPath(node)), 'clear removes the file');
|
|
54
|
-
assert.deepEqual([...loadInjectedDocs(node)], [], 'load after clear is empty');
|
|
55
|
-
});
|
|
56
48
|
test('project and user memory docs without applies-to do not fire on file reads', () => {
|
|
57
49
|
const fakeHome = mkdtempSync(join(tmpdir(), 'crtr-onread-user-home-'));
|
|
58
50
|
process.env['HOME'] = fakeHome;
|
|
@@ -107,3 +99,21 @@ test('on-read doc surfaces once, stays deduped across a revive(resume), re-surfa
|
|
|
107
99
|
const seenFresh = loadInjectedDocs(node);
|
|
108
100
|
assert.ok(renderOnReadDocs(node, readFile, seenFresh).includes(FIXTURE_BODY), 'a fresh transcript surfaces the doc again');
|
|
109
101
|
});
|
|
102
|
+
test('an explicitly routed doc injects on-read under its frontmatter name, not the path-derived one', () => {
|
|
103
|
+
const node = spawnNode({ kind: 'general', cwd: work, parent: null }).node_id;
|
|
104
|
+
const memDir = join(work, '.crouter', 'memory');
|
|
105
|
+
mkdirSync(memDir, { recursive: true });
|
|
106
|
+
writeFileSync(join(memDir, 'physical-guide.md'), '---\nkind: knowledge\n' +
|
|
107
|
+
'name: acme-project\n' +
|
|
108
|
+
'when-and-why-to-read: When reading acme source, this knowledge should be read because it carries the project-specific implementation constraints.\n' +
|
|
109
|
+
'file-read-visibility: content\n' +
|
|
110
|
+
'applies-to: "src/**"\n---\n' +
|
|
111
|
+
'ACME PROJECT OPERATING GUIDE\n');
|
|
112
|
+
const readFile = join(work, 'src', 'file.ts');
|
|
113
|
+
mkdirSync(join(work, 'src'), { recursive: true });
|
|
114
|
+
writeFileSync(readFile, 'export const x = 1;\n');
|
|
115
|
+
const rendered = renderOnReadDocs(node, readFile, new Set());
|
|
116
|
+
assert.ok(rendered.includes('ACME PROJECT OPERATING GUIDE'), 'the matching explicit route fires');
|
|
117
|
+
assert.ok(rendered.includes('<memory kind="knowledge" name="acme-project"'), `expected explicit frontmatter name "acme-project" in the injected envelope, got: ${rendered}`);
|
|
118
|
+
assert.ok(!rendered.includes('name="physical-guide"'), 'must not fall back to the path-derived name when frontmatter sets one');
|
|
119
|
+
});
|