@north-light/crouter 0.3.173 → 0.3.175
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/memory/write.js +13 -12
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +198 -0
- package/dist/commands/node/create.d.ts +23 -0
- package/dist/commands/node/create.js +207 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +302 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +415 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +164 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +82 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +159 -0
- package/dist/commands/node-lifecycle-revive.js +10 -57
- package/dist/commands/node.d.ts +0 -42
- package/dist/commands/node.js +11 -2065
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +67 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +46 -0
- package/dist/commands/surface/node/placement.js +124 -0
- package/dist/commands/surface-node.js +4 -1
- package/dist/commands/surface-reload.js +1 -2
- package/dist/commands/surface-tmux-spread.js +1 -1
- package/dist/commands/surface.js +5 -20
- package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
- package/dist/commands/sys/config.js +6 -6
- package/dist/commands/sys/logs.js +1 -1
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
- package/dist/commands/sys/panels/keys-panel.js +60 -0
- package/dist/commands/sys/panels/models-panel.d.ts +77 -0
- package/dist/commands/sys/panels/models-panel.js +647 -0
- package/dist/commands/sys/panels/panel.d.ts +45 -0
- package/dist/commands/sys/panels/panel.js +137 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +80 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
- package/dist/commands/sys/panels/prefs-panel.js +85 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
- package/dist/commands/sys/panels/provider-panel.js +538 -0
- package/dist/commands/sys/settings-shell.d.ts +55 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +31 -0
- package/dist/commands/sys/setup-core.d.ts +3 -33
- package/dist/commands/sys/setup-core.js +27 -78
- package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
- package/dist/commands/sys/setup-settings-runner.js +63 -0
- package/dist/commands/sys/setup-wizard.d.ts +26 -125
- package/dist/commands/sys/setup-wizard.js +209 -2473
- package/dist/commands/sys/setup.js +5 -7
- package/dist/commands/sys.js +3 -2
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
- package/dist/core/__tests__/broker-preflight.test.js +1 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
- package/dist/core/__tests__/canvas.test.js +2 -36
- package/dist/core/__tests__/close.test.js +14 -3
- package/dist/core/__tests__/context-intro.test.js +32 -143
- package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
- package/dist/core/__tests__/daemon-boot.test.js +2 -20
- package/dist/core/__tests__/daemon-wedge.test.js +1 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +4 -98
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
- package/dist/core/__tests__/helpers/broker-clients.js +0 -14
- package/dist/core/__tests__/helpers/harness.d.ts +0 -8
- package/dist/core/__tests__/helpers/harness.js +7 -87
- package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
- package/dist/core/__tests__/kickoff.test.js +1 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
- package/dist/core/__tests__/migration.test.js +35 -48
- package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
- package/dist/core/__tests__/passive-subscription.test.js +26 -49
- package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
- package/dist/core/__tests__/prune.test.js +94 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -32
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
- package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
- package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
- package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
- package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
- package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
- package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
- package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
- package/dist/core/__tests__/secrets.test.js +1 -7
- package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
- package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
- package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
- package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
- package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
- package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
- package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
- package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
- package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
- package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
- package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
- package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
- package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
- package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
- package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
- package/dist/core/__tests__/session-model.test.js +0 -18
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
- package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
- package/dist/core/broker-client/client.d.ts +2 -2
- package/dist/core/broker-client/client.js +4 -7
- package/dist/core/broker-client/transport-relay.d.ts +13 -19
- package/dist/core/broker-client/transport-relay.js +19 -34
- package/dist/core/broker-client/transport-socket.d.ts +2 -2
- package/dist/core/broker-client/transport-socket.js +9 -2
- package/dist/core/broker-client/transport.d.ts +7 -3
- package/dist/core/broker-client/transport.js +4 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -18
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
- package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
- package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
- package/dist/core/canvas/browse/app.d.ts +2 -17
- package/dist/core/canvas/browse/app.js +16 -88
- package/dist/core/canvas/browse/model.d.ts +0 -4
- package/dist/core/canvas/browse/model.js +1 -12
- package/dist/core/canvas/browse/render.js +6 -3
- package/dist/core/canvas/crons.d.ts +8 -5
- package/dist/core/canvas/crons.js +7 -6
- package/dist/core/canvas/extensions.d.ts +7 -3
- package/dist/core/canvas/extensions.js +16 -4
- package/dist/core/canvas/nav-model.d.ts +0 -4
- package/dist/core/canvas/nav-model.js +2 -14
- package/dist/core/canvas/node-order.d.ts +3 -0
- package/dist/core/canvas/node-order.js +12 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
- package/dist/core/canvas/remote-canvas-source.js +8 -15
- package/dist/core/command.js +11 -4
- package/dist/core/config.js +3 -1
- package/dist/core/events/envelope.js +1 -1
- package/dist/core/events/read.js +7 -21
- package/dist/core/events/source.d.ts +0 -2
- package/dist/core/events/source.js +0 -16
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/fault-classifier.d.ts +1 -1
- package/dist/core/feed/passive.d.ts +0 -11
- package/dist/core/feed/passive.js +1 -62
- package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
- package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
- package/dist/core/keybindings/background-bash.js +3 -4
- package/dist/core/keybindings/catalog.js +1 -1
- package/dist/core/memory/inline-ref-grammar.js +3 -3
- package/dist/core/memory-resolver.d.ts +11 -25
- package/dist/core/memory-resolver.js +51 -33
- package/dist/core/model-routes.d.ts +15 -0
- package/dist/core/model-routes.js +12 -0
- package/dist/core/pool-credential-store.js +1 -1
- package/dist/core/preview-registry.js +8 -9
- package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
- package/dist/core/review/realize.d.ts +0 -13
- package/dist/core/review/realize.js +0 -40
- package/dist/core/review/types.d.ts +1 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
- package/dist/core/runtime/bearings.js +1 -11
- package/dist/core/runtime/broker/client-registry.d.ts +33 -0
- package/dist/core/runtime/broker/client-registry.js +164 -0
- package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
- package/dist/core/runtime/broker/daemon-ops.js +49 -0
- package/dist/core/runtime/broker/event-projection.d.ts +42 -0
- package/dist/core/runtime/broker/event-projection.js +178 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
- package/dist/core/runtime/broker/fault-retry.js +277 -0
- package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
- package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
- package/dist/core/runtime/broker/inbox.d.ts +22 -0
- package/dist/core/runtime/broker/inbox.js +167 -0
- package/dist/core/runtime/broker/passive.d.ts +16 -0
- package/dist/core/runtime/broker/passive.js +44 -0
- package/dist/core/runtime/broker/read-ops.d.ts +23 -0
- package/dist/core/runtime/broker/read-ops.js +150 -0
- package/dist/core/runtime/broker/rebind.d.ts +74 -0
- package/dist/core/runtime/broker/rebind.js +211 -0
- package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
- package/dist/core/runtime/broker/tool-groups.js +244 -0
- package/dist/core/runtime/broker-extension-render.d.ts +11 -0
- package/dist/core/runtime/broker-extension-render.js +181 -0
- package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
- package/dist/core/runtime/broker-persona-guidance.js +58 -0
- package/dist/core/runtime/broker-protocol.d.ts +1 -1
- package/dist/core/runtime/broker-protocol.js +1 -1
- package/dist/core/runtime/broker.d.ts +5 -196
- package/dist/core/runtime/broker.js +276 -3059
- package/dist/core/runtime/canvas-extensions.js +11 -2
- package/dist/core/runtime/fault.js +1 -1
- package/dist/core/runtime/model-selection.d.ts +9 -0
- package/dist/core/runtime/model-selection.js +12 -0
- package/dist/core/runtime/model-swap.d.ts +3 -3
- package/dist/core/runtime/model-swap.js +33 -25
- package/dist/core/runtime/placement-tmux.d.ts +3 -14
- package/dist/core/runtime/placement-tmux.js +11 -80
- package/dist/core/runtime/placement.d.ts +4 -2
- package/dist/core/runtime/placement.js +7 -12
- package/dist/core/runtime/promote.d.ts +14 -1
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +8 -0
- package/dist/core/runtime/spawn.js +36 -6
- package/dist/core/runtime/stop-guard.d.ts +4 -3
- package/dist/core/runtime/stop-guard.js +36 -18
- package/dist/core/runtime/stop-signals.d.ts +4 -1
- package/dist/core/runtime/stream-watchdog.js +4 -5
- package/dist/core/runtime/structured-output.d.ts +15 -2
- package/dist/core/runtime/structured-output.js +35 -12
- package/dist/core/runtime/tmux-bindings.d.ts +25 -0
- package/dist/core/runtime/tmux-bindings.js +682 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -1
- package/dist/core/runtime/tmux-chrome.js +3 -2
- package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
- package/dist/core/runtime/tmux-driver.js +598 -0
- package/dist/core/runtime/view-socket.d.ts +14 -0
- package/dist/core/runtime/view-socket.js +83 -0
- package/dist/core/session-model/session-state.d.ts +1 -2
- package/dist/core/session-model/session-state.js +5 -8
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +2 -2
- package/dist/core/substrate/gate.d.ts +1 -1
- package/dist/core/substrate/on-read-pure.d.ts +7 -0
- package/dist/core/substrate/on-read-pure.js +272 -0
- package/dist/core/termrender/termrender.js +32 -2
- package/dist/core/user-settings.d.ts +23 -1
- package/dist/core/user-settings.js +18 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
- package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
- package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
- package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
- package/dist/daemon/api/bridge.js +40 -81
- package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
- package/dist/daemon/api/handlers/broker-ops.js +383 -0
- package/dist/daemon/api/handlers/crons.js +9 -4
- package/dist/daemon/api/handlers/files.js +6 -7
- package/dist/daemon/api/handlers/inbox.js +2 -340
- package/dist/daemon/api/handlers/nodes.d.ts +10 -1
- package/dist/daemon/api/handlers/nodes.js +74 -39
- package/dist/daemon/api/handlers/review-comments.js +5 -1
- package/dist/daemon/api/handlers/reviews.js +0 -19
- package/dist/daemon/api/map.js +25 -4
- package/dist/daemon/api/router.js +2 -3
- package/dist/daemon/api/server.js +5 -7
- package/dist/daemon/cron-run.d.ts +4 -0
- package/dist/daemon/cron-run.js +30 -13
- package/dist/daemon/crtrd.d.ts +3 -58
- package/dist/daemon/crtrd.js +28 -1244
- package/dist/daemon/manage.js +0 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
- package/dist/daemon/reconcilers/broker-supervision.js +549 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
- package/dist/daemon/reconcilers/cron-lane.js +32 -0
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
- package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
- package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
- package/dist/daemon/review/finish.js +2 -5
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
- package/dist/pi-extensions/broker-local.d.ts +20 -0
- package/dist/pi-extensions/broker-local.js +89 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
- package/dist/pi-extensions/canvas-context-intro.js +22 -11
- package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
- package/dist/pi-extensions/canvas-goal-capture.js +7 -12
- package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
- package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
- package/dist/pi-extensions/canvas-passive-context.js +22 -18
- package/dist/pi-extensions/canvas-recap.d.ts +2 -2
- package/dist/pi-extensions/canvas-recap.js +48 -21
- package/dist/pi-extensions/canvas-review-boundary.js +10 -4
- package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
- package/dist/pi-extensions/canvas-stophook.js +149 -431
- package/dist/pi-extensions/canvas-structured-output.js +52 -30
- package/dist/pi-extensions/envelope-merge.d.ts +13 -0
- package/dist/pi-extensions/envelope-merge.js +29 -0
- package/dist/shared/working-activity.d.ts +3 -2
- package/dist/shared/working-activity.js +3 -2
- package/dist/types.d.ts +6 -5
- package/dist/types.js +2 -2
- package/docs/compat/hearth-crtr-v1.md +4 -12
- package/docs/compat/hearth-crtr-v2.md +3 -11
- package/docs/compat/hearth-crtr-v3.md +4 -12
- package/docs/compat/hearth-crtr-v4.md +3 -11
- package/docs/compat/hearth-crtr-v5.md +3 -11
- package/docs/public-api.md +3 -7
- package/package.json +7 -49
- package/runtime.lock.json +2766 -14533
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
- package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
- package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
- package/dist/clients/conversation/conversation.d.ts +0 -65
- package/dist/clients/conversation/conversation.js +0 -318
- package/dist/clients/conversation/frames.d.ts +0 -30
- package/dist/clients/conversation/frames.js +0 -52
- package/dist/clients/conversation/region.d.ts +0 -51
- package/dist/clients/conversation/region.js +0 -265
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
- package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
- package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
- package/dist/clients/inbox/review/columns.d.ts +0 -22
- package/dist/clients/inbox/review/columns.js +0 -40
- package/dist/clients/inbox/review/composition.d.ts +0 -60
- package/dist/clients/inbox/review/composition.js +0 -278
- package/dist/clients/inbox/review/document-region.d.ts +0 -120
- package/dist/clients/surfaces/region.d.ts +0 -16
- package/dist/clients/web/__tests__/push-engine.test.js +0 -158
- package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
- package/dist/clients/web/__tests__/push-registry.test.js +0 -177
- package/dist/clients/web/dev-server.d.ts +0 -7
- package/dist/clients/web/dev-server.js +0 -46
- package/dist/clients/web/events.d.ts +0 -19
- package/dist/clients/web/events.js +0 -163
- package/dist/clients/web/push-engine.d.ts +0 -44
- package/dist/clients/web/push-engine.js +0 -125
- package/dist/clients/web/push-registry.d.ts +0 -85
- package/dist/clients/web/push-registry.js +0 -373
- package/dist/clients/web/server.d.ts +0 -19
- package/dist/clients/web/server.js +0 -661
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
- package/dist/clients/web/web-client/shared/protocol.js +0 -8
- package/dist/clients/web/web-cmd.d.ts +0 -2
- package/dist/clients/web/web-cmd.js +0 -141
- package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
- package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
- package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
- package/dist/commands/__tests__/canvas-config.test.js +0 -107
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
- package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
- package/dist/commands/__tests__/search-contents.test.js +0 -52
- package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/lint.test.js +0 -15
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
- package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
- package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
- package/dist/core/__tests__/finalization-migration.test.js +0 -38
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
- package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
- package/dist/core/__tests__/fork.test.d.ts +0 -1
- package/dist/core/__tests__/fork.test.js +0 -108
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
- package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
- package/dist/core/__tests__/full/cascade-close.test.js +0 -240
- package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/detach-focus.test.js +0 -126
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
- package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.js +0 -60
- package/dist/core/__tests__/model-routes.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes.test.js +0 -41
- package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-identity.test.js +0 -61
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
- package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
- package/dist/core/__tests__/prune-to-limit.test.js +0 -126
- package/dist/core/__tests__/reset.test.d.ts +0 -1
- package/dist/core/__tests__/reset.test.js +0 -69
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
- package/dist/core/__tests__/steer-note.test.d.ts +0 -1
- package/dist/core/__tests__/steer-note.test.js +0 -41
- package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
- package/dist/core/__tests__/subcommand-tier.test.js +0 -99
- package/dist/core/__tests__/subscription-delivery.test.js +0 -211
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
- package/dist/core/__tests__/tmux-surface.test.js +0 -484
- package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
- package/dist/core/__tests__/wake-bearings.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
- package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
- package/dist/core/canvas/remote-event-stream.d.ts +0 -24
- package/dist/core/canvas/remote-event-stream.js +0 -94
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
- package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
- package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
- package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
- package/dist/core/human/__tests__/visible-paths.test.js +0 -28
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
- package/dist/core/review/__tests__/project.test.d.ts +0 -1
- package/dist/core/review/__tests__/project.test.js +0 -71
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
- package/dist/core/runtime/tmux.js +0 -1314
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
- package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/inbox.test.js +0 -489
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
- package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +0 -17
- package/dist/web-client/manifest.webmanifest +0 -1
- package/dist/web-client/sw.js +0 -1
- /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
- /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
- /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
- /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
- /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
- /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
- /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
- /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
- /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
- /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
|
@@ -57,6 +57,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
57
57
|
description: 'Notify about crouter releases, install them automatically, or turn checks off.',
|
|
58
58
|
valueConstraint: 'true|false|notify|apply; true stores notify',
|
|
59
59
|
applies: 'Applies on the next crouter command.',
|
|
60
|
+
group: 'updates',
|
|
60
61
|
order: 70,
|
|
61
62
|
format: (config) => config.auto_update.crtr === false ? 'off' : config.auto_update.crtr,
|
|
62
63
|
cycle: (config, delta) => { config.auto_update.crtr = cycleChoice(AUTO_UPDATE_MODES, config.auto_update.crtr, delta); },
|
|
@@ -74,6 +75,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
74
75
|
description: 'Notify about plugin and marketplace updates, apply them automatically, or turn checks off.',
|
|
75
76
|
valueConstraint: 'false|notify|apply',
|
|
76
77
|
applies: 'Applies on the next crouter command.',
|
|
78
|
+
group: 'updates',
|
|
77
79
|
order: 80,
|
|
78
80
|
format: (config) => config.auto_update.content === false ? 'off' : config.auto_update.content,
|
|
79
81
|
cycle: (config, delta) => { config.auto_update.content = cycleChoice(AUTO_UPDATE_MODES, config.auto_update.content, delta); },
|
|
@@ -90,6 +92,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
90
92
|
description: 'Minimum hours between automatic update checks. Zero checks on every command.',
|
|
91
93
|
valueConstraint: 'integer >= 0',
|
|
92
94
|
applies: 'Applies on the next crouter command.',
|
|
95
|
+
group: 'updates',
|
|
93
96
|
order: 90,
|
|
94
97
|
format: (config) => `${config.auto_update.interval_hours}h`,
|
|
95
98
|
cycle: (config, delta) => { config.auto_update.interval_hours = cycleNumber(UPDATE_INTERVAL_HOURS, config.auto_update.interval_hours, delta); },
|
|
@@ -111,6 +114,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
111
114
|
description: 'Maximum human-review panes placed in one tmux window before using another window.',
|
|
112
115
|
valueConstraint: 'integer >= 1',
|
|
113
116
|
applies: 'Applies to the next pane placement.',
|
|
117
|
+
group: 'panes',
|
|
114
118
|
order: 20,
|
|
115
119
|
format: (config) => String(config.max_panes_per_window),
|
|
116
120
|
cycle: (config, delta) => { config.max_panes_per_window = cycleNumber(MAX_PANES, config.max_panes_per_window, delta); },
|
|
@@ -131,6 +135,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
131
135
|
description: 'Open each managed child beside its watched parent. Off keeps new children running in the background.',
|
|
132
136
|
valueConstraint: 'true|false',
|
|
133
137
|
applies: 'Applies to the next managed child created; independent roots still open their attended viewer.',
|
|
138
|
+
group: 'panes',
|
|
134
139
|
order: 10,
|
|
135
140
|
format: (config) => config.auto_open_child_viewers ? 'on' : 'off',
|
|
136
141
|
cycle: (config) => { config.auto_open_child_viewers = !config.auto_open_child_viewers; },
|
|
@@ -152,6 +157,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
152
157
|
description: 'Ring a short sound when the node in an attached viewer finishes a turn.',
|
|
153
158
|
valueConstraint: 'true|false',
|
|
154
159
|
applies: 'Applies on the next turn end.',
|
|
160
|
+
group: 'display',
|
|
155
161
|
order: 40,
|
|
156
162
|
format: (config) => config.completion_bell ? 'on' : 'off',
|
|
157
163
|
cycle: (config) => { config.completion_bell = !config.completion_bell; },
|
|
@@ -173,6 +179,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
173
179
|
description: 'Play the whip animation when you send a prompt and when an automatically opened child viewer starts.',
|
|
174
180
|
valueConstraint: 'true|false',
|
|
175
181
|
applies: 'Applies on the next attach.',
|
|
182
|
+
group: 'display',
|
|
176
183
|
order: 39,
|
|
177
184
|
format: (config) => config.whip_mode ? 'on' : 'off',
|
|
178
185
|
cycle: (config) => { config.whip_mode = !config.whip_mode; },
|
|
@@ -194,6 +201,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
194
201
|
description: 'Initial mouse wheel scrolling for each attached viewer.',
|
|
195
202
|
valueConstraint: MOUSE_MODE_DEFAULTS.join('|'),
|
|
196
203
|
applies: 'Applies on the next attach.',
|
|
204
|
+
group: 'display',
|
|
197
205
|
order: 38,
|
|
198
206
|
format: (config) => config.mouse_mode_default === 'tmux' ? 'follow tmux' : config.mouse_mode_default,
|
|
199
207
|
cycle: (config, delta) => { config.mouse_mode_default = cycleChoice(MOUSE_MODE_DEFAULTS, config.mouse_mode_default, delta); },
|
|
@@ -213,6 +221,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
213
221
|
description: 'Trailing refresh cycles rendered at full fidelity; older cycles condense to text.',
|
|
214
222
|
valueConstraint: 'integer >= 1',
|
|
215
223
|
applies: 'Applies on the next attach.',
|
|
224
|
+
group: 'display',
|
|
216
225
|
order: 50,
|
|
217
226
|
format: (config) => String(config.live_cycles),
|
|
218
227
|
cycle: (config, delta) => { config.live_cycles = cycleNumber(LIVE_CYCLES, config.live_cycles, delta); },
|
|
@@ -233,6 +242,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
233
242
|
description: 'Messages retained from condensed cycles. Tool calls are never kept.',
|
|
234
243
|
valueConstraint: CONDENSED_HISTORY_MODES.join('|'),
|
|
235
244
|
applies: 'Applies on the next attach.',
|
|
245
|
+
group: 'display',
|
|
236
246
|
order: 60,
|
|
237
247
|
format: (config) => config.condensed_history,
|
|
238
248
|
cycle: (config, delta) => { config.condensed_history = cycleChoice(CONDENSED_HISTORY_MODES, config.condensed_history, delta); },
|
|
@@ -252,6 +262,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
252
262
|
description: 'Fold every settled tool call to its call line. Toggle live with /fold-tools.',
|
|
253
263
|
valueConstraint: 'true|false',
|
|
254
264
|
applies: 'Applies on the next attach.',
|
|
265
|
+
group: 'display',
|
|
255
266
|
order: 30,
|
|
256
267
|
format: (config) => config.fold_finished_tools ? 'on' : 'off',
|
|
257
268
|
cycle: (config) => { config.fold_finished_tools = !config.fold_finished_tools; },
|
|
@@ -272,6 +283,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
272
283
|
description: 'Replace completed folded tool-call groups with a one-line broker summary when available.',
|
|
273
284
|
valueConstraint: 'true|false',
|
|
274
285
|
applies: 'Applies when the next visible message closes a tool-call group.',
|
|
286
|
+
group: 'display',
|
|
275
287
|
order: 35,
|
|
276
288
|
format: (config) => config.summarize_tool_calls ? 'on' : 'off',
|
|
277
289
|
cycle: (config) => { config.summarize_tool_calls = !config.summarize_tool_calls; },
|
|
@@ -292,6 +304,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
|
|
|
292
304
|
description: 'Show each memory read and edited file in folded tool recaps. Off shows a compact count line instead.',
|
|
293
305
|
valueConstraint: 'true|false',
|
|
294
306
|
applies: 'Applies on the next attach.',
|
|
307
|
+
group: 'display',
|
|
295
308
|
order: 36,
|
|
296
309
|
format: (config) => config.detailed_tool_recaps ? 'on' : 'off',
|
|
297
310
|
cycle: (config) => { config.detailed_tool_recaps = !config.detailed_tool_recaps; },
|
|
@@ -327,8 +340,12 @@ function collectUserSettings() {
|
|
|
327
340
|
}
|
|
328
341
|
return out.sort((a, b) => a.order - b.order);
|
|
329
342
|
}
|
|
330
|
-
/** The single row registry shared by `sys
|
|
343
|
+
/** The single row registry shared by `sys settings` and `sys config set`. */
|
|
331
344
|
export const USER_SETTINGS = collectUserSettings();
|
|
332
345
|
export function findUserSetting(key) {
|
|
333
346
|
return USER_SETTINGS.find((setting) => setting.key === key);
|
|
334
347
|
}
|
|
348
|
+
/** The rows one settings destination owns, in registry order. */
|
|
349
|
+
export function userSettingsInGroup(group) {
|
|
350
|
+
return USER_SETTINGS.filter((setting) => setting.group === group);
|
|
351
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { after, before, beforeEach, test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { createNode, getNode, listNodes } from '../../../core/canvas/canvas.js';
|
|
7
|
+
import { closeDb } from '../../../core/canvas/db.js';
|
|
8
|
+
import { CrtrError } from '../../../core/errors.js';
|
|
9
|
+
import { handleConfig, handleCreate, handlePromote, handleYield } from '../handlers/nodes.js';
|
|
10
|
+
const previousCrtrHome = process.env['CRTR_HOME'];
|
|
11
|
+
let home = '';
|
|
12
|
+
before(() => {
|
|
13
|
+
closeDb();
|
|
14
|
+
home = mkdtempSync(join(tmpdir(), 'crtr-node-model-validation-'));
|
|
15
|
+
process.env['CRTR_HOME'] = home;
|
|
16
|
+
});
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
closeDb();
|
|
19
|
+
rmSync(home, { recursive: true, force: true });
|
|
20
|
+
mkdirSync(home, { recursive: true });
|
|
21
|
+
});
|
|
22
|
+
after(() => {
|
|
23
|
+
closeDb();
|
|
24
|
+
rmSync(home, { recursive: true, force: true });
|
|
25
|
+
if (previousCrtrHome === undefined)
|
|
26
|
+
delete process.env['CRTR_HOME'];
|
|
27
|
+
else
|
|
28
|
+
process.env['CRTR_HOME'] = previousCrtrHome;
|
|
29
|
+
});
|
|
30
|
+
function node(id, cwd = home) {
|
|
31
|
+
return {
|
|
32
|
+
node_id: id,
|
|
33
|
+
name: id,
|
|
34
|
+
created: new Date().toISOString(),
|
|
35
|
+
cwd,
|
|
36
|
+
kind: 'developer',
|
|
37
|
+
mode: 'base',
|
|
38
|
+
lifecycle: 'terminal',
|
|
39
|
+
status: 'active',
|
|
40
|
+
parent: null,
|
|
41
|
+
profile_id: null,
|
|
42
|
+
launch: { model: 'anthropic/original', extensions: [], env: {} },
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function ctx(method, path, id, body) {
|
|
46
|
+
return {
|
|
47
|
+
method,
|
|
48
|
+
path,
|
|
49
|
+
params: { id },
|
|
50
|
+
query: new URLSearchParams(),
|
|
51
|
+
body,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const missingRegistry = {
|
|
55
|
+
find: () => undefined,
|
|
56
|
+
hasConfiguredAuth: () => false,
|
|
57
|
+
};
|
|
58
|
+
async function rejectsUnregistered(action) {
|
|
59
|
+
await assert.rejects(action, (error) => {
|
|
60
|
+
assert.ok(error instanceof CrtrError);
|
|
61
|
+
assert.equal(error.code, 'usage');
|
|
62
|
+
assert.match(error.message, /openai-codex\/fast/);
|
|
63
|
+
return true;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
test('create rejects an unregistered concrete model before creating a node row', async () => {
|
|
67
|
+
const beforeRows = listNodes().length;
|
|
68
|
+
const ctx = {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
path: '/v1/nodes',
|
|
71
|
+
params: {},
|
|
72
|
+
query: new URLSearchParams(),
|
|
73
|
+
body: {
|
|
74
|
+
kind: 'developer',
|
|
75
|
+
root: true,
|
|
76
|
+
profile: null,
|
|
77
|
+
cwd: home,
|
|
78
|
+
prompt: 'must never launch',
|
|
79
|
+
model: 'openai-codex/fast',
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
await assert.rejects(() => handleCreate(ctx, { modelRegistry: missingRegistry }), (error) => {
|
|
83
|
+
assert.ok(error instanceof CrtrError);
|
|
84
|
+
assert.equal(error.code, 'usage');
|
|
85
|
+
assert.match(error.message, /openai-codex\/fast/);
|
|
86
|
+
assert.match(error.details?.['next'], /ultra\|strong\|medium\|light/);
|
|
87
|
+
return true;
|
|
88
|
+
});
|
|
89
|
+
assert.equal(listNodes().length, beforeRows);
|
|
90
|
+
});
|
|
91
|
+
test('promote and yield reject unregistered model recipes before reshaping the node', async () => {
|
|
92
|
+
for (const operation of ['promote', 'yield']) {
|
|
93
|
+
const id = `${operation}-model`;
|
|
94
|
+
createNode(node(id));
|
|
95
|
+
const before = getNode(id);
|
|
96
|
+
const request = ctx('POST', `/v1/nodes/${id}/${operation}`, id, { model: 'openai-codex/fast' });
|
|
97
|
+
await rejectsUnregistered(() => operation === 'promote'
|
|
98
|
+
? handlePromote(request, { modelRegistry: missingRegistry })
|
|
99
|
+
: handleYield(request, { modelRegistry: missingRegistry }));
|
|
100
|
+
const after = getNode(id);
|
|
101
|
+
assert.equal(after?.model_override, before?.model_override, `${operation} did not persist the rejected override`);
|
|
102
|
+
assert.deepEqual(after?.launch, before?.launch, `${operation} did not rewrite the launch recipe`);
|
|
103
|
+
assert.equal(after?.mode, before?.mode, `${operation} did not reshape the node`);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
test('config normalizes portable models against the target node scope', async () => {
|
|
107
|
+
const cwd = join(home, 'target-project');
|
|
108
|
+
mkdirSync(join(cwd, '.crouter'), { recursive: true });
|
|
109
|
+
writeFileSync(join(cwd, '.crouter', 'config.json'), JSON.stringify({
|
|
110
|
+
modelLadders: {
|
|
111
|
+
anthropic: {
|
|
112
|
+
ultra: 'target-anthropic/a-ultra',
|
|
113
|
+
strong: 'target-anthropic/a-strong',
|
|
114
|
+
medium: 'target-anthropic/a-medium',
|
|
115
|
+
light: 'target-anthropic/a-light',
|
|
116
|
+
},
|
|
117
|
+
openai: {
|
|
118
|
+
ultra: 'target-openai/o-ultra',
|
|
119
|
+
strong: 'target-openai/o-strong',
|
|
120
|
+
medium: 'target-openai/o-medium',
|
|
121
|
+
light: 'target-openai/o-light',
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
}));
|
|
125
|
+
const id = 'target-scope-model';
|
|
126
|
+
createNode(node(id, cwd));
|
|
127
|
+
const registry = {
|
|
128
|
+
find: (providerId, modelId) => providerId === 'target-openai' && modelId === 'o-strong' ? { providerId, modelId } : undefined,
|
|
129
|
+
hasConfiguredAuth: () => false,
|
|
130
|
+
};
|
|
131
|
+
await handleConfig(ctx('PATCH', `/v1/nodes/${id}/config`, id, { model: 'openai/strong' }), { modelRegistry: registry });
|
|
132
|
+
assert.equal(getNode(id)?.model_override, 'target-openai/o-strong');
|
|
133
|
+
assert.equal(getNode(id)?.launch?.model, 'target-openai/o-strong');
|
|
134
|
+
});
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { test } from 'node:test';
|
|
6
|
+
import { closeDb, openDb } from '../../../core/canvas/db.js';
|
|
7
|
+
import { reviewResultPath } from '../../../core/canvas/paths.js';
|
|
8
|
+
import { toErrorBody } from '../map.js';
|
|
9
|
+
import { reviewCommentRoutes } from '../handlers/review-comments.js';
|
|
10
|
+
test('comment create reports the terminal review winner', async () => {
|
|
11
|
+
const home = mkdtempSync(join(tmpdir(), 'crtr-review-terminal-conflict-'));
|
|
12
|
+
const previousHome = process.env['CRTR_HOME'];
|
|
13
|
+
process.env['CRTR_HOME'] = home;
|
|
14
|
+
try {
|
|
15
|
+
const route = reviewCommentRoutes.find((candidate) => candidate.method === 'POST' && candidate.pattern === '/v1/human/reviews/:review_id/comments');
|
|
16
|
+
assert.ok(route, 'the canonical comment-create route is registered');
|
|
17
|
+
for (const terminal of [
|
|
18
|
+
{
|
|
19
|
+
state: 'canceled',
|
|
20
|
+
terminalColumns: ['2026-01-02T00:00:00.000Z', null, null, null, null, 'out of band cancel', 'human'],
|
|
21
|
+
terminalDTO: {
|
|
22
|
+
canceled_at: '2026-01-02T00:00:00.000Z',
|
|
23
|
+
cancel_reason: 'out of band cancel',
|
|
24
|
+
cancel_actor: 'human',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
state: 'approved',
|
|
29
|
+
terminalColumns: [null, '2026-01-03T00:00:00.000Z', 1, 2, 1, null, null],
|
|
30
|
+
terminalDTO: {
|
|
31
|
+
approved_at: '2026-01-03T00:00:00.000Z',
|
|
32
|
+
changed: true,
|
|
33
|
+
comments_total: 2,
|
|
34
|
+
comments_unresolved: 1,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
]) {
|
|
38
|
+
const reviewId = `${terminal.state}-review`;
|
|
39
|
+
openDb().prepare(`
|
|
40
|
+
INSERT INTO reviews
|
|
41
|
+
(review_id, idempotency_key, origin_kind, origin_node_id, companion_node_id, review_dir,
|
|
42
|
+
file, origin_session_file, origin_session_id, origin_leaf_id, model_spec, branch_file,
|
|
43
|
+
baseline_sha256, baseline_bytes, anchor_base_sha256, anchor_base_bytes, state, created, captured_at,
|
|
44
|
+
canceled_at, approved_at, changed, comments_total, comments_unresolved, cancel_reason, cancel_actor)
|
|
45
|
+
VALUES (?, ?, 'inline', 'origin', ?, '/tmp/review', '/tmp/source.md',
|
|
46
|
+
'/tmp/session.jsonl', 'session', 'leaf', 'anthropic/claude', '/tmp/branch.jsonl',
|
|
47
|
+
'baseline', 4, 'baseline', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
48
|
+
`).run(reviewId, `idempotency-${reviewId}`, `${terminal.state}-companion`, Buffer.from('base'), terminal.state, '2026-01-01T00:00:00.000Z', '2026-01-01T00:00:00.000Z', ...terminal.terminalColumns);
|
|
49
|
+
let thrown;
|
|
50
|
+
try {
|
|
51
|
+
await route.handler({
|
|
52
|
+
method: 'POST',
|
|
53
|
+
path: `/v1/human/reviews/${reviewId}/comments`,
|
|
54
|
+
params: { review_id: reviewId },
|
|
55
|
+
query: new URLSearchParams(),
|
|
56
|
+
body: {
|
|
57
|
+
text: 'late comment',
|
|
58
|
+
anchor: { line: 1, end_line: 1 },
|
|
59
|
+
doc_hash: 'a'.repeat(64),
|
|
60
|
+
actor_node_id: null,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
thrown = error;
|
|
66
|
+
}
|
|
67
|
+
const { status, body } = toErrorBody(thrown);
|
|
68
|
+
assert.equal(status, 409);
|
|
69
|
+
assert.equal(body.error.code, 'review_terminal_conflict');
|
|
70
|
+
assert.deepEqual(body.error.details, {
|
|
71
|
+
state: terminal.state,
|
|
72
|
+
requested: 'comment',
|
|
73
|
+
review: {
|
|
74
|
+
review_id: reviewId,
|
|
75
|
+
origin_kind: 'inline',
|
|
76
|
+
origin_node_id: 'origin',
|
|
77
|
+
bridge_node_id: null,
|
|
78
|
+
companion_node_id: `${terminal.state}-companion`,
|
|
79
|
+
file: '/tmp/source.md',
|
|
80
|
+
state: terminal.state,
|
|
81
|
+
created: '2026-01-01T00:00:00.000Z',
|
|
82
|
+
source_missing: true,
|
|
83
|
+
anchor_base_sha256: 'baseline',
|
|
84
|
+
...terminal.terminalDTO,
|
|
85
|
+
...(terminal.state === 'approved' ? { result_path: reviewResultPath(reviewId) } : {}),
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
closeDb();
|
|
92
|
+
rmSync(home, { recursive: true, force: true });
|
|
93
|
+
if (previousHome === undefined)
|
|
94
|
+
delete process.env['CRTR_HOME'];
|
|
95
|
+
else
|
|
96
|
+
process.env['CRTR_HOME'] = previousHome;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
// Run with: node --import tsx/esm --test src/daemon/api/__tests__/
|
|
1
|
+
// Run with: node --import tsx/esm --test src/daemon/api/__tests__/seam/api-server.test.ts
|
|
2
2
|
//
|
|
3
3
|
// A-11 — the Stage-A acceptance gate for the crtrd API server (spec §10, plan
|
|
4
4
|
// §Stage A). Proves A1–A8: the `CrtrClient` HTTP+WS transport drives the FULL
|
|
5
5
|
// server → router → handlers → bridge stack over the real unix socket, against a
|
|
6
6
|
// CRTR_HOME-isolated crtrd, with a fake broker engine (zero LLM cost).
|
|
7
7
|
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// tmux-free (createHeadlessHarness) but boots REAL broker processes, so it is NOT
|
|
13
|
-
// on the fast local loop.
|
|
8
|
+
// COMPILED SEAM (real-boot-bound): this file lives in `__tests__/seam/`, so
|
|
9
|
+
// `npm run test:seam` runs it from emitted JavaScript with the other real broker
|
|
10
|
+
// and tmux journeys. It is tmux-free (createHeadlessHarness) but boots REAL
|
|
11
|
+
// broker processes, so it is outside the ordinary local loop.
|
|
14
12
|
//
|
|
15
13
|
// APPROACH (see this node's a11-plan.md): the harness stands in for crtrd
|
|
16
14
|
// (in-process superviseTick, fake-live-daemon pidfile, isolated CRTR_HOME + the
|
|
@@ -29,8 +27,7 @@ import { test, before, after } from 'node:test';
|
|
|
29
27
|
import assert from 'node:assert/strict';
|
|
30
28
|
import { statSync, existsSync, readFileSync, mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
31
29
|
import { tmpdir } from 'node:os';
|
|
32
|
-
import { join, dirname
|
|
33
|
-
import { fileURLToPath } from 'node:url';
|
|
30
|
+
import { join, dirname } from 'node:path';
|
|
34
31
|
import WebSocket from 'ws';
|
|
35
32
|
import { createHeadlessHarness } from '../../../../core/__tests__/helpers/harness.js';
|
|
36
33
|
import { createAttachKit } from '../../../../core/__tests__/helpers/broker-clients.js';
|
|
@@ -331,42 +328,3 @@ test('files/peek: 400-usage (missing + relative) and 404 error mapping', async (
|
|
|
331
328
|
await assert.rejects(client.peekFile('relative/not/absolute.txt'), (e) => e instanceof ApiError && e.status === 400 && e.code === 'usage', 'relative path → 400 usage');
|
|
332
329
|
await assert.rejects(client.peekFile(join(tmpdir(), 'crtr-peek-does-not-exist-xyz', 'nope.txt')), (e) => e instanceof ApiError && e.status === 404 && e.code === 'not_found', 'nonexistent absolute path → 404 not_found');
|
|
333
330
|
});
|
|
334
|
-
// ---------------------------------------------------------------------------
|
|
335
|
-
// A7 — emitted dist/api/index.js require-graph reaches zero dist/core/* /
|
|
336
|
-
// dist/clients/*. Static assertion against the EMITTED output — requires a
|
|
337
|
-
// prior `npm run build`.
|
|
338
|
-
// ---------------------------------------------------------------------------
|
|
339
|
-
test('A7: emitted dist/api/index.js import graph reaches no dist/core/* or dist/clients/*', () => {
|
|
340
|
-
const ROOT = fileURLToPath(new URL('../../../../../', import.meta.url)); // repo root
|
|
341
|
-
const entry = join(ROOT, 'dist', 'api', 'index.js');
|
|
342
|
-
if (!existsSync(entry)) {
|
|
343
|
-
assert.fail(`dist/api/index.js is missing — run \`npm run build\` before this test (A7 checks emitted output)`);
|
|
344
|
-
}
|
|
345
|
-
// Walk the transitive graph over LOCAL relative imports/exports only. Node
|
|
346
|
-
// built-ins and bare-specifier deps are irrelevant to the CLI/core purity
|
|
347
|
-
// boundary; any reach into dist/core or dist/clients would surface as a
|
|
348
|
-
// relative `../core/...` / `../clients/...` specifier resolving into those
|
|
349
|
-
// trees.
|
|
350
|
-
const spec = /(?:from|import)\s*['"](\.[^'"]+)['"]/g;
|
|
351
|
-
const seen = new Set();
|
|
352
|
-
const stack = [entry];
|
|
353
|
-
while (stack.length > 0) {
|
|
354
|
-
const file = stack.pop();
|
|
355
|
-
if (seen.has(file))
|
|
356
|
-
continue;
|
|
357
|
-
seen.add(file);
|
|
358
|
-
let src;
|
|
359
|
-
try {
|
|
360
|
-
src = readFileSync(file, 'utf8');
|
|
361
|
-
}
|
|
362
|
-
catch {
|
|
363
|
-
continue; // a .d.ts-only or absent sibling — not part of the runtime graph
|
|
364
|
-
}
|
|
365
|
-
for (let m = spec.exec(src); m !== null; m = spec.exec(src)) {
|
|
366
|
-
stack.push(resolve(dirname(file), m[1]));
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
const leaks = [...seen].filter((f) => f.includes('/dist/core/') || f.includes('/dist/clients/'));
|
|
370
|
-
assert.deepEqual(leaks, [], `dist/api must not reach dist/core/* or dist/clients/* — leaked into:\n${leaks.join('\n')}`);
|
|
371
|
-
assert.ok(seen.size > 1, 'the graph walk actually followed dist/api imports (sanity)');
|
|
372
|
-
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Run with: node --import tsx/esm --test src/daemon/api/__tests__/
|
|
1
|
+
// Run with: node --import tsx/esm --test src/daemon/api/__tests__/seam/b10-attach-modelauth.test.ts
|
|
2
2
|
//
|
|
3
3
|
// B-10 acceptance gate (spec §7.2 surface-attach hybrid + §7.6 model-auth
|
|
4
4
|
// install). Proves spec acceptance **B2** for the two client swaps this batch
|
|
@@ -14,10 +14,9 @@
|
|
|
14
14
|
// /model-auth/{provider}): collection stays client-side; the route persists
|
|
15
15
|
// the credential to auth.json, which crtrd's mtime watcher fans as
|
|
16
16
|
// `reload_auth` to live brokers. B2 shape: auth.json write (assert content) +
|
|
17
|
-
// the reload FAN (assert the reloadAuthLive RPC acks against a live broker)
|
|
18
|
-
// old-path vs API-path STRUCTURAL PARITY (byte-identical auth.json).
|
|
17
|
+
// the reload FAN (assert the reloadAuthLive RPC acks against a live broker).
|
|
19
18
|
//
|
|
20
|
-
//
|
|
19
|
+
// COMPILED SEAM (real-boot-bound): lives in `__tests__/seam/` for the 30s-per-test /
|
|
21
20
|
// CI-only tier, exactly like api-server.test.ts (the A-11 sibling). tmux-free
|
|
22
21
|
// (createHeadlessHarness) but boots REAL broker processes with the fake engine
|
|
23
22
|
// (zero LLM cost). Reuses A-11's approach: createApiServer() in-process binds the
|
|
@@ -117,7 +116,7 @@ test('B2-attach: ensureAttach revives a dormant node, snapshot streams, detach l
|
|
|
117
116
|
// reload FAN acks against a live broker, and the API path is byte-identical to
|
|
118
117
|
// the old direct-write path.
|
|
119
118
|
// ---------------------------------------------------------------------------
|
|
120
|
-
test('B2-modelauth: installCredential writes auth.json
|
|
119
|
+
test('B2-modelauth: installCredential writes auth.json and the reload fan acks a live broker', async () => {
|
|
121
120
|
// Sandbox pi's credential store so the write lands in a throwaway dir, never the
|
|
122
121
|
// developer's real ~/.pi/agent/auth.json. authPath() honors PI_CODING_AGENT_DIR.
|
|
123
122
|
const savedPiDir = process.env['PI_CODING_AGENT_DIR'];
|
|
@@ -142,19 +141,6 @@ test('B2-modelauth: installCredential writes auth.json, the reload fan acks a li
|
|
|
142
141
|
// watcher invokes after this write; the mtime poll itself is crtrd-internal
|
|
143
142
|
// and out of B-10's scope — see the honest-proxy note in the header). ---
|
|
144
143
|
await assert.doesNotReject(reloadAuthLive(liveId), 'reloadAuthLive resolves — the live broker acked the reload_auth fan after the auth.json write');
|
|
145
|
-
// --- STRUCTURAL PARITY: the old path (setup.ts wrote directly via
|
|
146
|
-
// a direct credential write to authPath()). Write
|
|
147
|
-
// that same credential into a second sandbox and assert byte-identical
|
|
148
|
-
// auth.json — the API swap changed the CALLER, not the on-disk structure. ---
|
|
149
|
-
const oldDir = mkdtempSync(join(tmpdir(), 'crtr-b10-old-'));
|
|
150
|
-
try {
|
|
151
|
-
await setAuthCredential('anthropic', { type: 'api_key', key: 'sk-b10-test-key' }, join(oldDir, 'auth.json'));
|
|
152
|
-
const oldContents = readFileSync(join(oldDir, 'auth.json'), 'utf8');
|
|
153
|
-
assert.equal(apiContents, oldContents, 'API-path auth.json is byte-identical to the old direct-write path (structural parity)');
|
|
154
|
-
}
|
|
155
|
-
finally {
|
|
156
|
-
rmSync(oldDir, { recursive: true, force: true });
|
|
157
|
-
}
|
|
158
144
|
}
|
|
159
145
|
finally {
|
|
160
146
|
if (savedPiDir === undefined)
|
|
@@ -167,15 +153,12 @@ test('B2-modelauth: installCredential writes auth.json, the reload fan acks a li
|
|
|
167
153
|
// ---------------------------------------------------------------------------
|
|
168
154
|
// B2 (model-auth, oauth) — non-managed OAuth install must PRESERVE
|
|
169
155
|
// provider-specific extra credential fields (e.g. github-copilot's
|
|
170
|
-
// `enterpriseUrl`, load-bearing for enterprise routing/refresh).
|
|
171
|
-
//
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
// Parity here is STRUCTURAL (parsed deep-equal), not byte-identical: the
|
|
175
|
-
// extra-then-tokens spread order legitimately differs from OLD's credential key
|
|
176
|
-
// order, but the stored credential is the same object.
|
|
156
|
+
// `enterpriseUrl`, load-bearing for enterprise routing/refresh). The client
|
|
157
|
+
// forwards non-standard keys through `extra` and the handler re-spreads them.
|
|
158
|
+
// Regression guard for review M1 (a dropped enterpriseUrl breaks
|
|
159
|
+
// GitHub-Enterprise Copilot).
|
|
177
160
|
// ---------------------------------------------------------------------------
|
|
178
|
-
test('B2-modelauth-oauth: installCredential(oauth) preserves extra fields (enterpriseUrl)
|
|
161
|
+
test('B2-modelauth-oauth: installCredential(oauth) preserves extra fields (enterpriseUrl)', async () => {
|
|
179
162
|
const savedPiDir = process.env['PI_CODING_AGENT_DIR'];
|
|
180
163
|
const apiDir = mkdtempSync(join(tmpdir(), 'crtr-b10-oauth-api-'));
|
|
181
164
|
process.env['PI_CODING_AGENT_DIR'] = apiDir;
|
|
@@ -192,24 +175,14 @@ test('B2-modelauth-oauth: installCredential(oauth) preserves extra fields (enter
|
|
|
192
175
|
const apiContents = readFileSync(join(apiDir, 'auth.json'), 'utf8');
|
|
193
176
|
assert.ok(apiContents.includes('enterpriseUrl'), 'enterpriseUrl key survived the swap (M1 regression guard)');
|
|
194
177
|
assert.ok(apiContents.includes('ghe.example.com'), 'the enterprise domain value is preserved');
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
expires: expiresMs,
|
|
204
|
-
enterpriseUrl: 'https://ghe.example.com',
|
|
205
|
-
availableModelIds: ['gpt-4o'],
|
|
206
|
-
}, join(oldDir, 'auth.json'));
|
|
207
|
-
const oldContents = readFileSync(join(oldDir, 'auth.json'), 'utf8');
|
|
208
|
-
assert.deepEqual(JSON.parse(apiContents), JSON.parse(oldContents), 'oauth API-path auth.json is structurally identical to the OLD full-spread login path (no field dropped)');
|
|
209
|
-
}
|
|
210
|
-
finally {
|
|
211
|
-
rmSync(oldDir, { recursive: true, force: true });
|
|
212
|
-
}
|
|
178
|
+
assert.deepEqual(JSON.parse(apiContents)['github-copilot'], {
|
|
179
|
+
type: 'oauth',
|
|
180
|
+
enterpriseUrl: 'https://ghe.example.com',
|
|
181
|
+
availableModelIds: ['gpt-4o'],
|
|
182
|
+
access: 'gho-access-xyz',
|
|
183
|
+
refresh: 'ghr-refresh-xyz',
|
|
184
|
+
expires: expiresMs,
|
|
185
|
+
}, 'the stored oauth credential carries the tokens AND every extra field');
|
|
213
186
|
}
|
|
214
187
|
finally {
|
|
215
188
|
if (savedPiDir === undefined)
|