@north-light/crouter 0.3.173 → 0.3.175
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/memory/write.js +13 -12
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +198 -0
- package/dist/commands/node/create.d.ts +23 -0
- package/dist/commands/node/create.js +207 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +302 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +415 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +164 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +82 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +159 -0
- package/dist/commands/node-lifecycle-revive.js +10 -57
- package/dist/commands/node.d.ts +0 -42
- package/dist/commands/node.js +11 -2065
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +67 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +46 -0
- package/dist/commands/surface/node/placement.js +124 -0
- package/dist/commands/surface-node.js +4 -1
- package/dist/commands/surface-reload.js +1 -2
- package/dist/commands/surface-tmux-spread.js +1 -1
- package/dist/commands/surface.js +5 -20
- package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
- package/dist/commands/sys/config.js +6 -6
- package/dist/commands/sys/logs.js +1 -1
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
- package/dist/commands/sys/panels/keys-panel.js +60 -0
- package/dist/commands/sys/panels/models-panel.d.ts +77 -0
- package/dist/commands/sys/panels/models-panel.js +647 -0
- package/dist/commands/sys/panels/panel.d.ts +45 -0
- package/dist/commands/sys/panels/panel.js +137 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +80 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
- package/dist/commands/sys/panels/prefs-panel.js +85 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
- package/dist/commands/sys/panels/provider-panel.js +538 -0
- package/dist/commands/sys/settings-shell.d.ts +55 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +31 -0
- package/dist/commands/sys/setup-core.d.ts +3 -33
- package/dist/commands/sys/setup-core.js +27 -78
- package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
- package/dist/commands/sys/setup-settings-runner.js +63 -0
- package/dist/commands/sys/setup-wizard.d.ts +26 -125
- package/dist/commands/sys/setup-wizard.js +209 -2473
- package/dist/commands/sys/setup.js +5 -7
- package/dist/commands/sys.js +3 -2
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
- package/dist/core/__tests__/broker-preflight.test.js +1 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
- package/dist/core/__tests__/canvas.test.js +2 -36
- package/dist/core/__tests__/close.test.js +14 -3
- package/dist/core/__tests__/context-intro.test.js +32 -143
- package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
- package/dist/core/__tests__/daemon-boot.test.js +2 -20
- package/dist/core/__tests__/daemon-wedge.test.js +1 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +4 -98
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
- package/dist/core/__tests__/helpers/broker-clients.js +0 -14
- package/dist/core/__tests__/helpers/harness.d.ts +0 -8
- package/dist/core/__tests__/helpers/harness.js +7 -87
- package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
- package/dist/core/__tests__/kickoff.test.js +1 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
- package/dist/core/__tests__/migration.test.js +35 -48
- package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
- package/dist/core/__tests__/passive-subscription.test.js +26 -49
- package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
- package/dist/core/__tests__/prune.test.js +94 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -32
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
- package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
- package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
- package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
- package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
- package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
- package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
- package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
- package/dist/core/__tests__/secrets.test.js +1 -7
- package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
- package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
- package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
- package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
- package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
- package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
- package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
- package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
- package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
- package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
- package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
- package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
- package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
- package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
- package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
- package/dist/core/__tests__/session-model.test.js +0 -18
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
- package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
- package/dist/core/broker-client/client.d.ts +2 -2
- package/dist/core/broker-client/client.js +4 -7
- package/dist/core/broker-client/transport-relay.d.ts +13 -19
- package/dist/core/broker-client/transport-relay.js +19 -34
- package/dist/core/broker-client/transport-socket.d.ts +2 -2
- package/dist/core/broker-client/transport-socket.js +9 -2
- package/dist/core/broker-client/transport.d.ts +7 -3
- package/dist/core/broker-client/transport.js +4 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -18
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
- package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
- package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
- package/dist/core/canvas/browse/app.d.ts +2 -17
- package/dist/core/canvas/browse/app.js +16 -88
- package/dist/core/canvas/browse/model.d.ts +0 -4
- package/dist/core/canvas/browse/model.js +1 -12
- package/dist/core/canvas/browse/render.js +6 -3
- package/dist/core/canvas/crons.d.ts +8 -5
- package/dist/core/canvas/crons.js +7 -6
- package/dist/core/canvas/extensions.d.ts +7 -3
- package/dist/core/canvas/extensions.js +16 -4
- package/dist/core/canvas/nav-model.d.ts +0 -4
- package/dist/core/canvas/nav-model.js +2 -14
- package/dist/core/canvas/node-order.d.ts +3 -0
- package/dist/core/canvas/node-order.js +12 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
- package/dist/core/canvas/remote-canvas-source.js +8 -15
- package/dist/core/command.js +11 -4
- package/dist/core/config.js +3 -1
- package/dist/core/events/envelope.js +1 -1
- package/dist/core/events/read.js +7 -21
- package/dist/core/events/source.d.ts +0 -2
- package/dist/core/events/source.js +0 -16
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/fault-classifier.d.ts +1 -1
- package/dist/core/feed/passive.d.ts +0 -11
- package/dist/core/feed/passive.js +1 -62
- package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
- package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
- package/dist/core/keybindings/background-bash.js +3 -4
- package/dist/core/keybindings/catalog.js +1 -1
- package/dist/core/memory/inline-ref-grammar.js +3 -3
- package/dist/core/memory-resolver.d.ts +11 -25
- package/dist/core/memory-resolver.js +51 -33
- package/dist/core/model-routes.d.ts +15 -0
- package/dist/core/model-routes.js +12 -0
- package/dist/core/pool-credential-store.js +1 -1
- package/dist/core/preview-registry.js +8 -9
- package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
- package/dist/core/review/realize.d.ts +0 -13
- package/dist/core/review/realize.js +0 -40
- package/dist/core/review/types.d.ts +1 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
- package/dist/core/runtime/bearings.js +1 -11
- package/dist/core/runtime/broker/client-registry.d.ts +33 -0
- package/dist/core/runtime/broker/client-registry.js +164 -0
- package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
- package/dist/core/runtime/broker/daemon-ops.js +49 -0
- package/dist/core/runtime/broker/event-projection.d.ts +42 -0
- package/dist/core/runtime/broker/event-projection.js +178 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
- package/dist/core/runtime/broker/fault-retry.js +277 -0
- package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
- package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
- package/dist/core/runtime/broker/inbox.d.ts +22 -0
- package/dist/core/runtime/broker/inbox.js +167 -0
- package/dist/core/runtime/broker/passive.d.ts +16 -0
- package/dist/core/runtime/broker/passive.js +44 -0
- package/dist/core/runtime/broker/read-ops.d.ts +23 -0
- package/dist/core/runtime/broker/read-ops.js +150 -0
- package/dist/core/runtime/broker/rebind.d.ts +74 -0
- package/dist/core/runtime/broker/rebind.js +211 -0
- package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
- package/dist/core/runtime/broker/tool-groups.js +244 -0
- package/dist/core/runtime/broker-extension-render.d.ts +11 -0
- package/dist/core/runtime/broker-extension-render.js +181 -0
- package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
- package/dist/core/runtime/broker-persona-guidance.js +58 -0
- package/dist/core/runtime/broker-protocol.d.ts +1 -1
- package/dist/core/runtime/broker-protocol.js +1 -1
- package/dist/core/runtime/broker.d.ts +5 -196
- package/dist/core/runtime/broker.js +276 -3059
- package/dist/core/runtime/canvas-extensions.js +11 -2
- package/dist/core/runtime/fault.js +1 -1
- package/dist/core/runtime/model-selection.d.ts +9 -0
- package/dist/core/runtime/model-selection.js +12 -0
- package/dist/core/runtime/model-swap.d.ts +3 -3
- package/dist/core/runtime/model-swap.js +33 -25
- package/dist/core/runtime/placement-tmux.d.ts +3 -14
- package/dist/core/runtime/placement-tmux.js +11 -80
- package/dist/core/runtime/placement.d.ts +4 -2
- package/dist/core/runtime/placement.js +7 -12
- package/dist/core/runtime/promote.d.ts +14 -1
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +8 -0
- package/dist/core/runtime/spawn.js +36 -6
- package/dist/core/runtime/stop-guard.d.ts +4 -3
- package/dist/core/runtime/stop-guard.js +36 -18
- package/dist/core/runtime/stop-signals.d.ts +4 -1
- package/dist/core/runtime/stream-watchdog.js +4 -5
- package/dist/core/runtime/structured-output.d.ts +15 -2
- package/dist/core/runtime/structured-output.js +35 -12
- package/dist/core/runtime/tmux-bindings.d.ts +25 -0
- package/dist/core/runtime/tmux-bindings.js +682 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -1
- package/dist/core/runtime/tmux-chrome.js +3 -2
- package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
- package/dist/core/runtime/tmux-driver.js +598 -0
- package/dist/core/runtime/view-socket.d.ts +14 -0
- package/dist/core/runtime/view-socket.js +83 -0
- package/dist/core/session-model/session-state.d.ts +1 -2
- package/dist/core/session-model/session-state.js +5 -8
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +2 -2
- package/dist/core/substrate/gate.d.ts +1 -1
- package/dist/core/substrate/on-read-pure.d.ts +7 -0
- package/dist/core/substrate/on-read-pure.js +272 -0
- package/dist/core/termrender/termrender.js +32 -2
- package/dist/core/user-settings.d.ts +23 -1
- package/dist/core/user-settings.js +18 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
- package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
- package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
- package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
- package/dist/daemon/api/bridge.js +40 -81
- package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
- package/dist/daemon/api/handlers/broker-ops.js +383 -0
- package/dist/daemon/api/handlers/crons.js +9 -4
- package/dist/daemon/api/handlers/files.js +6 -7
- package/dist/daemon/api/handlers/inbox.js +2 -340
- package/dist/daemon/api/handlers/nodes.d.ts +10 -1
- package/dist/daemon/api/handlers/nodes.js +74 -39
- package/dist/daemon/api/handlers/review-comments.js +5 -1
- package/dist/daemon/api/handlers/reviews.js +0 -19
- package/dist/daemon/api/map.js +25 -4
- package/dist/daemon/api/router.js +2 -3
- package/dist/daemon/api/server.js +5 -7
- package/dist/daemon/cron-run.d.ts +4 -0
- package/dist/daemon/cron-run.js +30 -13
- package/dist/daemon/crtrd.d.ts +3 -58
- package/dist/daemon/crtrd.js +28 -1244
- package/dist/daemon/manage.js +0 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
- package/dist/daemon/reconcilers/broker-supervision.js +549 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
- package/dist/daemon/reconcilers/cron-lane.js +32 -0
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
- package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
- package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
- package/dist/daemon/review/finish.js +2 -5
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
- package/dist/pi-extensions/broker-local.d.ts +20 -0
- package/dist/pi-extensions/broker-local.js +89 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
- package/dist/pi-extensions/canvas-context-intro.js +22 -11
- package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
- package/dist/pi-extensions/canvas-goal-capture.js +7 -12
- package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
- package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
- package/dist/pi-extensions/canvas-passive-context.js +22 -18
- package/dist/pi-extensions/canvas-recap.d.ts +2 -2
- package/dist/pi-extensions/canvas-recap.js +48 -21
- package/dist/pi-extensions/canvas-review-boundary.js +10 -4
- package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
- package/dist/pi-extensions/canvas-stophook.js +149 -431
- package/dist/pi-extensions/canvas-structured-output.js +52 -30
- package/dist/pi-extensions/envelope-merge.d.ts +13 -0
- package/dist/pi-extensions/envelope-merge.js +29 -0
- package/dist/shared/working-activity.d.ts +3 -2
- package/dist/shared/working-activity.js +3 -2
- package/dist/types.d.ts +6 -5
- package/dist/types.js +2 -2
- package/docs/compat/hearth-crtr-v1.md +4 -12
- package/docs/compat/hearth-crtr-v2.md +3 -11
- package/docs/compat/hearth-crtr-v3.md +4 -12
- package/docs/compat/hearth-crtr-v4.md +3 -11
- package/docs/compat/hearth-crtr-v5.md +3 -11
- package/docs/public-api.md +3 -7
- package/package.json +7 -49
- package/runtime.lock.json +2766 -14533
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
- package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
- package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
- package/dist/clients/conversation/conversation.d.ts +0 -65
- package/dist/clients/conversation/conversation.js +0 -318
- package/dist/clients/conversation/frames.d.ts +0 -30
- package/dist/clients/conversation/frames.js +0 -52
- package/dist/clients/conversation/region.d.ts +0 -51
- package/dist/clients/conversation/region.js +0 -265
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
- package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
- package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
- package/dist/clients/inbox/review/columns.d.ts +0 -22
- package/dist/clients/inbox/review/columns.js +0 -40
- package/dist/clients/inbox/review/composition.d.ts +0 -60
- package/dist/clients/inbox/review/composition.js +0 -278
- package/dist/clients/inbox/review/document-region.d.ts +0 -120
- package/dist/clients/surfaces/region.d.ts +0 -16
- package/dist/clients/web/__tests__/push-engine.test.js +0 -158
- package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
- package/dist/clients/web/__tests__/push-registry.test.js +0 -177
- package/dist/clients/web/dev-server.d.ts +0 -7
- package/dist/clients/web/dev-server.js +0 -46
- package/dist/clients/web/events.d.ts +0 -19
- package/dist/clients/web/events.js +0 -163
- package/dist/clients/web/push-engine.d.ts +0 -44
- package/dist/clients/web/push-engine.js +0 -125
- package/dist/clients/web/push-registry.d.ts +0 -85
- package/dist/clients/web/push-registry.js +0 -373
- package/dist/clients/web/server.d.ts +0 -19
- package/dist/clients/web/server.js +0 -661
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
- package/dist/clients/web/web-client/shared/protocol.js +0 -8
- package/dist/clients/web/web-cmd.d.ts +0 -2
- package/dist/clients/web/web-cmd.js +0 -141
- package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
- package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
- package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
- package/dist/commands/__tests__/canvas-config.test.js +0 -107
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
- package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
- package/dist/commands/__tests__/search-contents.test.js +0 -52
- package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/lint.test.js +0 -15
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
- package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
- package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
- package/dist/core/__tests__/finalization-migration.test.js +0 -38
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
- package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
- package/dist/core/__tests__/fork.test.d.ts +0 -1
- package/dist/core/__tests__/fork.test.js +0 -108
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
- package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
- package/dist/core/__tests__/full/cascade-close.test.js +0 -240
- package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/detach-focus.test.js +0 -126
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
- package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.js +0 -60
- package/dist/core/__tests__/model-routes.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes.test.js +0 -41
- package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-identity.test.js +0 -61
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
- package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
- package/dist/core/__tests__/prune-to-limit.test.js +0 -126
- package/dist/core/__tests__/reset.test.d.ts +0 -1
- package/dist/core/__tests__/reset.test.js +0 -69
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
- package/dist/core/__tests__/steer-note.test.d.ts +0 -1
- package/dist/core/__tests__/steer-note.test.js +0 -41
- package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
- package/dist/core/__tests__/subcommand-tier.test.js +0 -99
- package/dist/core/__tests__/subscription-delivery.test.js +0 -211
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
- package/dist/core/__tests__/tmux-surface.test.js +0 -484
- package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
- package/dist/core/__tests__/wake-bearings.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
- package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
- package/dist/core/canvas/remote-event-stream.d.ts +0 -24
- package/dist/core/canvas/remote-event-stream.js +0 -94
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
- package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
- package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
- package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
- package/dist/core/human/__tests__/visible-paths.test.js +0 -28
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
- package/dist/core/review/__tests__/project.test.d.ts +0 -1
- package/dist/core/review/__tests__/project.test.js +0 -71
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
- package/dist/core/runtime/tmux.js +0 -1314
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
- package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/inbox.test.js +0 -489
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
- package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +0 -17
- package/dist/web-client/manifest.webmanifest +0 -1
- package/dist/web-client/sw.js +0 -1
- /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
- /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
- /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
- /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
- /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
- /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
- /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
- /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
- /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
- /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
package/dist/commands/search.js
CHANGED
|
@@ -12,7 +12,7 @@ export function registerSearch() {
|
|
|
12
12
|
rootEntry: {
|
|
13
13
|
concept: 'web search for agents — find pages, get grounded answers, extract page content (Exa)',
|
|
14
14
|
desc: 'search the web, answer a question with citations, or extract content from known URLs',
|
|
15
|
-
useWhen: 'you need information from the live web — current events, documentation, sources, facts beyond your training. Use web for relevant pages with excerpts, answer for one synthesized cited answer, and contents for clean text from URLs you already hold. This reaches
|
|
15
|
+
useWhen: 'you need information from the live web — current events, documentation, sources, facts beyond your training. Use web for relevant pages with excerpts, answer for one synthesized cited answer, and contents for clean text from URLs you already hold. This reaches public pages read-only, not logged-in pages or service APIs. Needs an Exa API key (EXA_API_KEY or ~/.crouter/exa.key).',
|
|
16
16
|
},
|
|
17
17
|
help: {
|
|
18
18
|
name: 'search',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const surfaceNodeCycleLeaf: import("../../../core/command.js").LeafDef;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// `crtr surface node cycle` — walk live viewers in DFS order.
|
|
2
|
+
import { defineLeaf } from '../../../core/command.js';
|
|
3
|
+
import { cliCanvasSource, getNodeOrNull, rethrowAsCliError } from '../../api-client.js';
|
|
4
|
+
import { currentTmux, focusViewer, nodeInPane } from './placement.js';
|
|
5
|
+
/** Every live node in DFS pre-order across the whole forest. The spawn tree is
|
|
6
|
+
* the `parent` field; children inherit their parent's row order (created), so
|
|
7
|
+
* the walk descends into a node's children before moving to its siblings —
|
|
8
|
+
* exactly "next in pre-order is your first child". Roots are live nodes with no
|
|
9
|
+
* live parent (a done/dead parent orphans its live children up to the top).
|
|
10
|
+
* Cycle-safe: a final pass appends any node a cycle kept from being reached. */
|
|
11
|
+
async function liveDfsOrder() {
|
|
12
|
+
const rows = await cliCanvasSource().listNodes({ status: ['active', 'idle'] }).catch(rethrowAsCliError); // ORDER BY created
|
|
13
|
+
const liveIds = new Set(rows.map((r) => r.node_id));
|
|
14
|
+
const childrenOf = new Map();
|
|
15
|
+
for (const r of rows) {
|
|
16
|
+
const p = r.parent;
|
|
17
|
+
if (p != null && liveIds.has(p)) {
|
|
18
|
+
const arr = childrenOf.get(p) ?? [];
|
|
19
|
+
arr.push(r.node_id);
|
|
20
|
+
childrenOf.set(p, arr);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const out = [];
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
const visit = (id) => {
|
|
26
|
+
if (seen.has(id))
|
|
27
|
+
return;
|
|
28
|
+
seen.add(id);
|
|
29
|
+
out.push(id);
|
|
30
|
+
for (const c of childrenOf.get(id) ?? [])
|
|
31
|
+
visit(c);
|
|
32
|
+
};
|
|
33
|
+
for (const r of rows)
|
|
34
|
+
if (r.parent == null || !liveIds.has(r.parent))
|
|
35
|
+
visit(r.node_id);
|
|
36
|
+
for (const r of rows)
|
|
37
|
+
visit(r.node_id); // stragglers (parent cycles)
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
export const surfaceNodeCycleLeaf = defineLeaf({
|
|
41
|
+
name: 'cycle',
|
|
42
|
+
description: 'DFS-walk to the next/prev live node\'s viewer',
|
|
43
|
+
whenToUse: 'sweeping the canvas one viewer at a time, descending into children before siblings (bound to Alt+] forward / Alt+[ back). Use `surface node focus` instead to jump straight to a named node',
|
|
44
|
+
help: {
|
|
45
|
+
name: 'surface node cycle',
|
|
46
|
+
summary: 'focus the next/previous live node\'s viewer in DFS pre-order — the canvas walked one viewer at a time, descending into a node\'s children before its siblings (bound to Alt+] forward / Alt+[ back)',
|
|
47
|
+
params: [
|
|
48
|
+
{ kind: 'flag', name: 'dir', type: 'enum', choices: ['next', 'prev'], required: false, default: 'next', constraint: 'Direction along the pre-order: next (Alt+], rightward/deeper into children) or prev (Alt+[, back). Wraps at the ends.' },
|
|
49
|
+
{ kind: 'flag', name: 'pane', type: 'string', required: false, constraint: 'tmux pane to cycle FROM. Defaults to $TMUX_PANE / your current pane. The Alt+] / Alt+[ bindings pass this for you.' },
|
|
50
|
+
],
|
|
51
|
+
output: [
|
|
52
|
+
{ name: 'focused', type: 'boolean', required: true, constraint: 'True when the neighbor was brought into view.' },
|
|
53
|
+
{ name: 'node_id', type: 'string', required: false, constraint: 'The node now in front of you.' },
|
|
54
|
+
{ name: 'name', type: 'string', required: false, constraint: 'Its display name.' },
|
|
55
|
+
{ name: 'from', type: 'string', required: false, constraint: 'The node you cycled away from.' },
|
|
56
|
+
],
|
|
57
|
+
outputKind: 'object',
|
|
58
|
+
effects: ['Brings the neighbor\'s viewer forefront beside the caller (like `surface node focus`); the viewer you were watching drops to the background.', 'Relaunches the neighbor\'s broker first if it was dormant.'],
|
|
59
|
+
},
|
|
60
|
+
run: async (input) => {
|
|
61
|
+
const pane = input['pane'] ?? process.env['TMUX_PANE'] ?? currentTmux()?.pane ?? undefined;
|
|
62
|
+
const dir = (input['dir'] ?? 'next');
|
|
63
|
+
const fromId = nodeInPane(pane);
|
|
64
|
+
if (fromId === undefined)
|
|
65
|
+
return { focused: false };
|
|
66
|
+
const order = await liveDfsOrder();
|
|
67
|
+
const i = order.indexOf(fromId);
|
|
68
|
+
if (i === -1 || order.length < 2)
|
|
69
|
+
return { focused: false, node_id: fromId, from: fromId };
|
|
70
|
+
const step = dir === 'next' ? 1 : -1;
|
|
71
|
+
const targetId = order[(i + step + order.length) % order.length];
|
|
72
|
+
const target = await getNodeOrNull(targetId);
|
|
73
|
+
if (target === null)
|
|
74
|
+
return { focused: false, from: fromId };
|
|
75
|
+
// Placement brings the neighbor's viewer forefront beside the caller; the
|
|
76
|
+
// server (ensureAttach, inside focusViewer) relaunches its broker if dormant.
|
|
77
|
+
const res = await focusViewer(targetId, { cwd: target.cwd, name: target.name, pane });
|
|
78
|
+
return { focused: res.focused, node_id: targetId, name: target.name, from: fromId };
|
|
79
|
+
},
|
|
80
|
+
render: (r) => r['focused'] === true
|
|
81
|
+
? `Cycled to "${r['name'] ?? ''}" (${r['node_id']}) — from ${r['from'] ?? '?'}.`
|
|
82
|
+
: 'No other live node to focus.',
|
|
83
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const surfaceNodeFocusLeaf: import("../../../core/command.js").LeafDef;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// `crtr surface node focus` — bring one viewer forward.
|
|
2
|
+
import { defineLeaf } from '../../../core/command.js';
|
|
3
|
+
import { InputError } from '../../../core/io.js';
|
|
4
|
+
import { inboxHint } from '../../../core/keybindings/index.js';
|
|
5
|
+
import { cliClient, rethrowAsCliError } from '../../api-client.js';
|
|
6
|
+
import { currentTmux, displayPopup, focusViewer, shellQuote } from './placement.js';
|
|
7
|
+
export const surfaceNodeFocusLeaf = defineLeaf({
|
|
8
|
+
name: 'focus',
|
|
9
|
+
description: 'bring a node into view without accidentally reviving finished work',
|
|
10
|
+
whenToUse: 'you want to bring a specific node into view — live nodes open or move their viewer beside your current pane; completed, canceled, or crashed nodes open their saved transcript instead. Use `node lifecycle revive` only when you deliberately want to relaunch a dormant agent. Use `surface node cycle` to walk neighbors, and `node message send` to steer without leaving where you are',
|
|
11
|
+
help: {
|
|
12
|
+
name: 'surface node focus',
|
|
13
|
+
summary: 'bring a node into view — attach to a live broker, or open a saved transcript for a non-live node without reviving it',
|
|
14
|
+
params: [
|
|
15
|
+
{ kind: 'positional', name: 'node', required: true, constraint: 'Node id to focus.' },
|
|
16
|
+
{ kind: 'flag', name: 'new-pane', type: 'bool', required: false, constraint: 'Always open a NEW viewer SIDE-BY-SIDE with your current pane instead of moving/reusing the node\'s existing viewer. Two agents on screen at once (F4).' },
|
|
17
|
+
{ kind: 'flag', name: 'in-place', type: 'bool', required: false, constraint: 'Re-exec the --pane pane ONTO this node, REPLACING whatever viewer it showed (a swap in place, not a split beside). Backs the attach viewer\'s subagent scroll+swap (↓ into the reports roster, Enter dives into the child right in your pane). MUST be driven from OUTSIDE that pane\'s process tree (e.g. `tmux run-shell`) — respawn-pane -k kills whatever runs in it. Mutually exclusive with --new-pane.' },
|
|
18
|
+
{ kind: 'flag', name: 'pane', type: 'string', required: false, constraint: 'tmux pane id to focus beside (default: caller TMUX_PANE). Used by the canvas browser popup to focus back into the originating pane.' },
|
|
19
|
+
],
|
|
20
|
+
output: [
|
|
21
|
+
{ name: 'focused', type: 'boolean', required: true, constraint: 'True when the node\'s viewer was brought into view.' },
|
|
22
|
+
{ name: 'session', type: 'string', required: false, constraint: 'The tmux session the viewer lives in.' },
|
|
23
|
+
{ name: 'revived', type: 'boolean', required: true, constraint: 'True when focusing a live node had to relaunch its broker; false for a saved-transcript inspection.' },
|
|
24
|
+
{ name: 'in_place', type: 'boolean', required: true, constraint: 'True when an existing viewer was navigated to (no new pane); false when a fresh viewer pane was opened or moved beside you.' },
|
|
25
|
+
],
|
|
26
|
+
outputKind: 'object',
|
|
27
|
+
effects: ['For active/idle nodes: opens/moves the one surface-attach viewer beside the caller, or navigates to its existing viewer.', 'For done/dead/canceled nodes: opens a read-only saved transcript popup. It does not launch a broker or change node status.', 'With --new-pane/--in-place on a live node: controls whether the viewer splits beside or replaces the caller pane.'],
|
|
28
|
+
},
|
|
29
|
+
run: async (input) => {
|
|
30
|
+
const id = input['node'];
|
|
31
|
+
const node = await cliClient()
|
|
32
|
+
.getNode(id)
|
|
33
|
+
.catch((err) => rethrowAsCliError(err, 'List nodes with `crtr node inspect list`.'));
|
|
34
|
+
// A kind:'human' node is a control-plane ASK (a humanloop deck on the human's
|
|
35
|
+
// screen), NOT a pi conversation — it has no session. Reviving one boots a
|
|
36
|
+
// confused blank "you have been revived" pi, so refuse rather than focus it.
|
|
37
|
+
// (The nav/resume UIs already hide human nodes; this guards a hand-typed id.)
|
|
38
|
+
if (node.kind === 'human') {
|
|
39
|
+
throw new InputError({
|
|
40
|
+
error: 'not_focusable',
|
|
41
|
+
message: `node ${id} is a human-ask (kind:human), not a conversation — it has no pi session to focus.`,
|
|
42
|
+
next: `The pending question is queued for the human (${inboxHint()} opens the inbox); see it with \`crtr human list\`, or retract it with \`crtr human cancel ${id}\`.`,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// Opening history is not resuming work. A terminal/canceled/crashed node has
|
|
46
|
+
// no live broker to attach to, so show its persisted transcript in a popup;
|
|
47
|
+
// `node lifecycle revive` remains the explicit state-changing operation.
|
|
48
|
+
if (node.status !== 'active' && node.status !== 'idle') {
|
|
49
|
+
const pane = input['pane'] ?? process.env['TMUX_PANE'] ?? currentTmux()?.pane;
|
|
50
|
+
const focused = pane !== undefined && pane !== ''
|
|
51
|
+
? displayPopup(pane, node.cwd, `crtr node inspect transcript ${shellQuote(id)}`)
|
|
52
|
+
: false;
|
|
53
|
+
return { focused, session: null, revived: false, in_place: false };
|
|
54
|
+
}
|
|
55
|
+
// Local viewer tail: open/move the broker-backed viewer beside the caller.
|
|
56
|
+
// The server (ensureAttach) owns the revive + view.sock wait; pure tmux ops
|
|
57
|
+
// own the pane placement.
|
|
58
|
+
const res = await focusViewer(id, {
|
|
59
|
+
cwd: node.cwd,
|
|
60
|
+
name: node.name,
|
|
61
|
+
pane: input['pane'],
|
|
62
|
+
newPane: input['newPane'] === true,
|
|
63
|
+
inPlace: input['inPlace'] === true,
|
|
64
|
+
});
|
|
65
|
+
return { focused: res.focused, session: res.session, revived: res.revived, in_place: res.inPlace };
|
|
66
|
+
},
|
|
67
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const surfaceNodeIdLeaf: import("../../../core/command.js").LeafDef;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// `crtr surface node id` — copy a viewer's node id.
|
|
2
|
+
import { defineLeaf } from '../../../core/command.js';
|
|
3
|
+
import { InputError } from '../../../core/io.js';
|
|
4
|
+
import { writeClipboardText } from '../../../core/clipboard-text.js';
|
|
5
|
+
import { displayMessage } from '../../../core/runtime/tmux-chrome.js';
|
|
6
|
+
import { nodeInPane } from './placement.js';
|
|
7
|
+
export const surfaceNodeIdLeaf = defineLeaf({
|
|
8
|
+
name: 'id',
|
|
9
|
+
description: 'copy the focused node id to the system clipboard',
|
|
10
|
+
whenToUse: 'you need the id of the node in a tmux pane for a follow-up command or external reference',
|
|
11
|
+
help: {
|
|
12
|
+
name: 'surface node id',
|
|
13
|
+
summary: 'copy the node resolved from a tmux pane to the system clipboard',
|
|
14
|
+
params: [
|
|
15
|
+
{ kind: 'flag', name: 'pane', type: 'string', required: false, constraint: 'tmux pane id whose focused node to copy. Defaults to $TMUX_PANE / your current pane.' },
|
|
16
|
+
],
|
|
17
|
+
output: [
|
|
18
|
+
{ name: 'node_id', type: 'string', required: true, constraint: 'The focused node id copied to the system clipboard.' },
|
|
19
|
+
],
|
|
20
|
+
outputKind: 'object',
|
|
21
|
+
effects: ['Writes the focused node id to the system clipboard and shows a transient tmux confirmation.'],
|
|
22
|
+
},
|
|
23
|
+
run: async (input) => {
|
|
24
|
+
const pane = input['pane'] ?? process.env['TMUX_PANE'];
|
|
25
|
+
const nodeId = nodeInPane(pane);
|
|
26
|
+
if (nodeId === undefined) {
|
|
27
|
+
displayMessage('crtr: no node in pane', pane);
|
|
28
|
+
throw new InputError({ error: 'no_node', message: 'no node found in this pane', next: 'Pass --pane <pane-id> for a pane showing an active node.' });
|
|
29
|
+
}
|
|
30
|
+
if (!writeClipboardText(nodeId)) {
|
|
31
|
+
displayMessage('crtr: copy failed', pane);
|
|
32
|
+
throw new InputError({ error: 'clipboard_write_failed', message: 'could not write the node id to the system clipboard', next: 'Make a system clipboard tool available, then retry.' });
|
|
33
|
+
}
|
|
34
|
+
displayMessage('crtr: node id copied', pane);
|
|
35
|
+
return { node_id: nodeId };
|
|
36
|
+
},
|
|
37
|
+
render: (r) => `Copied node id: ${r['node_id']}`,
|
|
38
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const surfaceNodePinLeaf: import("../../../core/command.js").LeafDef;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// `crtr surface node pin` — navigator pin control for a viewer.
|
|
2
|
+
import { defineLeaf } from '../../../core/command.js';
|
|
3
|
+
import { InputError } from '../../../core/io.js';
|
|
4
|
+
import { displayMessage } from '../../../core/runtime/tmux-chrome.js';
|
|
5
|
+
import { loadPins, savePins } from '../../../core/canvas/browse/pins.js';
|
|
6
|
+
import { nodeInPane } from './placement.js';
|
|
7
|
+
export const surfaceNodePinLeaf = defineLeaf({
|
|
8
|
+
name: 'pin',
|
|
9
|
+
description: 'pin or unpin the node in a tmux pane in the canvas navigator',
|
|
10
|
+
whenToUse: 'you want the conversation in this pane starred at the top of your canvas navigator (the same pin `canvas browse` toggles), without opening the navigator to do it',
|
|
11
|
+
help: {
|
|
12
|
+
name: 'surface node pin',
|
|
13
|
+
summary: 'toggle the canvas-navigator pin on the node resolved from a tmux pane — a local, per-user view preference that sorts the node to the top of your navigator and fills its Pinned tab, mutating nothing on the canvas',
|
|
14
|
+
params: [
|
|
15
|
+
{ kind: 'flag', name: 'pane', type: 'string', required: false, constraint: 'tmux pane id whose focused node to pin. Defaults to $TMUX_PANE / your current pane.' },
|
|
16
|
+
],
|
|
17
|
+
output: [
|
|
18
|
+
{ name: 'node_id', type: 'string', required: true, constraint: 'The node whose pin was toggled.' },
|
|
19
|
+
{ name: 'pinned', type: 'boolean', required: true, constraint: 'True when the node is now pinned, false when the pin was removed.' },
|
|
20
|
+
],
|
|
21
|
+
outputKind: 'object',
|
|
22
|
+
effects: ['Toggles the node in the per-user navigator pin set and shows a transient tmux confirmation.'],
|
|
23
|
+
},
|
|
24
|
+
run: async (input) => {
|
|
25
|
+
const pane = input['pane'] ?? process.env['TMUX_PANE'];
|
|
26
|
+
const nodeId = nodeInPane(pane);
|
|
27
|
+
if (nodeId === undefined) {
|
|
28
|
+
displayMessage('crtr: no node in pane', pane);
|
|
29
|
+
throw new InputError({ error: 'no_node', message: 'no node found in this pane', next: 'Pass --pane <pane-id> for a pane showing an active node.' });
|
|
30
|
+
}
|
|
31
|
+
const pins = loadPins();
|
|
32
|
+
const pinned = !pins.has(nodeId);
|
|
33
|
+
if (pinned)
|
|
34
|
+
pins.add(nodeId);
|
|
35
|
+
else
|
|
36
|
+
pins.delete(nodeId);
|
|
37
|
+
savePins(pins);
|
|
38
|
+
displayMessage(pinned ? 'crtr: conversation pinned' : 'crtr: conversation unpinned', pane);
|
|
39
|
+
return { node_id: nodeId, pinned };
|
|
40
|
+
},
|
|
41
|
+
render: (r) => (r['pinned'] === true ? `Pinned ${r['node_id']} in the canvas navigator.` : `Unpinned ${r['node_id']}.`),
|
|
42
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { closePane, currentTmux, displayPopup, paneCurrentPath, paneExists, panePid, paneStartCommand, respawnPaneInPlace, respawnPaneSync, shellQuote, viewerSplitEnv } from '../../../core/runtime/placement-tmux.js';
|
|
2
|
+
export { closePane, currentTmux, displayPopup, paneCurrentPath, paneExists, panePid, paneStartCommand, respawnPaneInPlace, respawnPaneSync, shellQuote, viewerSplitEnv };
|
|
3
|
+
export declare function viewerEnv(): Record<string, string>;
|
|
4
|
+
/** The live viewer pane for `nodeId` (the pane a surface-attach viewer tagged
|
|
5
|
+
* `@crtr_node`), or undefined. Pure tag scan over live panes. */
|
|
6
|
+
export declare function viewerPaneOf(nodeId: string): string | undefined;
|
|
7
|
+
interface FocusViewerOpts {
|
|
8
|
+
cwd: string;
|
|
9
|
+
name: string;
|
|
10
|
+
pane?: string;
|
|
11
|
+
newPane?: boolean;
|
|
12
|
+
inPlace?: boolean;
|
|
13
|
+
}
|
|
14
|
+
interface FocusViewerResult {
|
|
15
|
+
focused: boolean;
|
|
16
|
+
session: string | null;
|
|
17
|
+
inPlace: boolean;
|
|
18
|
+
revived: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** Bring a node's ONE viewer forefront beside (or navigated to) the caller —
|
|
21
|
+
* the pure-tmux port of placement.ts `focus()`. The server (`ensureAttach`)
|
|
22
|
+
* owns the broker revive + the view.sock accept-wait; the `@crtr_node` pane tag
|
|
23
|
+
* is the viewer registry. crtr is tmux-only: no caller pane ⇒ not focused. */
|
|
24
|
+
export declare function focusViewer(nodeId: string, opts: FocusViewerOpts): Promise<FocusViewerResult>;
|
|
25
|
+
/** Open a viewer for a freshly-spawned --root node in a FRESH WINDOW in the
|
|
26
|
+
* caller's current tmux session (the --root spawn-viewer path). Pure tmux; the
|
|
27
|
+
* broker is already launching server-side, so the attach pane self-polls the
|
|
28
|
+
* cold socket. Returns the opened window/session, empty when not in tmux. */
|
|
29
|
+
export declare function openSpawnViewer(nodeId: string, cwd: string, name: string): {
|
|
30
|
+
window?: string;
|
|
31
|
+
session?: string;
|
|
32
|
+
};
|
|
33
|
+
/** The node "in front of you" in a tmux pane, resolved PURELY from the pane's
|
|
34
|
+
* `@crtr_node` tag. Defaults to $TMUX_PANE / the caller's current pane when
|
|
35
|
+
* `pane` is omitted — shared by `node lifecycle recycle` / `node lifecycle
|
|
36
|
+
* demote` / `node config --lifecycle` / `node lifecycle close` / `surface node cycle`,
|
|
37
|
+
* and the `canvas chord` leaf.
|
|
38
|
+
*
|
|
39
|
+
* A `crtr surface attach` viewer self-tags its pane with the node it views
|
|
40
|
+
* (`@crtr_node`) — the tag IS the handle (a broker engine runs DETACHED with
|
|
41
|
+
* window=null, so there is no window→node fallback). Kept SYNC + tag-only: the
|
|
42
|
+
* re-plumbed CLI no longer reads canvas state to confirm the tagged node is
|
|
43
|
+
* still live, so a stale tag (attach SIGKILLed without clearing) resolves until
|
|
44
|
+
* the pane is respawned. Callers that mutate then re-validate the id via the
|
|
45
|
+
* API (getNode 404 → clean error). */
|
|
46
|
+
export declare function nodeInPane(pane?: string): string | undefined;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// `crtr surface node` — pure tmux placement for node viewers.
|
|
2
|
+
import { closePane, currentTmux, displayPopup, ensureSession, getPaneOption, listLivePanes, openNodeWindow, paneCurrentPath, paneExists, paneLocation, panePid, paneStartCommand, renameWindow, respawnPaneInPlace, respawnPaneSync, selectLayout, selectPane, selectWindow, setPaneOption, shellQuote, splitWindow, switchClient, viewerSplitEnv, windowOfPane, } from '../../../core/runtime/placement-tmux.js';
|
|
3
|
+
import { cliClient, rethrowAsCliError } from '../../api-client.js';
|
|
4
|
+
export { closePane, currentTmux, displayPopup, paneCurrentPath, paneExists, panePid, paneStartCommand, respawnPaneInPlace, respawnPaneSync, shellQuote, viewerSplitEnv };
|
|
5
|
+
export function viewerEnv() {
|
|
6
|
+
const crtrHome = process.env['CRTR_HOME'];
|
|
7
|
+
return crtrHome !== undefined ? { CRTR_HOME: crtrHome } : {};
|
|
8
|
+
}
|
|
9
|
+
/** The live viewer pane for `nodeId` (the pane a surface-attach viewer tagged
|
|
10
|
+
* `@crtr_node`), or undefined. Pure tag scan over live panes. */
|
|
11
|
+
export function viewerPaneOf(nodeId) {
|
|
12
|
+
const panes = listLivePanes();
|
|
13
|
+
if (panes === null)
|
|
14
|
+
return undefined;
|
|
15
|
+
for (const pane of panes) {
|
|
16
|
+
if (getPaneOption(pane, '@crtr_node') === nodeId)
|
|
17
|
+
return pane;
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
/** Open a fresh surface-attach viewer SPLIT beside `callerPane` and rebalance
|
|
22
|
+
* its window to even side-by-side widths. Pure tmux. */
|
|
23
|
+
function openBesideCaller(callerPane, nodeId, cwd, callerSession, revived) {
|
|
24
|
+
const opened = splitWindow(callerPane, { cwd, env: viewerEnv(), command: `crtr surface attach to ${nodeId}` });
|
|
25
|
+
if (opened === null)
|
|
26
|
+
return { focused: false, session: null, inPlace: false, revived };
|
|
27
|
+
const loc = paneLocation(opened);
|
|
28
|
+
if (loc !== null)
|
|
29
|
+
selectLayout(loc.window, 'even-horizontal');
|
|
30
|
+
selectPane(opened);
|
|
31
|
+
return { focused: true, session: loc?.session ?? callerSession, inPlace: false, revived };
|
|
32
|
+
}
|
|
33
|
+
/** Bring a node's ONE viewer forefront beside (or navigated to) the caller —
|
|
34
|
+
* the pure-tmux port of placement.ts `focus()`. The server (`ensureAttach`)
|
|
35
|
+
* owns the broker revive + the view.sock accept-wait; the `@crtr_node` pane tag
|
|
36
|
+
* is the viewer registry. crtr is tmux-only: no caller pane ⇒ not focused. */
|
|
37
|
+
export async function focusViewer(nodeId, opts) {
|
|
38
|
+
const callerPane = opts.pane ?? process.env['TMUX_PANE'] ?? currentTmux()?.pane;
|
|
39
|
+
if (callerPane === undefined || callerPane === '') {
|
|
40
|
+
return { focused: false, session: null, inPlace: false, revived: false };
|
|
41
|
+
}
|
|
42
|
+
// (a) Server ensures the broker engine is alive + its view.sock accepts.
|
|
43
|
+
const attach = await cliClient().ensureAttach(nodeId).catch(rethrowAsCliError);
|
|
44
|
+
const revived = attach.revived;
|
|
45
|
+
const callerSession = paneLocation(callerPane)?.session ?? null;
|
|
46
|
+
// (b0) --in-place → the caller pane BECOMES this node's viewer, replacing what
|
|
47
|
+
// it showed. Must be driven from OUTSIDE that pane's process tree.
|
|
48
|
+
if (opts.inPlace === true) {
|
|
49
|
+
const priorNodeId = getPaneOption(callerPane, '@crtr_node');
|
|
50
|
+
const existing = viewerPaneOf(nodeId);
|
|
51
|
+
if (existing !== undefined && existing !== callerPane && paneExists(existing))
|
|
52
|
+
closePane(existing);
|
|
53
|
+
try {
|
|
54
|
+
setPaneOption(callerPane, '@crtr_node', '');
|
|
55
|
+
}
|
|
56
|
+
catch { /* best-effort */ }
|
|
57
|
+
const window = windowOfPane(callerPane);
|
|
58
|
+
const env = priorNodeId !== undefined && priorNodeId !== ''
|
|
59
|
+
? { ...viewerEnv(), CRTR_ATTACH_ROSTER: priorNodeId }
|
|
60
|
+
: viewerEnv();
|
|
61
|
+
const ok = respawnPaneSync({ pane: callerPane, cwd: opts.cwd, env, command: `crtr surface attach to ${nodeId}` });
|
|
62
|
+
if (ok && window !== null)
|
|
63
|
+
renameWindow(window, opts.name);
|
|
64
|
+
return { focused: ok, session: callerSession, inPlace: true, revived };
|
|
65
|
+
}
|
|
66
|
+
// (b) --new-pane → always a fresh viewer beside the caller; drop any prior
|
|
67
|
+
// viewer this node holds elsewhere (one viewer per node).
|
|
68
|
+
if (opts.newPane === true) {
|
|
69
|
+
const prior = viewerPaneOf(nodeId);
|
|
70
|
+
if (prior !== undefined && paneExists(prior))
|
|
71
|
+
closePane(prior);
|
|
72
|
+
return openBesideCaller(callerPane, nodeId, opts.cwd, callerSession, revived);
|
|
73
|
+
}
|
|
74
|
+
// (c) Reuse the node's existing tagged viewer wherever it already lives.
|
|
75
|
+
const existing = viewerPaneOf(nodeId);
|
|
76
|
+
if (existing !== undefined) {
|
|
77
|
+
const loc = paneLocation(existing);
|
|
78
|
+
if (loc !== null) {
|
|
79
|
+
switchClient(loc.session);
|
|
80
|
+
selectWindow(loc.session, loc.window);
|
|
81
|
+
selectPane(existing);
|
|
82
|
+
return { focused: true, session: loc.session, inPlace: true, revived };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// (d) No live viewer → open one beside the caller.
|
|
86
|
+
return openBesideCaller(callerPane, nodeId, opts.cwd, callerSession, revived);
|
|
87
|
+
}
|
|
88
|
+
/** Open a viewer for a freshly-spawned --root node in a FRESH WINDOW in the
|
|
89
|
+
* caller's current tmux session (the --root spawn-viewer path). Pure tmux; the
|
|
90
|
+
* broker is already launching server-side, so the attach pane self-polls the
|
|
91
|
+
* cold socket. Returns the opened window/session, empty when not in tmux. */
|
|
92
|
+
export function openSpawnViewer(nodeId, cwd, name) {
|
|
93
|
+
const loc = currentTmux();
|
|
94
|
+
const session = loc?.session;
|
|
95
|
+
if (session === undefined || session === '')
|
|
96
|
+
return {};
|
|
97
|
+
ensureSession(session, cwd);
|
|
98
|
+
const opened = openNodeWindow({ session, name, cwd, env: viewerEnv(), command: `crtr surface attach to ${nodeId}` });
|
|
99
|
+
if (opened === null)
|
|
100
|
+
return {};
|
|
101
|
+
selectWindow(session, opened.window);
|
|
102
|
+
selectPane(opened.pane);
|
|
103
|
+
return { window: opened.window, session };
|
|
104
|
+
}
|
|
105
|
+
/** The node "in front of you" in a tmux pane, resolved PURELY from the pane's
|
|
106
|
+
* `@crtr_node` tag. Defaults to $TMUX_PANE / the caller's current pane when
|
|
107
|
+
* `pane` is omitted — shared by `node lifecycle recycle` / `node lifecycle
|
|
108
|
+
* demote` / `node config --lifecycle` / `node lifecycle close` / `surface node cycle`,
|
|
109
|
+
* and the `canvas chord` leaf.
|
|
110
|
+
*
|
|
111
|
+
* A `crtr surface attach` viewer self-tags its pane with the node it views
|
|
112
|
+
* (`@crtr_node`) — the tag IS the handle (a broker engine runs DETACHED with
|
|
113
|
+
* window=null, so there is no window→node fallback). Kept SYNC + tag-only: the
|
|
114
|
+
* re-plumbed CLI no longer reads canvas state to confirm the tagged node is
|
|
115
|
+
* still live, so a stale tag (attach SIGKILLed without clearing) resolves until
|
|
116
|
+
* the pane is respawned. Callers that mutate then re-validate the id via the
|
|
117
|
+
* API (getNode 404 → clean error). */
|
|
118
|
+
export function nodeInPane(pane) {
|
|
119
|
+
const resolvePane = pane ?? process.env['TMUX_PANE'] ?? currentTmux()?.pane;
|
|
120
|
+
if (resolvePane === undefined || resolvePane === '')
|
|
121
|
+
return undefined;
|
|
122
|
+
const tagged = getPaneOption(resolvePane, '@crtr_node');
|
|
123
|
+
return tagged !== undefined && tagged !== '' ? tagged : undefined;
|
|
124
|
+
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
// `crtr surface node` — screen navigation for canvas-node viewers.
|
|
2
2
|
import { defineBranch } from '../core/command.js';
|
|
3
|
-
import {
|
|
3
|
+
import { surfaceNodeFocusLeaf } from './surface/node/focus.js';
|
|
4
|
+
import { surfaceNodeCycleLeaf } from './surface/node/cycle.js';
|
|
5
|
+
import { surfaceNodeIdLeaf } from './surface/node/id.js';
|
|
6
|
+
import { surfaceNodePinLeaf } from './surface/node/pin.js';
|
|
4
7
|
export function registerSurfaceNode() {
|
|
5
8
|
return defineBranch({
|
|
6
9
|
name: 'node',
|
|
@@ -9,8 +9,7 @@ import { spawnSync } from 'node:child_process';
|
|
|
9
9
|
import { defineLeaf } from '../core/command.js';
|
|
10
10
|
import { InputError } from '../core/io.js';
|
|
11
11
|
import { displayMessage } from '../core/runtime/tmux-chrome.js';
|
|
12
|
-
import {
|
|
13
|
-
import { nodeInPane } from './node.js';
|
|
12
|
+
import { nodeInPane, paneCurrentPath, panePid, paneStartCommand, respawnPaneInPlace, respawnPaneSync, viewerSplitEnv, } from './surface/node/placement.js';
|
|
14
13
|
/** True when `rootPid` (the pane's `#{pane_pid}`) or any descendant of it is a
|
|
15
14
|
* live `crtr surface attach to <nodeId>` viewer process. This is how a
|
|
16
15
|
* shell-hosted viewer is recognized: older panes were opened as a login shell
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// `crtr surface tmux-spread <node>` — explode the local subtree into a tiled grid.
|
|
2
2
|
//
|
|
3
3
|
// A genuine viewer-placement decision (tile every live viewer in a subtree into
|
|
4
|
-
// one window), so it lives under `surface` alongside
|
|
4
|
+
// one window), so it lives under `surface` alongside the other viewer-placement commands.
|
|
5
5
|
// The command expands the graph being watched: the caller's
|
|
6
6
|
// own viewer pane is broken out into a BRAND-NEW window, then a surface-attach
|
|
7
7
|
// viewer pane is tiled beside it for every broker-alive node in the local
|
package/dist/commands/surface.js
CHANGED
|
@@ -2,41 +2,26 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Groups the screen-facing surface families under one canonical noun.
|
|
4
4
|
import { defineBranch } from '../core/command.js';
|
|
5
|
-
import { registerWeb } from '../clients/web/web-cmd.js';
|
|
6
5
|
import { registerAttach } from '../clients/attach/command.js';
|
|
7
6
|
import { tmuxSpreadLeaf } from './surface-tmux-spread.js';
|
|
8
7
|
import { surfaceEditLeaf } from './surface-edit.js';
|
|
9
8
|
import { registerSurfaceNode } from './surface-node.js';
|
|
10
9
|
import { surfaceInspectLeaf } from './surface-inspect.js';
|
|
11
10
|
import { surfaceReloadLeaf } from './surface-reload.js';
|
|
12
|
-
function namespaceForSurface(node) {
|
|
13
|
-
node.help.name = `surface ${node.help.name}`;
|
|
14
|
-
if (node.kind === 'branch') {
|
|
15
|
-
node.description = node.rootEntry?.concept ?? node.description ?? '';
|
|
16
|
-
node.whenToUse = node.rootEntry?.useWhen ?? node.whenToUse ?? '';
|
|
17
|
-
for (const child of node.children)
|
|
18
|
-
namespaceForSurface(child);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
11
|
export function registerSurface() {
|
|
22
|
-
const attach = registerAttach();
|
|
23
|
-
const web = registerWeb();
|
|
24
|
-
for (const child of [attach, web]) {
|
|
25
|
-
child.tier = 'important';
|
|
26
|
-
namespaceForSurface(child);
|
|
27
|
-
}
|
|
12
|
+
const attach = registerAttach('surface', 'important');
|
|
28
13
|
return defineBranch({
|
|
29
14
|
name: 'surface',
|
|
30
15
|
rootEntry: {
|
|
31
|
-
concept: 'screen-facing surfaces — node viewers, live broker attachment,
|
|
16
|
+
concept: 'screen-facing surfaces — node viewers, live broker attachment, and the Inspector',
|
|
32
17
|
desc: 'open and manage screen-facing surfaces',
|
|
33
|
-
useWhen: 'you need a UI or presentation surface rather than a node, document, or graph operation — node-viewer navigation, live broker attachment, node inspection, or
|
|
18
|
+
useWhen: 'you need a UI or presentation surface rather than a node, document, or graph operation — node-viewer navigation, live broker attachment, node inspection, tmux placement, or an editor pane',
|
|
34
19
|
},
|
|
35
20
|
help: {
|
|
36
21
|
name: 'surface',
|
|
37
22
|
summary: 'open and manage screen-facing surfaces',
|
|
38
|
-
model: 'Choose `node` for navigation among node viewers. The other commands open a broker attachment, node Inspector,
|
|
23
|
+
model: 'Choose `node` for navigation among node viewers. The other commands open a broker attachment, node Inspector, subtree spread, reload, or adjacent editor pane.',
|
|
39
24
|
},
|
|
40
|
-
children: [registerSurfaceNode(), attach,
|
|
25
|
+
children: [registerSurfaceNode(), attach, surfaceInspectLeaf, surfaceReloadLeaf, tmuxSpreadLeaf, surfaceEditLeaf],
|
|
41
26
|
});
|
|
42
27
|
}
|