@north-light/crouter 0.3.173 → 0.3.174
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +198 -0
- package/dist/commands/node/create.d.ts +23 -0
- package/dist/commands/node/create.js +207 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +302 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +415 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +164 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +82 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +159 -0
- package/dist/commands/node-lifecycle-revive.js +10 -57
- package/dist/commands/node.d.ts +0 -42
- package/dist/commands/node.js +11 -2065
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +67 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +46 -0
- package/dist/commands/surface/node/placement.js +124 -0
- package/dist/commands/surface-node.js +4 -1
- package/dist/commands/surface-reload.js +1 -2
- package/dist/commands/surface-tmux-spread.js +1 -1
- package/dist/commands/surface.js +5 -20
- package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
- package/dist/commands/sys/config.js +6 -6
- package/dist/commands/sys/logs.js +1 -1
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
- package/dist/commands/sys/panels/keys-panel.js +60 -0
- package/dist/commands/sys/panels/models-panel.d.ts +77 -0
- package/dist/commands/sys/panels/models-panel.js +647 -0
- package/dist/commands/sys/panels/panel.d.ts +45 -0
- package/dist/commands/sys/panels/panel.js +137 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +80 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
- package/dist/commands/sys/panels/prefs-panel.js +85 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
- package/dist/commands/sys/panels/provider-panel.js +538 -0
- package/dist/commands/sys/settings-shell.d.ts +55 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +31 -0
- package/dist/commands/sys/setup-core.d.ts +3 -33
- package/dist/commands/sys/setup-core.js +27 -78
- package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
- package/dist/commands/sys/setup-settings-runner.js +63 -0
- package/dist/commands/sys/setup-wizard.d.ts +26 -125
- package/dist/commands/sys/setup-wizard.js +209 -2473
- package/dist/commands/sys/setup.js +5 -7
- package/dist/commands/sys.js +3 -2
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
- package/dist/core/__tests__/broker-preflight.test.js +1 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
- package/dist/core/__tests__/canvas.test.js +2 -36
- package/dist/core/__tests__/close.test.js +14 -3
- package/dist/core/__tests__/context-intro.test.js +32 -143
- package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
- package/dist/core/__tests__/daemon-boot.test.js +2 -20
- package/dist/core/__tests__/daemon-wedge.test.js +1 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +4 -98
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
- package/dist/core/__tests__/helpers/broker-clients.js +0 -14
- package/dist/core/__tests__/helpers/harness.d.ts +0 -8
- package/dist/core/__tests__/helpers/harness.js +7 -87
- package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
- package/dist/core/__tests__/kickoff.test.js +1 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
- package/dist/core/__tests__/migration.test.js +35 -48
- package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
- package/dist/core/__tests__/passive-subscription.test.js +26 -49
- package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
- package/dist/core/__tests__/prune.test.js +94 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -32
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
- package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
- package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
- package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
- package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
- package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
- package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
- package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
- package/dist/core/__tests__/secrets.test.js +1 -7
- package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
- package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
- package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
- package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
- package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
- package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
- package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
- package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
- package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
- package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
- package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
- package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
- package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
- package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
- package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
- package/dist/core/__tests__/session-model.test.js +0 -18
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
- package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
- package/dist/core/broker-client/client.d.ts +2 -2
- package/dist/core/broker-client/client.js +4 -7
- package/dist/core/broker-client/transport-relay.d.ts +13 -19
- package/dist/core/broker-client/transport-relay.js +19 -34
- package/dist/core/broker-client/transport-socket.d.ts +2 -2
- package/dist/core/broker-client/transport-socket.js +9 -2
- package/dist/core/broker-client/transport.d.ts +7 -3
- package/dist/core/broker-client/transport.js +4 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -18
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
- package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
- package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
- package/dist/core/canvas/browse/app.d.ts +2 -17
- package/dist/core/canvas/browse/app.js +16 -88
- package/dist/core/canvas/browse/model.d.ts +0 -4
- package/dist/core/canvas/browse/model.js +1 -12
- package/dist/core/canvas/browse/render.js +6 -3
- package/dist/core/canvas/crons.d.ts +8 -5
- package/dist/core/canvas/crons.js +7 -6
- package/dist/core/canvas/extensions.d.ts +7 -3
- package/dist/core/canvas/extensions.js +16 -4
- package/dist/core/canvas/nav-model.d.ts +0 -4
- package/dist/core/canvas/nav-model.js +2 -14
- package/dist/core/canvas/node-order.d.ts +3 -0
- package/dist/core/canvas/node-order.js +12 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
- package/dist/core/canvas/remote-canvas-source.js +8 -15
- package/dist/core/command.js +11 -4
- package/dist/core/config.js +3 -1
- package/dist/core/events/envelope.js +1 -1
- package/dist/core/events/read.js +7 -21
- package/dist/core/events/source.d.ts +0 -2
- package/dist/core/events/source.js +0 -16
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/fault-classifier.d.ts +1 -1
- package/dist/core/feed/passive.d.ts +0 -11
- package/dist/core/feed/passive.js +1 -62
- package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
- package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
- package/dist/core/keybindings/background-bash.js +3 -4
- package/dist/core/keybindings/catalog.js +1 -1
- package/dist/core/memory/inline-ref-grammar.js +3 -3
- package/dist/core/memory-resolver.d.ts +11 -25
- package/dist/core/memory-resolver.js +51 -33
- package/dist/core/model-routes.d.ts +15 -0
- package/dist/core/model-routes.js +12 -0
- package/dist/core/pool-credential-store.js +1 -1
- package/dist/core/preview-registry.js +8 -9
- package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
- package/dist/core/review/realize.d.ts +0 -13
- package/dist/core/review/realize.js +0 -40
- package/dist/core/review/types.d.ts +1 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
- package/dist/core/runtime/bearings.js +1 -11
- package/dist/core/runtime/broker/client-registry.d.ts +33 -0
- package/dist/core/runtime/broker/client-registry.js +164 -0
- package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
- package/dist/core/runtime/broker/daemon-ops.js +49 -0
- package/dist/core/runtime/broker/event-projection.d.ts +42 -0
- package/dist/core/runtime/broker/event-projection.js +178 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
- package/dist/core/runtime/broker/fault-retry.js +277 -0
- package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
- package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
- package/dist/core/runtime/broker/inbox.d.ts +22 -0
- package/dist/core/runtime/broker/inbox.js +167 -0
- package/dist/core/runtime/broker/passive.d.ts +16 -0
- package/dist/core/runtime/broker/passive.js +44 -0
- package/dist/core/runtime/broker/read-ops.d.ts +23 -0
- package/dist/core/runtime/broker/read-ops.js +150 -0
- package/dist/core/runtime/broker/rebind.d.ts +74 -0
- package/dist/core/runtime/broker/rebind.js +211 -0
- package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
- package/dist/core/runtime/broker/tool-groups.js +244 -0
- package/dist/core/runtime/broker-extension-render.d.ts +11 -0
- package/dist/core/runtime/broker-extension-render.js +181 -0
- package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
- package/dist/core/runtime/broker-persona-guidance.js +58 -0
- package/dist/core/runtime/broker-protocol.d.ts +1 -1
- package/dist/core/runtime/broker-protocol.js +1 -1
- package/dist/core/runtime/broker.d.ts +5 -196
- package/dist/core/runtime/broker.js +276 -3059
- package/dist/core/runtime/canvas-extensions.js +11 -2
- package/dist/core/runtime/fault.js +1 -1
- package/dist/core/runtime/model-selection.d.ts +9 -0
- package/dist/core/runtime/model-selection.js +12 -0
- package/dist/core/runtime/model-swap.d.ts +3 -3
- package/dist/core/runtime/model-swap.js +33 -25
- package/dist/core/runtime/placement-tmux.d.ts +3 -14
- package/dist/core/runtime/placement-tmux.js +11 -80
- package/dist/core/runtime/placement.d.ts +4 -2
- package/dist/core/runtime/placement.js +7 -12
- package/dist/core/runtime/promote.d.ts +14 -1
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +8 -0
- package/dist/core/runtime/spawn.js +36 -6
- package/dist/core/runtime/stop-guard.d.ts +4 -3
- package/dist/core/runtime/stop-guard.js +36 -18
- package/dist/core/runtime/stop-signals.d.ts +4 -1
- package/dist/core/runtime/stream-watchdog.js +4 -5
- package/dist/core/runtime/structured-output.d.ts +15 -2
- package/dist/core/runtime/structured-output.js +35 -12
- package/dist/core/runtime/tmux-bindings.d.ts +25 -0
- package/dist/core/runtime/tmux-bindings.js +682 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -1
- package/dist/core/runtime/tmux-chrome.js +3 -2
- package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
- package/dist/core/runtime/tmux-driver.js +598 -0
- package/dist/core/runtime/view-socket.d.ts +14 -0
- package/dist/core/runtime/view-socket.js +83 -0
- package/dist/core/session-model/session-state.d.ts +1 -2
- package/dist/core/session-model/session-state.js +5 -8
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +2 -2
- package/dist/core/substrate/gate.d.ts +1 -1
- package/dist/core/substrate/on-read-pure.d.ts +7 -0
- package/dist/core/substrate/on-read-pure.js +272 -0
- package/dist/core/termrender/termrender.js +32 -2
- package/dist/core/user-settings.d.ts +23 -1
- package/dist/core/user-settings.js +18 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
- package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
- package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
- package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
- package/dist/daemon/api/bridge.js +40 -81
- package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
- package/dist/daemon/api/handlers/broker-ops.js +383 -0
- package/dist/daemon/api/handlers/crons.js +9 -4
- package/dist/daemon/api/handlers/files.js +6 -7
- package/dist/daemon/api/handlers/inbox.js +2 -340
- package/dist/daemon/api/handlers/nodes.d.ts +10 -1
- package/dist/daemon/api/handlers/nodes.js +74 -39
- package/dist/daemon/api/handlers/review-comments.js +5 -1
- package/dist/daemon/api/handlers/reviews.js +0 -19
- package/dist/daemon/api/map.js +25 -4
- package/dist/daemon/api/router.js +2 -3
- package/dist/daemon/api/server.js +5 -7
- package/dist/daemon/cron-run.d.ts +4 -0
- package/dist/daemon/cron-run.js +30 -13
- package/dist/daemon/crtrd.d.ts +3 -58
- package/dist/daemon/crtrd.js +28 -1244
- package/dist/daemon/manage.js +0 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
- package/dist/daemon/reconcilers/broker-supervision.js +549 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
- package/dist/daemon/reconcilers/cron-lane.js +32 -0
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
- package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
- package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
- package/dist/daemon/review/finish.js +2 -5
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
- package/dist/pi-extensions/broker-local.d.ts +20 -0
- package/dist/pi-extensions/broker-local.js +89 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
- package/dist/pi-extensions/canvas-context-intro.js +22 -11
- package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
- package/dist/pi-extensions/canvas-goal-capture.js +7 -12
- package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
- package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
- package/dist/pi-extensions/canvas-passive-context.js +22 -18
- package/dist/pi-extensions/canvas-recap.d.ts +2 -2
- package/dist/pi-extensions/canvas-recap.js +48 -21
- package/dist/pi-extensions/canvas-review-boundary.js +10 -4
- package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
- package/dist/pi-extensions/canvas-stophook.js +149 -431
- package/dist/pi-extensions/canvas-structured-output.js +52 -30
- package/dist/pi-extensions/envelope-merge.d.ts +13 -0
- package/dist/pi-extensions/envelope-merge.js +29 -0
- package/dist/shared/working-activity.d.ts +3 -2
- package/dist/shared/working-activity.js +3 -2
- package/dist/types.d.ts +6 -5
- package/dist/types.js +2 -2
- package/docs/compat/hearth-crtr-v1.md +4 -12
- package/docs/compat/hearth-crtr-v2.md +3 -11
- package/docs/compat/hearth-crtr-v3.md +4 -12
- package/docs/compat/hearth-crtr-v4.md +3 -11
- package/docs/compat/hearth-crtr-v5.md +3 -11
- package/docs/public-api.md +3 -7
- package/package.json +7 -49
- package/runtime.lock.json +2766 -14533
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
- package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
- package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
- package/dist/clients/conversation/conversation.d.ts +0 -65
- package/dist/clients/conversation/conversation.js +0 -318
- package/dist/clients/conversation/frames.d.ts +0 -30
- package/dist/clients/conversation/frames.js +0 -52
- package/dist/clients/conversation/region.d.ts +0 -51
- package/dist/clients/conversation/region.js +0 -265
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
- package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
- package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
- package/dist/clients/inbox/review/columns.d.ts +0 -22
- package/dist/clients/inbox/review/columns.js +0 -40
- package/dist/clients/inbox/review/composition.d.ts +0 -60
- package/dist/clients/inbox/review/composition.js +0 -278
- package/dist/clients/inbox/review/document-region.d.ts +0 -120
- package/dist/clients/surfaces/region.d.ts +0 -16
- package/dist/clients/web/__tests__/push-engine.test.js +0 -158
- package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
- package/dist/clients/web/__tests__/push-registry.test.js +0 -177
- package/dist/clients/web/dev-server.d.ts +0 -7
- package/dist/clients/web/dev-server.js +0 -46
- package/dist/clients/web/events.d.ts +0 -19
- package/dist/clients/web/events.js +0 -163
- package/dist/clients/web/push-engine.d.ts +0 -44
- package/dist/clients/web/push-engine.js +0 -125
- package/dist/clients/web/push-registry.d.ts +0 -85
- package/dist/clients/web/push-registry.js +0 -373
- package/dist/clients/web/server.d.ts +0 -19
- package/dist/clients/web/server.js +0 -661
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
- package/dist/clients/web/web-client/shared/protocol.js +0 -8
- package/dist/clients/web/web-cmd.d.ts +0 -2
- package/dist/clients/web/web-cmd.js +0 -141
- package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
- package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
- package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
- package/dist/commands/__tests__/canvas-config.test.js +0 -107
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
- package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
- package/dist/commands/__tests__/search-contents.test.js +0 -52
- package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/lint.test.js +0 -15
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
- package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
- package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
- package/dist/core/__tests__/finalization-migration.test.js +0 -38
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
- package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
- package/dist/core/__tests__/fork.test.d.ts +0 -1
- package/dist/core/__tests__/fork.test.js +0 -108
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
- package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
- package/dist/core/__tests__/full/cascade-close.test.js +0 -240
- package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/detach-focus.test.js +0 -126
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
- package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.js +0 -60
- package/dist/core/__tests__/model-routes.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes.test.js +0 -41
- package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-identity.test.js +0 -61
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
- package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
- package/dist/core/__tests__/prune-to-limit.test.js +0 -126
- package/dist/core/__tests__/reset.test.d.ts +0 -1
- package/dist/core/__tests__/reset.test.js +0 -69
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
- package/dist/core/__tests__/steer-note.test.d.ts +0 -1
- package/dist/core/__tests__/steer-note.test.js +0 -41
- package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
- package/dist/core/__tests__/subcommand-tier.test.js +0 -99
- package/dist/core/__tests__/subscription-delivery.test.js +0 -211
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
- package/dist/core/__tests__/tmux-surface.test.js +0 -484
- package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
- package/dist/core/__tests__/wake-bearings.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
- package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
- package/dist/core/canvas/remote-event-stream.d.ts +0 -24
- package/dist/core/canvas/remote-event-stream.js +0 -94
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
- package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
- package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
- package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
- package/dist/core/human/__tests__/visible-paths.test.js +0 -28
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
- package/dist/core/review/__tests__/project.test.d.ts +0 -1
- package/dist/core/review/__tests__/project.test.js +0 -71
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
- package/dist/core/runtime/tmux.js +0 -1314
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
- package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/inbox.test.js +0 -489
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
- package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +0 -17
- package/dist/web-client/manifest.webmanifest +0 -1
- package/dist/web-client/sw.js +0 -1
- /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
- /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
- /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
- /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
- /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
- /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
- /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
- /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
- /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
- /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
// Phase-2 surface tests: the lifecycle surfaces (pkg plugin install / show and
|
|
2
|
-
// sys doctor) must surface the Phase-1 validator's STABLE TYPED ISSUES to the
|
|
3
|
-
// caller, and must do so WITHOUT executing the plugin binary. Covers spec item
|
|
4
|
-
// 6 at the surface seam (the validator itself is tested in
|
|
5
|
-
// command-plugins.test.ts). Run with:
|
|
6
|
-
// node --import tsx/esm --test src/core/__tests__/command-plugins-surfaces.test.ts
|
|
7
|
-
//
|
|
8
|
-
// Every test runs against an ISOLATED home (HOME → temp) with cwd pinned to a
|
|
9
|
-
// dir that has no .crouter ancestor, so discovery is deterministic. Each fixture
|
|
10
|
-
// executable writes a sentinel file if it is ever spawned; every surface
|
|
11
|
-
// assertion also checks the sentinel is absent — proving validation stayed
|
|
12
|
-
// static.
|
|
13
|
-
import { test, describe, before, after, beforeEach, afterEach } from 'node:test';
|
|
14
|
-
import assert from 'node:assert/strict';
|
|
15
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, chmodSync, existsSync } from 'node:fs';
|
|
16
|
-
import { tmpdir } from 'node:os';
|
|
17
|
-
import { join } from 'node:path';
|
|
18
|
-
import { pluginInstall, pluginUpdate } from '../../commands/pkg/plugin-manage.js';
|
|
19
|
-
import { pluginShow } from '../../commands/pkg/plugin-inspect.js';
|
|
20
|
-
import { sysDoctorLeaf } from '../../commands/sys/doctor.js';
|
|
21
|
-
import { discoverCommandContributions } from '../command-plugins/discovery.js';
|
|
22
|
-
import { resetScopeCache } from '../scope.js';
|
|
23
|
-
import { createApiServer } from '../../daemon/api/server.js';
|
|
24
|
-
import { apiSocketPath, crtrHome } from '../canvas/paths.js';
|
|
25
|
-
import { closeDb } from '../canvas/db.js';
|
|
26
|
-
// A real executable that records the fact it ran. No surface should ever spawn
|
|
27
|
-
// it — the sentinel must never appear.
|
|
28
|
-
const SENTINEL_EXEC = `#!/usr/bin/env node
|
|
29
|
-
const fs = require('fs');
|
|
30
|
-
if (process.env.CMDPLUGIN_SENTINEL) fs.writeFileSync(process.env.CMDPLUGIN_SENTINEL, 'executed');
|
|
31
|
-
process.stdout.write(JSON.stringify({ protocolVersion: 1, ok: true, result: { app_id: 'x', status: 'running' } }));
|
|
32
|
-
`;
|
|
33
|
-
function validManifest() {
|
|
34
|
-
return {
|
|
35
|
-
schemaVersion: 1,
|
|
36
|
-
mounts: [
|
|
37
|
-
{
|
|
38
|
-
parent: [],
|
|
39
|
-
node: {
|
|
40
|
-
kind: 'branch',
|
|
41
|
-
name: 'app',
|
|
42
|
-
description: 'application lifecycle and inspection',
|
|
43
|
-
whenToUse: 'you need to create, deploy, inspect, or remove an application',
|
|
44
|
-
rootEntry: {
|
|
45
|
-
concept: 'applications hosted by a crouter home',
|
|
46
|
-
description: 'application lifecycle and inspection',
|
|
47
|
-
whenToUse: 'you need to create, deploy, inspect, or remove an application',
|
|
48
|
-
},
|
|
49
|
-
summary: 'application lifecycle and inspection',
|
|
50
|
-
children: [
|
|
51
|
-
{
|
|
52
|
-
kind: 'leaf',
|
|
53
|
-
name: 'show',
|
|
54
|
-
description: 'show one application',
|
|
55
|
-
whenToUse: 'inspect a single application by id',
|
|
56
|
-
summary: 'show one application details',
|
|
57
|
-
params: [{ kind: 'positional', name: 'app-id', required: true, constraint: 'the application id' }],
|
|
58
|
-
output: [{ name: 'app_id', type: 'string', required: true, constraint: 'the echoed application id' }],
|
|
59
|
-
outputKind: 'object',
|
|
60
|
-
effects: ['None. Read-only.'],
|
|
61
|
-
},
|
|
62
|
-
],
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
],
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
const CASES = [
|
|
69
|
-
{ name: 'escaping executable path', code: 'command_path_unsafe', executable: '../../../../bin/sh' },
|
|
70
|
-
{ name: 'non-executable file', code: 'command_not_executable', execBit: false },
|
|
71
|
-
(() => { const m = validManifest(); m['schemaVersion'] = 2; return { name: 'unknown schemaVersion', code: 'command_schema_version', manifest: m }; })(),
|
|
72
|
-
(() => { const m = validManifest(); m['requires'] = { crtr: '>=1' }; return { name: 'unknown top-level key', code: 'command_manifest_invalid', manifest: m }; })(),
|
|
73
|
-
];
|
|
74
|
-
function nestedManifest() {
|
|
75
|
-
const manifest = validManifest();
|
|
76
|
-
const mounts = manifest['mounts'];
|
|
77
|
-
const topLevel = mounts[0];
|
|
78
|
-
const child = topLevel.node['children'][0];
|
|
79
|
-
topLevel.node['children'] = [{
|
|
80
|
-
kind: 'branch',
|
|
81
|
-
name: 'tools',
|
|
82
|
-
description: 'application tools',
|
|
83
|
-
whenToUse: 'inspect application tools',
|
|
84
|
-
summary: 'application tools',
|
|
85
|
-
children: [],
|
|
86
|
-
}];
|
|
87
|
-
mounts.push({ parent: ['app', 'tools'], node: { ...child, name: 'status' } });
|
|
88
|
-
return manifest;
|
|
89
|
-
}
|
|
90
|
-
// ---------------------------------------------------------------------------
|
|
91
|
-
// Isolated home + cwd
|
|
92
|
-
// ---------------------------------------------------------------------------
|
|
93
|
-
let home;
|
|
94
|
-
let userRoot;
|
|
95
|
-
let emptyStart;
|
|
96
|
-
let sourceRoot; // holds source plugin dirs for install tests
|
|
97
|
-
let sentinel;
|
|
98
|
-
let realHome;
|
|
99
|
-
let realProfile;
|
|
100
|
-
let realCwd;
|
|
101
|
-
// `sys doctor` scans live nodes for faults via `cliClient().listNodes()` — a
|
|
102
|
-
// thin CLI forwarder since the crtrd-API re-plumb. No node is ever created here
|
|
103
|
-
// (these tests only exercise the static command-plugin validation surface), so
|
|
104
|
-
// the fault scan just needs a reachable daemon that answers with an empty
|
|
105
|
-
// roster. Stand up a real in-process `createApiServer()` on the isolated home's
|
|
106
|
-
// socket so that call resolves instead of trying to autostart a subprocess.
|
|
107
|
-
let server;
|
|
108
|
-
async function waitForSocket(path) {
|
|
109
|
-
for (let i = 0; i < 200; i++) {
|
|
110
|
-
if (existsSync(path))
|
|
111
|
-
return;
|
|
112
|
-
await new Promise((r) => setTimeout(r, 25));
|
|
113
|
-
}
|
|
114
|
-
throw new Error(`api socket never bound at ${path}`);
|
|
115
|
-
}
|
|
116
|
-
before(() => {
|
|
117
|
-
realHome = process.env['HOME'];
|
|
118
|
-
realProfile = process.env['CRTR_PROFILE_ID'];
|
|
119
|
-
realCwd = process.cwd();
|
|
120
|
-
delete process.env['CRTR_PROFILE_ID'];
|
|
121
|
-
});
|
|
122
|
-
after(() => {
|
|
123
|
-
process.chdir(realCwd);
|
|
124
|
-
if (realHome !== undefined)
|
|
125
|
-
process.env['HOME'] = realHome;
|
|
126
|
-
else
|
|
127
|
-
delete process.env['HOME'];
|
|
128
|
-
if (realProfile !== undefined)
|
|
129
|
-
process.env['CRTR_PROFILE_ID'] = realProfile;
|
|
130
|
-
delete process.env['CMDPLUGIN_SENTINEL'];
|
|
131
|
-
// Remove EVERY test's temp dirs, not just the last beforeEach's set.
|
|
132
|
-
for (const d of tempDirs) {
|
|
133
|
-
try {
|
|
134
|
-
rmSync(d, { recursive: true, force: true });
|
|
135
|
-
}
|
|
136
|
-
catch { /* ignore */ }
|
|
137
|
-
}
|
|
138
|
-
resetScopeCache();
|
|
139
|
-
});
|
|
140
|
-
const tempDirs = [];
|
|
141
|
-
function mintDir(prefix) {
|
|
142
|
-
const d = mkdtempSync(join(tmpdir(), prefix));
|
|
143
|
-
tempDirs.push(d);
|
|
144
|
-
return d;
|
|
145
|
-
}
|
|
146
|
-
beforeEach(async () => {
|
|
147
|
-
home = mintDir('crtr-cmdsurf-home-');
|
|
148
|
-
process.env['HOME'] = home;
|
|
149
|
-
userRoot = join(home, '.crouter');
|
|
150
|
-
mkdirSync(join(userRoot, 'plugins'), { recursive: true });
|
|
151
|
-
emptyStart = mintDir('crtr-cmdsurf-empty-');
|
|
152
|
-
sourceRoot = mintDir('crtr-cmdsurf-src-');
|
|
153
|
-
sentinel = join(emptyStart, 'EXECUTED');
|
|
154
|
-
process.env['CMDPLUGIN_SENTINEL'] = sentinel;
|
|
155
|
-
process.chdir(emptyStart); // no .crouter ancestor → project scope is empty
|
|
156
|
-
resetScopeCache();
|
|
157
|
-
// Canvas home is `<HOME>/.crouter/canvas` (no CRTR_HOME set); create it so the
|
|
158
|
-
// socket can bind, then stand up the in-process daemon.
|
|
159
|
-
mkdirSync(crtrHome(), { recursive: true });
|
|
160
|
-
server = createApiServer();
|
|
161
|
-
await waitForSocket(apiSocketPath());
|
|
162
|
-
});
|
|
163
|
-
afterEach(async () => {
|
|
164
|
-
await server?.close();
|
|
165
|
-
closeDb();
|
|
166
|
-
});
|
|
167
|
-
/** Write a plugin at `<dir>/<name>/` with a command manifest + executable. */
|
|
168
|
-
function writePlugin(dir, name, c) {
|
|
169
|
-
const root = join(dir, name);
|
|
170
|
-
mkdirSync(join(root, '.crouter-plugin'), { recursive: true });
|
|
171
|
-
mkdirSync(join(root, 'bin'), { recursive: true });
|
|
172
|
-
writeFileSync(join(root, '.crouter-plugin', 'plugin.json'), JSON.stringify({
|
|
173
|
-
name,
|
|
174
|
-
version: '0.1.0',
|
|
175
|
-
description: 'fixture',
|
|
176
|
-
commands: 'commands.json',
|
|
177
|
-
transport: { kind: 'exec', executable: c.executable ?? 'bin/cmd.js' },
|
|
178
|
-
}));
|
|
179
|
-
writeFileSync(join(root, 'commands.json'), JSON.stringify(c.manifest ?? validManifest()));
|
|
180
|
-
const execPath = join(root, 'bin', 'cmd.js');
|
|
181
|
-
writeFileSync(execPath, SENTINEL_EXEC);
|
|
182
|
-
chmodSync(execPath, c.execBit === false ? 0o644 : 0o755);
|
|
183
|
-
return root;
|
|
184
|
-
}
|
|
185
|
-
function assertNotExecuted() {
|
|
186
|
-
assert.equal(existsSync(sentinel), false, 'the plugin binary must never be spawned by a validation surface');
|
|
187
|
-
}
|
|
188
|
-
// ---------------------------------------------------------------------------
|
|
189
|
-
// pkg plugin show
|
|
190
|
-
// ---------------------------------------------------------------------------
|
|
191
|
-
describe('pkg plugin show surfaces command validation', () => {
|
|
192
|
-
for (const c of CASES) {
|
|
193
|
-
test(`${c.name} → ${c.code} in commands.issues, no execution`, async () => {
|
|
194
|
-
writePlugin(join(userRoot, 'plugins'), 'p', c);
|
|
195
|
-
resetScopeCache();
|
|
196
|
-
const out = await pluginShow.run({ name: 'p' });
|
|
197
|
-
const commands = out['commands'];
|
|
198
|
-
assert.ok(commands, 'show must inventory commands for a plugin declaring a manifest');
|
|
199
|
-
assert.ok(commands.issues.some((i) => i.code === c.code), `expected ${c.code}, got ${JSON.stringify(commands.issues.map((i) => i.code))}`);
|
|
200
|
-
// Typed issues render with received/expected/next.
|
|
201
|
-
const issue = commands.issues.find((i) => i.code === c.code);
|
|
202
|
-
assert.ok(typeof issue.received === 'string' && typeof issue.expected === 'string' && typeof issue.next === 'string');
|
|
203
|
-
assert.equal(commands.mounts.length, 0, 'a rejected manifest contributes no mounts');
|
|
204
|
-
assertNotExecuted();
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
test('valid manifest → inventory with the accepted mount and zero issues', async () => {
|
|
208
|
-
writePlugin(join(userRoot, 'plugins'), 'p', { name: 'valid', code: '' });
|
|
209
|
-
resetScopeCache();
|
|
210
|
-
const out = await pluginShow.run({ name: 'p' });
|
|
211
|
-
const commands = out['commands'];
|
|
212
|
-
const manifest = out['manifest'];
|
|
213
|
-
assert.deepEqual(commands.mounts, ['app']);
|
|
214
|
-
assert.equal(commands.issues.length, 0);
|
|
215
|
-
assert.deepEqual(manifest.transport, { kind: 'exec', executable: 'bin/cmd.js' }, 'the executable belongs to plugin.json transport, not commands.json');
|
|
216
|
-
assertNotExecuted();
|
|
217
|
-
});
|
|
218
|
-
test('a nested mount composes into an empty exec branch instead of being rejected', async () => {
|
|
219
|
-
writePlugin(join(userRoot, 'plugins'), 'p', { name: 'nested mount', code: '', manifest: nestedManifest() });
|
|
220
|
-
resetScopeCache();
|
|
221
|
-
const out = await pluginShow.run({ name: 'p' });
|
|
222
|
-
const commands = out['commands'];
|
|
223
|
-
assert.deepEqual(commands.mounts, ['app']);
|
|
224
|
-
assert.equal(commands.issues.length, 0);
|
|
225
|
-
const snapshot = discoverCommandContributions(new Set(), emptyStart);
|
|
226
|
-
const tools = snapshot.contributions[0].node.children.find((node) => node.name === 'tools');
|
|
227
|
-
assert.equal(tools.kind, 'branch');
|
|
228
|
-
assert.deepEqual(tools.children.map((node) => node.name), ['status']);
|
|
229
|
-
assertNotExecuted();
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
// ---------------------------------------------------------------------------
|
|
233
|
-
// sys doctor
|
|
234
|
-
// ---------------------------------------------------------------------------
|
|
235
|
-
describe('sys doctor surfaces command validation', () => {
|
|
236
|
-
for (const c of CASES) {
|
|
237
|
-
test(`${c.name} → fail check with human_action remediation, no execution`, async () => {
|
|
238
|
-
writePlugin(join(userRoot, 'plugins'), 'p', c);
|
|
239
|
-
resetScopeCache();
|
|
240
|
-
const out = await sysDoctorLeaf.run({ scope: 'user', fix: false, remote: false });
|
|
241
|
-
const checks = out['checks'];
|
|
242
|
-
const cmdCheck = checks.find((k) => k.name.startsWith('plugin:p:commands') && k.status === 'fail');
|
|
243
|
-
assert.ok(cmdCheck, `expected a failing command check, got ${JSON.stringify(checks.map((k) => k.name + ':' + k.status))}`);
|
|
244
|
-
assert.match(cmdCheck.message, new RegExp(c.code));
|
|
245
|
-
assert.equal(cmdCheck.remediation?.kind, 'human_action', 'command remediation is never auto-applied');
|
|
246
|
-
assert.equal(out['ok'], false);
|
|
247
|
-
assertNotExecuted();
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
test('--fix never touches plugin content and leaves the command issue unresolved', async () => {
|
|
251
|
-
writePlugin(join(userRoot, 'plugins'), 'p', { name: 'non-executable file', code: 'command_not_executable', execBit: false });
|
|
252
|
-
resetScopeCache();
|
|
253
|
-
const out = await sysDoctorLeaf.run({ scope: 'user', fix: true, remote: false });
|
|
254
|
-
const checks = out['checks'];
|
|
255
|
-
const cmdCheck = checks.find((k) => k.name.startsWith('plugin:p:commands') && k.status === 'fail');
|
|
256
|
-
assert.ok(cmdCheck, 'the command issue is still reported under --fix');
|
|
257
|
-
assert.notEqual(cmdCheck.fixed, true, '--fix must not chmod the plugin executable');
|
|
258
|
-
assertNotExecuted();
|
|
259
|
-
});
|
|
260
|
-
test('valid manifest → a passing command check', async () => {
|
|
261
|
-
writePlugin(join(userRoot, 'plugins'), 'p', { name: 'valid', code: '' });
|
|
262
|
-
resetScopeCache();
|
|
263
|
-
const out = await sysDoctorLeaf.run({ scope: 'user', fix: false, remote: false });
|
|
264
|
-
const checks = out['checks'];
|
|
265
|
-
const cmdCheck = checks.find((k) => k.name === 'plugin:p:commands');
|
|
266
|
-
assert.ok(cmdCheck && cmdCheck.status === 'pass', 'a valid manifest yields a pass check');
|
|
267
|
-
assert.match(cmdCheck.message, /app/);
|
|
268
|
-
assertNotExecuted();
|
|
269
|
-
});
|
|
270
|
-
});
|
|
271
|
-
// ---------------------------------------------------------------------------
|
|
272
|
-
// Cross-plugin top-level collision (drop-both + issue, visible on surfaces)
|
|
273
|
-
// ---------------------------------------------------------------------------
|
|
274
|
-
describe('cross-plugin top-level collision surfaces on doctor and show', () => {
|
|
275
|
-
function installTwoClaimants() {
|
|
276
|
-
// Two distinct plugins, both valid in isolation, both claiming `app`.
|
|
277
|
-
writePlugin(join(userRoot, 'plugins'), 'p-one', { name: 'valid', code: '' });
|
|
278
|
-
writePlugin(join(userRoot, 'plugins'), 'p-two', { name: 'valid', code: '' });
|
|
279
|
-
resetScopeCache();
|
|
280
|
-
}
|
|
281
|
-
test('neither claimant mounts: discovery drops the collided command from the tree', () => {
|
|
282
|
-
installTwoClaimants();
|
|
283
|
-
const snapshot = discoverCommandContributions(new Set(['sys']));
|
|
284
|
-
assert.equal(snapshot.contributions.length, 0, 'a collided top-level command must not be mounted by ANY claimant');
|
|
285
|
-
const collisions = snapshot.issues.filter((i) => i.code === 'command_collision');
|
|
286
|
-
assert.deepEqual(collisions.map((i) => i.plugin).sort(), ['p-one', 'p-two'], 'both claimants are flagged');
|
|
287
|
-
});
|
|
288
|
-
test('sys doctor fails BOTH claimants with the collision (no false pass)', async () => {
|
|
289
|
-
installTwoClaimants();
|
|
290
|
-
const out = await sysDoctorLeaf.run({ scope: 'user', fix: false, remote: false });
|
|
291
|
-
const checks = out['checks'];
|
|
292
|
-
for (const name of ['p-one', 'p-two']) {
|
|
293
|
-
const passCheck = checks.find((k) => k.name === `plugin:${name}:commands` && k.status === 'pass');
|
|
294
|
-
assert.equal(passCheck, undefined, `${name} must not PASS while its command is dropped by a collision`);
|
|
295
|
-
const failCheck = checks.find((k) => k.name.startsWith(`plugin:${name}:commands`) && k.status === 'fail' && /command_collision/.test(k.message));
|
|
296
|
-
assert.ok(failCheck, `${name} must fail with command_collision, got ${JSON.stringify(checks.map((k) => k.name + ':' + k.status))}`);
|
|
297
|
-
assert.match(failCheck.message, /claimed by multiple plugins/);
|
|
298
|
-
assert.match(failCheck.message, /p-one/);
|
|
299
|
-
assert.match(failCheck.message, /p-two/);
|
|
300
|
-
assert.equal(failCheck.remediation?.kind, 'human_action');
|
|
301
|
-
}
|
|
302
|
-
assert.equal(out['ok'], false);
|
|
303
|
-
assertNotExecuted();
|
|
304
|
-
});
|
|
305
|
-
test('pkg plugin show reports the collision on each claimant and lists no mounts', async () => {
|
|
306
|
-
installTwoClaimants();
|
|
307
|
-
for (const name of ['p-one', 'p-two']) {
|
|
308
|
-
const out = await pluginShow.run({ name });
|
|
309
|
-
const commands = out['commands'];
|
|
310
|
-
assert.deepEqual(commands.mounts, [], `${name} must not list the collided command as an accepted mount`);
|
|
311
|
-
const issue = commands.issues.find((i) => i.code === 'command_collision');
|
|
312
|
-
assert.ok(issue, `${name} show must carry the command_collision issue`);
|
|
313
|
-
assert.deepEqual(issue.received.split(', ').sort(), ['p-one', 'p-two'], 'the issue names both claimants');
|
|
314
|
-
}
|
|
315
|
-
assertNotExecuted();
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
// ---------------------------------------------------------------------------
|
|
319
|
-
// pkg plugin install / update
|
|
320
|
-
// ---------------------------------------------------------------------------
|
|
321
|
-
describe('pkg plugin install/update surface command validation', () => {
|
|
322
|
-
for (const c of CASES) {
|
|
323
|
-
test(`install ${c.name} → ${c.code} in result.commands.issues, no execution`, async () => {
|
|
324
|
-
const src = writePlugin(sourceRoot, 'p', c);
|
|
325
|
-
resetScopeCache();
|
|
326
|
-
const out = await pluginInstall.run({ installRef: src, scope: 'user' });
|
|
327
|
-
const commands = out['commands'];
|
|
328
|
-
assert.ok(commands, 'install reports command validation for a plugin declaring a manifest');
|
|
329
|
-
assert.ok(commands.issues.some((i) => i.code === c.code), `expected ${c.code}, got ${JSON.stringify(commands.issues.map((i) => i.code))}`);
|
|
330
|
-
assert.equal(commands.mounts.length, 0);
|
|
331
|
-
assertNotExecuted();
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
test('install valid manifest → accepted contribution, zero issues, no execution', async () => {
|
|
335
|
-
const src = writePlugin(sourceRoot, 'p', { name: 'valid', code: '' });
|
|
336
|
-
resetScopeCache();
|
|
337
|
-
const out = await pluginInstall.run({ installRef: src, scope: 'user' });
|
|
338
|
-
const commands = out['commands'];
|
|
339
|
-
assert.deepEqual(commands.mounts, ['app']);
|
|
340
|
-
assert.equal(commands.issues.length, 0);
|
|
341
|
-
assertNotExecuted();
|
|
342
|
-
});
|
|
343
|
-
test('update re-reports the current command validation for an edited manifest', async () => {
|
|
344
|
-
// Install valid, then break the on-disk manifest, then update: the report
|
|
345
|
-
// must reflect the CURRENT (broken) state — validation is per-call.
|
|
346
|
-
const src = writePlugin(sourceRoot, 'p', { name: 'valid', code: '' });
|
|
347
|
-
resetScopeCache();
|
|
348
|
-
await pluginInstall.run({ installRef: src, scope: 'user' });
|
|
349
|
-
// Break the installed copy's manifest in place.
|
|
350
|
-
writeFileSync(join(userRoot, 'plugins', 'p', 'commands.json'), JSON.stringify((() => { const m = validManifest(); m['schemaVersion'] = 2; return m; })()));
|
|
351
|
-
resetScopeCache();
|
|
352
|
-
const out = await pluginUpdate.run({ name: 'p' });
|
|
353
|
-
const updated = out['updated'];
|
|
354
|
-
const entry = updated.find((u) => u.name === 'p');
|
|
355
|
-
assert.ok(entry.commands, 'update reports command validation');
|
|
356
|
-
assert.ok(entry.commands.issues.some((i) => i.code === 'command_schema_version'));
|
|
357
|
-
assertNotExecuted();
|
|
358
|
-
});
|
|
359
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
// Run with: node --import tsx/esm --test src/core/__tests__/connection-reconnect-resume.test.ts
|
|
2
|
-
//
|
|
3
|
-
// BUG-REGRESSION: connection faults follow the shared broker-owned retry schedule.
|
|
4
|
-
// The broker exercises this policy table directly.
|
|
5
|
-
import { test } from 'node:test';
|
|
6
|
-
import assert from 'node:assert/strict';
|
|
7
|
-
import { nextFaultRetry, policyFor } from '../runtime/fault-recovery.js';
|
|
8
|
-
const NOW = Date.parse('2026-06-23T20:00:00.000Z');
|
|
9
|
-
const ISO = (ms) => new Date(ms).toISOString();
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
// J1 — the policy table itself: connection faults retry on a 5s → 2x → 60s
|
|
12
|
-
// cap, and the planner advances the next attempt.
|
|
13
|
-
// ---------------------------------------------------------------------------
|
|
14
|
-
test('J1 policy table: connection faults use the shared retry schedule', () => {
|
|
15
|
-
assert.deepEqual(policyFor('connection'), {
|
|
16
|
-
kind: 'connection',
|
|
17
|
-
gate: 'online',
|
|
18
|
-
max: 8,
|
|
19
|
-
baseDelayMs: 5_000,
|
|
20
|
-
capDelayMs: 60_000,
|
|
21
|
-
fatal: false,
|
|
22
|
-
});
|
|
23
|
-
const plan = nextFaultRetry({
|
|
24
|
-
link: 'pi→provider',
|
|
25
|
-
op: 'generation turn',
|
|
26
|
-
kind: 'connection',
|
|
27
|
-
retry: { disposition: 'auto', by: 'daemon' },
|
|
28
|
-
message: 'Connection error.',
|
|
29
|
-
since: ISO(NOW),
|
|
30
|
-
}, NOW);
|
|
31
|
-
assert.equal(plan.attempt, 1, 'the first plan primes attempt 1');
|
|
32
|
-
assert.equal(plan.max, 8, 'connection max attempts stay at 8');
|
|
33
|
-
assert.equal(plan.nextAt, ISO(NOW + 5_000), 'connection starts at 5s');
|
|
34
|
-
assert.equal(plan.fault.retry.attempt, 1, 'planned marker carries the primed attempt');
|
|
35
|
-
assert.equal(plan.fault.retry.disposition, 'auto', 'planned marker stays auto');
|
|
36
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { after, before, test } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
4
|
-
import { tmpdir } from 'node:os';
|
|
5
|
-
import { join } from 'node:path';
|
|
6
|
-
import { DatabaseSync } from 'node:sqlite';
|
|
7
|
-
import { MIGRATIONS, migrate } from '../canvas/db.js';
|
|
8
|
-
let home;
|
|
9
|
-
const previousHome = process.env['CRTR_HOME'];
|
|
10
|
-
before(() => {
|
|
11
|
-
home = mkdtempSync(join(tmpdir(), 'crtr-finalization-migration-'));
|
|
12
|
-
process.env['CRTR_HOME'] = home;
|
|
13
|
-
});
|
|
14
|
-
after(() => {
|
|
15
|
-
rmSync(home, { recursive: true, force: true });
|
|
16
|
-
if (previousHome === undefined)
|
|
17
|
-
delete process.env['CRTR_HOME'];
|
|
18
|
-
else
|
|
19
|
-
process.env['CRTR_HOME'] = previousHome;
|
|
20
|
-
});
|
|
21
|
-
test('v16 repairs a v15 database missing canonical finalization columns', () => {
|
|
22
|
-
const db = new DatabaseSync(join(home, 'migration.db'));
|
|
23
|
-
try {
|
|
24
|
-
MIGRATIONS[0](db);
|
|
25
|
-
db.exec('PRAGMA user_version = 15');
|
|
26
|
-
migrate(db);
|
|
27
|
-
const columns = db.prepare('PRAGMA table_info(nodes)').all();
|
|
28
|
-
assert.ok(columns.some(({ name }) => name === 'final_report'));
|
|
29
|
-
assert.ok(columns.some(({ name }) => name === 'finalized_at'));
|
|
30
|
-
// migrate() always brings a db to the latest schema, not just v16 — assert
|
|
31
|
-
// against the live migration count rather than a version snapshot that will
|
|
32
|
-
// go stale every time a new migration is appended.
|
|
33
|
-
assert.equal(db.prepare('PRAGMA user_version').get().user_version, MIGRATIONS.length);
|
|
34
|
-
}
|
|
35
|
-
finally {
|
|
36
|
-
db.close();
|
|
37
|
-
}
|
|
38
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function register(_pi: unknown): void;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test from 'node:test';
|
|
3
|
-
import { writeFileSync } from 'node:fs';
|
|
4
|
-
// Target-only fixture for the test-runner's nested-spawn regression coverage
|
|
5
|
-
// (see ../test-runner-cheap-sharding.test.ts). Run directly by the real
|
|
6
|
-
// suite it is a trivial always-passing test; that regression instead spawns
|
|
7
|
-
// it through runTier() with CRTR_SPAWN_PROOF_FILE set and checks that this
|
|
8
|
-
// marker file was actually written, proving the spawned process really
|
|
9
|
-
// executed this file's test body rather than silently skipping it.
|
|
10
|
-
test('writes an observable proof marker when asked, otherwise no-ops', () => {
|
|
11
|
-
const proofFile = process.env.CRTR_SPAWN_PROOF_FILE;
|
|
12
|
-
if (proofFile)
|
|
13
|
-
writeFileSync(proofFile, 'ran');
|
|
14
|
-
assert.ok(true);
|
|
15
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
// Run with: node --import tsx/esm --test src/core/__tests__/fork.test.ts
|
|
2
|
-
//
|
|
3
|
-
// Covers `crtr node new --fork-from`: the spawn-time branch where a new node is
|
|
4
|
-
// born as a COPY of an existing pi conversation. Two pure layers are unit-tested
|
|
5
|
-
// here — `buildPiArgv` emitting `--fork` (vs `--session`), and `resolveForkSource`
|
|
6
|
-
// turning a node id / path / uuid into the `--fork <path|id>` argument. The tmux
|
|
7
|
-
// spawn itself is exercised elsewhere (it needs a live pi + tmux).
|
|
8
|
-
import { test, before, after, beforeEach } from 'node:test';
|
|
9
|
-
import assert from 'node:assert/strict';
|
|
10
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
11
|
-
import { tmpdir } from 'node:os';
|
|
12
|
-
import { join } from 'node:path';
|
|
13
|
-
import { createNode } from '../canvas/canvas.js';
|
|
14
|
-
import { closeDb } from '../canvas/db.js';
|
|
15
|
-
import { buildPiArgv } from '../runtime/launch.js';
|
|
16
|
-
import { resolveForkSource } from '../runtime/spawn.js';
|
|
17
|
-
let home;
|
|
18
|
-
function node(id, over = {}) {
|
|
19
|
-
return {
|
|
20
|
-
node_id: id,
|
|
21
|
-
name: id,
|
|
22
|
-
created: new Date().toISOString(),
|
|
23
|
-
cwd: '/tmp/work',
|
|
24
|
-
kind: 'developer',
|
|
25
|
-
mode: 'base',
|
|
26
|
-
lifecycle: 'terminal',
|
|
27
|
-
status: 'active',
|
|
28
|
-
...over,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
before(() => {
|
|
32
|
-
home = mkdtempSync(join(tmpdir(), 'crtr-fork-'));
|
|
33
|
-
process.env['CRTR_HOME'] = home;
|
|
34
|
-
});
|
|
35
|
-
beforeEach(() => {
|
|
36
|
-
closeDb();
|
|
37
|
-
rmSync(home, { recursive: true, force: true });
|
|
38
|
-
});
|
|
39
|
-
after(() => {
|
|
40
|
-
closeDb();
|
|
41
|
-
rmSync(home, { recursive: true, force: true });
|
|
42
|
-
delete process.env['CRTR_HOME'];
|
|
43
|
-
});
|
|
44
|
-
// ---------------------------------------------------------------------------
|
|
45
|
-
// buildPiArgv — `--fork` is the spawn-time branch (not `--session`)
|
|
46
|
-
// ---------------------------------------------------------------------------
|
|
47
|
-
test('buildPiArgv emits --fork <src> and delivers the kickoff prompt', () => {
|
|
48
|
-
const m = node('n');
|
|
49
|
-
const { argv } = buildPiArgv(m, { prompt: 'continue from here', forkFrom: '/abs/src.jsonl' });
|
|
50
|
-
const i = argv.indexOf('--fork');
|
|
51
|
-
assert.ok(i >= 0, 'argv carries --fork');
|
|
52
|
-
assert.equal(argv[i + 1], '/abs/src.jsonl', 'forks from the resolved source');
|
|
53
|
-
assert.ok(!argv.includes('--session'), 'a fork never also resumes');
|
|
54
|
-
assert.equal(argv[argv.length - 1], 'continue from here', 'the kickoff prompt is the last positional');
|
|
55
|
-
});
|
|
56
|
-
test('buildPiArgv prefers --fork over --session when both are somehow set', () => {
|
|
57
|
-
const m = node('n');
|
|
58
|
-
const { argv } = buildPiArgv(m, { forkFrom: '/abs/src.jsonl', resumeSessionPath: '/abs/own.jsonl' });
|
|
59
|
-
assert.ok(argv.includes('--fork'), 'fork wins');
|
|
60
|
-
assert.ok(!argv.includes('--session'), 'resume is suppressed when forking');
|
|
61
|
-
});
|
|
62
|
-
test('buildPiArgv without forkFrom is unchanged (fresh launch, no --fork)', () => {
|
|
63
|
-
const m = node('n');
|
|
64
|
-
const { argv } = buildPiArgv(m, { prompt: 'go' });
|
|
65
|
-
assert.ok(!argv.includes('--fork'), 'no fork on an ordinary fresh launch');
|
|
66
|
-
assert.ok(!argv.includes('--session'), 'no resume either');
|
|
67
|
-
});
|
|
68
|
-
// ---------------------------------------------------------------------------
|
|
69
|
-
// resolveForkSource — node id / path / uuid → the `--fork` argument
|
|
70
|
-
// ---------------------------------------------------------------------------
|
|
71
|
-
test('resolveForkSource resolves a node id to its absolute session FILE', () => {
|
|
72
|
-
createNode(node('src', { pi_session_id: 'uuid-1', pi_session_file: '/abs/src.jsonl' }));
|
|
73
|
-
assert.equal(resolveForkSource('src'), '/abs/src.jsonl');
|
|
74
|
-
});
|
|
75
|
-
test('resolveForkSource THROWS when a node has a session id but no captured FILE', () => {
|
|
76
|
-
// Broker-cut contract (U6/§B.broker): the broker forks an absolute .jsonl PATH,
|
|
77
|
-
// never a bare session id. A node row carrying only pi_session_id (no
|
|
78
|
-
// pi_session_file) can no longer be forked — it fails loudly pre-launch.
|
|
79
|
-
createNode(node('src', { pi_session_id: 'uuid-1' }));
|
|
80
|
-
assert.throws(() => resolveForkSource('src'), /no pi session yet|session FILE/);
|
|
81
|
-
});
|
|
82
|
-
test('resolveForkSource throws when the node has no pi session to fork yet', () => {
|
|
83
|
-
createNode(node('fresh'));
|
|
84
|
-
assert.throws(() => resolveForkSource('fresh'), /no pi session yet/);
|
|
85
|
-
});
|
|
86
|
-
test('resolveForkSource passes an absolute path straight through', () => {
|
|
87
|
-
assert.equal(resolveForkSource('/some/where/sess.jsonl'), '/some/where/sess.jsonl');
|
|
88
|
-
});
|
|
89
|
-
test('resolveForkSource makes a relative path absolute', () => {
|
|
90
|
-
assert.equal(resolveForkSource('sub/sess.jsonl'), join(process.cwd(), 'sub/sess.jsonl'));
|
|
91
|
-
});
|
|
92
|
-
test('resolveForkSource THROWS on a bare/partial uuid that resolves to no session', () => {
|
|
93
|
-
// Broker-cut contract (U6): an unknown bare/partial uuid is scanned against
|
|
94
|
-
// pi's sessions store and fails loudly when it matches nothing — it is no
|
|
95
|
-
// longer passed through verbatim (the broker fork won't resolve a uuid).
|
|
96
|
-
const sessRoot = mkdtempSync(join(tmpdir(), 'crtr-pi-agent-'));
|
|
97
|
-
process.env['PI_CODING_AGENT_DIR'] = sessRoot;
|
|
98
|
-
try {
|
|
99
|
-
assert.throws(() => resolveForkSource('019e8ce3-322e'), /no pi session/);
|
|
100
|
-
}
|
|
101
|
-
finally {
|
|
102
|
-
delete process.env['PI_CODING_AGENT_DIR'];
|
|
103
|
-
rmSync(sessRoot, { recursive: true, force: true });
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
test('resolveForkSource rejects an empty reference', () => {
|
|
107
|
-
assert.throws(() => resolveForkSource(' '), /requires a node id/);
|
|
108
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|