@north-light/crouter 0.3.172 → 0.3.174
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +106 -177
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +55 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +198 -0
- package/dist/commands/node/create.d.ts +23 -0
- package/dist/commands/node/create.js +207 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +302 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +415 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +164 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +82 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +159 -0
- package/dist/commands/node-lifecycle-revive.js +10 -57
- package/dist/commands/node.d.ts +0 -42
- package/dist/commands/node.js +11 -2065
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +67 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +46 -0
- package/dist/commands/surface/node/placement.js +124 -0
- package/dist/commands/surface-node.js +4 -1
- package/dist/commands/surface-reload.js +1 -2
- package/dist/commands/surface-tmux-spread.js +1 -1
- package/dist/commands/surface.js +5 -20
- package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
- package/dist/commands/sys/config.js +6 -6
- package/dist/commands/sys/logs.js +1 -1
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
- package/dist/commands/sys/panels/keys-panel.js +60 -0
- package/dist/commands/sys/panels/models-panel.d.ts +77 -0
- package/dist/commands/sys/panels/models-panel.js +647 -0
- package/dist/commands/sys/panels/panel.d.ts +45 -0
- package/dist/commands/sys/panels/panel.js +137 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +80 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
- package/dist/commands/sys/panels/prefs-panel.js +85 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
- package/dist/commands/sys/panels/provider-panel.js +538 -0
- package/dist/commands/sys/settings-shell.d.ts +55 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +31 -0
- package/dist/commands/sys/setup-core.d.ts +3 -33
- package/dist/commands/sys/setup-core.js +27 -78
- package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
- package/dist/commands/sys/setup-settings-runner.js +63 -0
- package/dist/commands/sys/setup-wizard.d.ts +26 -125
- package/dist/commands/sys/setup-wizard.js +209 -2473
- package/dist/commands/sys/setup.js +5 -7
- package/dist/commands/sys.js +3 -2
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
- package/dist/core/__tests__/broker-preflight.test.js +1 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
- package/dist/core/__tests__/canvas.test.js +2 -36
- package/dist/core/__tests__/close.test.js +14 -3
- package/dist/core/__tests__/context-intro.test.js +32 -143
- package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
- package/dist/core/__tests__/daemon-boot.test.js +2 -20
- package/dist/core/__tests__/daemon-wedge.test.js +1 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +4 -98
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
- package/dist/core/__tests__/helpers/broker-clients.js +0 -14
- package/dist/core/__tests__/helpers/harness.d.ts +0 -8
- package/dist/core/__tests__/helpers/harness.js +7 -87
- package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
- package/dist/core/__tests__/kickoff.test.js +1 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
- package/dist/core/__tests__/migration.test.js +35 -48
- package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
- package/dist/core/__tests__/passive-subscription.test.js +26 -49
- package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
- package/dist/core/__tests__/prune.test.js +94 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -32
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
- package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
- package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
- package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
- package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
- package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
- package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
- package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
- package/dist/core/__tests__/secrets.test.js +1 -7
- package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
- package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
- package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
- package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
- package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
- package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
- package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
- package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
- package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
- package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
- package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
- package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
- package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
- package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
- package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
- package/dist/core/__tests__/session-model.test.js +0 -18
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
- package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
- package/dist/core/broker-client/client.d.ts +2 -2
- package/dist/core/broker-client/client.js +4 -7
- package/dist/core/broker-client/transport-relay.d.ts +13 -19
- package/dist/core/broker-client/transport-relay.js +19 -34
- package/dist/core/broker-client/transport-socket.d.ts +2 -2
- package/dist/core/broker-client/transport-socket.js +9 -2
- package/dist/core/broker-client/transport.d.ts +7 -3
- package/dist/core/broker-client/transport.js +4 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -18
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
- package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
- package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
- package/dist/core/canvas/browse/app.d.ts +2 -17
- package/dist/core/canvas/browse/app.js +16 -88
- package/dist/core/canvas/browse/model.d.ts +0 -4
- package/dist/core/canvas/browse/model.js +1 -12
- package/dist/core/canvas/browse/render.js +6 -3
- package/dist/core/canvas/crons.d.ts +8 -5
- package/dist/core/canvas/crons.js +7 -6
- package/dist/core/canvas/extensions.d.ts +7 -3
- package/dist/core/canvas/extensions.js +16 -4
- package/dist/core/canvas/nav-model.d.ts +0 -4
- package/dist/core/canvas/nav-model.js +2 -14
- package/dist/core/canvas/node-order.d.ts +3 -0
- package/dist/core/canvas/node-order.js +12 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
- package/dist/core/canvas/remote-canvas-source.js +8 -15
- package/dist/core/command.js +11 -4
- package/dist/core/config.js +3 -1
- package/dist/core/events/envelope.js +1 -1
- package/dist/core/events/read.js +7 -21
- package/dist/core/events/source.d.ts +0 -2
- package/dist/core/events/source.js +0 -16
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/fault-classifier.d.ts +1 -1
- package/dist/core/feed/passive.d.ts +0 -11
- package/dist/core/feed/passive.js +1 -62
- package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
- package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
- package/dist/core/keybindings/background-bash.js +3 -4
- package/dist/core/keybindings/catalog.js +1 -1
- package/dist/core/memory/inline-ref-grammar.js +3 -3
- package/dist/core/memory-resolver.d.ts +11 -25
- package/dist/core/memory-resolver.js +51 -33
- package/dist/core/model-routes.d.ts +15 -0
- package/dist/core/model-routes.js +12 -0
- package/dist/core/pool-credential-store.js +1 -1
- package/dist/core/preview-registry.js +8 -9
- package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
- package/dist/core/review/realize.d.ts +0 -13
- package/dist/core/review/realize.js +0 -40
- package/dist/core/review/types.d.ts +1 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
- package/dist/core/runtime/bearings.js +1 -11
- package/dist/core/runtime/broker/client-registry.d.ts +33 -0
- package/dist/core/runtime/broker/client-registry.js +164 -0
- package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
- package/dist/core/runtime/broker/daemon-ops.js +49 -0
- package/dist/core/runtime/broker/event-projection.d.ts +42 -0
- package/dist/core/runtime/broker/event-projection.js +178 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
- package/dist/core/runtime/broker/fault-retry.js +277 -0
- package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
- package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
- package/dist/core/runtime/broker/inbox.d.ts +22 -0
- package/dist/core/runtime/broker/inbox.js +167 -0
- package/dist/core/runtime/broker/passive.d.ts +16 -0
- package/dist/core/runtime/broker/passive.js +44 -0
- package/dist/core/runtime/broker/read-ops.d.ts +23 -0
- package/dist/core/runtime/broker/read-ops.js +150 -0
- package/dist/core/runtime/broker/rebind.d.ts +74 -0
- package/dist/core/runtime/broker/rebind.js +211 -0
- package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
- package/dist/core/runtime/broker/tool-groups.js +244 -0
- package/dist/core/runtime/broker-extension-render.d.ts +11 -0
- package/dist/core/runtime/broker-extension-render.js +181 -0
- package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
- package/dist/core/runtime/broker-persona-guidance.js +58 -0
- package/dist/core/runtime/broker-protocol.d.ts +1 -1
- package/dist/core/runtime/broker-protocol.js +1 -1
- package/dist/core/runtime/broker.d.ts +5 -196
- package/dist/core/runtime/broker.js +276 -3059
- package/dist/core/runtime/canvas-extensions.js +11 -2
- package/dist/core/runtime/fault.js +1 -1
- package/dist/core/runtime/model-selection.d.ts +9 -0
- package/dist/core/runtime/model-selection.js +12 -0
- package/dist/core/runtime/model-swap.d.ts +3 -3
- package/dist/core/runtime/model-swap.js +33 -25
- package/dist/core/runtime/placement-tmux.d.ts +3 -14
- package/dist/core/runtime/placement-tmux.js +11 -80
- package/dist/core/runtime/placement.d.ts +4 -2
- package/dist/core/runtime/placement.js +7 -12
- package/dist/core/runtime/promote.d.ts +14 -1
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +8 -0
- package/dist/core/runtime/spawn.js +36 -6
- package/dist/core/runtime/stop-guard.d.ts +4 -3
- package/dist/core/runtime/stop-guard.js +36 -18
- package/dist/core/runtime/stop-signals.d.ts +4 -1
- package/dist/core/runtime/stream-watchdog.js +4 -5
- package/dist/core/runtime/structured-output.d.ts +15 -2
- package/dist/core/runtime/structured-output.js +35 -12
- package/dist/core/runtime/tmux-bindings.d.ts +25 -0
- package/dist/core/runtime/tmux-bindings.js +682 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -1
- package/dist/core/runtime/tmux-chrome.js +3 -2
- package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
- package/dist/core/runtime/tmux-driver.js +598 -0
- package/dist/core/runtime/view-socket.d.ts +14 -0
- package/dist/core/runtime/view-socket.js +83 -0
- package/dist/core/session-model/session-state.d.ts +1 -2
- package/dist/core/session-model/session-state.js +5 -8
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +2 -2
- package/dist/core/substrate/gate.d.ts +1 -1
- package/dist/core/substrate/on-read-pure.d.ts +7 -0
- package/dist/core/substrate/on-read-pure.js +272 -0
- package/dist/core/termrender/termrender.js +32 -2
- package/dist/core/user-settings.d.ts +23 -1
- package/dist/core/user-settings.js +18 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
- package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
- package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
- package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
- package/dist/daemon/api/bridge.js +40 -81
- package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
- package/dist/daemon/api/handlers/broker-ops.js +383 -0
- package/dist/daemon/api/handlers/crons.js +9 -4
- package/dist/daemon/api/handlers/files.js +6 -7
- package/dist/daemon/api/handlers/inbox.js +2 -340
- package/dist/daemon/api/handlers/nodes.d.ts +10 -1
- package/dist/daemon/api/handlers/nodes.js +74 -39
- package/dist/daemon/api/handlers/review-comments.js +5 -1
- package/dist/daemon/api/handlers/reviews.js +0 -19
- package/dist/daemon/api/map.js +25 -4
- package/dist/daemon/api/router.js +2 -3
- package/dist/daemon/api/server.js +5 -7
- package/dist/daemon/cron-run.d.ts +4 -0
- package/dist/daemon/cron-run.js +30 -13
- package/dist/daemon/crtrd.d.ts +3 -58
- package/dist/daemon/crtrd.js +28 -1244
- package/dist/daemon/manage.js +0 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
- package/dist/daemon/reconcilers/broker-supervision.js +549 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
- package/dist/daemon/reconcilers/cron-lane.js +32 -0
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
- package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
- package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
- package/dist/daemon/review/finish.js +2 -5
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
- package/dist/pi-extensions/broker-local.d.ts +20 -0
- package/dist/pi-extensions/broker-local.js +89 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
- package/dist/pi-extensions/canvas-context-intro.js +22 -11
- package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
- package/dist/pi-extensions/canvas-goal-capture.js +7 -12
- package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
- package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
- package/dist/pi-extensions/canvas-passive-context.js +22 -18
- package/dist/pi-extensions/canvas-recap.d.ts +2 -2
- package/dist/pi-extensions/canvas-recap.js +48 -21
- package/dist/pi-extensions/canvas-review-boundary.js +10 -4
- package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
- package/dist/pi-extensions/canvas-stophook.js +149 -431
- package/dist/pi-extensions/canvas-structured-output.js +52 -30
- package/dist/pi-extensions/envelope-merge.d.ts +13 -0
- package/dist/pi-extensions/envelope-merge.js +29 -0
- package/dist/shared/working-activity.d.ts +3 -2
- package/dist/shared/working-activity.js +3 -2
- package/dist/types.d.ts +6 -5
- package/dist/types.js +2 -2
- package/docs/compat/hearth-crtr-v1.md +4 -12
- package/docs/compat/hearth-crtr-v2.md +3 -11
- package/docs/compat/hearth-crtr-v3.md +4 -12
- package/docs/compat/hearth-crtr-v4.md +3 -11
- package/docs/compat/hearth-crtr-v5.md +3 -11
- package/docs/public-api.md +3 -7
- package/package.json +7 -49
- package/runtime.lock.json +2766 -14533
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
- package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
- package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
- package/dist/clients/conversation/conversation.d.ts +0 -65
- package/dist/clients/conversation/conversation.js +0 -318
- package/dist/clients/conversation/frames.d.ts +0 -30
- package/dist/clients/conversation/frames.js +0 -52
- package/dist/clients/conversation/region.d.ts +0 -51
- package/dist/clients/conversation/region.js +0 -265
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
- package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
- package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
- package/dist/clients/inbox/review/columns.d.ts +0 -22
- package/dist/clients/inbox/review/columns.js +0 -40
- package/dist/clients/inbox/review/composition.d.ts +0 -60
- package/dist/clients/inbox/review/composition.js +0 -278
- package/dist/clients/inbox/review/document-region.d.ts +0 -120
- package/dist/clients/surfaces/region.d.ts +0 -16
- package/dist/clients/web/__tests__/push-engine.test.js +0 -158
- package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
- package/dist/clients/web/__tests__/push-registry.test.js +0 -177
- package/dist/clients/web/dev-server.d.ts +0 -7
- package/dist/clients/web/dev-server.js +0 -46
- package/dist/clients/web/events.d.ts +0 -19
- package/dist/clients/web/events.js +0 -163
- package/dist/clients/web/push-engine.d.ts +0 -44
- package/dist/clients/web/push-engine.js +0 -125
- package/dist/clients/web/push-registry.d.ts +0 -85
- package/dist/clients/web/push-registry.js +0 -373
- package/dist/clients/web/server.d.ts +0 -19
- package/dist/clients/web/server.js +0 -661
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
- package/dist/clients/web/web-client/shared/protocol.js +0 -8
- package/dist/clients/web/web-cmd.d.ts +0 -2
- package/dist/clients/web/web-cmd.js +0 -141
- package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
- package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
- package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
- package/dist/commands/__tests__/canvas-config.test.js +0 -107
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
- package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
- package/dist/commands/__tests__/search-contents.test.js +0 -52
- package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/lint.test.js +0 -15
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
- package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
- package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
- package/dist/core/__tests__/finalization-migration.test.js +0 -38
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
- package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
- package/dist/core/__tests__/fork.test.d.ts +0 -1
- package/dist/core/__tests__/fork.test.js +0 -108
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
- package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
- package/dist/core/__tests__/full/cascade-close.test.js +0 -240
- package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/detach-focus.test.js +0 -126
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
- package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.js +0 -60
- package/dist/core/__tests__/model-routes.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes.test.js +0 -41
- package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-identity.test.js +0 -61
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
- package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
- package/dist/core/__tests__/prune-to-limit.test.js +0 -126
- package/dist/core/__tests__/reset.test.d.ts +0 -1
- package/dist/core/__tests__/reset.test.js +0 -69
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
- package/dist/core/__tests__/steer-note.test.d.ts +0 -1
- package/dist/core/__tests__/steer-note.test.js +0 -41
- package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
- package/dist/core/__tests__/subcommand-tier.test.js +0 -99
- package/dist/core/__tests__/subscription-delivery.test.js +0 -211
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
- package/dist/core/__tests__/tmux-surface.test.js +0 -484
- package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
- package/dist/core/__tests__/wake-bearings.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
- package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
- package/dist/core/canvas/remote-event-stream.d.ts +0 -24
- package/dist/core/canvas/remote-event-stream.js +0 -94
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
- package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
- package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
- package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
- package/dist/core/human/__tests__/visible-paths.test.js +0 -28
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
- package/dist/core/review/__tests__/project.test.d.ts +0 -1
- package/dist/core/review/__tests__/project.test.js +0 -71
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
- package/dist/core/runtime/tmux.js +0 -1314
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
- package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/inbox.test.js +0 -489
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
- package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +0 -17
- package/dist/web-client/manifest.webmanifest +0 -1
- package/dist/web-client/sw.js +0 -1
- /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
- /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
- /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
- /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
- /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
- /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
- /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
- /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
- /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
- /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
|
@@ -2,22 +2,22 @@ import { before, after, test } from "node:test";
|
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
4
|
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
5
|
-
import { LockedJsonFile } from "
|
|
6
|
-
import { expandModelCandidates } from "
|
|
7
|
-
import type { SubscriptionCredential } from "
|
|
5
|
+
import { LockedJsonFile } from "../../../../../core/locked-file.ts";
|
|
6
|
+
import { expandModelCandidates } from "../../../../../core/model-routes.ts";
|
|
7
|
+
import type { SubscriptionCredential } from "../../../lib/subscription-state.ts";
|
|
8
8
|
import { dirname, join } from "node:path";
|
|
9
9
|
import { tmpdir } from "node:os";
|
|
10
10
|
|
|
11
11
|
// Child processes reach crouter's locked-file primitive by absolute URL: they run under
|
|
12
12
|
// tsx with `--input-type=module`, so a bare relative specifier has no base to resolve from.
|
|
13
|
-
const lockedFileUrl = new URL("
|
|
13
|
+
const lockedFileUrl = new URL("../../../../../core/locked-file.ts", import.meta.url).href;
|
|
14
14
|
|
|
15
15
|
let home: string;
|
|
16
16
|
let nodeCwd: string;
|
|
17
|
-
let helpers: typeof import("
|
|
18
|
-
let providerManagement: typeof import("
|
|
19
|
-
let rotationModule: typeof import("
|
|
20
|
-
let providerRotationExtension: typeof import("
|
|
17
|
+
let helpers: typeof import("../../../lib/subscription-state.ts");
|
|
18
|
+
let providerManagement: typeof import("../../../../../core/provider-management.ts");
|
|
19
|
+
let rotationModule: typeof import("../../provider-rotation.ts");
|
|
20
|
+
let providerRotationExtension: typeof import("../../provider-rotation.ts").default;
|
|
21
21
|
const previousHome = process.env.HOME;
|
|
22
22
|
const previousAgentDir = process.env.PI_CODING_AGENT_DIR;
|
|
23
23
|
const previousModelIntent = process.env.CRTR_MODEL_INTENT;
|
|
@@ -109,9 +109,9 @@ before(async () => {
|
|
|
109
109
|
process.env.HOME = home;
|
|
110
110
|
process.env.PI_CODING_AGENT_DIR = join(home, ".pi", "agent");
|
|
111
111
|
process.env.CRTR_NODE_CWD = nodeCwd;
|
|
112
|
-
helpers = await import("
|
|
113
|
-
providerManagement = await import("
|
|
114
|
-
rotationModule = await import("
|
|
112
|
+
helpers = await import("../../../lib/subscription-state.ts");
|
|
113
|
+
providerManagement = await import("../../../../../core/provider-management.ts");
|
|
114
|
+
rotationModule = await import("../../provider-rotation.ts");
|
|
115
115
|
providerRotationExtension = rotationModule.default;
|
|
116
116
|
});
|
|
117
117
|
|
|
@@ -128,33 +128,6 @@ after(() => {
|
|
|
128
128
|
rmSync(nodeCwd, { recursive: true, force: true });
|
|
129
129
|
});
|
|
130
130
|
|
|
131
|
-
test("normalizes provider subscription pool files", async () => {
|
|
132
|
-
await resetRotationState();
|
|
133
|
-
await helpers.writeSubscriptionPool("anthropic", [
|
|
134
|
-
{
|
|
135
|
-
label: " personal ",
|
|
136
|
-
refresh: " refresh-token ",
|
|
137
|
-
access: " access-token ",
|
|
138
|
-
expires: 123,
|
|
139
|
-
rateLimitedUntil: Number.NaN,
|
|
140
|
-
lastAttemptAt: Number.NaN,
|
|
141
|
-
lastRateLimitedAt: Number.NaN,
|
|
142
|
-
},
|
|
143
|
-
]);
|
|
144
|
-
|
|
145
|
-
assert.deepEqual(helpers.readSubscriptionPool("anthropic"), [
|
|
146
|
-
{
|
|
147
|
-
label: "personal",
|
|
148
|
-
refresh: "refresh-token",
|
|
149
|
-
access: "access-token",
|
|
150
|
-
expires: 123,
|
|
151
|
-
rateLimitedUntil: 0,
|
|
152
|
-
lastAttemptAt: 0,
|
|
153
|
-
lastRateLimitedAt: 0,
|
|
154
|
-
},
|
|
155
|
-
]);
|
|
156
|
-
});
|
|
157
|
-
|
|
158
131
|
// Concurrent refreshes of the same expired pool credential serialize read, token exchange,
|
|
159
132
|
// and write under one lock. The injected refresh runs once; the second caller observes the
|
|
160
133
|
// winner's fresh token and does not make a second single-use refresh request.
|
|
@@ -364,144 +337,6 @@ test("a genuine invalid_grant through the pool account's lock with no UI reaches
|
|
|
364
337
|
}
|
|
365
338
|
});
|
|
366
339
|
|
|
367
|
-
test("/provider-sub add still adds an explicit additional subscription alongside the pool account", async () => {
|
|
368
|
-
await resetRotationState();
|
|
369
|
-
await helpers.writeSubscriptionPool("anthropic", [credential("anthropic", { refresh: "refresh-first", access: "access-first" })]);
|
|
370
|
-
|
|
371
|
-
await helpers.upsertSubscription("anthropic", credential("work", { refresh: "refresh-work", access: "access-work" }));
|
|
372
|
-
|
|
373
|
-
assert.deepEqual(helpers.readSubscriptionPool("anthropic").map((entry) => entry.label), ["anthropic", "work"]);
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
// /provider-sub <provider> add accepts the default label as the login-backed slot: the
|
|
377
|
-
// registered command handler must store that login on the default pool entry rather than
|
|
378
|
-
// discard it, because the pool is the only credential store a managed provider has.
|
|
379
|
-
test("/provider-sub add with the default label persists the login credential to the default pool entry", async () => {
|
|
380
|
-
await resetRotationState();
|
|
381
|
-
|
|
382
|
-
const { ctx, commands, pi } = makeRotationCtx();
|
|
383
|
-
ctx.hasUI = true;
|
|
384
|
-
ctx.ui.notify = () => {};
|
|
385
|
-
ctx.ui.input = async () => "personal";
|
|
386
|
-
rotationModule.__setLoginForProviderForTest(async () => ({ refresh: "refresh-login", access: "access-login", expires: Date.now() + 60_000 }));
|
|
387
|
-
|
|
388
|
-
try {
|
|
389
|
-
await providerRotationExtension(pi);
|
|
390
|
-
await commands["provider-sub"].handler("anthropic add", ctx);
|
|
391
|
-
|
|
392
|
-
// The default pool entry carries the login's value with the cooldown cleared -- not a
|
|
393
|
-
// broken "authenticated but valueless" slot.
|
|
394
|
-
const [entry] = helpers.readSubscriptionPool("anthropic");
|
|
395
|
-
assert.equal(entry.label, "personal");
|
|
396
|
-
assert.equal(entry.refresh, "refresh-login");
|
|
397
|
-
assert.equal(entry.access, "access-login");
|
|
398
|
-
assert.equal(entry.rateLimitedUntil, 0);
|
|
399
|
-
} finally {
|
|
400
|
-
rotationModule.__setLoginForProviderForTest(undefined);
|
|
401
|
-
}
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
// The retained agent command must use the same coordinated removal as the Providers panel: the
|
|
405
|
-
// pool account leaves the pool exactly like any explicit account.
|
|
406
|
-
test("/provider-sub rm removes the pool account", async () => {
|
|
407
|
-
await resetRotationState();
|
|
408
|
-
await helpers.writeSubscriptionPool("anthropic", [credential("anthropic")]);
|
|
409
|
-
assert.equal(helpers.readSubscriptionPool("anthropic")[0]?.label, "anthropic");
|
|
410
|
-
|
|
411
|
-
const { ctx, commands, pi } = makeRotationCtx();
|
|
412
|
-
ctx.ui.notify = () => {};
|
|
413
|
-
await providerRotationExtension(pi);
|
|
414
|
-
await commands["provider-sub"].handler("anthropic rm anthropic", ctx);
|
|
415
|
-
|
|
416
|
-
assert.equal(helpers.readSubscriptionPool("anthropic").some((entry) => entry.label === "anthropic"), false);
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
// The manual-code-paste dialog races pi-ai's loopback callback server. These tests exercise
|
|
420
|
-
// the wrapper directly with a run function that can leave manual input pending. Aborting the
|
|
421
|
-
// dialog signal removes its broker entry and emits a request-scoped dismissal frame, so the
|
|
422
|
-
// assertions verify the signal rather than an unrelated notification.
|
|
423
|
-
|
|
424
|
-
test("loginWithManualInputCleanup aborts the still-open manual dialog's signal once the OAuth call settles without it (loopback-wins parity)", async () => {
|
|
425
|
-
let capturedSignal: AbortSignal | undefined;
|
|
426
|
-
const notifications: Array<{ message: string; type?: string }> = [];
|
|
427
|
-
const ctx = {
|
|
428
|
-
ui: {
|
|
429
|
-
notify: (message: string, type?: string) => notifications.push({ message, type }),
|
|
430
|
-
input: (_title: string, _placeholder: string, opts?: { signal?: AbortSignal }) => {
|
|
431
|
-
capturedSignal = opts?.signal;
|
|
432
|
-
// Never resolves on its own -- mirrors pi-ai abandoning the manual-input
|
|
433
|
-
// promise once the loopback callback server wins the race.
|
|
434
|
-
return new Promise<string | undefined>(() => {});
|
|
435
|
-
},
|
|
436
|
-
},
|
|
437
|
-
} as any;
|
|
438
|
-
|
|
439
|
-
const result = await rotationModule.loginWithManualInputCleanup(ctx, async (readCode: any) => {
|
|
440
|
-
// Start the manual-code prompt (as onManualCodeInput would) but -- like the real
|
|
441
|
-
// pi-ai race -- never await its outcome; the loopback callback "wins" instead.
|
|
442
|
-
void readCode("Open this URL...", "placeholder").catch(() => {});
|
|
443
|
-
return "loopback-code";
|
|
444
|
-
});
|
|
445
|
-
|
|
446
|
-
assert.equal(result, "loopback-code");
|
|
447
|
-
assert.equal(capturedSignal?.aborted, true, "the abandoned manual-input dialog's signal must be aborted once the OAuth call settles -- the broker turns that abort into a correlated extension_ui_dismiss");
|
|
448
|
-
assert.equal(notifications.length, 0, "no broad dismiss notify -- an unrelated notify must never be used as a dialog-dismissal signal");
|
|
449
|
-
});
|
|
450
|
-
|
|
451
|
-
test("loginWithManualInputCleanup dismisses the manual dialog at callback-win (onProgress), NOT after a delayed token exchange", async () => {
|
|
452
|
-
// Once the loopback callback supplies a code, progress starts token exchange. The manual
|
|
453
|
-
// dialog is aborted at that boundary, before the exchange resolves, so a slow exchange does
|
|
454
|
-
// not leave its overlay open.
|
|
455
|
-
let order = 0;
|
|
456
|
-
let abortedAt: number | undefined;
|
|
457
|
-
let runResolvedAt: number | undefined;
|
|
458
|
-
const ctx = {
|
|
459
|
-
ui: {
|
|
460
|
-
notify: () => {},
|
|
461
|
-
input: (_title: string, _placeholder: string, opts?: { signal?: AbortSignal }) =>
|
|
462
|
-
// Mirror the broker: resolve to undefined on abort (which readCode turns
|
|
463
|
-
// into a throw, inert on the abandoned promise like pi-ai's own .catch).
|
|
464
|
-
new Promise<string | undefined>((resolve) => {
|
|
465
|
-
opts?.signal?.addEventListener("abort", () => { abortedAt = order++; resolve(undefined); }, { once: true });
|
|
466
|
-
}),
|
|
467
|
-
},
|
|
468
|
-
} as any;
|
|
469
|
-
|
|
470
|
-
const result = await rotationModule.loginWithManualInputCleanup(ctx, async (readCode: any, dismissManual: () => void) => {
|
|
471
|
-
void readCode("Open this URL...", "placeholder").catch(() => {});
|
|
472
|
-
dismissManual(); // pi-ai's onProgress fires here -- it already has the code
|
|
473
|
-
await new Promise((r) => setTimeout(r, 25)); // the (possibly slow) token exchange
|
|
474
|
-
runResolvedAt = order++;
|
|
475
|
-
return "exchanged-token";
|
|
476
|
-
});
|
|
477
|
-
|
|
478
|
-
assert.equal(result, "exchanged-token");
|
|
479
|
-
assert.notEqual(abortedAt, undefined, "the manual dialog's signal must have been aborted");
|
|
480
|
-
assert.notEqual(runResolvedAt, undefined);
|
|
481
|
-
assert.ok(abortedAt! < runResolvedAt!, "the manual dialog must be dismissed at callback-win (onProgress), BEFORE the delayed token exchange completes");
|
|
482
|
-
});
|
|
483
|
-
|
|
484
|
-
test("loginWithManualInputCleanup's readCode rejects (rather than resolving to \"\") when the manual dialog is cancelled or times out", async () => {
|
|
485
|
-
const ctx = {
|
|
486
|
-
ui: {
|
|
487
|
-
notify: () => {},
|
|
488
|
-
// ctx.ui.input resolving to undefined is exactly what a Cancel button or the
|
|
489
|
-
// dialog's own timeout produces (dialogPromise's cancelled/timeout default).
|
|
490
|
-
input: async () => undefined,
|
|
491
|
-
},
|
|
492
|
-
} as any;
|
|
493
|
-
|
|
494
|
-
// pi-ai only calls its onPrompt paste-only fallback when onManualCodeInput
|
|
495
|
-
// RESOLVES (even to a falsy value) -- never when it rejects. Asserting
|
|
496
|
-
// loginWithManualInputCleanup itself rejects (instead of resolving to "", the
|
|
497
|
-
// pre-fix behavior) proves readCode ends the OAuth attempt directly and pi-ai
|
|
498
|
-
// never gets the chance to fall through to that second, URL-less dialog.
|
|
499
|
-
await assert.rejects(
|
|
500
|
-
() => rotationModule.loginWithManualInputCleanup(ctx, (readCode) => readCode("Open this URL...", "placeholder")),
|
|
501
|
-
/OAuth login cancelled/,
|
|
502
|
-
);
|
|
503
|
-
});
|
|
504
|
-
|
|
505
340
|
test("the synthesized ladder registry preserves family preference before configured strength fallback", async () => {
|
|
506
341
|
await resetRotationState();
|
|
507
342
|
writeLadderConfig();
|
|
@@ -877,7 +712,7 @@ test("addSubscription normalizes labels and enforces Codex account uniqueness in
|
|
|
877
712
|
test("cross-process explicit adds admit exactly one duplicate Codex account", { timeout: 60_000 }, async () => {
|
|
878
713
|
await resetRotationState();
|
|
879
714
|
const poolPath = join(home, ".pi", "agent", "openai-codex-subscriptions.json");
|
|
880
|
-
const subscriptionStateUrl = new URL("
|
|
715
|
+
const subscriptionStateUrl = new URL("../../../lib/subscription-state.ts", import.meta.url).href;
|
|
881
716
|
const spawnContender = (label: string) => {
|
|
882
717
|
const child = spawn(
|
|
883
718
|
process.execPath,
|
|
@@ -1001,6 +836,100 @@ function makeRotationCtx(modelIntent?: string) {
|
|
|
1001
836
|
return { ctx, setModelCalls, thinkingLevelCalls, providers, events, commands, pi };
|
|
1002
837
|
}
|
|
1003
838
|
|
|
839
|
+
test("managed Anthropic requests opt into server-side fallback without changing other managed routes", async () => {
|
|
840
|
+
await resetRotationState();
|
|
841
|
+
writeLadderConfig();
|
|
842
|
+
await helpers.writeSubscriptionPool("anthropic", [credential("anthropic")]);
|
|
843
|
+
|
|
844
|
+
const anthropicModel = { provider: "anthropic", id: "claude-opus-5", api: "anthropic-messages" };
|
|
845
|
+
const { ctx, providers, events, pi } = makeRotationCtx("anthropic/ultra");
|
|
846
|
+
ctx.model = anthropicModel;
|
|
847
|
+
const streamOptions: any[] = [];
|
|
848
|
+
const fetchCalls: Array<[RequestInfo | URL, RequestInit | undefined]> = [];
|
|
849
|
+
const callerPayloads: unknown[] = [];
|
|
850
|
+
rotationModule.__setStreamForProviderForTest((_model, _context, options) => {
|
|
851
|
+
streamOptions.push(options);
|
|
852
|
+
return (async function* () {
|
|
853
|
+
yield { type: "text_delta", text: "served" };
|
|
854
|
+
})() as any;
|
|
855
|
+
});
|
|
856
|
+
|
|
857
|
+
try {
|
|
858
|
+
await providerRotationExtension(pi);
|
|
859
|
+
await events.session_start?.({}, ctx);
|
|
860
|
+
const stream = providers["anthropic"].streamSimple(anthropicModel, ctx, {
|
|
861
|
+
onPayload(payload: unknown) {
|
|
862
|
+
callerPayloads.push(payload);
|
|
863
|
+
if ((payload as { replaceWithNull?: boolean })?.replaceWithNull) return null;
|
|
864
|
+
return { ...(payload as object), callerPayload: true };
|
|
865
|
+
},
|
|
866
|
+
fetch: async (input: RequestInfo | URL, init?: RequestInit) => {
|
|
867
|
+
fetchCalls.push([input, init]);
|
|
868
|
+
return new Response();
|
|
869
|
+
},
|
|
870
|
+
});
|
|
871
|
+
for await (const _event of stream) {
|
|
872
|
+
// Drain the managed request so the injected stream options are captured.
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
const [anthropicOptions] = streamOptions;
|
|
876
|
+
assert.deepEqual(await anthropicOptions.onPayload({ request: true }, anthropicModel), {
|
|
877
|
+
request: true,
|
|
878
|
+
callerPayload: true,
|
|
879
|
+
fallbacks: "default",
|
|
880
|
+
});
|
|
881
|
+
assert.deepEqual(await anthropicOptions.onPayload({ replaceWithNull: true }, anthropicModel), { fallbacks: "default" });
|
|
882
|
+
assert.deepEqual(callerPayloads, [{ request: true }, { replaceWithNull: true }]);
|
|
883
|
+
|
|
884
|
+
for (const headers of [
|
|
885
|
+
new Headers({ "anthropic-beta": "claude-code-20250219,oauth-2025-04-20", "x-keep": "headers" }),
|
|
886
|
+
{ "anthropic-beta": "claude-code-20250219,oauth-2025-04-20", "x-keep": "object" },
|
|
887
|
+
[["anthropic-beta", "claude-code-20250219,oauth-2025-04-20"], ["x-keep", "pairs"]],
|
|
888
|
+
]) {
|
|
889
|
+
await anthropicOptions.fetch("https://example.test/messages", { headers });
|
|
890
|
+
}
|
|
891
|
+
for (const [_input, init] of fetchCalls) {
|
|
892
|
+
const headers = new Headers(init?.headers);
|
|
893
|
+
assert.equal(headers.get("anthropic-beta"), "claude-code-20250219,oauth-2025-04-20,server-side-fallback-2026-07-01");
|
|
894
|
+
assert.ok(headers.get("x-keep"));
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
const haikuModel = { provider: "anthropic", id: "claude-haiku-4-5", api: "anthropic-messages" };
|
|
898
|
+
const haikuOnPayload = (payload: unknown) => payload;
|
|
899
|
+
const haikuFetch = async () => new Response();
|
|
900
|
+
for await (const _event of providers["anthropic"].streamSimple(haikuModel, ctx, {
|
|
901
|
+
onPayload: haikuOnPayload,
|
|
902
|
+
fetch: haikuFetch,
|
|
903
|
+
})) {
|
|
904
|
+
// Drain the managed Haiku request.
|
|
905
|
+
}
|
|
906
|
+
assert.equal(streamOptions[1].onPayload, haikuOnPayload);
|
|
907
|
+
assert.equal(streamOptions[1].fetch, haikuFetch);
|
|
908
|
+
assert.deepEqual(await streamOptions[1].onPayload({ request: true }, haikuModel), { request: true });
|
|
909
|
+
|
|
910
|
+
await resetRotationState();
|
|
911
|
+
await helpers.writeSubscriptionPool("openai-codex", [credential("codex")]);
|
|
912
|
+
const codexModel = { provider: "openai-codex", id: "gpt-5.6-sol", api: "openai-codex-responses" };
|
|
913
|
+
const codex = makeRotationCtx("openai/strong");
|
|
914
|
+
const codexOptions: any[] = [];
|
|
915
|
+
rotationModule.__setStreamForProviderForTest((_model, _context, options) => {
|
|
916
|
+
codexOptions.push(options);
|
|
917
|
+
return (async function* () {
|
|
918
|
+
yield { type: "text_delta", text: "served" };
|
|
919
|
+
})() as any;
|
|
920
|
+
});
|
|
921
|
+
await providerRotationExtension(codex.pi);
|
|
922
|
+
await codex.events.session_start?.({}, codex.ctx);
|
|
923
|
+
for await (const _event of codex.providers["openai-codex"].streamSimple(codexModel, codex.ctx)) {
|
|
924
|
+
// Drain the managed Codex route.
|
|
925
|
+
}
|
|
926
|
+
assert.equal(codexOptions[0].onPayload, undefined);
|
|
927
|
+
assert.equal(codexOptions[0].fetch, undefined);
|
|
928
|
+
} finally {
|
|
929
|
+
rotationModule.__setStreamForProviderForTest(undefined);
|
|
930
|
+
}
|
|
931
|
+
});
|
|
932
|
+
|
|
1004
933
|
// A live route carries the session's exact thinking level through every provider
|
|
1005
934
|
// request, including the requests that continue a turn after tool results.
|
|
1006
935
|
test("preserves a manually selected thinking level across provider requests", async () => {
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
realpathSync,
|
|
12
12
|
} from "node:fs";
|
|
13
13
|
import { homedir } from "node:os";
|
|
14
|
-
import { join, resolve,
|
|
14
|
+
import { join, resolve, dirname } from "node:path";
|
|
15
15
|
import { loadProfileManifest } from "../../../core/profiles/manifest.js";
|
|
16
16
|
import { stripMarkdownComments } from "../../../core/runtime/command-expansion.js";
|
|
17
17
|
|
|
@@ -53,7 +53,6 @@ const SHIM_DIR = join(HOME, ".pi", "agent", ".plugin-command-shims");
|
|
|
53
53
|
const PI_PROMPTS = join(HOME, ".pi", "agent", "prompts");
|
|
54
54
|
const PROJECT_PI_PROMPTS = ".pi/prompts";
|
|
55
55
|
|
|
56
|
-
const INCLUDE_ALL_SCOPES = true;
|
|
57
56
|
const EXCLUDE_NAMES = new Set(["claude.md", "agents.md", "readme.md", "index.md"]);
|
|
58
57
|
|
|
59
58
|
type Kind = "command" | "skill";
|
|
@@ -63,7 +62,7 @@ type IndexRecord = { file: string; kind: Kind; baseDir: string };
|
|
|
63
62
|
// hook to find the file to expand+execute (and how to frame it).
|
|
64
63
|
const commandIndex = new Map<string, IndexRecord>();
|
|
65
64
|
|
|
66
|
-
type InstallRecord = {
|
|
65
|
+
type InstallRecord = { installPath?: string };
|
|
67
66
|
type InstalledPlugins = { plugins?: Record<string, InstallRecord[]> };
|
|
68
67
|
type Shim = { name: string; target: string; kind: Kind; baseDir: string };
|
|
69
68
|
|
|
@@ -171,14 +170,8 @@ function selectedProfileProjects(): string[] {
|
|
|
171
170
|
}
|
|
172
171
|
}
|
|
173
172
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
const b = resolve(projectPath);
|
|
177
|
-
return a === b || a.startsWith(b + sep);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// Installed plugins as { name, installPath } pairs (scope-filtered).
|
|
181
|
-
function pluginDirs(cwd: string): { name: string; installPath: string }[] {
|
|
173
|
+
// Installed plugins as { name, installPath } pairs.
|
|
174
|
+
function pluginDirs(): { name: string; installPath: string }[] {
|
|
182
175
|
if (!existsSync(INSTALLED)) return [];
|
|
183
176
|
let data: InstalledPlugins;
|
|
184
177
|
try {
|
|
@@ -191,9 +184,6 @@ function pluginDirs(cwd: string): { name: string; installPath: string }[] {
|
|
|
191
184
|
const name = key.split("@")[0];
|
|
192
185
|
for (const rec of records ?? []) {
|
|
193
186
|
if (!rec.installPath) continue;
|
|
194
|
-
if (!INCLUDE_ALL_SCOPES && rec.scope === "project") {
|
|
195
|
-
if (!rec.projectPath || !cwdInProject(cwd, rec.projectPath)) continue;
|
|
196
|
-
}
|
|
197
187
|
out.push({ name, installPath: rec.installPath });
|
|
198
188
|
}
|
|
199
189
|
}
|
|
@@ -254,7 +244,7 @@ function buildShims(cwd: string): string {
|
|
|
254
244
|
const shims: Shim[] = [];
|
|
255
245
|
const nativeStems = nativePiPromptStems();
|
|
256
246
|
const projectDirs = projectClaudeDirs(cwd, selectedProfileProjects());
|
|
257
|
-
const plugins = pluginDirs(
|
|
247
|
+
const plugins = pluginDirs();
|
|
258
248
|
|
|
259
249
|
// Commands: user, project ancestors, then plugins.
|
|
260
250
|
collectCommands(USER_COMMANDS, [], [], shims);
|
|
@@ -70,6 +70,7 @@ import * as fs from "node:fs";
|
|
|
70
70
|
import * as os from "node:os";
|
|
71
71
|
import * as path from "node:path";
|
|
72
72
|
import { parse as parseYaml } from "yaml";
|
|
73
|
+
import { mergeAutoLoadedContext } from "../../../../pi-extensions/envelope-merge.js";
|
|
73
74
|
|
|
74
75
|
const MARKDOWN_EXTS = new Set([".md", ".mdx", ".markdown"]);
|
|
75
76
|
|
|
@@ -138,34 +139,6 @@ function attr(s: string): string {
|
|
|
138
139
|
.replace(/>/g, ">");
|
|
139
140
|
}
|
|
140
141
|
|
|
141
|
-
const AUTO_CONTEXT_RE = /<auto-loaded-context(?:\s[^>]*)?>\n([\s\S]*?)\n<\/auto-loaded-context>/;
|
|
142
|
-
|
|
143
|
-
function isTextContent(block: ToolResultEvent["content"][number]): block is Extract<ToolResultEvent["content"][number], { type: "text" }> {
|
|
144
|
-
return block.type === "text";
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
function mergeAutoLoadedContext(items: string[], content: ToolResultEvent["content"]): ToolResultEvent["content"] {
|
|
148
|
-
const existingText = content.map((block) => isTextContent(block) ? block.text : "").join("\n");
|
|
149
|
-
const fresh = items.map((item) => item.trim()).filter((item) => item !== "" && !existingText.includes(item));
|
|
150
|
-
if (fresh.length === 0) return content;
|
|
151
|
-
const inner = fresh.join("\n");
|
|
152
|
-
|
|
153
|
-
const existingIdx = content.findIndex((block) => isTextContent(block) && AUTO_CONTEXT_RE.test(block.text));
|
|
154
|
-
if (existingIdx !== -1) {
|
|
155
|
-
return content.map((block, idx) => {
|
|
156
|
-
if (idx !== existingIdx || !isTextContent(block)) return block;
|
|
157
|
-
return {
|
|
158
|
-
...block,
|
|
159
|
-
text: block.text.replace(AUTO_CONTEXT_RE, (_whole: string, current: string) => {
|
|
160
|
-
const trimmed = String(current).trim();
|
|
161
|
-
return `<auto-loaded-context>\n${inner}${trimmed === "" ? "" : `\n${trimmed}`}\n</auto-loaded-context>`;
|
|
162
|
-
}),
|
|
163
|
-
};
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return [{ type: "text" as const, text: `<auto-loaded-context>\n${inner}\n</auto-loaded-context>` }, ...content];
|
|
168
|
-
}
|
|
169
142
|
|
|
170
143
|
// Pull the leading `--- ... ---` YAML block out of a markdown file.
|
|
171
144
|
function extractFrontmatter(raw: string): Frontmatter | null {
|
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { readFileSync } from "node:fs";
|
|
5
|
-
import { parse as parseYaml } from "yaml";
|
|
2
|
+
import { listMemoryDocs } from "../../../commands/memory/list.js";
|
|
3
|
+
import { createMemoryDocSnapshot, readMemoryDocContent } from "../../../commands/memory/read.js";
|
|
6
4
|
import {
|
|
7
5
|
expandDeterministicCommand,
|
|
8
6
|
type DeterministicCommandExpansion,
|
|
9
7
|
} from "../../../core/runtime/command-expansion.js";
|
|
10
8
|
|
|
11
|
-
const exec = promisify(execFile);
|
|
12
|
-
const CRTR = "crtr";
|
|
13
|
-
|
|
14
9
|
// ---------------------------------------------------------------------------
|
|
15
10
|
// memory-slash-commands: any memory doc frontmatter-flagged `slash: true`
|
|
16
11
|
// becomes an invocable slash command (`/<name>`). This mirrors Hermes Agent's
|
|
@@ -18,24 +13,22 @@ const CRTR = "crtr";
|
|
|
18
13
|
// the doc body (plus the user's free-text args) as a normal turn instead of
|
|
19
14
|
// requiring a separate skill-invocation mechanism.
|
|
20
15
|
//
|
|
21
|
-
// Discovery
|
|
22
|
-
//
|
|
23
|
-
// builtin)
|
|
24
|
-
// resolution. `list`'s
|
|
25
|
-
// `scopeRank` in crouter's memory/shared.ts), so
|
|
26
|
-
// name reproduces the resolver's identity
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
// load-bearing here (isSlashFlagged reads the file at each item's path).
|
|
16
|
+
// Discovery uses the in-process `memory list` inventory and its source
|
|
17
|
+
// snapshot, which already resolve the substrate's scope precedence (project
|
|
18
|
+
// stack > profile > user > builtin). This file does not walk memory/
|
|
19
|
+
// directories or reimplement scope resolution. `list`'s items are
|
|
20
|
+
// scope-precedence sorted (see `scopeRank` in crouter's memory/shared.ts), so
|
|
21
|
+
// first-occurrence-wins per doc name reproduces the resolver's identity
|
|
22
|
+
// precedence for free. The inventory carries parsed `slash` flags and resolved
|
|
23
|
+
// paths for command bodies.
|
|
30
24
|
// ---------------------------------------------------------------------------
|
|
31
25
|
|
|
32
|
-
const FRONTMATTER_RE = /^---\s*\r?\n([\s\S]*?)\r?\n---\s*\r?\n?/;
|
|
33
|
-
|
|
34
26
|
interface MemoryListItem {
|
|
35
27
|
name: string;
|
|
36
28
|
path: string;
|
|
37
29
|
short_form: string;
|
|
38
30
|
is_dir: boolean;
|
|
31
|
+
slash: boolean;
|
|
39
32
|
}
|
|
40
33
|
|
|
41
34
|
export interface SlashDoc {
|
|
@@ -49,65 +42,40 @@ export interface SlashDoc {
|
|
|
49
42
|
description: string;
|
|
50
43
|
}
|
|
51
44
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
45
|
+
// `memory list` already chose the winning path for each identity. Keep that
|
|
46
|
+
// path for registration-body reads so every slash document does not re-walk the
|
|
47
|
+
// full corpus through `memory read`.
|
|
48
|
+
const resolvedMemoryPaths = new Map<string, string>();
|
|
56
49
|
|
|
57
50
|
async function defaultListMemoryDocs(): Promise<MemoryListItem[]> {
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
51
|
+
const snapshot = createMemoryDocSnapshot();
|
|
52
|
+
const items = listMemoryDocs(undefined, undefined, true, snapshot.docs).map((doc) => ({
|
|
53
|
+
name: doc.name,
|
|
54
|
+
path: doc.path,
|
|
55
|
+
short_form: doc.shortForm,
|
|
56
|
+
is_dir: doc.isDir,
|
|
57
|
+
slash: doc.slash,
|
|
58
|
+
}));
|
|
59
|
+
|
|
60
|
+
// Slash eligibility follows the list identity, while the body follows the
|
|
61
|
+
// separate `memory read <name>` resolver contract (including direct-path
|
|
62
|
+
// precedence). Resolve all eligible names against one source snapshot.
|
|
63
|
+
const seen = new Set<string>();
|
|
64
|
+
const names = items.flatMap((item) => {
|
|
65
|
+
if (item.is_dir || seen.has(item.name)) return [];
|
|
66
|
+
seen.add(item.name);
|
|
67
|
+
return item.slash === true ? [item.name] : [];
|
|
68
|
+
});
|
|
69
|
+
const resolved = snapshot.resolve(names);
|
|
70
|
+
resolvedMemoryPaths.clear();
|
|
71
|
+
for (const [name, doc] of resolved) resolvedMemoryPaths.set(name, doc.path);
|
|
69
72
|
return items;
|
|
70
73
|
}
|
|
71
74
|
|
|
72
|
-
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
return
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
let listMemoryDocsImpl = defaultListMemoryDocs;
|
|
79
|
-
let readMemoryDocImpl = defaultReadMemoryDoc;
|
|
80
|
-
|
|
81
|
-
/** Test seam: override doc discovery so tests never shell out to `crtr`. */
|
|
82
|
-
export function __setListMemoryDocsForTest(fn?: typeof listMemoryDocsImpl): void {
|
|
83
|
-
listMemoryDocsImpl = fn ?? defaultListMemoryDocs;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/** Test seam: override doc-body reads so tests never shell out to `crtr`. */
|
|
87
|
-
export function __setReadMemoryDocForTest(fn?: typeof readMemoryDocImpl): void {
|
|
88
|
-
readMemoryDocImpl = fn ?? defaultReadMemoryDoc;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/** Read a memory doc's raw frontmatter directly off its already-resolved
|
|
92
|
-
* `path` (from `crtr memory list`) and report whether `slash` is `true`.
|
|
93
|
-
* No directory walk, no scope reasoning — the path is already resolved. */
|
|
94
|
-
function isSlashFlagged(path: string): boolean {
|
|
95
|
-
let raw: string;
|
|
96
|
-
try {
|
|
97
|
-
raw = readFileSync(path, "utf8");
|
|
98
|
-
} catch {
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
const match = raw.match(FRONTMATTER_RE);
|
|
102
|
-
if (!match) return false;
|
|
103
|
-
let data: unknown;
|
|
104
|
-
try {
|
|
105
|
-
data = parseYaml(match[1]);
|
|
106
|
-
} catch {
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
if (data === null || typeof data !== "object" || Array.isArray(data)) return false;
|
|
110
|
-
return (data as Record<string, unknown>).slash === true;
|
|
75
|
+
function defaultReadMemoryDoc(name: string): string {
|
|
76
|
+
const path = resolvedMemoryPaths.get(name);
|
|
77
|
+
if (path === undefined) throw new Error(`memory slash document was not resolved: ${name}`);
|
|
78
|
+
return readMemoryDocContent(path);
|
|
111
79
|
}
|
|
112
80
|
|
|
113
81
|
/** `/`-joined path-derived doc name -> the registered slash-command name. */
|
|
@@ -121,7 +89,7 @@ export function slashCommandName(docName: string): string {
|
|
|
121
89
|
export async function discoverSlashDocs(): Promise<SlashDoc[]> {
|
|
122
90
|
let items: MemoryListItem[];
|
|
123
91
|
try {
|
|
124
|
-
items = await
|
|
92
|
+
items = await defaultListMemoryDocs();
|
|
125
93
|
} catch {
|
|
126
94
|
return [];
|
|
127
95
|
}
|
|
@@ -131,26 +99,13 @@ export async function discoverSlashDocs(): Promise<SlashDoc[]> {
|
|
|
131
99
|
if (item.is_dir) continue;
|
|
132
100
|
if (seen.has(item.name)) continue;
|
|
133
101
|
seen.add(item.name);
|
|
134
|
-
if (
|
|
102
|
+
if (item.slash) {
|
|
135
103
|
out.push({ name: item.name, commandName: slashCommandName(item.name), description: item.short_form });
|
|
136
104
|
}
|
|
137
105
|
}
|
|
138
106
|
return out;
|
|
139
107
|
}
|
|
140
108
|
|
|
141
|
-
/** Compose the invocation prompt from the freshly-read doc body plus the
|
|
142
|
-
* user's raw invocation args, following Claude Code's `$ARGUMENTS`
|
|
143
|
-
* convention. When the body contains `$ARGUMENTS`, every occurrence is
|
|
144
|
-
* replaced with the trimmed args (empty string when none were given) and the
|
|
145
|
-
* substituted body is injected AS-IS — the doc placed its own args, so no
|
|
146
|
-
* extra header is added. Otherwise: a short invocation header naming the
|
|
147
|
-
* command and the raw args (both the given-args and no-args cases are
|
|
148
|
-
* load-bearing, per the Hermes /learn prompt pattern this mirrors), followed
|
|
149
|
-
* by the full doc body as the instructions to follow. */
|
|
150
|
-
export function composeSlashPrompt(commandName: string, rawArgs: string, body: string): string {
|
|
151
|
-
return expandDeterministicCommand({ kind: "memory-slash", commandName, body }, rawArgs);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
109
|
export default async function (pi: ExtensionAPI) {
|
|
155
110
|
const docs = await discoverSlashDocs();
|
|
156
111
|
for (const doc of docs) {
|
|
@@ -160,7 +115,7 @@ export default async function (pi: ExtensionAPI) {
|
|
|
160
115
|
expansion = {
|
|
161
116
|
kind: "memory-slash",
|
|
162
117
|
commandName: doc.commandName,
|
|
163
|
-
body:
|
|
118
|
+
body: defaultReadMemoryDoc(doc.name),
|
|
164
119
|
};
|
|
165
120
|
} catch (err) {
|
|
166
121
|
loadError = err;
|