@north-light/crouter 0.3.173 → 0.3.174
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +198 -0
- package/dist/commands/node/create.d.ts +23 -0
- package/dist/commands/node/create.js +207 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +302 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +415 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +164 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +82 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +159 -0
- package/dist/commands/node-lifecycle-revive.js +10 -57
- package/dist/commands/node.d.ts +0 -42
- package/dist/commands/node.js +11 -2065
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +67 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +46 -0
- package/dist/commands/surface/node/placement.js +124 -0
- package/dist/commands/surface-node.js +4 -1
- package/dist/commands/surface-reload.js +1 -2
- package/dist/commands/surface-tmux-spread.js +1 -1
- package/dist/commands/surface.js +5 -20
- package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
- package/dist/commands/sys/config.js +6 -6
- package/dist/commands/sys/logs.js +1 -1
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
- package/dist/commands/sys/panels/keys-panel.js +60 -0
- package/dist/commands/sys/panels/models-panel.d.ts +77 -0
- package/dist/commands/sys/panels/models-panel.js +647 -0
- package/dist/commands/sys/panels/panel.d.ts +45 -0
- package/dist/commands/sys/panels/panel.js +137 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +80 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
- package/dist/commands/sys/panels/prefs-panel.js +85 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
- package/dist/commands/sys/panels/provider-panel.js +538 -0
- package/dist/commands/sys/settings-shell.d.ts +55 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +31 -0
- package/dist/commands/sys/setup-core.d.ts +3 -33
- package/dist/commands/sys/setup-core.js +27 -78
- package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
- package/dist/commands/sys/setup-settings-runner.js +63 -0
- package/dist/commands/sys/setup-wizard.d.ts +26 -125
- package/dist/commands/sys/setup-wizard.js +209 -2473
- package/dist/commands/sys/setup.js +5 -7
- package/dist/commands/sys.js +3 -2
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
- package/dist/core/__tests__/broker-preflight.test.js +1 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
- package/dist/core/__tests__/canvas.test.js +2 -36
- package/dist/core/__tests__/close.test.js +14 -3
- package/dist/core/__tests__/context-intro.test.js +32 -143
- package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
- package/dist/core/__tests__/daemon-boot.test.js +2 -20
- package/dist/core/__tests__/daemon-wedge.test.js +1 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +4 -98
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
- package/dist/core/__tests__/helpers/broker-clients.js +0 -14
- package/dist/core/__tests__/helpers/harness.d.ts +0 -8
- package/dist/core/__tests__/helpers/harness.js +7 -87
- package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
- package/dist/core/__tests__/kickoff.test.js +1 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
- package/dist/core/__tests__/migration.test.js +35 -48
- package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
- package/dist/core/__tests__/passive-subscription.test.js +26 -49
- package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
- package/dist/core/__tests__/prune.test.js +94 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -32
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
- package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
- package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
- package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
- package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
- package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
- package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
- package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
- package/dist/core/__tests__/secrets.test.js +1 -7
- package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
- package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
- package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
- package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
- package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
- package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
- package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
- package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
- package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
- package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
- package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
- package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
- package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
- package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
- package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
- package/dist/core/__tests__/session-model.test.js +0 -18
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
- package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
- package/dist/core/broker-client/client.d.ts +2 -2
- package/dist/core/broker-client/client.js +4 -7
- package/dist/core/broker-client/transport-relay.d.ts +13 -19
- package/dist/core/broker-client/transport-relay.js +19 -34
- package/dist/core/broker-client/transport-socket.d.ts +2 -2
- package/dist/core/broker-client/transport-socket.js +9 -2
- package/dist/core/broker-client/transport.d.ts +7 -3
- package/dist/core/broker-client/transport.js +4 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -18
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
- package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
- package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
- package/dist/core/canvas/browse/app.d.ts +2 -17
- package/dist/core/canvas/browse/app.js +16 -88
- package/dist/core/canvas/browse/model.d.ts +0 -4
- package/dist/core/canvas/browse/model.js +1 -12
- package/dist/core/canvas/browse/render.js +6 -3
- package/dist/core/canvas/crons.d.ts +8 -5
- package/dist/core/canvas/crons.js +7 -6
- package/dist/core/canvas/extensions.d.ts +7 -3
- package/dist/core/canvas/extensions.js +16 -4
- package/dist/core/canvas/nav-model.d.ts +0 -4
- package/dist/core/canvas/nav-model.js +2 -14
- package/dist/core/canvas/node-order.d.ts +3 -0
- package/dist/core/canvas/node-order.js +12 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
- package/dist/core/canvas/remote-canvas-source.js +8 -15
- package/dist/core/command.js +11 -4
- package/dist/core/config.js +3 -1
- package/dist/core/events/envelope.js +1 -1
- package/dist/core/events/read.js +7 -21
- package/dist/core/events/source.d.ts +0 -2
- package/dist/core/events/source.js +0 -16
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/fault-classifier.d.ts +1 -1
- package/dist/core/feed/passive.d.ts +0 -11
- package/dist/core/feed/passive.js +1 -62
- package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
- package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
- package/dist/core/keybindings/background-bash.js +3 -4
- package/dist/core/keybindings/catalog.js +1 -1
- package/dist/core/memory/inline-ref-grammar.js +3 -3
- package/dist/core/memory-resolver.d.ts +11 -25
- package/dist/core/memory-resolver.js +51 -33
- package/dist/core/model-routes.d.ts +15 -0
- package/dist/core/model-routes.js +12 -0
- package/dist/core/pool-credential-store.js +1 -1
- package/dist/core/preview-registry.js +8 -9
- package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
- package/dist/core/review/realize.d.ts +0 -13
- package/dist/core/review/realize.js +0 -40
- package/dist/core/review/types.d.ts +1 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
- package/dist/core/runtime/bearings.js +1 -11
- package/dist/core/runtime/broker/client-registry.d.ts +33 -0
- package/dist/core/runtime/broker/client-registry.js +164 -0
- package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
- package/dist/core/runtime/broker/daemon-ops.js +49 -0
- package/dist/core/runtime/broker/event-projection.d.ts +42 -0
- package/dist/core/runtime/broker/event-projection.js +178 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
- package/dist/core/runtime/broker/fault-retry.js +277 -0
- package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
- package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
- package/dist/core/runtime/broker/inbox.d.ts +22 -0
- package/dist/core/runtime/broker/inbox.js +167 -0
- package/dist/core/runtime/broker/passive.d.ts +16 -0
- package/dist/core/runtime/broker/passive.js +44 -0
- package/dist/core/runtime/broker/read-ops.d.ts +23 -0
- package/dist/core/runtime/broker/read-ops.js +150 -0
- package/dist/core/runtime/broker/rebind.d.ts +74 -0
- package/dist/core/runtime/broker/rebind.js +211 -0
- package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
- package/dist/core/runtime/broker/tool-groups.js +244 -0
- package/dist/core/runtime/broker-extension-render.d.ts +11 -0
- package/dist/core/runtime/broker-extension-render.js +181 -0
- package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
- package/dist/core/runtime/broker-persona-guidance.js +58 -0
- package/dist/core/runtime/broker-protocol.d.ts +1 -1
- package/dist/core/runtime/broker-protocol.js +1 -1
- package/dist/core/runtime/broker.d.ts +5 -196
- package/dist/core/runtime/broker.js +276 -3059
- package/dist/core/runtime/canvas-extensions.js +11 -2
- package/dist/core/runtime/fault.js +1 -1
- package/dist/core/runtime/model-selection.d.ts +9 -0
- package/dist/core/runtime/model-selection.js +12 -0
- package/dist/core/runtime/model-swap.d.ts +3 -3
- package/dist/core/runtime/model-swap.js +33 -25
- package/dist/core/runtime/placement-tmux.d.ts +3 -14
- package/dist/core/runtime/placement-tmux.js +11 -80
- package/dist/core/runtime/placement.d.ts +4 -2
- package/dist/core/runtime/placement.js +7 -12
- package/dist/core/runtime/promote.d.ts +14 -1
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +8 -0
- package/dist/core/runtime/spawn.js +36 -6
- package/dist/core/runtime/stop-guard.d.ts +4 -3
- package/dist/core/runtime/stop-guard.js +36 -18
- package/dist/core/runtime/stop-signals.d.ts +4 -1
- package/dist/core/runtime/stream-watchdog.js +4 -5
- package/dist/core/runtime/structured-output.d.ts +15 -2
- package/dist/core/runtime/structured-output.js +35 -12
- package/dist/core/runtime/tmux-bindings.d.ts +25 -0
- package/dist/core/runtime/tmux-bindings.js +682 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -1
- package/dist/core/runtime/tmux-chrome.js +3 -2
- package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
- package/dist/core/runtime/tmux-driver.js +598 -0
- package/dist/core/runtime/view-socket.d.ts +14 -0
- package/dist/core/runtime/view-socket.js +83 -0
- package/dist/core/session-model/session-state.d.ts +1 -2
- package/dist/core/session-model/session-state.js +5 -8
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +2 -2
- package/dist/core/substrate/gate.d.ts +1 -1
- package/dist/core/substrate/on-read-pure.d.ts +7 -0
- package/dist/core/substrate/on-read-pure.js +272 -0
- package/dist/core/termrender/termrender.js +32 -2
- package/dist/core/user-settings.d.ts +23 -1
- package/dist/core/user-settings.js +18 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
- package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
- package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
- package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
- package/dist/daemon/api/bridge.js +40 -81
- package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
- package/dist/daemon/api/handlers/broker-ops.js +383 -0
- package/dist/daemon/api/handlers/crons.js +9 -4
- package/dist/daemon/api/handlers/files.js +6 -7
- package/dist/daemon/api/handlers/inbox.js +2 -340
- package/dist/daemon/api/handlers/nodes.d.ts +10 -1
- package/dist/daemon/api/handlers/nodes.js +74 -39
- package/dist/daemon/api/handlers/review-comments.js +5 -1
- package/dist/daemon/api/handlers/reviews.js +0 -19
- package/dist/daemon/api/map.js +25 -4
- package/dist/daemon/api/router.js +2 -3
- package/dist/daemon/api/server.js +5 -7
- package/dist/daemon/cron-run.d.ts +4 -0
- package/dist/daemon/cron-run.js +30 -13
- package/dist/daemon/crtrd.d.ts +3 -58
- package/dist/daemon/crtrd.js +28 -1244
- package/dist/daemon/manage.js +0 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
- package/dist/daemon/reconcilers/broker-supervision.js +549 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
- package/dist/daemon/reconcilers/cron-lane.js +32 -0
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
- package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
- package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
- package/dist/daemon/review/finish.js +2 -5
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
- package/dist/pi-extensions/broker-local.d.ts +20 -0
- package/dist/pi-extensions/broker-local.js +89 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
- package/dist/pi-extensions/canvas-context-intro.js +22 -11
- package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
- package/dist/pi-extensions/canvas-goal-capture.js +7 -12
- package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
- package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
- package/dist/pi-extensions/canvas-passive-context.js +22 -18
- package/dist/pi-extensions/canvas-recap.d.ts +2 -2
- package/dist/pi-extensions/canvas-recap.js +48 -21
- package/dist/pi-extensions/canvas-review-boundary.js +10 -4
- package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
- package/dist/pi-extensions/canvas-stophook.js +149 -431
- package/dist/pi-extensions/canvas-structured-output.js +52 -30
- package/dist/pi-extensions/envelope-merge.d.ts +13 -0
- package/dist/pi-extensions/envelope-merge.js +29 -0
- package/dist/shared/working-activity.d.ts +3 -2
- package/dist/shared/working-activity.js +3 -2
- package/dist/types.d.ts +6 -5
- package/dist/types.js +2 -2
- package/docs/compat/hearth-crtr-v1.md +4 -12
- package/docs/compat/hearth-crtr-v2.md +3 -11
- package/docs/compat/hearth-crtr-v3.md +4 -12
- package/docs/compat/hearth-crtr-v4.md +3 -11
- package/docs/compat/hearth-crtr-v5.md +3 -11
- package/docs/public-api.md +3 -7
- package/package.json +7 -49
- package/runtime.lock.json +2766 -14533
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
- package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
- package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
- package/dist/clients/conversation/conversation.d.ts +0 -65
- package/dist/clients/conversation/conversation.js +0 -318
- package/dist/clients/conversation/frames.d.ts +0 -30
- package/dist/clients/conversation/frames.js +0 -52
- package/dist/clients/conversation/region.d.ts +0 -51
- package/dist/clients/conversation/region.js +0 -265
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
- package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
- package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
- package/dist/clients/inbox/review/columns.d.ts +0 -22
- package/dist/clients/inbox/review/columns.js +0 -40
- package/dist/clients/inbox/review/composition.d.ts +0 -60
- package/dist/clients/inbox/review/composition.js +0 -278
- package/dist/clients/inbox/review/document-region.d.ts +0 -120
- package/dist/clients/surfaces/region.d.ts +0 -16
- package/dist/clients/web/__tests__/push-engine.test.js +0 -158
- package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
- package/dist/clients/web/__tests__/push-registry.test.js +0 -177
- package/dist/clients/web/dev-server.d.ts +0 -7
- package/dist/clients/web/dev-server.js +0 -46
- package/dist/clients/web/events.d.ts +0 -19
- package/dist/clients/web/events.js +0 -163
- package/dist/clients/web/push-engine.d.ts +0 -44
- package/dist/clients/web/push-engine.js +0 -125
- package/dist/clients/web/push-registry.d.ts +0 -85
- package/dist/clients/web/push-registry.js +0 -373
- package/dist/clients/web/server.d.ts +0 -19
- package/dist/clients/web/server.js +0 -661
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
- package/dist/clients/web/web-client/shared/protocol.js +0 -8
- package/dist/clients/web/web-cmd.d.ts +0 -2
- package/dist/clients/web/web-cmd.js +0 -141
- package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
- package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
- package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
- package/dist/commands/__tests__/canvas-config.test.js +0 -107
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
- package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
- package/dist/commands/__tests__/search-contents.test.js +0 -52
- package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/lint.test.js +0 -15
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
- package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
- package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
- package/dist/core/__tests__/finalization-migration.test.js +0 -38
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
- package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
- package/dist/core/__tests__/fork.test.d.ts +0 -1
- package/dist/core/__tests__/fork.test.js +0 -108
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
- package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
- package/dist/core/__tests__/full/cascade-close.test.js +0 -240
- package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/detach-focus.test.js +0 -126
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
- package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.js +0 -60
- package/dist/core/__tests__/model-routes.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes.test.js +0 -41
- package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-identity.test.js +0 -61
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
- package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
- package/dist/core/__tests__/prune-to-limit.test.js +0 -126
- package/dist/core/__tests__/reset.test.d.ts +0 -1
- package/dist/core/__tests__/reset.test.js +0 -69
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
- package/dist/core/__tests__/steer-note.test.d.ts +0 -1
- package/dist/core/__tests__/steer-note.test.js +0 -41
- package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
- package/dist/core/__tests__/subcommand-tier.test.js +0 -99
- package/dist/core/__tests__/subscription-delivery.test.js +0 -211
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
- package/dist/core/__tests__/tmux-surface.test.js +0 -484
- package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
- package/dist/core/__tests__/wake-bearings.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
- package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
- package/dist/core/canvas/remote-event-stream.d.ts +0 -24
- package/dist/core/canvas/remote-event-stream.js +0 -94
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
- package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
- package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
- package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
- package/dist/core/human/__tests__/visible-paths.test.js +0 -28
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
- package/dist/core/review/__tests__/project.test.d.ts +0 -1
- package/dist/core/review/__tests__/project.test.js +0 -71
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
- package/dist/core/runtime/tmux.js +0 -1314
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
- package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/inbox.test.js +0 -489
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
- package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +0 -17
- package/dist/web-client/manifest.webmanifest +0 -1
- package/dist/web-client/sw.js +0 -1
- /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
- /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
- /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
- /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
- /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
- /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
- /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
- /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
- /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
- /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
|
@@ -13,16 +13,27 @@
|
|
|
13
13
|
// 'toolUse' (pi-ai's StopReason), NEVER 'stop'. Gating the steer path on
|
|
14
14
|
// stopReason 'stop'/'length' made runContinues unconditionally false, so the
|
|
15
15
|
// nudge was ALWAYS appended as nextTurn and never steered mid-run.
|
|
16
|
-
import { test, before, after, beforeEach } from 'node:test';
|
|
16
|
+
import { test, before, after, beforeEach, afterEach } from 'node:test';
|
|
17
17
|
import assert from 'node:assert/strict';
|
|
18
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
18
|
+
import { existsSync, mkdtempSync, mkdirSync, rmSync } from 'node:fs';
|
|
19
19
|
import { tmpdir } from 'node:os';
|
|
20
20
|
import { join } from 'node:path';
|
|
21
21
|
import registerCanvasStophook from '../canvas-stophook.js';
|
|
22
22
|
import { createNode } from '../../core/canvas/canvas.js';
|
|
23
23
|
import { closeDb } from '../../core/canvas/db.js';
|
|
24
|
+
import { apiSocketPath } from '../../core/canvas/paths.js';
|
|
25
|
+
import { createApiServer } from '../../daemon/api/server.js';
|
|
24
26
|
let home;
|
|
25
27
|
let origNode;
|
|
28
|
+
let server;
|
|
29
|
+
async function waitForSocket(path) {
|
|
30
|
+
for (let i = 0; i < 200; i++) {
|
|
31
|
+
if (existsSync(path))
|
|
32
|
+
return;
|
|
33
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
34
|
+
}
|
|
35
|
+
throw new Error(`api socket never bound at ${path}`);
|
|
36
|
+
}
|
|
26
37
|
function node(id) {
|
|
27
38
|
return {
|
|
28
39
|
node_id: id,
|
|
@@ -45,7 +56,7 @@ function makeFakePi() {
|
|
|
45
56
|
sendMessage(m, options) {
|
|
46
57
|
this.held.push({ customType: m.customType, content: m.content, deliverAs: options?.deliverAs, triggerTurn: options?.triggerTurn });
|
|
47
58
|
},
|
|
48
|
-
fire(e, ev, ctx) { handlers[e]?.(ev, ctx); },
|
|
59
|
+
async fire(e, ev, ctx) { await handlers[e]?.(ev, ctx); },
|
|
49
60
|
};
|
|
50
61
|
}
|
|
51
62
|
/** A turn_end event whose assistant message crossed a steering band. A
|
|
@@ -56,12 +67,18 @@ function turnEnd(content, stopReason = 'stop') {
|
|
|
56
67
|
}
|
|
57
68
|
const ctxAt = (tokens) => ({ getContextUsage: () => ({ tokens }) });
|
|
58
69
|
before(() => { origNode = process.env['CRTR_NODE_ID']; });
|
|
59
|
-
beforeEach(() => {
|
|
70
|
+
beforeEach(async () => {
|
|
60
71
|
closeDb();
|
|
61
72
|
if (home)
|
|
62
73
|
rmSync(home, { recursive: true, force: true });
|
|
63
74
|
home = mkdtempSync(join(tmpdir(), 'crtr-stophook-nudge-'));
|
|
64
75
|
process.env['CRTR_HOME'] = home;
|
|
76
|
+
mkdirSync(home, { recursive: true });
|
|
77
|
+
server = createApiServer();
|
|
78
|
+
await waitForSocket(apiSocketPath());
|
|
79
|
+
});
|
|
80
|
+
afterEach(async () => {
|
|
81
|
+
await server.close();
|
|
65
82
|
});
|
|
66
83
|
after(() => {
|
|
67
84
|
closeDb();
|
|
@@ -73,23 +90,23 @@ after(() => {
|
|
|
73
90
|
else
|
|
74
91
|
process.env['CRTR_NODE_ID'] = origNode;
|
|
75
92
|
});
|
|
76
|
-
test('band crossing mid-run (tool calls present) → context nudge is a STEER', () => {
|
|
93
|
+
test('band crossing mid-run (tool calls present) → context nudge is a STEER', async () => {
|
|
77
94
|
createNode(node('midrun'));
|
|
78
95
|
process.env['CRTR_NODE_ID'] = 'midrun';
|
|
79
96
|
const pi = makeFakePi();
|
|
80
97
|
registerCanvasStophook(pi);
|
|
81
|
-
pi.fire('turn_end', turnEnd([{ type: 'toolCall', id: 't1', name: 'bash', arguments: {} }], 'toolUse'), ctxAt(150_000));
|
|
98
|
+
await pi.fire('turn_end', turnEnd([{ type: 'toolCall', id: 't1', name: 'bash', arguments: {} }], 'toolUse'), ctxAt(150_000));
|
|
82
99
|
assert.equal(pi.steered.length, 1, 'exactly one steer delivered');
|
|
83
100
|
assert.equal(pi.steered[0].deliverAs, 'steer');
|
|
84
101
|
assert.match(pi.steered[0].content, /^\[crtr\] Context ~150k/);
|
|
85
102
|
assert.equal(pi.held.length, 0, 'nothing held for nextTurn');
|
|
86
103
|
});
|
|
87
|
-
test('band crossing on the FINAL message (no tool calls) → nudge is HELD as nextTurn, never a steer', () => {
|
|
104
|
+
test('band crossing on the FINAL message (no tool calls) → nudge is HELD as nextTurn, never a steer', async () => {
|
|
88
105
|
createNode(node('final'));
|
|
89
106
|
process.env['CRTR_NODE_ID'] = 'final';
|
|
90
107
|
const pi = makeFakePi();
|
|
91
108
|
registerCanvasStophook(pi);
|
|
92
|
-
pi.fire('turn_end', turnEnd([{ type: 'text', text: 'here is my summary' }]), ctxAt(150_000));
|
|
109
|
+
await pi.fire('turn_end', turnEnd([{ type: 'text', text: 'here is my summary' }]), ctxAt(150_000));
|
|
93
110
|
assert.equal(pi.steered.length, 0, 'no steer — a steer here would extend the run past the closing reply');
|
|
94
111
|
assert.equal(pi.held.length, 1, 'nudge held for the next user message');
|
|
95
112
|
assert.equal(pi.held[0].deliverAs, 'nextTurn');
|
|
@@ -97,24 +114,24 @@ test('band crossing on the FINAL message (no tool calls) → nudge is HELD as ne
|
|
|
97
114
|
assert.match(pi.held[0].content, /^\[crtr\] Context ~150k/);
|
|
98
115
|
assert.notEqual(pi.held[0].triggerTurn, true, 'must not trigger a turn');
|
|
99
116
|
});
|
|
100
|
-
test('a truncated tool-calling turn (stopReason length) still steers — the loop continues past failed calls', () => {
|
|
117
|
+
test('a truncated tool-calling turn (stopReason length) still steers — the loop continues past failed calls', async () => {
|
|
101
118
|
createNode(node('lengthrun'));
|
|
102
119
|
process.env['CRTR_NODE_ID'] = 'lengthrun';
|
|
103
120
|
const pi = makeFakePi();
|
|
104
121
|
registerCanvasStophook(pi);
|
|
105
|
-
pi.fire('turn_end', turnEnd([{ type: 'toolCall', id: 't1', name: 'bash', arguments: {} }], 'length'), ctxAt(150_000));
|
|
122
|
+
await pi.fire('turn_end', turnEnd([{ type: 'toolCall', id: 't1', name: 'bash', arguments: {} }], 'length'), ctxAt(150_000));
|
|
106
123
|
assert.equal(pi.steered.length, 1);
|
|
107
124
|
assert.equal(pi.steered[0].deliverAs, 'steer');
|
|
108
125
|
assert.equal(pi.held.length, 0);
|
|
109
126
|
});
|
|
110
|
-
test('an aborted final turn also holds (the loop ends unconditionally on abort)', () => {
|
|
127
|
+
test('an aborted final turn also holds (the loop ends unconditionally on abort)', async () => {
|
|
111
128
|
createNode(node('aborted'));
|
|
112
129
|
process.env['CRTR_NODE_ID'] = 'aborted';
|
|
113
130
|
const pi = makeFakePi();
|
|
114
131
|
registerCanvasStophook(pi);
|
|
115
132
|
// Aborted mid-tool-call: toolCall content present, but the run ends anyway —
|
|
116
133
|
// a steer would sit queued and leak into the NEXT run's start instead.
|
|
117
|
-
pi.fire('turn_end', turnEnd([{ type: 'toolCall', id: 't1', name: 'bash', arguments: {} }], 'aborted'), ctxAt(150_000));
|
|
134
|
+
await pi.fire('turn_end', turnEnd([{ type: 'toolCall', id: 't1', name: 'bash', arguments: {} }], 'aborted'), ctxAt(150_000));
|
|
118
135
|
assert.equal(pi.steered.length, 0);
|
|
119
136
|
assert.equal(pi.held.length, 1);
|
|
120
137
|
assert.equal(pi.held[0].deliverAs, 'nextTurn');
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { REVIVE_KICKOFF_SENTINEL } from '../shared/generated-context.js';
|
|
2
|
+
export { REVIVE_KICKOFF_SENTINEL };
|
|
3
|
+
/** Persist a bare root's first real interactive message without clobbering an
|
|
4
|
+
* existing spawning mandate. This is broker-local file state, not canvas.db. */
|
|
5
|
+
export declare function captureGoalIfAbsent(nodeId: string, text: string): boolean;
|
|
6
|
+
/** Read the node-owned roadmap without importing the canvas state store. */
|
|
7
|
+
export declare function readRoadmap(nodeId: string): string | null;
|
|
8
|
+
/** Generate and commit the first name for a node. The initial operation is
|
|
9
|
+
* guarded by crtrd, so a concurrent rename or another broker cannot be
|
|
10
|
+
* overwritten after this projection becomes stale. */
|
|
11
|
+
export declare function generateAndCommitInitialName(nodeId: string, prompt: string, onNamed?: (editorLabel: string) => void): void;
|
|
12
|
+
/** Generate and commit a recap-driven name against the exact node projection
|
|
13
|
+
* captured before the one-shot model call. The daemon owns the compare-and-set
|
|
14
|
+
* so a human rename or another generated update wins without a fallback write. */
|
|
15
|
+
export declare function generateAndCommitRecapName(nodeId: string, conversation: string, expected: {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
icon: string;
|
|
19
|
+
kind: string;
|
|
20
|
+
}, isStillAutomatic: () => boolean, onNamed?: (editorLabel: string) => void): void;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Broker-local filesystem and naming helpers.
|
|
2
|
+
//
|
|
3
|
+
// These helpers are intentionally independent of the canvas state store. A
|
|
4
|
+
// broker may read its own context files directly, but all node metadata reads
|
|
5
|
+
// and generated-name writes go through crtrd's broker operation projection.
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
7
|
+
import { homedir } from 'node:os';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { CRTR_DIR_NAME } from '../types.js';
|
|
10
|
+
import { REVIVE_KICKOFF_SENTINEL } from '../shared/generated-context.js';
|
|
11
|
+
import { brokerExtensionState, commitBrokerGeneratedName, } from '../core/runtime/broker/daemon-ops.js';
|
|
12
|
+
import { headlessName, headlessNameFromConversation, sanitizeSessionName, slugFromPrompt, } from '../core/runtime/naming.js';
|
|
13
|
+
export { REVIVE_KICKOFF_SENTINEL };
|
|
14
|
+
function contextDir(nodeId) {
|
|
15
|
+
if (nodeId === '' || nodeId === '.' || nodeId === '..' || /[\\/\0]/u.test(nodeId)) {
|
|
16
|
+
throw new TypeError('node_id must be a non-empty path segment');
|
|
17
|
+
}
|
|
18
|
+
const canvasHome = process.env['CRTR_HOME']?.trim() || join(homedir(), CRTR_DIR_NAME, 'canvas');
|
|
19
|
+
return join(canvasHome, 'nodes', nodeId, 'context');
|
|
20
|
+
}
|
|
21
|
+
/** Persist a bare root's first real interactive message without clobbering an
|
|
22
|
+
* existing spawning mandate. This is broker-local file state, not canvas.db. */
|
|
23
|
+
export function captureGoalIfAbsent(nodeId, text) {
|
|
24
|
+
const dir = contextDir(nodeId);
|
|
25
|
+
const path = join(dir, 'initial-prompt.md');
|
|
26
|
+
if (existsSync(path) && readFileSync(path, 'utf8').trim() !== '')
|
|
27
|
+
return false;
|
|
28
|
+
const body = text.trim();
|
|
29
|
+
if (body === '')
|
|
30
|
+
return false;
|
|
31
|
+
mkdirSync(dir, { recursive: true });
|
|
32
|
+
writeFileSync(path, `${body}\n`, 'utf8');
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
/** Read the node-owned roadmap without importing the canvas state store. */
|
|
36
|
+
export function readRoadmap(nodeId) {
|
|
37
|
+
const path = join(contextDir(nodeId), 'roadmap.md');
|
|
38
|
+
return existsSync(path) ? readFileSync(path, 'utf8') : null;
|
|
39
|
+
}
|
|
40
|
+
function generatedDescription(source, generated) {
|
|
41
|
+
return sanitizeSessionName(generated.name) || slugFromPrompt(source);
|
|
42
|
+
}
|
|
43
|
+
/** Generate and commit the first name for a node. The initial operation is
|
|
44
|
+
* guarded by crtrd, so a concurrent rename or another broker cannot be
|
|
45
|
+
* overwritten after this projection becomes stale. */
|
|
46
|
+
export function generateAndCommitInitialName(nodeId, prompt, onNamed) {
|
|
47
|
+
const body = prompt.trim();
|
|
48
|
+
if (body === '')
|
|
49
|
+
return;
|
|
50
|
+
void brokerExtensionState(nodeId)
|
|
51
|
+
.then((state) => {
|
|
52
|
+
if ((state.node.description ?? '').trim() !== '')
|
|
53
|
+
return undefined;
|
|
54
|
+
return headlessName(body).then((generated) => commitBrokerGeneratedName(nodeId, {
|
|
55
|
+
kind: 'initial',
|
|
56
|
+
description: generatedDescription(body, generated),
|
|
57
|
+
icon: generated.icon,
|
|
58
|
+
}));
|
|
59
|
+
})
|
|
60
|
+
.then((result) => {
|
|
61
|
+
if (result?.applied && result.editorLabel !== undefined)
|
|
62
|
+
onNamed?.(result.editorLabel);
|
|
63
|
+
})
|
|
64
|
+
.catch(() => { });
|
|
65
|
+
}
|
|
66
|
+
/** Generate and commit a recap-driven name against the exact node projection
|
|
67
|
+
* captured before the one-shot model call. The daemon owns the compare-and-set
|
|
68
|
+
* so a human rename or another generated update wins without a fallback write. */
|
|
69
|
+
export function generateAndCommitRecapName(nodeId, conversation, expected, isStillAutomatic, onNamed) {
|
|
70
|
+
const body = conversation.trim();
|
|
71
|
+
if (body === '')
|
|
72
|
+
return;
|
|
73
|
+
void headlessNameFromConversation(body)
|
|
74
|
+
.then((generated) => {
|
|
75
|
+
if (!isStillAutomatic())
|
|
76
|
+
return undefined;
|
|
77
|
+
return commitBrokerGeneratedName(nodeId, {
|
|
78
|
+
kind: 'recap',
|
|
79
|
+
description: generatedDescription(body, generated),
|
|
80
|
+
icon: generated.icon,
|
|
81
|
+
expected,
|
|
82
|
+
});
|
|
83
|
+
})
|
|
84
|
+
.then((result) => {
|
|
85
|
+
if (result?.applied && result.editorLabel !== undefined)
|
|
86
|
+
onNamed?.(result.editorLabel);
|
|
87
|
+
})
|
|
88
|
+
.catch(() => { });
|
|
89
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CONTEXT_INTRO_CUSTOM_TYPE } from '../
|
|
1
|
+
import { CONTEXT_INTRO_CUSTOM_TYPE } from '../shared/generated-context.js';
|
|
2
2
|
/** The `customType` stamped on the injected session message. Used both to write
|
|
3
3
|
* the entry and to detect it on resume (the idempotency guard). Defined beside
|
|
4
4
|
* the block builder in `core/runtime/bearings.ts` because the warm-pool claim's
|
|
@@ -68,10 +68,10 @@ interface PiLike {
|
|
|
68
68
|
}
|
|
69
69
|
/** Build the full bearings baseline for a conversation without inherited
|
|
70
70
|
* crouter context. Exported for testing. */
|
|
71
|
-
export declare function buildContextIntro(nodeId: string): string
|
|
71
|
+
export declare function buildContextIntro(nodeId: string): Promise<string>;
|
|
72
72
|
/** Build the compact node-scoped update for a fork whose copied branch already
|
|
73
73
|
* carries a full crouter baseline. Exported for testing. */
|
|
74
|
-
export declare function buildForkContextIntro(nodeId: string): string
|
|
74
|
+
export declare function buildForkContextIntro(nodeId: string): Promise<string>;
|
|
75
75
|
/**
|
|
76
76
|
* Renderer for `crtr-context` messages. Collapsed (default) shows a one-line
|
|
77
77
|
* stub; expanded (Ctrl+O) shows the label + full body. Returns a plain object
|
|
@@ -26,8 +26,10 @@
|
|
|
26
26
|
//
|
|
27
27
|
// Plain TS-with-types — no imports from @earendil-works/* so this compiles inside
|
|
28
28
|
// crouter's own tsc build without a dep on the pi packages.
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
29
|
+
import { CONTEXT_INTRO_CUSTOM_TYPE } from '../shared/generated-context.js';
|
|
30
|
+
import { brokerExtensionState } from '../core/runtime/broker/daemon-ops.js';
|
|
31
|
+
import { buildContextBearingsFromState, buildForkBearingsFromState, buildProjectContextBlockForBroker } from '../core/runtime/broker-extension-render.js';
|
|
32
|
+
import { situationalContextBlock } from '../core/runtime/situational-context.js';
|
|
31
33
|
/** The `customType` stamped on the injected session message. Used both to write
|
|
32
34
|
* the entry and to detect it on resume (the idempotency guard). Defined beside
|
|
33
35
|
* the block builder in `core/runtime/bearings.ts` because the warm-pool claim's
|
|
@@ -38,13 +40,15 @@ export { CONTEXT_INTRO_CUSTOM_TYPE };
|
|
|
38
40
|
// ---------------------------------------------------------------------------
|
|
39
41
|
/** Build the full bearings baseline for a conversation without inherited
|
|
40
42
|
* crouter context. Exported for testing. */
|
|
41
|
-
export function buildContextIntro(nodeId) {
|
|
42
|
-
|
|
43
|
+
export async function buildContextIntro(nodeId) {
|
|
44
|
+
const state = await brokerExtensionState(nodeId);
|
|
45
|
+
return buildContextBearingsFromState(state, buildProjectContextBlockForBroker(state.node.cwd), situationalContextBlock(nodeId));
|
|
43
46
|
}
|
|
44
47
|
/** Build the compact node-scoped update for a fork whose copied branch already
|
|
45
48
|
* carries a full crouter baseline. Exported for testing. */
|
|
46
|
-
export function buildForkContextIntro(nodeId) {
|
|
47
|
-
|
|
49
|
+
export async function buildForkContextIntro(nodeId) {
|
|
50
|
+
const state = await brokerExtensionState(nodeId);
|
|
51
|
+
return buildForkBearingsFromState(state, situationalContextBlock(nodeId));
|
|
48
52
|
}
|
|
49
53
|
// ---------------------------------------------------------------------------
|
|
50
54
|
// Collapsed-by-default rendering
|
|
@@ -141,13 +145,20 @@ export function registerCanvasContextIntro(pi) {
|
|
|
141
145
|
// Collapse the block to a one-liner until the user expands tool output (Ctrl+O).
|
|
142
146
|
// Harmless to register outside TUI mode (it's only consulted while rendering).
|
|
143
147
|
pi.registerMessageRenderer(CONTEXT_INTRO_CUSTOM_TYPE, renderContextMessage);
|
|
144
|
-
pi.on('session_start', (_event, ctx) => {
|
|
148
|
+
pi.on('session_start', async (_event, ctx) => {
|
|
145
149
|
const nodeId = process.env['CRTR_NODE_ID'];
|
|
146
150
|
if (nodeId === undefined || nodeId.trim() === '')
|
|
147
151
|
return;
|
|
148
152
|
// Warm spares have no claimant yet. Their claim path delivers the full
|
|
149
153
|
// baseline after assigning the real persona, profile, and working directory.
|
|
150
|
-
|
|
154
|
+
let state;
|
|
155
|
+
try {
|
|
156
|
+
state = await brokerExtensionState(nodeId);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (state.warm_spare)
|
|
151
162
|
return;
|
|
152
163
|
// The active branch, rather than the whole session file, is the context the
|
|
153
164
|
// next turn sees. A new cycle therefore receives its own current baseline.
|
|
@@ -161,10 +172,10 @@ export function registerCanvasContextIntro(pi) {
|
|
|
161
172
|
// A copied crouter branch already carries the shared baseline. Append only
|
|
162
173
|
// this fork's new node-scoped facts. A non-crouter branch has no such entry.
|
|
163
174
|
const inherited = contextEntries.length > 0;
|
|
164
|
-
const forked =
|
|
175
|
+
const forked = state.node.fork_from !== null;
|
|
165
176
|
const content = inherited && forked
|
|
166
|
-
?
|
|
167
|
-
:
|
|
177
|
+
? buildForkBearingsFromState(state, situationalContextBlock(nodeId))
|
|
178
|
+
: buildContextBearingsFromState(state, buildProjectContextBlockForBroker(state.node.cwd), situationalContextBlock(nodeId));
|
|
168
179
|
pi.sendMessage({
|
|
169
180
|
customType: CONTEXT_INTRO_CUSTOM_TYPE,
|
|
170
181
|
content,
|
|
@@ -32,9 +32,12 @@
|
|
|
32
32
|
// with no dep on the pi packages. Mirrors canvas-context-intro.ts.
|
|
33
33
|
import { homedir } from 'node:os';
|
|
34
34
|
import { join, resolve } from 'node:path';
|
|
35
|
-
import {
|
|
35
|
+
import { brokerExtensionState } from '../core/runtime/broker/daemon-ops.js';
|
|
36
|
+
import { renderPreferencesFromState } from '../core/runtime/broker-extension-render.js';
|
|
37
|
+
import { renderOnReadDocsForSubject } from '../core/substrate/on-read-pure.js';
|
|
36
38
|
import { clearSessionCache } from '../core/substrate/session-cache.js';
|
|
37
39
|
import { loadInjectedDocs, saveInjectedDocs } from '../core/substrate/injected-store.js';
|
|
40
|
+
import { autoLoadedContextInner, mergeAutoLoadedContext } from './envelope-merge.js';
|
|
38
41
|
// ---------------------------------------------------------------------------
|
|
39
42
|
// Extension
|
|
40
43
|
// ---------------------------------------------------------------------------
|
|
@@ -43,31 +46,6 @@ import { loadInjectedDocs, saveInjectedDocs } from '../core/substrate/injected-s
|
|
|
43
46
|
* to reach for while reading the tools, so memory docs/preferences must sit
|
|
44
47
|
* there, not far below. Falls back to appending if absent. */
|
|
45
48
|
const TOOLS_ANCHOR = '\n\nGuidelines:';
|
|
46
|
-
const AUTO_CONTEXT_RE = /<auto-loaded-context(?:\s[^>]*)?>\n([\s\S]*?)\n<\/auto-loaded-context>/;
|
|
47
|
-
function mergeAutoLoadedContext(injected, content) {
|
|
48
|
-
const match = injected.match(AUTO_CONTEXT_RE);
|
|
49
|
-
const inner = match?.[1]?.trim();
|
|
50
|
-
if (!inner)
|
|
51
|
-
return content;
|
|
52
|
-
const existingText = content.map((block) => block.text ?? '').join('\n');
|
|
53
|
-
if (existingText.includes(inner))
|
|
54
|
-
return content;
|
|
55
|
-
const existingIdx = content.findIndex((block) => typeof block.text === 'string' && AUTO_CONTEXT_RE.test(block.text));
|
|
56
|
-
if (existingIdx !== -1) {
|
|
57
|
-
return content.map((block, idx) => {
|
|
58
|
-
if (idx !== existingIdx || typeof block.text !== 'string')
|
|
59
|
-
return block;
|
|
60
|
-
return {
|
|
61
|
-
...block,
|
|
62
|
-
text: block.text.replace(AUTO_CONTEXT_RE, (_whole, current) => {
|
|
63
|
-
const trimmed = String(current).trim();
|
|
64
|
-
return `<auto-loaded-context>\n${inner}${trimmed === '' ? '' : `\n${trimmed}`}\n</auto-loaded-context>`;
|
|
65
|
-
}),
|
|
66
|
-
};
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
return [{ type: 'text', text: `<auto-loaded-context>\n${inner}\n</auto-loaded-context>` }, ...content];
|
|
70
|
-
}
|
|
71
49
|
/**
|
|
72
50
|
* Register the document substrate's pi hooks on `pi`.
|
|
73
51
|
*
|
|
@@ -100,9 +78,10 @@ export function registerCanvasDocSubstrate(pi) {
|
|
|
100
78
|
// is never empty even when no preference is eligible. (The knowledge catalog
|
|
101
79
|
// no longer enters the system prompt — it rides the bearings message via
|
|
102
80
|
// renderKnowledgeBlock.)
|
|
103
|
-
pi.on('before_agent_start', (event) => {
|
|
81
|
+
pi.on('before_agent_start', async (event) => {
|
|
104
82
|
try {
|
|
105
|
-
const
|
|
83
|
+
const state = await brokerExtensionState(nodeId);
|
|
84
|
+
const block = renderPreferencesFromState(state);
|
|
106
85
|
if (block === '')
|
|
107
86
|
return; // nothing eligible — leave the prompt untouched
|
|
108
87
|
const idx = event.systemPrompt.indexOf(TOOLS_ANCHOR);
|
|
@@ -118,7 +97,7 @@ export function registerCanvasDocSubstrate(pi) {
|
|
|
118
97
|
}
|
|
119
98
|
});
|
|
120
99
|
// 2. ON-READ half — augment a non-error `read` result with surfacing docs.
|
|
121
|
-
pi.on('tool_result', (event, ctx) => {
|
|
100
|
+
pi.on('tool_result', async (event, ctx) => {
|
|
122
101
|
try {
|
|
123
102
|
if (event.toolName !== 'read' || event.isError === true)
|
|
124
103
|
return;
|
|
@@ -126,13 +105,14 @@ export function registerCanvasDocSubstrate(pi) {
|
|
|
126
105
|
const rawPath = input?.path ?? input?.file_path;
|
|
127
106
|
if (rawPath === undefined || rawPath === '')
|
|
128
107
|
return;
|
|
129
|
-
// Resolve to an absolute path (
|
|
130
|
-
// tool expands a leading `~`, but event.input keeps the raw
|
|
131
|
-
// expand it ourselves before resolving against the session cwd.
|
|
108
|
+
// Resolve to an absolute path (renderOnReadDocsForSubject realpaths it).
|
|
109
|
+
// pi's read tool expands a leading `~`, but event.input keeps the raw
|
|
110
|
+
// form, so expand it ourselves before resolving against the session cwd.
|
|
132
111
|
const cwd = typeof ctx?.cwd === 'string' && ctx.cwd !== '' ? ctx.cwd : process.cwd();
|
|
133
112
|
const expanded = rawPath.startsWith('~') ? join(homedir(), rawPath.slice(1)) : rawPath;
|
|
134
113
|
const absFile = resolve(cwd, expanded);
|
|
135
|
-
const
|
|
114
|
+
const state = await brokerExtensionState(nodeId);
|
|
115
|
+
const injected = renderOnReadDocsForSubject(state.subject, absFile, injectedDocs);
|
|
136
116
|
if (injected === '')
|
|
137
117
|
return; // nothing surfaced — pass the read through unchanged
|
|
138
118
|
// A doc surfaced → renderOnReadDocs grew injectedDocs; persist the set so
|
|
@@ -140,7 +120,10 @@ export function registerCanvasDocSubstrate(pi) {
|
|
|
140
120
|
saveInjectedDocs(nodeId, injectedDocs);
|
|
141
121
|
// Fold into any existing auto-loaded-context block from sibling read hooks;
|
|
142
122
|
// otherwise prepend one quiet block ahead of the file contents.
|
|
143
|
-
|
|
123
|
+
const inner = autoLoadedContextInner(injected);
|
|
124
|
+
if (inner === null)
|
|
125
|
+
return;
|
|
126
|
+
return { content: mergeAutoLoadedContext([inner], event.content) };
|
|
144
127
|
}
|
|
145
128
|
catch {
|
|
146
129
|
return; // inert on error — a bug must degrade a read, never break it
|
|
@@ -28,9 +28,7 @@
|
|
|
28
28
|
//
|
|
29
29
|
// Plain TS-with-types — no imports from @earendil-works/* so this compiles inside
|
|
30
30
|
// crouter's own tsc build without a dep on the pi packages.
|
|
31
|
-
import { captureGoalIfAbsent, REVIVE_KICKOFF_SENTINEL } from '
|
|
32
|
-
import { generateAndPersistName } from '../core/runtime/naming-persist.js';
|
|
33
|
-
import { editorLabel, getNode } from '../core/canvas/index.js';
|
|
31
|
+
import { captureGoalIfAbsent, generateAndCommitInitialName, REVIVE_KICKOFF_SENTINEL, } from './broker-local.js';
|
|
34
32
|
/**
|
|
35
33
|
* Register the goal-capture handler on `pi`.
|
|
36
34
|
*
|
|
@@ -65,15 +63,12 @@ export function registerCanvasGoalCapture(pi) {
|
|
|
65
63
|
// canvas extensions, so it never recurses into another spawn/name. The
|
|
66
64
|
// onNamed callback live-updates THIS session's label instead of waiting
|
|
67
65
|
// for the next cycle. The unnamed-guard keeps it to one call per node.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
catch { /* best-effort */ }
|
|
75
|
-
});
|
|
76
|
-
}
|
|
66
|
+
generateAndCommitInitialName(nodeId, text, (label) => {
|
|
67
|
+
try {
|
|
68
|
+
pi.setSessionName?.(label);
|
|
69
|
+
}
|
|
70
|
+
catch { /* best-effort */ }
|
|
71
|
+
});
|
|
77
72
|
}
|
|
78
73
|
catch {
|
|
79
74
|
// Best-effort: a capture failure must never drop or alter the message.
|