@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,8 +2,8 @@
|
|
|
2
2
|
// relay-token-authed `/__crtr/source` transport (see `remote-transport.ts`).
|
|
3
3
|
// Every method shells out to an EXISTING `crtr --json <subcommand>` in-guest —
|
|
4
4
|
// no new in-guest command, no remote SQLite read, no drive-plane verb. A
|
|
5
|
-
// short-TTL cache coalesces the
|
|
6
|
-
// otherwise make
|
|
5
|
+
// short-TTL cache coalesces the repeated reads a single remote inspection or
|
|
6
|
+
// dashboard render would otherwise make for the same node.
|
|
7
7
|
//
|
|
8
8
|
// P2 DEFERRAL (Stage-C, plan C-1/C-5): this remote path still targets the
|
|
9
9
|
// `/__crtr/source` in-guest fulfillment endpoint on a preview host, NOT the
|
|
@@ -45,7 +45,7 @@ function isValidShowResponse(x) {
|
|
|
45
45
|
if (!isPlainObject(paths) ||
|
|
46
46
|
typeof paths['context_dir'] !== 'string' ||
|
|
47
47
|
typeof paths['reports_dir'] !== 'string' ||
|
|
48
|
-
(paths['session_file'] !== null && typeof paths['session_file'] !== 'string'))
|
|
48
|
+
('session_file' in paths && paths['session_file'] !== null && typeof paths['session_file'] !== 'string'))
|
|
49
49
|
return false;
|
|
50
50
|
if (typeof x['follow_up'] !== 'string')
|
|
51
51
|
return false;
|
|
@@ -54,7 +54,7 @@ function isValidShowResponse(x) {
|
|
|
54
54
|
/** A `reports`/`managers` entry (`RemoteShowResponse`) — validated per-element
|
|
55
55
|
* because `isValidShowResponse` only checks the array wrapper. Without this,
|
|
56
56
|
* a malformed neighbor (`null`, `{}`) survives into `subscriptionsOf`/
|
|
57
|
-
* `subscribersOf`'s `.map()` and node.ts's remote `show` passthrough render,
|
|
57
|
+
* `subscribersOf`'s `.map()` and `node/inspect.ts`'s remote `show` passthrough render,
|
|
58
58
|
* both of which dereference `.node_id`/`.active` unguarded. */
|
|
59
59
|
function isValidNeighborEntry(x) {
|
|
60
60
|
return (isPlainObject(x) &&
|
|
@@ -67,8 +67,8 @@ function isValidNeighborEntry(x) {
|
|
|
67
67
|
/** A `NodeRow` element from `node inspect list`'s `nodes` array — validated
|
|
68
68
|
* per-element because a remote success payload can be `{nodes:[null]}` (the
|
|
69
69
|
* outer array check alone lets that through). Requires the string identity/
|
|
70
|
-
* lifecycle fields
|
|
71
|
-
*
|
|
70
|
+
* lifecycle fields local/API-backed row renderers dereference unguarded;
|
|
71
|
+
* the remaining nullable runtime
|
|
72
72
|
* fields (host_kind, parent, pi_pid, ...) are left to cast through as-is. */
|
|
73
73
|
function isValidNodeRow(x) {
|
|
74
74
|
if (!isPlainObject(x))
|
|
@@ -94,13 +94,6 @@ export class RemoteCanvasSource {
|
|
|
94
94
|
this.relayToken = relayToken;
|
|
95
95
|
this.exec = createRemoteExec(previewEndpoint, relayToken);
|
|
96
96
|
}
|
|
97
|
-
/** Drops every cached entry — called on a `RemoteEventStream` `'nodes'` (or
|
|
98
|
-
* `'inbox'`) event so the next read re-fetches fresh state. */
|
|
99
|
-
invalidate() {
|
|
100
|
-
this.nodeCache.clear();
|
|
101
|
-
this.rosterCache.clear();
|
|
102
|
-
this.viewCache.clear();
|
|
103
|
-
}
|
|
104
97
|
async execJson(args) {
|
|
105
98
|
let raw;
|
|
106
99
|
try {
|
|
@@ -127,7 +120,7 @@ export class RemoteCanvasSource {
|
|
|
127
120
|
const raw = await this.execJson(['node', 'inspect', 'show', id]);
|
|
128
121
|
// Sanitize reports/managers elements here (not just the outer array shape)
|
|
129
122
|
// so both consumers — subscriptionsOf/subscribersOf's `.map()` below AND
|
|
130
|
-
// node.ts's remote `show` passthrough render — see only well-formed
|
|
123
|
+
// node/inspect.ts's remote `show` passthrough render — see only well-formed
|
|
131
124
|
// neighbor entries, never a malformed one they'd dereference unguarded.
|
|
132
125
|
const res = isValidShowResponse(raw)
|
|
133
126
|
? { ...raw, reports: raw.reports.filter(isValidNeighborEntry), managers: raw.managers.filter(isValidNeighborEntry) }
|
|
@@ -136,7 +129,7 @@ export class RemoteCanvasSource {
|
|
|
136
129
|
return res;
|
|
137
130
|
}
|
|
138
131
|
/** The full passthrough object `node inspect show` produces — used by
|
|
139
|
-
* `nodeShow`'s remote branch (`src/commands/node.ts`) to return the exact
|
|
132
|
+
* `nodeShow`'s remote branch (`src/commands/node/inspect.ts`) to return the exact
|
|
140
133
|
* same shape a local read would, without re-deriving it. */
|
|
141
134
|
async rawShow(id) {
|
|
142
135
|
return this.fetchShow(id);
|
package/dist/core/command.js
CHANGED
|
@@ -18,18 +18,25 @@ import { resolve } from 'node:path';
|
|
|
18
18
|
// ---------------------------------------------------------------------------
|
|
19
19
|
// Factory functions
|
|
20
20
|
// ---------------------------------------------------------------------------
|
|
21
|
+
function freezeCommandMetadata(value) {
|
|
22
|
+
if (value === null || typeof value !== 'object' || Object.isFrozen(value))
|
|
23
|
+
return value;
|
|
24
|
+
for (const child of Object.values(value))
|
|
25
|
+
freezeCommandMetadata(child);
|
|
26
|
+
return Object.freeze(value);
|
|
27
|
+
}
|
|
21
28
|
export function defineLeaf(opts) {
|
|
22
|
-
return {
|
|
29
|
+
return Object.freeze({
|
|
23
30
|
kind: 'leaf',
|
|
24
31
|
name: opts.name,
|
|
25
32
|
description: opts.description,
|
|
26
33
|
whenToUse: opts.whenToUse,
|
|
27
34
|
tier: opts.tier,
|
|
28
|
-
help: opts.help,
|
|
29
|
-
slash: opts.slash,
|
|
35
|
+
help: freezeCommandMetadata(opts.help),
|
|
36
|
+
slash: opts.slash === undefined ? undefined : freezeCommandMetadata(opts.slash),
|
|
30
37
|
run: opts.run,
|
|
31
38
|
render: opts.render,
|
|
32
|
-
};
|
|
39
|
+
});
|
|
33
40
|
}
|
|
34
41
|
/** Number of a node's own non-hidden subcommands (direct children). Leaves and
|
|
35
42
|
* childless branches return 0. */
|
package/dist/core/config.js
CHANGED
|
@@ -452,7 +452,9 @@ function mergeConfig(partial) {
|
|
|
452
452
|
: defaults.auto_open_child_viewers;
|
|
453
453
|
const brokerThresholds = mergeBrokerThresholds(partial.brokerThresholds, defaults.brokerThresholds);
|
|
454
454
|
const completion_bell = typeof partial.completion_bell === 'boolean' ? partial.completion_bell : defaults.completion_bell;
|
|
455
|
-
const working_gerunds =
|
|
455
|
+
const working_gerunds = partial.working_gerunds === undefined
|
|
456
|
+
? [...defaults.working_gerunds]
|
|
457
|
+
: normalizeWorkingGerunds(partial.working_gerunds);
|
|
456
458
|
const whip_mode = typeof partial.whip_mode === 'boolean' ? partial.whip_mode : defaults.whip_mode;
|
|
457
459
|
const whip_messages = normalizeWhipMessages(partial.whip_messages);
|
|
458
460
|
const mouse_mode_default = MOUSE_MODE_DEFAULTS.includes(partial.mouse_mode_default)
|
|
@@ -2,7 +2,7 @@ import { errorClassCodes, eventErrorFromUnknown } from './errors.js';
|
|
|
2
2
|
import { generateOperationId, operationIdContext, validateOperationId } from './operation-id.js';
|
|
3
3
|
const eventName = /^[a-z][a-z0-9]*(?:[._][a-z0-9]+)*$/;
|
|
4
4
|
const levels = new Set(['error', 'warn', 'info', 'debug']);
|
|
5
|
-
const components = new Set(['daemon', 'broker', '
|
|
5
|
+
const components = new Set(['daemon', 'broker', 'control-plane', 'front', 'sentinel']);
|
|
6
6
|
const outcomes = new Set(['succeeded', 'failed', 'skipped']);
|
|
7
7
|
const dispositions = new Set(['auto', 'manual', 'fatal']);
|
|
8
8
|
const classes = new Set(errorClassCodes);
|
package/dist/core/events/read.js
CHANGED
|
@@ -9,7 +9,6 @@ const MAX_CANONICAL_SOURCE_BYTES = 6 * 1024 * 1024;
|
|
|
9
9
|
const MAX_RAW_SOURCE_BYTES = 256 * 1024;
|
|
10
10
|
const MAX_CANONICAL_CONTENT_BYTES = MAX_EVENT_RECORD_BYTES - 1;
|
|
11
11
|
const NO_FOLLOW_FLAG = typeof constants.O_NOFOLLOW === 'number' ? constants.O_NOFOLLOW : 0;
|
|
12
|
-
const WEB_BASENAME = /^web\.([0-9a-f]{16})\.log\.jsonl(?:\.([12]))?$/;
|
|
13
12
|
const EVENT_NAME = /^[a-z][a-z0-9]*(?:[._][a-z0-9]+)*$/;
|
|
14
13
|
const CANONICAL_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
15
14
|
const ISO_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T/;
|
|
@@ -36,7 +35,7 @@ const TOP_LEVEL_KEYS = new Set([
|
|
|
36
35
|
'dropped_fields_count',
|
|
37
36
|
]);
|
|
38
37
|
const LEVELS = new Set(['debug', 'info', 'warn', 'error']);
|
|
39
|
-
const COMPONENTS = new Set(['daemon', 'broker'
|
|
38
|
+
const COMPONENTS = new Set(['daemon', 'broker']);
|
|
40
39
|
const OUTCOMES = new Set(['succeeded', 'failed', 'skipped']);
|
|
41
40
|
const RETRY_DISPOSITIONS = new Set(['auto', 'manual', 'fatal']);
|
|
42
41
|
const ERROR_CLASSES = new Set(errorClassCodes);
|
|
@@ -167,7 +166,7 @@ function forEachDirectoryEntry(proof, consume) {
|
|
|
167
166
|
const entry = directory.readSync();
|
|
168
167
|
if (entry === null)
|
|
169
168
|
break;
|
|
170
|
-
consume(entry.name);
|
|
169
|
+
consume(entry.name, entry.isDirectory());
|
|
171
170
|
}
|
|
172
171
|
}
|
|
173
172
|
finally {
|
|
@@ -575,22 +574,6 @@ export function readLogSnapshot(query, includeRaw) {
|
|
|
575
574
|
if (rawCompatible)
|
|
576
575
|
scanRawSource(state, home, rootChain, join(home, 'crtrd.err'), 'daemon');
|
|
577
576
|
}
|
|
578
|
-
if (selected(normalized, 'web')) {
|
|
579
|
-
forEachDirectoryEntry(root, (name) => {
|
|
580
|
-
const match = WEB_BASENAME.exec(name);
|
|
581
|
-
if (match === null)
|
|
582
|
-
return;
|
|
583
|
-
const streamId = match[1];
|
|
584
|
-
const generation = (match[2] === undefined ? 0 : Number(match[2]));
|
|
585
|
-
scanCanonicalSource(state, home, rootChain, {
|
|
586
|
-
component: 'web',
|
|
587
|
-
streamKey: `web:${streamId}`,
|
|
588
|
-
activeAbsolute: join(home, `web.${streamId}.log.jsonl`),
|
|
589
|
-
generation,
|
|
590
|
-
boundStreamId: streamId,
|
|
591
|
-
});
|
|
592
|
-
});
|
|
593
|
-
}
|
|
594
577
|
const canonicalBroker = selected(normalized, 'broker');
|
|
595
578
|
const rawBroker = rawCompatible && selected(normalized, 'broker');
|
|
596
579
|
if (canonicalBroker || rawBroker) {
|
|
@@ -602,8 +585,11 @@ export function readLogSnapshot(query, includeRaw) {
|
|
|
602
585
|
scanBrokerNode(state, home, parents, normalized.nodeId, canonicalBroker, rawBroker);
|
|
603
586
|
}
|
|
604
587
|
else {
|
|
605
|
-
forEachDirectoryEntry(nodes, (nodeId) => {
|
|
606
|
-
|
|
588
|
+
forEachDirectoryEntry(nodes, (nodeId, isDirectory) => {
|
|
589
|
+
// The node root may contain ordinary filesystem metadata such as
|
|
590
|
+
// .DS_Store. Only a directory can be a node; proveDirectory still
|
|
591
|
+
// revalidates it to reject a replacement or symlink race.
|
|
592
|
+
if (isDirectory && isSafeNodeId(nodeId))
|
|
607
593
|
scanBrokerNode(state, home, parents, nodeId, canonicalBroker, rawBroker);
|
|
608
594
|
});
|
|
609
595
|
}
|
|
@@ -7,8 +7,6 @@ export interface BoundEventSource {
|
|
|
7
7
|
}
|
|
8
8
|
export declare function bindDaemonEventSource(): void;
|
|
9
9
|
export declare function bindBrokerEventSource(nodeId: string): void;
|
|
10
|
-
export declare function webStreamId(host: string, port: number): string;
|
|
11
|
-
export declare function bindWebEventSource(host: string, port: number): void;
|
|
12
10
|
export declare function eventSource(): BoundEventSource | undefined;
|
|
13
11
|
/** Test-only: clear the process-global binding. A single test process can
|
|
14
12
|
* legitimately play several components in sequence (an in-process revive binds
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
2
1
|
import { join } from 'node:path';
|
|
3
2
|
import { crtrHome, isSafeNodeId, jobDir } from '../canvas/paths.js';
|
|
4
3
|
let bound;
|
|
@@ -21,21 +20,6 @@ export function bindBrokerEventSource(nodeId) {
|
|
|
21
20
|
throw new TypeError('node_id must be a non-empty path segment of at most 128 UTF-8 bytes');
|
|
22
21
|
bind({ component: 'broker', node_id: nodeId, path: join(jobDir(nodeId), 'log.jsonl') });
|
|
23
22
|
}
|
|
24
|
-
function normalizeHost(host) {
|
|
25
|
-
const unbracketed = host.trim().toLowerCase().replace(/^\[|\]$/g, '');
|
|
26
|
-
if (unbracketed === '' || unbracketed === '0.0.0.0' || unbracketed === '::')
|
|
27
|
-
return 'localhost';
|
|
28
|
-
return unbracketed;
|
|
29
|
-
}
|
|
30
|
-
export function webStreamId(host, port) {
|
|
31
|
-
if (!Number.isInteger(port) || port < 0 || port > 65_535)
|
|
32
|
-
throw new TypeError('web port is invalid');
|
|
33
|
-
return createHash('sha256').update(`${normalizeHost(host)}\0${port}`).digest('hex').slice(0, 16);
|
|
34
|
-
}
|
|
35
|
-
export function bindWebEventSource(host, port) {
|
|
36
|
-
const stream_id = webStreamId(host, port);
|
|
37
|
-
bind({ component: 'web', stream_id, path: join(crtrHome(), `web.${stream_id}.log.jsonl`) });
|
|
38
|
-
}
|
|
39
23
|
export function eventSource() { return bound; }
|
|
40
24
|
/** Test-only: clear the process-global binding. A single test process can
|
|
41
25
|
* legitimately play several components in sequence (an in-process revive binds
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type EventLevel = 'error' | 'warn' | 'info' | 'debug';
|
|
2
|
-
export type EventComponent = 'daemon' | 'broker' | '
|
|
2
|
+
export type EventComponent = 'daemon' | 'broker' | 'control-plane' | 'front' | 'sentinel';
|
|
3
3
|
export type EventOutcome = 'succeeded' | 'failed' | 'skipped';
|
|
4
4
|
export type RetryDisposition = 'auto' | 'manual' | 'fatal';
|
|
5
5
|
export type OperationId = string & {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ErrorClass, OperationId } from './events/types.js';
|
|
2
|
-
export type FaultLink = 'pi→provider' | 'viewer↔broker' | 'relay↔broker' | '
|
|
2
|
+
export type FaultLink = 'pi→provider' | 'viewer↔broker' | 'relay↔broker' | 'viewer↔crtrd' | 'cli→exa' | 'daemon→node' | 'crtr→pi';
|
|
3
3
|
export type FaultKind = 'rate-limit' | 'overloaded' | 'connection' | 'auth' | 'protocol' | 'context-overflow' | 'other' | 'wedged' | 'model-not-found';
|
|
4
4
|
export type FaultRetryDisposition = 'auto' | 'manual' | 'fatal';
|
|
5
5
|
export type FaultRetryOwner = 'sdk' | 'daemon' | 'client';
|
|
@@ -1,14 +1,3 @@
|
|
|
1
1
|
import { type InboxEntry, type InboxEntryInput } from './inbox.js';
|
|
2
2
|
/** Atomically append one finalized entry to `nodes/<nodeId>/passive.jsonl`. */
|
|
3
3
|
export declare function appendPassive(nodeId: string, entry: InboxEntryInput): InboxEntry;
|
|
4
|
-
/** Return every accumulated passive entry (oldest first) without clearing. */
|
|
5
|
-
export declare function readPassive(nodeId: string): InboxEntry[];
|
|
6
|
-
/**
|
|
7
|
-
* Read AND clear the accumulator in one shot — the drain-on-message primitive.
|
|
8
|
-
*
|
|
9
|
-
* We rename the file aside before reading so a concurrent `appendPassive` (a
|
|
10
|
-
* publisher pushing at the same instant) starts a fresh file and is never lost
|
|
11
|
-
* to the truncate: at worst it lands in the next drain. The renamed snapshot is
|
|
12
|
-
* removed after a successful read. Returns the drained entries (oldest first).
|
|
13
|
-
*/
|
|
14
|
-
export declare function drainPassive(nodeId: string): InboxEntry[];
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
//
|
|
14
14
|
// Same entry shape as the inbox (InboxEntry) so the two stores stay symmetric
|
|
15
15
|
// and a passive edge can be flipped active without reshaping data.
|
|
16
|
-
import { appendFileSync, existsSync,
|
|
16
|
+
import { appendFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
17
17
|
import { dirname } from 'node:path';
|
|
18
18
|
import { passivePath } from '../canvas/index.js';
|
|
19
19
|
import { emitEvent } from '../events/emit.js';
|
|
@@ -51,64 +51,3 @@ function emitPassiveAppendFailure(nodeId, entry, error) {
|
|
|
51
51
|
// Event emission is observational; the original append failure remains authoritative.
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
-
/**
|
|
55
|
-
* Parse jsonl text into entries, tolerating corruption: each line is parsed on
|
|
56
|
-
* its own and a single malformed line is SKIPPED, never the whole feed. The
|
|
57
|
-
* drain path renames + deletes its snapshot, so a non-tolerant parse here would
|
|
58
|
-
* silently discard every accumulated entry the moment one bad line appears.
|
|
59
|
-
*/
|
|
60
|
-
function parseEntries(text) {
|
|
61
|
-
const entries = [];
|
|
62
|
-
for (const line of text.split('\n')) {
|
|
63
|
-
if (line.trim() === '')
|
|
64
|
-
continue;
|
|
65
|
-
try {
|
|
66
|
-
entries.push(JSON.parse(line));
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
// Skip only the corrupt line — the rest of the feed survives.
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return entries;
|
|
73
|
-
}
|
|
74
|
-
/** Return every accumulated passive entry (oldest first) without clearing. */
|
|
75
|
-
export function readPassive(nodeId) {
|
|
76
|
-
const p = passivePath(nodeId);
|
|
77
|
-
if (!existsSync(p))
|
|
78
|
-
return [];
|
|
79
|
-
return parseEntries(readFileSync(p, 'utf8'));
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Read AND clear the accumulator in one shot — the drain-on-message primitive.
|
|
83
|
-
*
|
|
84
|
-
* We rename the file aside before reading so a concurrent `appendPassive` (a
|
|
85
|
-
* publisher pushing at the same instant) starts a fresh file and is never lost
|
|
86
|
-
* to the truncate: at worst it lands in the next drain. The renamed snapshot is
|
|
87
|
-
* removed after a successful read. Returns the drained entries (oldest first).
|
|
88
|
-
*/
|
|
89
|
-
export function drainPassive(nodeId) {
|
|
90
|
-
const p = passivePath(nodeId);
|
|
91
|
-
if (!existsSync(p))
|
|
92
|
-
return [];
|
|
93
|
-
const snapshot = `${p}.draining`;
|
|
94
|
-
try {
|
|
95
|
-
renameSync(p, snapshot);
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
// Lost the race (file vanished) — nothing to drain.
|
|
99
|
-
return [];
|
|
100
|
-
}
|
|
101
|
-
// Parse with the tolerant per-line parser BEFORE removing the snapshot, so a
|
|
102
|
-
// single corrupt line can never discard the whole accumulated feed.
|
|
103
|
-
let entries = [];
|
|
104
|
-
try {
|
|
105
|
-
entries = parseEntries(readFileSync(snapshot, 'utf8'));
|
|
106
|
-
}
|
|
107
|
-
finally {
|
|
108
|
-
try {
|
|
109
|
-
rmSync(snapshot, { force: true });
|
|
110
|
-
}
|
|
111
|
-
catch { /* best-effort cleanup */ }
|
|
112
|
-
}
|
|
113
|
-
return entries;
|
|
114
|
-
}
|
|
@@ -3,12 +3,12 @@ import { existsSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync,
|
|
|
3
3
|
import { spawn } from 'node:child_process';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
-
import { submitDeck, submitReview, completeDeck, cancelTicket, readTicketResult } from '
|
|
7
|
-
import { claimTicket } from '
|
|
8
|
-
import { scanInbox } from '
|
|
9
|
-
import { atomicWriteJson, progressPath, responsePath } from '
|
|
10
|
-
import { validateDeck } from '
|
|
11
|
-
import { ticketDir } from '
|
|
6
|
+
import { submitDeck, submitReview, completeDeck, cancelTicket, readTicketResult } from '../../tickets.js';
|
|
7
|
+
import { claimTicket } from '../../claim.js';
|
|
8
|
+
import { scanInbox } from '../../scan.js';
|
|
9
|
+
import { atomicWriteJson, progressPath, responsePath } from '../../convention.js';
|
|
10
|
+
import { validateDeck } from '../../deck-schema.js';
|
|
11
|
+
import { ticketDir } from '../../root.js';
|
|
12
12
|
const temp = mkdtempSync(join(tmpdir(), 'crtr-inbox-core-'));
|
|
13
13
|
process.env['CRTR_HOME'] = temp;
|
|
14
14
|
const source = join(temp, 'source.md');
|
|
@@ -3,7 +3,7 @@ import assert from 'node:assert/strict';
|
|
|
3
3
|
import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
-
import {
|
|
6
|
+
import { KeybindingConcurrentEditError, KeybindingValidationError, canonicalTerminalStroke, matchesTerminalInput, normalizeSparseOverrides, persistUserKeybindings, resolveKeybindings, resolveUserKeybindings, } from '../index.js';
|
|
7
7
|
import { readConfig } from '../../config.js';
|
|
8
8
|
const typeCheckedBindingId = 'crtr.graph.down';
|
|
9
9
|
// @ts-expect-error The catalog type rejects IDs that are not built in.
|
|
@@ -13,50 +13,6 @@ const rejectedAttachGlobalId = 'crtr.tmux.menu-global.attach';
|
|
|
13
13
|
void typeCheckedBindingId;
|
|
14
14
|
void rejectedBindingId;
|
|
15
15
|
void rejectedAttachGlobalId;
|
|
16
|
-
function ids(prefix, actions) {
|
|
17
|
-
return actions.map((action) => `${prefix}.${action}`);
|
|
18
|
-
}
|
|
19
|
-
function pairedMenuIds(actions) {
|
|
20
|
-
return actions.flatMap((action) => [`crtr.tmux.menu.${action}`, `crtr.tmux.menu-global.${action}`]);
|
|
21
|
-
}
|
|
22
|
-
function pairedAttachIds(pairs) {
|
|
23
|
-
return pairs.flatMap(([menuAction, directId]) => [`crtr.tmux.menu.attach.${menuAction}`, directId]);
|
|
24
|
-
}
|
|
25
|
-
const REQUIRED_IDS = [
|
|
26
|
-
'crtr.tmux.menu.open',
|
|
27
|
-
'crtr.tmux.menu.attach',
|
|
28
|
-
...pairedMenuIds(['promote', 'resume', 'fork', 'demote', 'detach', 'close-subtree', 'background-bash', 'file-review', 'pin', 'show', 'view-settings', 'fold-tools', 'metadata', 'context', 'providers', 'graph', 'focus-manager', 'copy-id', 'reload-viewer', 'recap', 'issues', 'issue.idea', 'issue.bug']),
|
|
29
|
-
...ids('crtr.tmux.node', ['next', 'previous']),
|
|
30
|
-
'crtr.tmux.inbox.toggle',
|
|
31
|
-
...pairedAttachIds([
|
|
32
|
-
['detach', 'crtr.attach.detach'],
|
|
33
|
-
['clear-or-detach', 'crtr.attach.clear-or-detach'],
|
|
34
|
-
['graph.toggle', 'crtr.attach.graph.toggle'],
|
|
35
|
-
['help.toggle', 'crtr.attach.help.toggle'],
|
|
36
|
-
['inbox.toggle', 'crtr.attach.inbox.toggle'],
|
|
37
|
-
['model-ladder.next', 'crtr.attach.model-ladder.next'],
|
|
38
|
-
['model-ladder.previous', 'crtr.attach.model-ladder.previous'],
|
|
39
|
-
['command.inspect', 'crtr.attach.command.inspect'],
|
|
40
|
-
['file-review', 'crtr.attach.file-review'],
|
|
41
|
-
['profile-files', 'crtr.attach.profile-files'],
|
|
42
|
-
['whip', 'crtr.attach.whip'],
|
|
43
|
-
]),
|
|
44
|
-
...ids('crtr.attach.scroll', ['up', 'down', 'page-up', 'page-down', 'live']),
|
|
45
|
-
'crtr.attach.mouse.toggle',
|
|
46
|
-
'crtr.attach.copy.message',
|
|
47
|
-
...ids('crtr.graph', ['down', 'up', 'first', 'last', 'collapse-or-manager', 'expand-or-child', 'focus', 'revive', 'focus-manager', 'close-subtree', 'dismiss']),
|
|
48
|
-
...ids('crtr.graph.confirm', ['accept', 'cancel']),
|
|
49
|
-
...ids('crtr.inspector', ['force-quit', 'down', 'up', 'section-next', 'section-prev', 'page-down', 'page-up', 'toggle-detail', 'cancel-item', 'open-log', 'confirm', 'dismiss', 'retarget', 'refresh', 'quit']),
|
|
50
|
-
...ids('crtr.browse', ['quit', 'down', 'up', 'first', 'last', 'expand-or-child', 'collapse-or-parent', 'toggle-fold', 'tab-next', 'tab-previous', 'tab.1', 'tab.2', 'tab.3', 'tab.4', 'tab.5', 'close-subtree', 'confirm-close', 'sort', 'scope', 'profile', 'residents', 'preview', 'search', 'revive-now', 'focus', 'focus-background']),
|
|
51
|
-
...ids('crtr.browse.search', ['cancel', 'commit', 'delete', 'quit']),
|
|
52
|
-
...ids('crtr.profile.menu', ['up', 'down', 'select', 'accept-default', 'abort', 'slot.1', 'slot.2', 'slot.3', 'slot.4', 'slot.5', 'slot.6', 'slot.7', 'slot.8', 'slot.9', 'create', 'search-existing', 'use-root', 'set-default', 'add-directory', 'unpin']),
|
|
53
|
-
...ids('crtr.profile.search', ['up', 'down', 'pick', 'back', 'delete', 'abort']),
|
|
54
|
-
...ids('crtr.setup', ['cancel', 'tab-next', 'tab-previous', 'open', 'list-down', 'list-up', 'toggle', 'details', 'advance']),
|
|
55
|
-
...ids('crtr.setup.confirm', ['accept', 'back']),
|
|
56
|
-
...ids('crtr.setup.keybindings', ['edit', 'commit-edit', 'cancel-edit', 'unbind', 'reset-row', 'reset-all', 'save', 'discard', 'page-up', 'page-down', 'filter', 'filter-delete', 'filter-clear']),
|
|
57
|
-
...ids('crtr.setup', ['cell-previous', 'cell-next']),
|
|
58
|
-
...ids('crtr.setup.models', ['open', 'scope-next', 'commit', 'cancel']),
|
|
59
|
-
];
|
|
60
16
|
let home;
|
|
61
17
|
let realHome;
|
|
62
18
|
let realCwd;
|
|
@@ -77,57 +33,6 @@ after(() => {
|
|
|
77
33
|
process.env['HOME'] = realHome;
|
|
78
34
|
});
|
|
79
35
|
test.afterEach(() => rmSync(home, { recursive: true, force: true }));
|
|
80
|
-
test('catalog is closed, complete, ordered, and has valid collision-free defaults', () => {
|
|
81
|
-
const actualIds = BINDING_CATALOG.map((definition) => definition.id);
|
|
82
|
-
assert.deepEqual(actualIds, REQUIRED_IDS);
|
|
83
|
-
assert.equal(actualIds.length, REQUIRED_IDS.length);
|
|
84
|
-
assert.equal(new Set(actualIds).size, actualIds.length);
|
|
85
|
-
for (const definition of BINDING_CATALOG) {
|
|
86
|
-
assert.match(definition.id, /^crtr\.[a-z0-9.-]+$/);
|
|
87
|
-
assert.ok(definition.name.length > 0);
|
|
88
|
-
assert.ok(definition.description.length > 0);
|
|
89
|
-
assert.ok(definition.contexts.length > 0);
|
|
90
|
-
for (const gesture of definition.defaults)
|
|
91
|
-
assert.equal(normalizeGesture(gesture, definition), gesture);
|
|
92
|
-
}
|
|
93
|
-
const byId = new Map(BINDING_CATALOG.map((definition) => [definition.id, definition]));
|
|
94
|
-
for (const definition of BINDING_CATALOG) {
|
|
95
|
-
if (definition.pair === undefined)
|
|
96
|
-
continue;
|
|
97
|
-
const paired = byId.get(definition.pair.pairedId);
|
|
98
|
-
assert.equal(paired?.pair?.pairedId, definition.id, `${definition.id} must have a reciprocal pair`);
|
|
99
|
-
assert.notEqual(paired?.pair?.field, definition.pair.field, `${definition.id} pair fields must differ`);
|
|
100
|
-
assert.ok(definition.pair.field === 'menu' || paired?.pair?.field === 'menu', `${definition.id} must pair with a menu selector`);
|
|
101
|
-
}
|
|
102
|
-
for (const { menuId, actionId } of ATTACH_CONTROL_BINDINGS) {
|
|
103
|
-
assert.equal(byId.get(menuId)?.pair?.field, 'menu');
|
|
104
|
-
assert.equal(byId.get(menuId)?.pair?.pairedId, actionId);
|
|
105
|
-
assert.equal(byId.get(actionId)?.pair?.field, 'direct');
|
|
106
|
-
assert.equal(byId.get(actionId)?.pair?.pairedId, menuId);
|
|
107
|
-
}
|
|
108
|
-
const resolved = resolveKeybindings();
|
|
109
|
-
assert.equal(resolved.bindings.size, BINDING_CATALOG.length);
|
|
110
|
-
assert.deepEqual(resolved.diagnostics, []);
|
|
111
|
-
assert.ok(SAFETY_REQUIREMENTS.length > 0);
|
|
112
|
-
});
|
|
113
|
-
test('normalizes aliases, modifier order, uppercase printables, sequences, and duplicate gestures', () => {
|
|
114
|
-
assert.equal(normalizeGesture('M-C-X'), 'ctrl+alt+shift+x');
|
|
115
|
-
assert.equal(normalizeGesture('alt+ctrl+x'), 'ctrl+alt+x');
|
|
116
|
-
assert.equal(normalizeGesture('return'), 'enter');
|
|
117
|
-
assert.equal(normalizeGesture('esc'), 'escape');
|
|
118
|
-
assert.equal(normalizeGesture('meta+j'), 'alt+j');
|
|
119
|
-
assert.equal(normalizeGesture('+'), '+');
|
|
120
|
-
assert.equal(normalizeGesture('ctrl++'), 'ctrl++');
|
|
121
|
-
assert.equal(normalizeGesture('alt+>'), 'alt+>');
|
|
122
|
-
assert.equal(formatStroke('ctrl++'), 'Ctrl++');
|
|
123
|
-
assert.equal(canonicalTerminalStroke({ input: '+', ctrl: true }), 'ctrl++');
|
|
124
|
-
const resolved = resolveKeybindings({
|
|
125
|
-
'crtr.attach.graph.toggle': ['M-X', 'alt+x'],
|
|
126
|
-
'crtr.tmux.menu.promote': ['space'],
|
|
127
|
-
});
|
|
128
|
-
assert.deepEqual(resolved.gestures('crtr.attach.graph.toggle'), ['alt+shift+x', 'alt+x']);
|
|
129
|
-
assert.deepEqual(resolved.gestures('crtr.tmux.menu.promote'), ['space']);
|
|
130
|
-
});
|
|
131
36
|
test('terminal literal space matches named space bindings', () => {
|
|
132
37
|
const raw = { input: ' ' };
|
|
133
38
|
assert.equal(canonicalTerminalStroke(raw), 'space');
|
|
@@ -3,10 +3,9 @@ import { resolveUserKeybindings } from './resolve.js';
|
|
|
3
3
|
const MENU_OPEN = 'crtr.tmux.menu.open';
|
|
4
4
|
const BACKGROUND_BASH = 'crtr.tmux.menu.background-bash';
|
|
5
5
|
/** The tmux menu's own shift-aware selector rendering (bare key -> itself,
|
|
6
|
-
* shift+letter -> uppercase, shift+space -> a literal space)
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `keybindings/index.ts` and importing back would cycle. */
|
|
6
|
+
* shift+letter -> uppercase, shift+space -> a literal space) stays local
|
|
7
|
+
* because `runtime/tmux-bindings.ts` consumes this module through
|
|
8
|
+
* `keybindings/index.ts`; importing its private selector here would cycle. */
|
|
10
9
|
function selectorLabel(stroke) {
|
|
11
10
|
const parts = stroke.split('+');
|
|
12
11
|
const key = parts.at(-1);
|
|
@@ -73,7 +73,7 @@ export const BINDING_CATALOG = Object.freeze([
|
|
|
73
73
|
...attachEntry('crtr.tmux.menu.attach.model-ladder.previous', 'crtr.attach.model-ladder.previous', 'Previous model', 'Move to the previous model ladder rung.', ['['], ['alt+shift+m']),
|
|
74
74
|
...attachEntry('crtr.tmux.menu.attach.command.inspect', 'crtr.attach.command.inspect', 'Inspect loaded command', 'Open the loaded slash command’s expanded prompt.', ['h'], ['alt+shift+h']),
|
|
75
75
|
...attachEntry('crtr.tmux.menu.attach.file-review', 'crtr.attach.file-review', 'Review a file', 'Open a line-anchored review of a file named in the transcript.', [], ['alt+shift+r']),
|
|
76
|
-
...attachEntry('crtr.tmux.menu.attach.profile-files', 'crtr.attach.profile-files', 'Search profile files', 'Search files across the node’s profile projects, cwd, and ancestor crouter memory stores.', ['f'], []),
|
|
76
|
+
...attachEntry('crtr.tmux.menu.attach.profile-files', 'crtr.attach.profile-files', 'Search profile files', 'Search files across the node’s profile projects, profile memory, cwd, and ancestor crouter memory stores.', ['f'], ['ctrl+f']),
|
|
77
77
|
...attachEntry('crtr.tmux.menu.attach.whip', 'crtr.attach.whip', 'Whip agent', 'Interrupt the agent and send a playful command.', ['w'], []),
|
|
78
78
|
b('crtr.attach.scroll.up', 'Attach', 'Scroll up', 'Scroll the transcript one line up.', ['shift+up'], 'terminal', ATTACH_CONTEXTS),
|
|
79
79
|
b('crtr.attach.scroll.down', 'Attach', 'Scroll down', 'Scroll the transcript one line down.', ['shift+down'], 'terminal', ATTACH_CONTEXTS),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// inline-ref-grammar.ts — the single source of truth for the inline
|
|
2
|
-
// memory-reference token grammar (spec §4.1).
|
|
3
|
-
//
|
|
4
|
-
//
|
|
2
|
+
// memory-reference token grammar (spec §4.1). The broker and terminal attach
|
|
3
|
+
// viewer import these zero-dependency string operations directly rather than
|
|
4
|
+
// each re-implementing `[A-Za-z0-9_:-]`,
|
|
5
5
|
// trimming, boundary detection, or `:` decoding. Divergence between the
|
|
6
6
|
// viewer's highlight rule and the broker's resolution rule would let a
|
|
7
7
|
// highlighted token yield no guidance (or vice versa) — see the spec and
|
|
@@ -81,29 +81,15 @@ export declare function listProjectMemoryDocs(startDir?: string, profileId?: str
|
|
|
81
81
|
* native docs are emitted before enabled-plugin docs, so native wins on the
|
|
82
82
|
* caller's first-wins dedup. */
|
|
83
83
|
export declare function listAllMemoryDocs(scope?: MemoryScope, quiet?: boolean): MemoryDoc[];
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
*
|
|
94
|
-
|
|
95
|
-
* identity (`doc.name === query` — the explicit frontmatter `name`, else its
|
|
96
|
-
* normalized path-derived fallback, the SAME identity `listAllMemoryDocs`
|
|
97
|
-
* reports); then (2) direct `memory/<name>.md` physical-path lookup (the
|
|
98
|
-
* bare-dir → INDEX.md and bare-plugin-name → plugin root INDEX.md conveniences
|
|
99
|
-
* neither identity nor a literal path expresses). Only if that pass finds
|
|
100
|
-
* nothing does a second nearest-first pass try bare leaf-name fallback (final
|
|
101
|
-
* path segment), ambiguous when two DIFFERENT identities in the SAME source
|
|
102
|
-
* share a leaf. A farther canonical identity therefore beats a nearer leaf,
|
|
103
|
-
* while scope precedence still decides between equally strong matches.
|
|
104
|
-
*
|
|
105
|
-
* `opts.kind`, when given, is a resolution CONSTRAINT, not a post-filter: in
|
|
106
|
-
* both passes a candidate whose `effectiveDocKind` doesn't match is skipped,
|
|
107
|
-
* so resolution keeps looking for a matching-kind document.
|
|
108
|
-
*/
|
|
84
|
+
export interface MemoryDocSnapshot {
|
|
85
|
+
/** Every document in default scope precedence order, loaded once. */
|
|
86
|
+
docs: readonly MemoryDoc[];
|
|
87
|
+
/** Resolve names against that source snapshot; failures are omitted so
|
|
88
|
+
* callers can retain their own per-document error behavior. */
|
|
89
|
+
resolve(names: readonly string[]): Map<string, MemoryDoc>;
|
|
90
|
+
}
|
|
91
|
+
export declare function createMemoryDocSnapshot(): MemoryDocSnapshot;
|
|
92
|
+
/** Resolve several unqualified names over one memory-source snapshot. Failed
|
|
93
|
+
* names are omitted so callers can preserve their per-document error behavior. */
|
|
94
|
+
export declare function resolveMemoryDocs(names: readonly string[]): Map<string, MemoryDoc>;
|
|
109
95
|
export declare function resolveMemoryDoc(rawName: string, opts?: MemoryResolutionOpts): MemoryDoc;
|