@north-light/crouter 0.3.172 → 0.3.174
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +106 -177
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +55 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +198 -0
- package/dist/commands/node/create.d.ts +23 -0
- package/dist/commands/node/create.js +207 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +302 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +415 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +164 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +82 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +159 -0
- package/dist/commands/node-lifecycle-revive.js +10 -57
- package/dist/commands/node.d.ts +0 -42
- package/dist/commands/node.js +11 -2065
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +67 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +46 -0
- package/dist/commands/surface/node/placement.js +124 -0
- package/dist/commands/surface-node.js +4 -1
- package/dist/commands/surface-reload.js +1 -2
- package/dist/commands/surface-tmux-spread.js +1 -1
- package/dist/commands/surface.js +5 -20
- package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
- package/dist/commands/sys/config.js +6 -6
- package/dist/commands/sys/logs.js +1 -1
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
- package/dist/commands/sys/panels/keys-panel.js +60 -0
- package/dist/commands/sys/panels/models-panel.d.ts +77 -0
- package/dist/commands/sys/panels/models-panel.js +647 -0
- package/dist/commands/sys/panels/panel.d.ts +45 -0
- package/dist/commands/sys/panels/panel.js +137 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +80 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
- package/dist/commands/sys/panels/prefs-panel.js +85 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
- package/dist/commands/sys/panels/provider-panel.js +538 -0
- package/dist/commands/sys/settings-shell.d.ts +55 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +31 -0
- package/dist/commands/sys/setup-core.d.ts +3 -33
- package/dist/commands/sys/setup-core.js +27 -78
- package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
- package/dist/commands/sys/setup-settings-runner.js +63 -0
- package/dist/commands/sys/setup-wizard.d.ts +26 -125
- package/dist/commands/sys/setup-wizard.js +209 -2473
- package/dist/commands/sys/setup.js +5 -7
- package/dist/commands/sys.js +3 -2
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
- package/dist/core/__tests__/broker-preflight.test.js +1 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
- package/dist/core/__tests__/canvas.test.js +2 -36
- package/dist/core/__tests__/close.test.js +14 -3
- package/dist/core/__tests__/context-intro.test.js +32 -143
- package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
- package/dist/core/__tests__/daemon-boot.test.js +2 -20
- package/dist/core/__tests__/daemon-wedge.test.js +1 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +4 -98
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
- package/dist/core/__tests__/helpers/broker-clients.js +0 -14
- package/dist/core/__tests__/helpers/harness.d.ts +0 -8
- package/dist/core/__tests__/helpers/harness.js +7 -87
- package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
- package/dist/core/__tests__/kickoff.test.js +1 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
- package/dist/core/__tests__/migration.test.js +35 -48
- package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
- package/dist/core/__tests__/passive-subscription.test.js +26 -49
- package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
- package/dist/core/__tests__/prune.test.js +94 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -32
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
- package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
- package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
- package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
- package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
- package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
- package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
- package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
- package/dist/core/__tests__/secrets.test.js +1 -7
- package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
- package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
- package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
- package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
- package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
- package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
- package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
- package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
- package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
- package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
- package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
- package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
- package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
- package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
- package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
- package/dist/core/__tests__/session-model.test.js +0 -18
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
- package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
- package/dist/core/broker-client/client.d.ts +2 -2
- package/dist/core/broker-client/client.js +4 -7
- package/dist/core/broker-client/transport-relay.d.ts +13 -19
- package/dist/core/broker-client/transport-relay.js +19 -34
- package/dist/core/broker-client/transport-socket.d.ts +2 -2
- package/dist/core/broker-client/transport-socket.js +9 -2
- package/dist/core/broker-client/transport.d.ts +7 -3
- package/dist/core/broker-client/transport.js +4 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -18
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
- package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
- package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
- package/dist/core/canvas/browse/app.d.ts +2 -17
- package/dist/core/canvas/browse/app.js +16 -88
- package/dist/core/canvas/browse/model.d.ts +0 -4
- package/dist/core/canvas/browse/model.js +1 -12
- package/dist/core/canvas/browse/render.js +6 -3
- package/dist/core/canvas/crons.d.ts +8 -5
- package/dist/core/canvas/crons.js +7 -6
- package/dist/core/canvas/extensions.d.ts +7 -3
- package/dist/core/canvas/extensions.js +16 -4
- package/dist/core/canvas/nav-model.d.ts +0 -4
- package/dist/core/canvas/nav-model.js +2 -14
- package/dist/core/canvas/node-order.d.ts +3 -0
- package/dist/core/canvas/node-order.js +12 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
- package/dist/core/canvas/remote-canvas-source.js +8 -15
- package/dist/core/command.js +11 -4
- package/dist/core/config.js +3 -1
- package/dist/core/events/envelope.js +1 -1
- package/dist/core/events/read.js +7 -21
- package/dist/core/events/source.d.ts +0 -2
- package/dist/core/events/source.js +0 -16
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/fault-classifier.d.ts +1 -1
- package/dist/core/feed/passive.d.ts +0 -11
- package/dist/core/feed/passive.js +1 -62
- package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
- package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
- package/dist/core/keybindings/background-bash.js +3 -4
- package/dist/core/keybindings/catalog.js +1 -1
- package/dist/core/memory/inline-ref-grammar.js +3 -3
- package/dist/core/memory-resolver.d.ts +11 -25
- package/dist/core/memory-resolver.js +51 -33
- package/dist/core/model-routes.d.ts +15 -0
- package/dist/core/model-routes.js +12 -0
- package/dist/core/pool-credential-store.js +1 -1
- package/dist/core/preview-registry.js +8 -9
- package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
- package/dist/core/review/realize.d.ts +0 -13
- package/dist/core/review/realize.js +0 -40
- package/dist/core/review/types.d.ts +1 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
- package/dist/core/runtime/bearings.js +1 -11
- package/dist/core/runtime/broker/client-registry.d.ts +33 -0
- package/dist/core/runtime/broker/client-registry.js +164 -0
- package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
- package/dist/core/runtime/broker/daemon-ops.js +49 -0
- package/dist/core/runtime/broker/event-projection.d.ts +42 -0
- package/dist/core/runtime/broker/event-projection.js +178 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
- package/dist/core/runtime/broker/fault-retry.js +277 -0
- package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
- package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
- package/dist/core/runtime/broker/inbox.d.ts +22 -0
- package/dist/core/runtime/broker/inbox.js +167 -0
- package/dist/core/runtime/broker/passive.d.ts +16 -0
- package/dist/core/runtime/broker/passive.js +44 -0
- package/dist/core/runtime/broker/read-ops.d.ts +23 -0
- package/dist/core/runtime/broker/read-ops.js +150 -0
- package/dist/core/runtime/broker/rebind.d.ts +74 -0
- package/dist/core/runtime/broker/rebind.js +211 -0
- package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
- package/dist/core/runtime/broker/tool-groups.js +244 -0
- package/dist/core/runtime/broker-extension-render.d.ts +11 -0
- package/dist/core/runtime/broker-extension-render.js +181 -0
- package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
- package/dist/core/runtime/broker-persona-guidance.js +58 -0
- package/dist/core/runtime/broker-protocol.d.ts +1 -1
- package/dist/core/runtime/broker-protocol.js +1 -1
- package/dist/core/runtime/broker.d.ts +5 -196
- package/dist/core/runtime/broker.js +276 -3059
- package/dist/core/runtime/canvas-extensions.js +11 -2
- package/dist/core/runtime/fault.js +1 -1
- package/dist/core/runtime/model-selection.d.ts +9 -0
- package/dist/core/runtime/model-selection.js +12 -0
- package/dist/core/runtime/model-swap.d.ts +3 -3
- package/dist/core/runtime/model-swap.js +33 -25
- package/dist/core/runtime/placement-tmux.d.ts +3 -14
- package/dist/core/runtime/placement-tmux.js +11 -80
- package/dist/core/runtime/placement.d.ts +4 -2
- package/dist/core/runtime/placement.js +7 -12
- package/dist/core/runtime/promote.d.ts +14 -1
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +8 -0
- package/dist/core/runtime/spawn.js +36 -6
- package/dist/core/runtime/stop-guard.d.ts +4 -3
- package/dist/core/runtime/stop-guard.js +36 -18
- package/dist/core/runtime/stop-signals.d.ts +4 -1
- package/dist/core/runtime/stream-watchdog.js +4 -5
- package/dist/core/runtime/structured-output.d.ts +15 -2
- package/dist/core/runtime/structured-output.js +35 -12
- package/dist/core/runtime/tmux-bindings.d.ts +25 -0
- package/dist/core/runtime/tmux-bindings.js +682 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -1
- package/dist/core/runtime/tmux-chrome.js +3 -2
- package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
- package/dist/core/runtime/tmux-driver.js +598 -0
- package/dist/core/runtime/view-socket.d.ts +14 -0
- package/dist/core/runtime/view-socket.js +83 -0
- package/dist/core/session-model/session-state.d.ts +1 -2
- package/dist/core/session-model/session-state.js +5 -8
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +2 -2
- package/dist/core/substrate/gate.d.ts +1 -1
- package/dist/core/substrate/on-read-pure.d.ts +7 -0
- package/dist/core/substrate/on-read-pure.js +272 -0
- package/dist/core/termrender/termrender.js +32 -2
- package/dist/core/user-settings.d.ts +23 -1
- package/dist/core/user-settings.js +18 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
- package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
- package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
- package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
- package/dist/daemon/api/bridge.js +40 -81
- package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
- package/dist/daemon/api/handlers/broker-ops.js +383 -0
- package/dist/daemon/api/handlers/crons.js +9 -4
- package/dist/daemon/api/handlers/files.js +6 -7
- package/dist/daemon/api/handlers/inbox.js +2 -340
- package/dist/daemon/api/handlers/nodes.d.ts +10 -1
- package/dist/daemon/api/handlers/nodes.js +74 -39
- package/dist/daemon/api/handlers/review-comments.js +5 -1
- package/dist/daemon/api/handlers/reviews.js +0 -19
- package/dist/daemon/api/map.js +25 -4
- package/dist/daemon/api/router.js +2 -3
- package/dist/daemon/api/server.js +5 -7
- package/dist/daemon/cron-run.d.ts +4 -0
- package/dist/daemon/cron-run.js +30 -13
- package/dist/daemon/crtrd.d.ts +3 -58
- package/dist/daemon/crtrd.js +28 -1244
- package/dist/daemon/manage.js +0 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
- package/dist/daemon/reconcilers/broker-supervision.js +549 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
- package/dist/daemon/reconcilers/cron-lane.js +32 -0
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
- package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
- package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
- package/dist/daemon/review/finish.js +2 -5
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
- package/dist/pi-extensions/broker-local.d.ts +20 -0
- package/dist/pi-extensions/broker-local.js +89 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
- package/dist/pi-extensions/canvas-context-intro.js +22 -11
- package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
- package/dist/pi-extensions/canvas-goal-capture.js +7 -12
- package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
- package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
- package/dist/pi-extensions/canvas-passive-context.js +22 -18
- package/dist/pi-extensions/canvas-recap.d.ts +2 -2
- package/dist/pi-extensions/canvas-recap.js +48 -21
- package/dist/pi-extensions/canvas-review-boundary.js +10 -4
- package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
- package/dist/pi-extensions/canvas-stophook.js +149 -431
- package/dist/pi-extensions/canvas-structured-output.js +52 -30
- package/dist/pi-extensions/envelope-merge.d.ts +13 -0
- package/dist/pi-extensions/envelope-merge.js +29 -0
- package/dist/shared/working-activity.d.ts +3 -2
- package/dist/shared/working-activity.js +3 -2
- package/dist/types.d.ts +6 -5
- package/dist/types.js +2 -2
- package/docs/compat/hearth-crtr-v1.md +4 -12
- package/docs/compat/hearth-crtr-v2.md +3 -11
- package/docs/compat/hearth-crtr-v3.md +4 -12
- package/docs/compat/hearth-crtr-v4.md +3 -11
- package/docs/compat/hearth-crtr-v5.md +3 -11
- package/docs/public-api.md +3 -7
- package/package.json +7 -49
- package/runtime.lock.json +2766 -14533
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
- package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
- package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
- package/dist/clients/conversation/conversation.d.ts +0 -65
- package/dist/clients/conversation/conversation.js +0 -318
- package/dist/clients/conversation/frames.d.ts +0 -30
- package/dist/clients/conversation/frames.js +0 -52
- package/dist/clients/conversation/region.d.ts +0 -51
- package/dist/clients/conversation/region.js +0 -265
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
- package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
- package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
- package/dist/clients/inbox/review/columns.d.ts +0 -22
- package/dist/clients/inbox/review/columns.js +0 -40
- package/dist/clients/inbox/review/composition.d.ts +0 -60
- package/dist/clients/inbox/review/composition.js +0 -278
- package/dist/clients/inbox/review/document-region.d.ts +0 -120
- package/dist/clients/surfaces/region.d.ts +0 -16
- package/dist/clients/web/__tests__/push-engine.test.js +0 -158
- package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
- package/dist/clients/web/__tests__/push-registry.test.js +0 -177
- package/dist/clients/web/dev-server.d.ts +0 -7
- package/dist/clients/web/dev-server.js +0 -46
- package/dist/clients/web/events.d.ts +0 -19
- package/dist/clients/web/events.js +0 -163
- package/dist/clients/web/push-engine.d.ts +0 -44
- package/dist/clients/web/push-engine.js +0 -125
- package/dist/clients/web/push-registry.d.ts +0 -85
- package/dist/clients/web/push-registry.js +0 -373
- package/dist/clients/web/server.d.ts +0 -19
- package/dist/clients/web/server.js +0 -661
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
- package/dist/clients/web/web-client/shared/protocol.js +0 -8
- package/dist/clients/web/web-cmd.d.ts +0 -2
- package/dist/clients/web/web-cmd.js +0 -141
- package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
- package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
- package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
- package/dist/commands/__tests__/canvas-config.test.js +0 -107
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
- package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
- package/dist/commands/__tests__/search-contents.test.js +0 -52
- package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/lint.test.js +0 -15
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
- package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
- package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
- package/dist/core/__tests__/finalization-migration.test.js +0 -38
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
- package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
- package/dist/core/__tests__/fork.test.d.ts +0 -1
- package/dist/core/__tests__/fork.test.js +0 -108
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
- package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
- package/dist/core/__tests__/full/cascade-close.test.js +0 -240
- package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/detach-focus.test.js +0 -126
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
- package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.js +0 -60
- package/dist/core/__tests__/model-routes.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes.test.js +0 -41
- package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-identity.test.js +0 -61
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
- package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
- package/dist/core/__tests__/prune-to-limit.test.js +0 -126
- package/dist/core/__tests__/reset.test.d.ts +0 -1
- package/dist/core/__tests__/reset.test.js +0 -69
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
- package/dist/core/__tests__/steer-note.test.d.ts +0 -1
- package/dist/core/__tests__/steer-note.test.js +0 -41
- package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
- package/dist/core/__tests__/subcommand-tier.test.js +0 -99
- package/dist/core/__tests__/subscription-delivery.test.js +0 -211
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
- package/dist/core/__tests__/tmux-surface.test.js +0 -484
- package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
- package/dist/core/__tests__/wake-bearings.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
- package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
- package/dist/core/canvas/remote-event-stream.d.ts +0 -24
- package/dist/core/canvas/remote-event-stream.js +0 -94
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
- package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
- package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
- package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
- package/dist/core/human/__tests__/visible-paths.test.js +0 -28
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
- package/dist/core/review/__tests__/project.test.d.ts +0 -1
- package/dist/core/review/__tests__/project.test.js +0 -71
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
- package/dist/core/runtime/tmux.js +0 -1314
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
- package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/inbox.test.js +0 -489
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
- package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +0 -17
- package/dist/web-client/manifest.webmanifest +0 -1
- package/dist/web-client/sw.js +0 -1
- /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
- /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
- /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
- /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
- /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
- /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
- /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
- /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
- /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
- /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Contract-seam tests for the external command-plugin seam (Phase 1).
|
|
2
|
-
// Run with:
|
|
2
|
+
// Run with: npm run test:serial
|
|
3
3
|
//
|
|
4
4
|
// All tests run against an ISOLATED home (HOME → a fresh temp dir, no ambient
|
|
5
5
|
// user plugins) and pass an explicit no-`.crouter` startDir, so discovery is
|
|
@@ -20,23 +20,28 @@
|
|
|
20
20
|
// on the next discovery call (per-invocation, no cache).
|
|
21
21
|
// 6/7. Typed issues for path/exec-bit/schema/unknown-key violations and nested
|
|
22
22
|
// mount composition without executing the fixture binary.
|
|
23
|
-
import { test, describe, before, after, beforeEach } from 'node:test';
|
|
23
|
+
import { test, describe, before, after, beforeEach, afterEach } from 'node:test';
|
|
24
24
|
import assert from 'node:assert/strict';
|
|
25
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, chmodSync } from 'node:fs';
|
|
25
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, chmodSync, existsSync } from 'node:fs';
|
|
26
26
|
import { readFileSync } from 'node:fs';
|
|
27
27
|
import { execFileSync } from 'node:child_process';
|
|
28
28
|
import { tmpdir } from 'node:os';
|
|
29
29
|
import { join, dirname } from 'node:path';
|
|
30
30
|
import { fileURLToPath } from 'node:url';
|
|
31
|
-
import { discoverCommandContributions, effectiveCommandPlugins, validatePluginCommands, } from '
|
|
32
|
-
import { composeExternalSubtrees, adaptPluginContributions } from '
|
|
33
|
-
import { resolveCommandRegistry } from '
|
|
34
|
-
import { defineRoot } from '
|
|
35
|
-
import { renderRoot, renderBranch, renderLeafArgv } from '
|
|
36
|
-
import { renderResult } from '
|
|
37
|
-
import { CrtrError } from '
|
|
38
|
-
import { resetScopeCache } from '
|
|
39
|
-
import { listInstalledPluginsInRoot } from '
|
|
31
|
+
import { discoverCommandContributions, effectiveCommandPlugins, validatePluginCommands, } from '../../command-plugins/discovery.js';
|
|
32
|
+
import { composeExternalSubtrees, adaptPluginContributions } from '../../command-plugins/compose.js';
|
|
33
|
+
import { resolveCommandRegistry } from '../../command-manifests/registry.js';
|
|
34
|
+
import { defineRoot } from '../../command.js';
|
|
35
|
+
import { renderRoot, renderBranch, renderLeafArgv } from '../../help.js';
|
|
36
|
+
import { renderResult } from '../../render.js';
|
|
37
|
+
import { CrtrError } from '../../errors.js';
|
|
38
|
+
import { resetScopeCache } from '../../scope.js';
|
|
39
|
+
import { listInstalledPluginsInRoot } from '../../resolver.js';
|
|
40
|
+
import { pluginShow } from '../../../commands/pkg/plugin-inspect.js';
|
|
41
|
+
import { sysDoctorLeaf } from '../../../commands/sys/doctor.js';
|
|
42
|
+
import { createApiServer } from '../../../daemon/api/server.js';
|
|
43
|
+
import { apiSocketPath, crtrHome } from '../../canvas/paths.js';
|
|
44
|
+
import { closeDb } from '../../canvas/db.js';
|
|
40
45
|
// The set of reserved core names discovery must fail closed against. We don't
|
|
41
46
|
// import the real SUBTREE_NAMES (build-root.ts pulls the whole tree); a small
|
|
42
47
|
// explicit set is enough for the collision contract and keeps the test cheap.
|
|
@@ -364,11 +369,11 @@ describe('protocol integration', () => {
|
|
|
364
369
|
// 4b. True end-to-end CLI invocation (argv → parseArgv → adapter → renderer)
|
|
365
370
|
// ---------------------------------------------------------------------------
|
|
366
371
|
describe('end-to-end CLI invocation', () => {
|
|
367
|
-
// dist/cli.js is up 4 from src/core/__tests__/. Requires a prior
|
|
368
|
-
// build` (the harness/CI builds before tests). Drives the WHOLE seam: the
|
|
372
|
+
// dist/cli.js is up 4 from src/core/__tests__/serial/. Requires a prior
|
|
373
|
+
// `npm run build` (the harness/CI builds before tests). Drives the WHOLE seam: the
|
|
369
374
|
// declared positional `app-id` must arrive as `appId` in the request, and
|
|
370
375
|
// the rendered + --json outputs come through the real dispatcher.
|
|
371
|
-
const cli = join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..', 'dist', 'cli.js');
|
|
376
|
+
const cli = join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..', 'dist', 'cli.js');
|
|
372
377
|
const runCrtr = (args) => {
|
|
373
378
|
installPlugin(userRoot, 'deploy-tools');
|
|
374
379
|
resetScopeCache();
|
|
@@ -505,3 +510,88 @@ describe('typed validation issues', () => {
|
|
|
505
510
|
assert.equal(v.contributions[0].node.name, 'app');
|
|
506
511
|
});
|
|
507
512
|
});
|
|
513
|
+
// ---------------------------------------------------------------------------
|
|
514
|
+
// Lifecycle surfaces — the validator's verdict must reach the caller WITHOUT
|
|
515
|
+
// executing the plugin binary, and a cross-plugin top-level collision must not
|
|
516
|
+
// read as a pass on any claimant.
|
|
517
|
+
// ---------------------------------------------------------------------------
|
|
518
|
+
describe('lifecycle surfaces report validation without executing the plugin', () => {
|
|
519
|
+
// Records the fact it ran. No validation surface may ever spawn it.
|
|
520
|
+
const SENTINEL_EXEC = `#!/usr/bin/env node
|
|
521
|
+
const fs = require('fs');
|
|
522
|
+
if (process.env.CMDPLUGIN_SENTINEL) fs.writeFileSync(process.env.CMDPLUGIN_SENTINEL, 'executed');
|
|
523
|
+
process.stdout.write(JSON.stringify({ protocolVersion: 1, ok: true, result: { app_id: 'x', status: 'running' } }));
|
|
524
|
+
`;
|
|
525
|
+
let sentinel;
|
|
526
|
+
let realCwd;
|
|
527
|
+
beforeEach(() => {
|
|
528
|
+
realCwd = process.cwd();
|
|
529
|
+
sentinel = join(emptyStart, 'EXECUTED');
|
|
530
|
+
process.env['CMDPLUGIN_SENTINEL'] = sentinel;
|
|
531
|
+
process.chdir(emptyStart); // no .crouter ancestor → project scope is empty
|
|
532
|
+
resetScopeCache();
|
|
533
|
+
});
|
|
534
|
+
afterEach(() => {
|
|
535
|
+
process.chdir(realCwd);
|
|
536
|
+
delete process.env['CMDPLUGIN_SENTINEL'];
|
|
537
|
+
resetScopeCache();
|
|
538
|
+
});
|
|
539
|
+
function assertNotExecuted() {
|
|
540
|
+
assert.equal(existsSync(sentinel), false, 'a validation surface must never spawn the plugin binary');
|
|
541
|
+
}
|
|
542
|
+
test('pkg plugin show passes the typed issue through and mounts nothing', async () => {
|
|
543
|
+
const broken = commandsJson();
|
|
544
|
+
broken['schemaVersion'] = 2;
|
|
545
|
+
installPlugin(userRoot, 'p', { manifest: broken, exec: SENTINEL_EXEC });
|
|
546
|
+
resetScopeCache();
|
|
547
|
+
const out = await pluginShow.run({ name: 'p' });
|
|
548
|
+
const commands = out['commands'];
|
|
549
|
+
const issue = commands.issues.find((i) => i.code === 'command_schema_version');
|
|
550
|
+
assert.ok(issue, `expected command_schema_version, got ${JSON.stringify(commands.issues.map((i) => i.code))}`);
|
|
551
|
+
assert.ok(typeof issue.received === 'string' && typeof issue.expected === 'string' && typeof issue.next === 'string');
|
|
552
|
+
assert.equal(commands.mounts.length, 0, 'a rejected manifest contributes no mounts');
|
|
553
|
+
assertNotExecuted();
|
|
554
|
+
});
|
|
555
|
+
test('a cross-plugin top-level collision drops the command and fails BOTH claimants on every surface', async () => {
|
|
556
|
+
// Two plugins, each valid in isolation, both claiming `app`.
|
|
557
|
+
installPlugin(userRoot, 'p-one', { exec: SENTINEL_EXEC });
|
|
558
|
+
installPlugin(userRoot, 'p-two', { exec: SENTINEL_EXEC });
|
|
559
|
+
resetScopeCache();
|
|
560
|
+
const snapshot = discoverCommandContributions(new Set(['sys']), emptyStart);
|
|
561
|
+
assert.equal(snapshot.contributions.length, 0, 'a collided top-level command must not be mounted by ANY claimant');
|
|
562
|
+
assert.deepEqual(snapshot.issues.filter((i) => i.code === 'command_collision').map((i) => i.plugin).sort(), ['p-one', 'p-two'], 'both claimants are flagged');
|
|
563
|
+
for (const name of ['p-one', 'p-two']) {
|
|
564
|
+
const out = await pluginShow.run({ name });
|
|
565
|
+
const commands = out['commands'];
|
|
566
|
+
assert.deepEqual(commands.mounts, [], `${name} must not list the collided command as an accepted mount`);
|
|
567
|
+
const issue = commands.issues.find((i) => i.code === 'command_collision');
|
|
568
|
+
assert.ok(issue, `${name} show must carry the command_collision issue`);
|
|
569
|
+
assert.deepEqual(issue.received.split(', ').sort(), ['p-one', 'p-two'], 'the issue names both claimants');
|
|
570
|
+
}
|
|
571
|
+
// `sys doctor` scans live nodes through the daemon API, so it needs a
|
|
572
|
+
// reachable daemon answering with an empty roster (no node is ever created
|
|
573
|
+
// here) rather than trying to autostart a subprocess.
|
|
574
|
+
mkdirSync(crtrHome(), { recursive: true });
|
|
575
|
+
const server = createApiServer();
|
|
576
|
+
try {
|
|
577
|
+
for (let i = 0; i < 200 && !existsSync(apiSocketPath()); i++)
|
|
578
|
+
await new Promise((r) => setTimeout(r, 25));
|
|
579
|
+
assert.equal(existsSync(apiSocketPath()), true, 'api socket never bound');
|
|
580
|
+
const out = await sysDoctorLeaf.run({ scope: 'user', fix: false, remote: false });
|
|
581
|
+
const checks = out['checks'];
|
|
582
|
+
for (const name of ['p-one', 'p-two']) {
|
|
583
|
+
assert.equal(checks.find((k) => k.name === `plugin:${name}:commands` && k.status === 'pass'), undefined, `${name} must not PASS while its command is dropped by a collision`);
|
|
584
|
+
const failCheck = checks.find((k) => k.name.startsWith(`plugin:${name}:commands`) && k.status === 'fail' && /command_collision/.test(k.message));
|
|
585
|
+
assert.ok(failCheck, `${name} must fail with command_collision, got ${JSON.stringify(checks.map((k) => k.name + ':' + k.status))}`);
|
|
586
|
+
assert.match(failCheck.message, /claimed by multiple plugins/);
|
|
587
|
+
assert.equal(failCheck.remediation?.kind, 'human_action', 'command remediation is never auto-applied');
|
|
588
|
+
}
|
|
589
|
+
assert.equal(out['ok'], false);
|
|
590
|
+
}
|
|
591
|
+
finally {
|
|
592
|
+
await server.close();
|
|
593
|
+
closeDb();
|
|
594
|
+
}
|
|
595
|
+
assertNotExecuted();
|
|
596
|
+
});
|
|
597
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Run with:
|
|
1
|
+
// Run with: npm run test:serial
|
|
2
2
|
//
|
|
3
3
|
// REGRESSION LOCK — gh issue #341. `--tier deferred` is documented as the ONE
|
|
4
4
|
// tier that never wakes an idle node ("read on its next natural cycle"), but
|
|
@@ -44,21 +44,21 @@ import { tmpdir } from 'node:os';
|
|
|
44
44
|
import { join } from 'node:path';
|
|
45
45
|
import { spawnSync } from 'node:child_process';
|
|
46
46
|
import { DatabaseSync } from 'node:sqlite';
|
|
47
|
-
import { createNode, deleteNode, getNode, setStatus, withFreshTerminalGuard } from '
|
|
48
|
-
import { hasNoNaturalCycle } from '
|
|
49
|
-
import { canvasDbPath, nodeDir, apiSocketPath } from '
|
|
50
|
-
import { closeDb } from '
|
|
51
|
-
import { createApiServer } from '
|
|
52
|
-
import { CrtrClient } from '
|
|
53
|
-
import { registerNode } from '
|
|
54
|
-
import { pushFinal } from '
|
|
55
|
-
import { InputError } from '
|
|
56
|
-
import { headlessBrokerHost } from '
|
|
57
|
-
import { appendInbox, readInboxSince, readCursor } from '
|
|
58
|
-
import { superviseTick } from '
|
|
59
|
-
import registerCanvasInboxWatcher from '
|
|
60
|
-
import { bindTestFleet } from '
|
|
61
|
-
import { resetFleetForTests } from '
|
|
47
|
+
import { createNode, deleteNode, getNode, setStatus, withFreshTerminalGuard } from '../../canvas/canvas.js';
|
|
48
|
+
import { hasNoNaturalCycle } from '../../runtime/revive-all.js';
|
|
49
|
+
import { canvasDbPath, nodeDir, apiSocketPath } from '../../canvas/paths.js';
|
|
50
|
+
import { closeDb } from '../../canvas/db.js';
|
|
51
|
+
import { createApiServer } from '../../../daemon/api/server.js';
|
|
52
|
+
import { CrtrClient } from '../../../api/index.js';
|
|
53
|
+
import { registerNode } from '../../../commands/node.js';
|
|
54
|
+
import { pushFinal } from '../../feed/feed.js';
|
|
55
|
+
import { InputError } from '../../io.js';
|
|
56
|
+
import { headlessBrokerHost } from '../../runtime/host.js';
|
|
57
|
+
import { appendInbox, readInboxSince, readCursor } from '../../feed/inbox.js';
|
|
58
|
+
import { superviseTick } from '../../../daemon/crtrd.js';
|
|
59
|
+
import registerCanvasInboxWatcher from '../../../pi-extensions/canvas-inbox-watcher.js';
|
|
60
|
+
import { bindTestFleet } from '../helpers/fleet.js';
|
|
61
|
+
import { resetFleetForTests } from '../../runtime/fleet.js';
|
|
62
62
|
let home;
|
|
63
63
|
let server;
|
|
64
64
|
const prevNodeId = process.env['CRTR_NODE_ID'];
|
|
@@ -439,13 +439,16 @@ function makeFakePi() {
|
|
|
439
439
|
on(e, h) { handlers[e] = h; },
|
|
440
440
|
sendUserMessage(content, options) { this.injected.push({ content, deliverAs: options?.deliverAs }); },
|
|
441
441
|
sendMessage() { },
|
|
442
|
-
fire(e, ev, ctx) { handlers[e]?.(ev, ctx); },
|
|
442
|
+
async fire(e, ev, ctx) { await handlers[e]?.(ev, ctx); },
|
|
443
443
|
};
|
|
444
444
|
}
|
|
445
445
|
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
446
446
|
test('the real inbox watcher holds a deferred entry alone, then delivers it TOGETHER with a later normal entry with no duplicate/loss, and the durable cursor settles past both (gh #341 review: genuine delivery, not just the daemon decision)', { timeout: 30_000 }, async () => {
|
|
447
447
|
const id = 'watcherDeferredThenNormal';
|
|
448
|
-
|
|
448
|
+
// The watcher may advance its cursor only for the current broker generation.
|
|
449
|
+
// This fake Pi runs in this test process, so its fabricated node must carry
|
|
450
|
+
// that process as the active broker just like a real launched node does.
|
|
451
|
+
createNode(node(id, { status: 'idle', intent: null, pi_pid: process.pid }));
|
|
449
452
|
const TICK_MS = 20;
|
|
450
453
|
const DEBOUNCE_MS = 25;
|
|
451
454
|
const SETTLE_MS = TICK_MS * 2 + DEBOUNCE_MS + 30;
|
|
@@ -462,7 +465,7 @@ test('the real inbox watcher holds a deferred entry alone, then delivers it TOGE
|
|
|
462
465
|
// session_start is the real lifecycle gate that arms the watcher's poll
|
|
463
466
|
// interval and initial tick (see canvas-inbox-watcher.ts) — registration
|
|
464
467
|
// alone only wires up handlers.
|
|
465
|
-
pi.fire('session_start', { type: 'session_start' }, undefined);
|
|
468
|
+
await pi.fire('session_start', { type: 'session_start' }, undefined);
|
|
466
469
|
// No agent_start fired — the watcher treats the node as idle, same as the
|
|
467
470
|
// idle-released daemon scenario above.
|
|
468
471
|
await wait(TICK_MS + 60);
|
|
@@ -492,7 +495,7 @@ test('the real inbox watcher holds a deferred entry alone, then delivers it TOGE
|
|
|
492
495
|
// durable cursor at agent_settled (never on the fire-and-forget send
|
|
493
496
|
// itself) — settle the turn and prove the cursor lands past BOTH delivered
|
|
494
497
|
// entries, not just the earlier (previously-held) one.
|
|
495
|
-
pi.fire('agent_settled', { type: 'agent_settled' }, { isIdle: () => true, hasPendingMessages: () => false });
|
|
498
|
+
await pi.fire('agent_settled', { type: 'agent_settled' }, { isIdle: () => true, hasPendingMessages: () => false });
|
|
496
499
|
assert.equal(readCursor(id), normalEntry.entry_id, 'the durable cursor settles past BOTH delivered entries, at the final physical entry');
|
|
497
500
|
assert.notEqual(readCursor(id), deferredEntry.entry_id, 'not a partial commit stuck at the earlier entry');
|
|
498
501
|
}
|
package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Run with:
|
|
1
|
+
// Run with: npm run test:serial
|
|
2
2
|
//
|
|
3
3
|
// HEADLESS RETARGET (foundation-spec §C.9 + §E). The flagship end-to-end
|
|
4
4
|
// lifecycle scenario, driven entirely at the MODEL layer against FABRICATED
|
|
@@ -54,12 +54,12 @@
|
|
|
54
54
|
import { test } from 'node:test';
|
|
55
55
|
import assert from 'node:assert/strict';
|
|
56
56
|
import { spawnSync } from 'node:child_process';
|
|
57
|
-
import { createHeadlessHarness } from '
|
|
58
|
-
import { subscribe } from '
|
|
59
|
-
import { transition } from '
|
|
60
|
-
import { pushFinal } from '
|
|
61
|
-
import { evaluateStop, STALL_REPROMPT } from '
|
|
62
|
-
import { personaDrift, commitPersonaAck } from '
|
|
57
|
+
import { createHeadlessHarness } from '../helpers/harness.js';
|
|
58
|
+
import { subscribe } from '../../canvas/canvas.js';
|
|
59
|
+
import { transition } from '../../runtime/lifecycle.js';
|
|
60
|
+
import { pushFinal } from '../../feed/feed.js';
|
|
61
|
+
import { evaluateStop, STALL_REPROMPT } from '../../runtime/stop-guard.js';
|
|
62
|
+
import { personaDrift, commitPersonaAck } from '../../runtime/persona.js';
|
|
63
63
|
// A pid reaped (dead) by the time spawnSync returns — a released broker's exited
|
|
64
64
|
// process (the headless analog of a closed pane).
|
|
65
65
|
function deadPid() {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Run with:
|
|
1
|
+
// Run with: npm run test:serial
|
|
2
2
|
//
|
|
3
3
|
// Regression cover for crouton-labs/crouter#98: a canceled/wedged child node
|
|
4
4
|
// ORPHANS its subprocess tree (bash → test runner → spawned app) because
|
|
@@ -65,11 +65,11 @@ import { spawn } from 'node:child_process';
|
|
|
65
65
|
import { mkdtempSync, readFileSync, rmSync } from 'node:fs';
|
|
66
66
|
import { tmpdir } from 'node:os';
|
|
67
67
|
import { join } from 'node:path';
|
|
68
|
-
import { createHarness } from '
|
|
69
|
-
import { isPidAlive, capturePidIdentities, killProcessTreePids, captureTeardownSnapshot } from '
|
|
70
|
-
import { recordPid } from '
|
|
71
|
-
import { openDb } from '
|
|
72
|
-
import { headlessBrokerHost } from '
|
|
68
|
+
import { createHarness } from '../helpers/harness.js';
|
|
69
|
+
import { isPidAlive, capturePidIdentities, killProcessTreePids, captureTeardownSnapshot } from '../../canvas/pid.js';
|
|
70
|
+
import { recordPid } from '../../canvas/canvas.js';
|
|
71
|
+
import { openDb } from '../../canvas/db.js';
|
|
72
|
+
import { headlessBrokerHost } from '../../runtime/host.js';
|
|
73
73
|
let h;
|
|
74
74
|
let root;
|
|
75
75
|
let scratch;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Run with:
|
|
1
|
+
// Run with: npm run test:serial
|
|
2
2
|
//
|
|
3
3
|
// Drive a terminal ticket through the public crtrd ticket route. Terminal
|
|
4
4
|
// delivery is daemon-owned; no subprocess handler or delivery receipt exists.
|
|
@@ -7,17 +7,17 @@ import assert from 'node:assert/strict';
|
|
|
7
7
|
import { mkdtempSync, existsSync, writeFileSync } from 'node:fs';
|
|
8
8
|
import { tmpdir } from 'node:os';
|
|
9
9
|
import { join } from 'node:path';
|
|
10
|
-
import { ApiError, CrtrClient } from '
|
|
11
|
-
import { createApiServer } from '
|
|
12
|
-
import { apiSocketPath } from '
|
|
13
|
-
import { validateDeck } from '
|
|
14
|
-
import { claimTicket, readTicketClaim } from '
|
|
15
|
-
import { ticketDir } from '
|
|
16
|
-
import { submitDeck, submitReview } from '
|
|
17
|
-
import { spawnNode } from '
|
|
18
|
-
import { getNode, closeDb } from '
|
|
19
|
-
import { readInboxSince } from '
|
|
20
|
-
import { resolveRef } from '
|
|
10
|
+
import { ApiError, CrtrClient } from '../../../api/index.js';
|
|
11
|
+
import { createApiServer } from '../../../daemon/api/server.js';
|
|
12
|
+
import { apiSocketPath } from '../../canvas/paths.js';
|
|
13
|
+
import { validateDeck } from '../../human/deck-schema.js';
|
|
14
|
+
import { claimTicket, readTicketClaim } from '../../human/claim.js';
|
|
15
|
+
import { ticketDir } from '../../human/root.js';
|
|
16
|
+
import { submitDeck, submitReview } from '../../human/tickets.js';
|
|
17
|
+
import { spawnNode } from '../../runtime/nodes.js';
|
|
18
|
+
import { getNode, closeDb } from '../../canvas/index.js';
|
|
19
|
+
import { readInboxSince } from '../../feed/inbox.js';
|
|
20
|
+
import { resolveRef } from '../../canvas/history.js';
|
|
21
21
|
let home;
|
|
22
22
|
let priorHome;
|
|
23
23
|
let server;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Run with:
|
|
1
|
+
// Run with: npm run test:serial
|
|
2
2
|
//
|
|
3
3
|
// HEADLESS RETARGET (foundation-spec §C.12 + §E). AXIS: LIVE MUTATION of the
|
|
4
4
|
// 2×2 state vector (mode {base,orchestrator} × lifecycle {terminal,resident})
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
// base→orchestrator after promote, then clears on commit').
|
|
41
41
|
import { test } from 'node:test';
|
|
42
42
|
import assert from 'node:assert/strict';
|
|
43
|
-
import { createHeadlessHarness } from '
|
|
44
|
-
import { subscribe } from '
|
|
45
|
-
import { commitPersonaAck, personaDrift } from '
|
|
46
|
-
import { evaluateStop } from '
|
|
43
|
+
import { createHeadlessHarness } from '../helpers/harness.js';
|
|
44
|
+
import { subscribe } from '../../canvas/canvas.js';
|
|
45
|
+
import { commitPersonaAck, personaDrift } from '../../runtime/persona.js';
|
|
46
|
+
import { evaluateStop } from '../../runtime/stop-guard.js';
|
|
47
47
|
/** Normalize the two persona axes off a NodeMeta for deepEqual. */
|
|
48
48
|
function persona(m) {
|
|
49
49
|
return { mode: m.mode, lifecycle: m.lifecycle };
|
package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Run with:
|
|
1
|
+
// Run with: npm run test:serial
|
|
2
2
|
//
|
|
3
3
|
// BUG-REGRESSION (broker-universal-host cut, design §H refresh-authority; U7
|
|
4
4
|
// report mq8gq8we-4cadd8e6; stuck-refresh, parent mq7s5o93). A `node yield` /
|
|
@@ -21,9 +21,10 @@
|
|
|
21
21
|
import { test } from 'node:test';
|
|
22
22
|
import assert from 'node:assert/strict';
|
|
23
23
|
import { spawn } from 'node:child_process';
|
|
24
|
-
import { createHeadlessHarness } from '
|
|
25
|
-
import { recordPid } from '
|
|
26
|
-
import {
|
|
24
|
+
import { createHeadlessHarness } from '../helpers/harness.js';
|
|
25
|
+
import { recordPid } from '../../canvas/canvas.js';
|
|
26
|
+
import { isPidAlive } from '../../canvas/pid.js';
|
|
27
|
+
import { yieldStallVerdict, YIELD_STALL_GRACE_MS } from '../../../daemon/reconcilers/broker-supervision.js';
|
|
27
28
|
// ---------------------------------------------------------------------------
|
|
28
29
|
// D4a — the pure refresh-stall truth table.
|
|
29
30
|
// ---------------------------------------------------------------------------
|
|
@@ -31,18 +32,8 @@ test('D4a yieldStallVerdict: kill ONLY a live, not-busy, refresh engine past the
|
|
|
31
32
|
const G = YIELD_STALL_GRACE_MS;
|
|
32
33
|
// The one 'kill' case: engine alive, intent=refresh, turn over (not busy), past grace.
|
|
33
34
|
assert.equal(yieldStallVerdict(true, 'refresh', false, G), 'kill', 'alive+refresh+!busy+>=grace → kill');
|
|
34
|
-
assert.equal(yieldStallVerdict(true, 'refresh', false, G + 60_000), 'kill', 'well past grace → kill');
|
|
35
|
-
// Within the grace → pending (the healthy stophook window).
|
|
36
|
-
assert.equal(yieldStallVerdict(true, 'refresh', false, null), 'pending', 'first observation → pending');
|
|
37
|
-
assert.equal(yieldStallVerdict(true, 'refresh', false, G - 1), 'pending', 'within grace → pending');
|
|
38
35
|
// A working engine is NEVER killed, even past the grace.
|
|
39
36
|
assert.equal(yieldStallVerdict(true, 'refresh', true, G + 60_000), 'leave', 'busy (mid-turn) → leave');
|
|
40
|
-
// Not a refresh → not our concern.
|
|
41
|
-
assert.equal(yieldStallVerdict(true, 'idle-release', false, G + 60_000), 'leave', 'intent≠refresh → leave');
|
|
42
|
-
assert.equal(yieldStallVerdict(true, null, false, G + 60_000), 'leave', 'no pending intent → leave');
|
|
43
|
-
// A dead/unknown engine is the exit-policy job's concern, not this live-fleet check.
|
|
44
|
-
assert.equal(yieldStallVerdict(false, 'refresh', false, G + 60_000), 'leave', 'dead engine → leave (exit policy owns it)');
|
|
45
|
-
assert.equal(yieldStallVerdict(null, 'refresh', false, G + 60_000), 'leave', 'unknown pid → leave');
|
|
46
37
|
});
|
|
47
38
|
// ---------------------------------------------------------------------------
|
|
48
39
|
// D4b — daemon integration: a stuck refresh on a LIVE engine is force-recycled.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Run with:
|
|
1
|
+
// Run with: npm run test:serial
|
|
2
2
|
//
|
|
3
3
|
// HEADLESS RETARGET (foundation-spec §C.13 + §E). Covers the session-picker fix
|
|
4
4
|
// (resume by ABSOLUTE session-file path, cwd-immune) and the double-revive guard
|
|
@@ -30,24 +30,21 @@ import { test, before, after, beforeEach } from 'node:test';
|
|
|
30
30
|
import assert from 'node:assert/strict';
|
|
31
31
|
import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
32
32
|
import { tmpdir } from 'node:os';
|
|
33
|
-
import { join
|
|
34
|
-
import { fileURLToPath } from 'node:url';
|
|
33
|
+
import { join } from 'node:path';
|
|
35
34
|
import { spawn, spawnSync } from 'node:child_process';
|
|
36
|
-
import { createNode, getNode, subscribe, updateNode } from '
|
|
37
|
-
import { armCron, hasPendingCancelOnWakeCron } from '
|
|
38
|
-
import { readInboxSince } from '
|
|
39
|
-
import { closeDb } from '
|
|
40
|
-
import { buildPiArgv
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
47
|
-
import {
|
|
48
|
-
import {
|
|
49
|
-
import { resetFleetForTests } from '../runtime/fleet.js';
|
|
50
|
-
const EXTRA_EXTENSION_PATH = join(dirname(fileURLToPath(import.meta.url)), '..', 'fixtures', 'extra-extension.ts');
|
|
35
|
+
import { createNode, getNode, subscribe, updateNode } from '../../canvas/canvas.js';
|
|
36
|
+
import { armCron, hasPendingCancelOnWakeCron } from '../../canvas/crons.js';
|
|
37
|
+
import { readInboxSince } from '../../feed/inbox.js';
|
|
38
|
+
import { closeDb } from '../../canvas/db.js';
|
|
39
|
+
import { buildPiArgv } from '../../runtime/launch.js';
|
|
40
|
+
import { headlessBrokerHost } from '../../runtime/host.js';
|
|
41
|
+
import { resumeArgs, reviveNode } from '../../runtime/revive.js';
|
|
42
|
+
import { REVIVE_KICKOFF_SENTINEL, readGoal, writeGoal } from '../../runtime/kickoff.js';
|
|
43
|
+
import { seedRoadmap } from '../../runtime/roadmap.js';
|
|
44
|
+
import { InputError } from '../../io.js';
|
|
45
|
+
import { createHarness } from '../helpers/harness.js';
|
|
46
|
+
import { bindTestFleet } from '../helpers/fleet.js';
|
|
47
|
+
import { resetFleetForTests } from '../../runtime/fleet.js';
|
|
51
48
|
let home;
|
|
52
49
|
function node(id, over = {}) {
|
|
53
50
|
return {
|
|
@@ -163,88 +160,6 @@ test('buildPiArgv passes no --session on a fresh (no-resume) launch', () => {
|
|
|
163
160
|
assert.ok(!argv.includes('--session'), 'a fresh launch never resumes');
|
|
164
161
|
assert.ok(argv.includes('go'), 'the kickoff prompt is the last positional');
|
|
165
162
|
});
|
|
166
|
-
test('buildPiArgv restores mandatory canvas extensions when persisted launch metadata is empty', () => {
|
|
167
|
-
const m = node('n', {
|
|
168
|
-
launch: {
|
|
169
|
-
model: 'openai/sonnet',
|
|
170
|
-
tools: [],
|
|
171
|
-
extensions: [],
|
|
172
|
-
systemPrompt: 'historical replay',
|
|
173
|
-
env: {},
|
|
174
|
-
},
|
|
175
|
-
});
|
|
176
|
-
const { argv } = buildPiArgv(m, { prompt: 'go' });
|
|
177
|
-
const seen = new Map();
|
|
178
|
-
const extensions = [];
|
|
179
|
-
for (let i = 0; i < argv.length; i++) {
|
|
180
|
-
if (argv[i] === '-e') {
|
|
181
|
-
const next = argv[i + 1];
|
|
182
|
-
if (typeof next === 'string') {
|
|
183
|
-
seen.set(next, (seen.get(next) ?? 0) + 1);
|
|
184
|
-
extensions.push(next);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
const required = new Set(CANVAS_EXTENSIONS);
|
|
189
|
-
const mandatory = [];
|
|
190
|
-
for (const ext of CANVAS_EXTENSIONS) {
|
|
191
|
-
mandatory.push(ext);
|
|
192
|
-
assert.equal(seen.get(ext), 1, `mandatory extension present exactly once: ${ext}`);
|
|
193
|
-
}
|
|
194
|
-
assert.deepEqual(extensions.slice(0, required.size), mandatory, 'mandatory extensions are loaded first and once');
|
|
195
|
-
assert.equal(extensions.indexOf(CANVAS_STOPHOOK_PATH), extensions.indexOf(CANVAS_REVIEW_BOUNDARY_PATH) + 1, 'review boundary runs immediately before the stophook commits a companion bind');
|
|
196
|
-
assert.ok(extensions.indexOf(CANVAS_CONTEXT_INTRO_PATH) > extensions.indexOf(CANVAS_REVIEW_BOUNDARY_PATH), 'review boundary still precedes fork bearings');
|
|
197
|
-
});
|
|
198
|
-
test('buildPiArgv replaces the previous mandatory prefix with the current canvas hooks', () => {
|
|
199
|
-
const historicalNames = [
|
|
200
|
-
'canvas-inbox-watcher', 'canvas-stophook', 'canvas-recap',
|
|
201
|
-
'canvas-goal-capture', 'canvas-passive-context', 'canvas-context-intro',
|
|
202
|
-
'canvas-doc-substrate', 'canvas-structured-output', 'canvas-bash-valve',
|
|
203
|
-
];
|
|
204
|
-
const m = node('n', {
|
|
205
|
-
launch: {
|
|
206
|
-
model: 'openai/sonnet',
|
|
207
|
-
tools: [],
|
|
208
|
-
extensions: [
|
|
209
|
-
...historicalNames.map((name) => `/old-generation/pi-extensions/${name}.js`),
|
|
210
|
-
EXTRA_EXTENSION_PATH,
|
|
211
|
-
],
|
|
212
|
-
systemPrompt: 'historical extension order',
|
|
213
|
-
env: {},
|
|
214
|
-
},
|
|
215
|
-
});
|
|
216
|
-
const { argv } = buildPiArgv(m, { prompt: 'go' });
|
|
217
|
-
const extensions = argv.flatMap((arg, index) => arg === '-e' && typeof argv[index + 1] === 'string' ? [argv[index + 1]] : []);
|
|
218
|
-
assert.deepEqual(extensions, [...CANVAS_EXTENSIONS, EXTRA_EXTENSION_PATH]);
|
|
219
|
-
assert.equal(extensions.some((path) => path.startsWith('/old-generation/')), false);
|
|
220
|
-
});
|
|
221
|
-
test('buildPiArgv preserves user extensions while deduplicating mandatory hooks', () => {
|
|
222
|
-
const m = node('n', {
|
|
223
|
-
launch: {
|
|
224
|
-
model: 'openai/sonnet',
|
|
225
|
-
tools: [],
|
|
226
|
-
extensions: [EXTRA_EXTENSION_PATH, CANVAS_INBOX_WATCHER_PATH],
|
|
227
|
-
systemPrompt: 'user extras replay',
|
|
228
|
-
env: {},
|
|
229
|
-
},
|
|
230
|
-
});
|
|
231
|
-
const { argv } = buildPiArgv(m, { prompt: 'go' });
|
|
232
|
-
const extensions = [];
|
|
233
|
-
for (let i = 0; i < argv.length; i++) {
|
|
234
|
-
if (argv[i] === '-e') {
|
|
235
|
-
const next = argv[i + 1];
|
|
236
|
-
if (typeof next === 'string')
|
|
237
|
-
extensions.push(next);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
const mandatoryCount = CANVAS_EXTENSIONS.length;
|
|
241
|
-
assert.equal(extensions.slice(0, mandatoryCount).length, CANVAS_EXTENSIONS.length, 'mandatory extensions are still the boot prefix');
|
|
242
|
-
for (let i = 0; i < CANVAS_EXTENSIONS.length; i++) {
|
|
243
|
-
assert.equal(extensions[i], CANVAS_EXTENSIONS[i], `mandatory extension ${i} remains in order`);
|
|
244
|
-
}
|
|
245
|
-
assert.equal(extensions.includes(EXTRA_EXTENSION_PATH), true, 'custom extension preserved');
|
|
246
|
-
assert.equal(extensions.filter((ext) => ext === CANVAS_INBOX_WATCHER_PATH).length, 1, 'mandatory inbox watcher is deduplicated against user list');
|
|
247
|
-
});
|
|
248
163
|
// ---------------------------------------------------------------------------
|
|
249
164
|
// buildPiArgv — the resumed argv replays the persisted launch spec faithfully
|
|
250
165
|
// (kind/mode/lifecycle come back as the node's *current* self).
|
|
@@ -3,19 +3,20 @@
|
|
|
3
3
|
// only — no subscription wires back to the spawner.
|
|
4
4
|
import { test, before, after, beforeEach } from 'node:test';
|
|
5
5
|
import assert from 'node:assert/strict';
|
|
6
|
-
import { mkdtempSync, rmSync, existsSync
|
|
6
|
+
import { mkdtempSync, rmSync, existsSync } from 'node:fs';
|
|
7
7
|
import { tmpdir } from 'node:os';
|
|
8
8
|
import { join } from 'node:path';
|
|
9
9
|
import { createServer } from 'node:net';
|
|
10
10
|
import { spawn as spawnProcess } from 'node:child_process';
|
|
11
|
-
import { createNode, getNode, getRow, subscribersOf } from '
|
|
12
|
-
import { closeDb } from '
|
|
13
|
-
import { nodeDir } from '
|
|
14
|
-
import { spawnNode } from '
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
11
|
+
import { createNode, getNode, getRow, subscribersOf } from '../../canvas/canvas.js';
|
|
12
|
+
import { closeDb } from '../../canvas/db.js';
|
|
13
|
+
import { nodeDir } from '../../canvas/paths.js';
|
|
14
|
+
import { spawnNode } from '../../runtime/nodes.js';
|
|
15
|
+
import { readGoal } from '../../runtime/kickoff.js';
|
|
16
|
+
import { spawnChild, resolveSpawner } from '../../runtime/spawn.js';
|
|
17
|
+
import { headlessBrokerHost } from '../../runtime/host.js';
|
|
18
|
+
import { recordFault } from '../../runtime/fault.js';
|
|
19
|
+
import { ROOT_PROFILE_ID } from '../../profiles/manifest.js';
|
|
19
20
|
let home;
|
|
20
21
|
function spawner(id) {
|
|
21
22
|
return {
|
|
@@ -175,12 +176,28 @@ test('spawnChild: a root from a shell gets the stable root profile id', async ()
|
|
|
175
176
|
rmSync(localCwd, { recursive: true, force: true });
|
|
176
177
|
}
|
|
177
178
|
});
|
|
178
|
-
test('
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
179
|
+
test('a no-kickoff root persists no goal and still comes up active', async () => {
|
|
180
|
+
// The `node new --root --no-kickoff` path: an empty prompt reaches
|
|
181
|
+
// buildPiArgv as `undefined`-equivalent, so the broker comes up idle and
|
|
182
|
+
// goal-less, ready for a real first prompt.
|
|
183
|
+
const originalLaunch = headlessBrokerHost.launch;
|
|
184
|
+
const localCwd = mkdtempSync(join(tmpdir(), 'crtr-no-kickoff-cwd-'));
|
|
185
|
+
let broker;
|
|
186
|
+
try {
|
|
187
|
+
headlessBrokerHost.launch = (nodeId, _inv, _opts) => {
|
|
188
|
+
broker = createServer();
|
|
189
|
+
broker.listen(join(nodeDir(nodeId), 'view.sock'));
|
|
190
|
+
return { pid: process.pid, exited: new Promise(() => { }) };
|
|
191
|
+
};
|
|
192
|
+
const result = await spawnChild({ kind: 'general', cwd: localCwd, root: true, readiness: 'await', prompt: '' });
|
|
193
|
+
assert.equal(readGoal(result.node.node_id), null, 'no goal file was written for an empty (no-kickoff) prompt');
|
|
194
|
+
assert.equal(getNode(result.node.node_id)?.status, 'active', 'the node still comes up active, ready for a real first prompt');
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
headlessBrokerHost.launch = originalLaunch;
|
|
198
|
+
await new Promise((resolve) => broker?.close(() => resolve()) ?? resolve());
|
|
199
|
+
rmSync(localCwd, { recursive: true, force: true });
|
|
200
|
+
}
|
|
184
201
|
});
|
|
185
202
|
test('root readiness is explicit: direct creation awaits its listener; deferred births launch immediately', async () => {
|
|
186
203
|
const originalLaunch = headlessBrokerHost.launch;
|