@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
|
@@ -23,6 +23,9 @@ function memoryName(memory, palette) {
|
|
|
23
23
|
? hyperlink(name, pathToFileURL(memory.path).href)
|
|
24
24
|
: name;
|
|
25
25
|
}
|
|
26
|
+
function countMemories(memories, action) {
|
|
27
|
+
return memories.filter((memory) => memory.action === action).length;
|
|
28
|
+
}
|
|
26
29
|
function distinctFileCount(files) {
|
|
27
30
|
return new Set(files.map((file) => file.key)).size;
|
|
28
31
|
}
|
|
@@ -52,7 +55,8 @@ export class GroupRecapComponent extends Container {
|
|
|
52
55
|
this.addChild(new Spacer(1));
|
|
53
56
|
if (detailed) {
|
|
54
57
|
for (const memory of activity.memories) {
|
|
55
|
-
|
|
58
|
+
const icon = memory.action === 'write' ? TOOL_ICON.write : MEMORY_ICON;
|
|
59
|
+
this.addChild(new RecapDetailLine(`${palette.info(icon)} `, memoryName(memory, palette), ''));
|
|
56
60
|
}
|
|
57
61
|
for (const file of activity.files)
|
|
58
62
|
this.addFile(file, palette);
|
|
@@ -70,8 +74,13 @@ export class GroupRecapComponent extends Container {
|
|
|
70
74
|
if (changedFiles >= 1) {
|
|
71
75
|
stats.push(`${palette.warning(TOOL_ICON.edit)} ${palette.muted(count(changedFiles, 'file changed', 'files changed'))}`);
|
|
72
76
|
}
|
|
73
|
-
|
|
74
|
-
|
|
77
|
+
const memoriesRead = countMemories(activity.memories, 'read');
|
|
78
|
+
if (memoriesRead >= 1) {
|
|
79
|
+
stats.push(`${palette.info(MEMORY_ICON)} ${palette.muted(count(memoriesRead, 'memory read', 'memory reads'))}`);
|
|
80
|
+
}
|
|
81
|
+
const memoriesSaved = countMemories(activity.memories, 'write');
|
|
82
|
+
if (memoriesSaved >= 1) {
|
|
83
|
+
stats.push(`${palette.info(TOOL_ICON.write)} ${palette.muted(count(memoriesSaved, 'memory saved', 'memories saved'))}`);
|
|
75
84
|
}
|
|
76
85
|
this.addChild(new Text(stats.join(palette.muted(' · ')), 0, 0));
|
|
77
86
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// session/connection.ts — how a viewer gets onto a broker: resolving the
|
|
2
|
-
// local
|
|
2
|
+
// local or remote attach target, dialing it, the role it claims in the hello
|
|
3
3
|
// handshake, and the optional pre-wait for a socket still being bound.
|
|
4
4
|
//
|
|
5
5
|
// Everything here runs BEFORE the TUI takes over the terminal, which is the
|
|
@@ -102,8 +102,8 @@ export async function connectToNode(nodeId, canvasName) {
|
|
|
102
102
|
catch (err) {
|
|
103
103
|
rethrowAsCliError(err, 'The node may be finalized or otherwise not attachable.');
|
|
104
104
|
}
|
|
105
|
-
// Local only:
|
|
106
|
-
//
|
|
105
|
+
// Local only: remote attach reaches crtrd over WebSocket rather than a
|
|
106
|
+
// local socket file, so `--canvas` has nothing to pre-wait on.
|
|
107
107
|
await preWaitForViewSocket(nodeId);
|
|
108
108
|
}
|
|
109
109
|
const socket = new BrokerClient(nodeId, { transport });
|
|
@@ -125,18 +125,12 @@ export async function connectToNode(nodeId, canvasName) {
|
|
|
125
125
|
next: 'Check the node has a running headless broker.',
|
|
126
126
|
});
|
|
127
127
|
};
|
|
128
|
-
// A remote
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
//
|
|
133
|
-
//
|
|
134
|
-
// listener that is NEVER removed instead, before dialing at all, so nothing
|
|
135
|
-
// landing during the caller's synchronous TUI/editor setup has nowhere to go.
|
|
136
|
-
// `assertConnected` is the caller's one synchronous checkpoint on it, taken
|
|
137
|
-
// immediately before permanent socket wiring; anything after that is
|
|
138
|
-
// legitimately mid-session and belongs to the reconnect supervisor, exactly
|
|
139
|
-
// as it already does for a local socket.
|
|
128
|
+
// A remote crtrd attach connection can close after its WebSocket upgrade when
|
|
129
|
+
// its broker socket drops. Install a listener before dialing and keep it
|
|
130
|
+
// through synchronous TUI/editor setup, so `assertConnected` can surface any
|
|
131
|
+
// terminal startup failure at its one checkpoint immediately before permanent
|
|
132
|
+
// socket wiring. Failures after that are mid-session and belong to the
|
|
133
|
+
// reconnect supervisor, as they do for a local socket.
|
|
140
134
|
let terminalStartupError;
|
|
141
135
|
socket.on('error', (err) => {
|
|
142
136
|
if (terminalStartupError === undefined)
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { CombinedAutocompleteProvider } from '@earendil-works/pi-tui';
|
|
2
2
|
import type { BrokerDataFrame, RefMeta } from '../../../core/runtime/broker-protocol.js';
|
|
3
|
+
import type { ViewerCapabilities } from '../input/capabilities.js';
|
|
3
4
|
import { type PreviewableCommand } from '../slash/prompt-preview.js';
|
|
4
5
|
import type { AttachBindings } from './bindings.js';
|
|
5
6
|
import type { AttachSession } from './context.js';
|
|
6
|
-
export declare function buildAttachAutocompleteProvider(cwd: string, fdPath: string | null, commands
|
|
7
|
+
export declare function buildAttachAutocompleteProvider(cwd: string, fdPath: string | null, commands: ReadonlyArray<{
|
|
7
8
|
name: string;
|
|
8
9
|
description?: string;
|
|
9
|
-
}
|
|
10
|
+
}> | undefined, capabilities: ViewerCapabilities, createProvider?: (items: ReadonlyArray<{
|
|
10
11
|
name: string;
|
|
11
12
|
description?: string;
|
|
12
13
|
}>, cwd: string, fdPath: string | null) => CombinedAutocompleteProvider): CombinedAutocompleteProvider;
|
|
@@ -54,6 +55,6 @@ export interface EditorInventoryHooks {
|
|
|
54
55
|
/** Owns everything the editor can complete against — the merged slash-command
|
|
55
56
|
* list, the loaded-command preview, the broker's raw command metadata, and the
|
|
56
57
|
* memory-ref inventory — plus the popup that inspects the loaded template.
|
|
57
|
-
*
|
|
58
|
-
* autocomplete
|
|
59
|
-
export declare function createEditorInventory(ctx: Pick<AttachSession, '
|
|
58
|
+
* Input wiring supplies the session capability before first render, seeding
|
|
59
|
+
* builtins-only autocomplete before the broker's first `get_commands` ack. */
|
|
60
|
+
export declare function createEditorInventory(ctx: Pick<AttachSession, 'meta' | 'socket' | 'tui' | 'editor'>, capabilities: ViewerCapabilities, hooks: EditorInventoryHooks): EditorInventory;
|
|
@@ -19,8 +19,8 @@ import { surfaceTmuxStyleArgs } from '../../../core/runtime/surface-bg.js';
|
|
|
19
19
|
import { RefAwareAutocompleteProvider } from '../input/ref-autocomplete.js';
|
|
20
20
|
import { CANVAS_SLASH_COMMANDS, locallyConsumedCommandNames, slashCommandList } from '../slash/dispatch.js';
|
|
21
21
|
import { loadedCommandPreview } from '../slash/prompt-preview.js';
|
|
22
|
-
export function buildAttachAutocompleteProvider(cwd, fdPath, commands,
|
|
23
|
-
return createProvider([...slashCommandList(commands,
|
|
22
|
+
export function buildAttachAutocompleteProvider(cwd, fdPath, commands, capabilities, createProvider = (items, cwd, path) => new CombinedAutocompleteProvider([...items], cwd, path)) {
|
|
23
|
+
return createProvider([...slashCommandList(commands, capabilities)], cwd, fdPath);
|
|
24
24
|
}
|
|
25
25
|
export function createMemoryRefRefreshCoordinator(setMemoryRefs, request) {
|
|
26
26
|
let epoch = 0;
|
|
@@ -46,10 +46,10 @@ export function createMemoryRefRefreshCoordinator(setMemoryRefs, request) {
|
|
|
46
46
|
/** Owns everything the editor can complete against — the merged slash-command
|
|
47
47
|
* list, the loaded-command preview, the broker's raw command metadata, and the
|
|
48
48
|
* memory-ref inventory — plus the popup that inspects the loaded template.
|
|
49
|
-
*
|
|
50
|
-
* autocomplete
|
|
51
|
-
export function createEditorInventory(ctx, hooks) {
|
|
52
|
-
const {
|
|
49
|
+
* Input wiring supplies the session capability before first render, seeding
|
|
50
|
+
* builtins-only autocomplete before the broker's first `get_commands` ack. */
|
|
51
|
+
export function createEditorInventory(ctx, capabilities, hooks) {
|
|
52
|
+
const { meta, socket, tui, editor } = ctx;
|
|
53
53
|
let commands = [];
|
|
54
54
|
let commandPreview;
|
|
55
55
|
// The broker's RAW command metadata (`undefined` until the first get_commands
|
|
@@ -90,7 +90,7 @@ export function createEditorInventory(ctx, hooks) {
|
|
|
90
90
|
// refs never enter command completion or the loaded-command preview (which
|
|
91
91
|
// reads only `commands`, never `memoryRefs`).
|
|
92
92
|
const syncEditorInventories = () => {
|
|
93
|
-
const commandProvider = buildAttachAutocompleteProvider(meta.cwd, hooks.fdPath, brokerCommands,
|
|
93
|
+
const commandProvider = buildAttachAutocompleteProvider(meta.cwd, hooks.fdPath, brokerCommands, capabilities);
|
|
94
94
|
editor.setAutocompleteProvider(new RefAwareAutocompleteProvider(memoryRefs, commandProvider));
|
|
95
95
|
editor.setResolvedRefNames(memoryRefs.map((ref) => ref.name));
|
|
96
96
|
// Two independent suppression inventories (review Major 6): the viewer-local
|
|
@@ -130,7 +130,6 @@ export function createEditorInventory(ctx, hooks) {
|
|
|
130
130
|
syncEditorInventories();
|
|
131
131
|
tui.requestRender();
|
|
132
132
|
};
|
|
133
|
-
setCommands();
|
|
134
133
|
// The correlated ref-inventory lifecycle (design: inline memory references,
|
|
135
134
|
// T3 terminal integration). `socket.request` is the same observer-safe
|
|
136
135
|
// read-op channel local and remote attach already share, so this is
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** URI of the OSC-8 hyperlink occupying the given 1-indexed terminal cell. */
|
|
2
|
+
export declare function osc8UriAt(frame: readonly string[], row: number, column: number): string | undefined;
|
|
3
|
+
export type LinkedFileOpenResult = 'opened' | 'missing' | 'invalid' | 'failed';
|
|
4
|
+
/** Replace this local viewer pane with Neovim, then reattach it when Neovim exits. */
|
|
5
|
+
export declare function openLinkedFileInPane(opts: {
|
|
6
|
+
uri: string;
|
|
7
|
+
pane: string;
|
|
8
|
+
cwd: string;
|
|
9
|
+
nodeId: string;
|
|
10
|
+
observer: boolean;
|
|
11
|
+
/** Clear viewer-local pane identity immediately before the pane runs Neovim. */
|
|
12
|
+
beforeRespawn: () => void;
|
|
13
|
+
}): LinkedFileOpenResult;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// session/file-links.ts — OSC-8 file links in the rendered attach frame.
|
|
2
|
+
//
|
|
3
|
+
// A click is resolved against the physical rows last handed to the terminal,
|
|
4
|
+
// not against transcript records: wrapping, fixed cockpit rows, ANSI styling,
|
|
5
|
+
// and OSC-8 boundaries have all already been composed there.
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import stringWidth from 'string-width';
|
|
9
|
+
import { respawnPaneInBackground, shellQuote, viewerSplitEnv } from '../../../core/runtime/placement-tmux.js';
|
|
10
|
+
const GRAPHEMES = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
11
|
+
/** URI of the OSC-8 hyperlink occupying the given 1-indexed terminal cell. */
|
|
12
|
+
export function osc8UriAt(frame, row, column) {
|
|
13
|
+
if (!Number.isInteger(row) || !Number.isInteger(column) || row < 1 || column < 1)
|
|
14
|
+
return undefined;
|
|
15
|
+
let activeUri;
|
|
16
|
+
for (let index = 0; index < Math.min(row, frame.length); index++) {
|
|
17
|
+
const hitColumn = index === row - 1 ? column : undefined;
|
|
18
|
+
const scanned = scanOsc8Row(frame[index] ?? '', activeUri, hitColumn);
|
|
19
|
+
activeUri = scanned.activeUri;
|
|
20
|
+
if (scanned.uri !== undefined)
|
|
21
|
+
return scanned.uri;
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
function scanOsc8Row(line, initialUri, hitColumn) {
|
|
26
|
+
let activeUri = initialUri;
|
|
27
|
+
let cell = 1;
|
|
28
|
+
let index = 0;
|
|
29
|
+
while (index < line.length) {
|
|
30
|
+
if (line[index] === '\x1b') {
|
|
31
|
+
const escape = readEscape(line, index);
|
|
32
|
+
if (escape === undefined)
|
|
33
|
+
break;
|
|
34
|
+
const osc8 = parseOsc8(escape.text);
|
|
35
|
+
if (osc8 !== null)
|
|
36
|
+
activeUri = osc8 === '' ? undefined : osc8;
|
|
37
|
+
index = escape.end;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const nextEscape = line.indexOf('\x1b', index);
|
|
41
|
+
const text = line.slice(index, nextEscape === -1 ? undefined : nextEscape);
|
|
42
|
+
for (const segment of GRAPHEMES.segment(text)) {
|
|
43
|
+
const width = stringWidth(segment.segment);
|
|
44
|
+
if (hitColumn !== undefined && width > 0 && hitColumn >= cell && hitColumn < cell + width && activeUri !== undefined) {
|
|
45
|
+
return { activeUri, uri: activeUri };
|
|
46
|
+
}
|
|
47
|
+
cell += width;
|
|
48
|
+
}
|
|
49
|
+
index = nextEscape === -1 ? line.length : nextEscape;
|
|
50
|
+
}
|
|
51
|
+
return { activeUri, uri: undefined };
|
|
52
|
+
}
|
|
53
|
+
/** Read one terminal control sequence so non-printing ANSI never takes a cell. */
|
|
54
|
+
function readEscape(line, start) {
|
|
55
|
+
const kind = line[start + 1];
|
|
56
|
+
if (kind === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
// OSC, APC, DCS, and PM are string controls terminated by BEL or ST. pi-tui's
|
|
59
|
+
// cursor marker uses APC, so it must consume no display cells here.
|
|
60
|
+
if (kind === ']' || kind === '_' || kind === 'P' || kind === '^') {
|
|
61
|
+
const bel = line.indexOf('\x07', start + 2);
|
|
62
|
+
const st = line.indexOf('\x1b\\', start + 2);
|
|
63
|
+
const end = bel === -1 ? st : st === -1 ? bel : Math.min(bel, st);
|
|
64
|
+
if (end === -1)
|
|
65
|
+
return undefined;
|
|
66
|
+
return { text: line.slice(start, end + (end === bel ? 1 : 2)), end: end + (end === bel ? 1 : 2) };
|
|
67
|
+
}
|
|
68
|
+
if (kind === '[') {
|
|
69
|
+
let end = start + 2;
|
|
70
|
+
while (end < line.length && (line.charCodeAt(end) < 0x40 || line.charCodeAt(end) > 0x7e))
|
|
71
|
+
end++;
|
|
72
|
+
if (end >= line.length)
|
|
73
|
+
return undefined;
|
|
74
|
+
return { text: line.slice(start, end + 1), end: end + 1 };
|
|
75
|
+
}
|
|
76
|
+
return { text: line.slice(start, start + 2), end: start + 2 };
|
|
77
|
+
}
|
|
78
|
+
/** `null` means another escape sequence; an empty URI closes the active link. */
|
|
79
|
+
function parseOsc8(sequence) {
|
|
80
|
+
if (!sequence.startsWith('\x1b]8;'))
|
|
81
|
+
return null;
|
|
82
|
+
const terminatorLength = sequence.endsWith('\x1b\\') ? 2 : 1;
|
|
83
|
+
const body = sequence.slice(4, -terminatorLength);
|
|
84
|
+
const separator = body.indexOf(';');
|
|
85
|
+
if (separator === -1)
|
|
86
|
+
return null;
|
|
87
|
+
return body.slice(separator + 1);
|
|
88
|
+
}
|
|
89
|
+
/** Replace this local viewer pane with Neovim, then reattach it when Neovim exits. */
|
|
90
|
+
export function openLinkedFileInPane(opts) {
|
|
91
|
+
let file;
|
|
92
|
+
try {
|
|
93
|
+
const url = new URL(opts.uri);
|
|
94
|
+
if (url.protocol !== 'file:')
|
|
95
|
+
return 'invalid';
|
|
96
|
+
file = fileURLToPath(url);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return 'invalid';
|
|
100
|
+
}
|
|
101
|
+
if (!existsSync(file))
|
|
102
|
+
return 'missing';
|
|
103
|
+
const attach = `crtr surface attach to ${shellQuote(opts.nodeId)}${opts.observer ? ' --observer' : ''}`;
|
|
104
|
+
const command = `nvim ${shellQuote(file)} || :; exec ${attach}`;
|
|
105
|
+
opts.beforeRespawn();
|
|
106
|
+
return respawnPaneInBackground({ pane: opts.pane, cwd: opts.cwd, env: viewerSplitEnv(), command }) ? 'opened' : 'failed';
|
|
107
|
+
}
|
|
@@ -24,8 +24,11 @@ export declare class ViewerFrame implements Component {
|
|
|
24
24
|
private readonly terminal;
|
|
25
25
|
private readonly parts;
|
|
26
26
|
private viewportRows;
|
|
27
|
+
private lastFrame;
|
|
27
28
|
constructor(terminal: Terminal, parts: ViewerFrameParts);
|
|
28
29
|
render(width: number): string[];
|
|
30
|
+
/** The physical rows returned by the most recent render. */
|
|
31
|
+
lastRenderedFrame(): readonly string[];
|
|
29
32
|
invalidate(): void;
|
|
30
33
|
/** Rows the transcript viewport got in the last frame — the page size. */
|
|
31
34
|
lastViewportRows(): number;
|
|
@@ -55,6 +55,7 @@ export class ViewerFrame {
|
|
|
55
55
|
terminal;
|
|
56
56
|
parts;
|
|
57
57
|
viewportRows = 0;
|
|
58
|
+
lastFrame = [];
|
|
58
59
|
constructor(terminal, parts) {
|
|
59
60
|
this.terminal = terminal;
|
|
60
61
|
this.parts = parts;
|
|
@@ -115,7 +116,15 @@ export class ViewerFrame {
|
|
|
115
116
|
}
|
|
116
117
|
if (frame.length !== rows)
|
|
117
118
|
reportInvariant(`frame correction rendered ${frame.length} rows; expected ${rows}`);
|
|
118
|
-
|
|
119
|
+
const finalFrame = this.ensureCursorMarker(frame, editorLines, editorSlice, editorBottomOffset, bottomLines.length, rows);
|
|
120
|
+
// This is the exact physical screen content used for OSC-8 mouse hit tests.
|
|
121
|
+
// Keep a copy because terminal rendering is allowed to retain the returned array.
|
|
122
|
+
this.lastFrame = finalFrame.slice();
|
|
123
|
+
return finalFrame;
|
|
124
|
+
}
|
|
125
|
+
/** The physical rows returned by the most recent render. */
|
|
126
|
+
lastRenderedFrame() {
|
|
127
|
+
return this.lastFrame;
|
|
119
128
|
}
|
|
120
129
|
invalidate() {
|
|
121
130
|
this.parts.header.invalidate();
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// session/frames.ts — what this terminal DOES about each broker frame.
|
|
2
2
|
//
|
|
3
3
|
// Every fact a frame carries is folded by the shared pure reducer
|
|
4
|
-
// (`core/session-model`)
|
|
5
|
-
//
|
|
6
|
-
// before anything here runs. What is left, and all this file owns, is the
|
|
4
|
+
// (`core/session-model`) in `foldState` before anything here runs. What is left,
|
|
5
|
+
// and all this file owns, is the
|
|
7
6
|
// LOCAL effects: transcript writes, notices, editor text, and the correlated
|
|
8
7
|
// refetches a fresh broker forces.
|
|
9
8
|
//
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { InputController } from '../input/controller.js';
|
|
2
|
+
import { type ViewerCapabilities } from '../input/capabilities.js';
|
|
2
3
|
import type { ToolDisplayToggle } from '../render/chat-view.js';
|
|
3
4
|
import type { KeybindingsManager } from '@earendil-works/pi-tui';
|
|
4
5
|
import type { CopyTarget } from '../render/transcript-copy.js';
|
|
@@ -40,5 +41,7 @@ export interface InputWiringHooks {
|
|
|
40
41
|
/** A prompt or steer was accepted from the editor. */
|
|
41
42
|
onPromptSent: () => void;
|
|
42
43
|
}
|
|
44
|
+
/** Construct the viewer's one capability authority. */
|
|
45
|
+
export declare function createViewerCapabilitiesForInput(ctx: Pick<AttachSession, 'nodeId' | 'remote' | 'role' | 'meta'>): ViewerCapabilities;
|
|
43
46
|
/** Build the viewer's InputController with every hook answered. */
|
|
44
|
-
export declare function createInputController(ctx: Pick<AttachSession, 'nodeId' | 'remote' | 'role' | 'meta' | 'socket' | 'tui' | 'editor' | 'containers'>, km: KeybindingsManager, hooks: InputWiringHooks): InputController;
|
|
47
|
+
export declare function createInputController(ctx: Pick<AttachSession, 'nodeId' | 'remote' | 'role' | 'meta' | 'socket' | 'tui' | 'editor' | 'containers'>, km: KeybindingsManager, capabilities: ViewerCapabilities, hooks: InputWiringHooks): InputController;
|
|
@@ -12,18 +12,23 @@
|
|
|
12
12
|
// pickers (which need a reference to the controller being constructed, so they
|
|
13
13
|
// can only be closed over from inside).
|
|
14
14
|
import { InputController } from '../input/controller.js';
|
|
15
|
+
import { createViewerCapabilities } from '../input/capabilities.js';
|
|
15
16
|
import { cliClient } from '../../../commands/api-client.js';
|
|
16
17
|
import { buildLoginPicker, buildLogoutPicker } from '../overlays/auth.js';
|
|
17
18
|
import { defaultAgentDir } from '../config.js';
|
|
19
|
+
/** Construct the viewer's one capability authority. */
|
|
20
|
+
export function createViewerCapabilitiesForInput(ctx) {
|
|
21
|
+
return createViewerCapabilities({
|
|
22
|
+
nodeId: ctx.nodeId,
|
|
23
|
+
profileId: ctx.meta.profile_id ?? undefined,
|
|
24
|
+
remote: ctx.remote,
|
|
25
|
+
role: ctx.role,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
18
28
|
/** Build the viewer's InputController with every hook answered. */
|
|
19
|
-
export function createInputController(ctx, km, hooks) {
|
|
20
|
-
const { nodeId,
|
|
29
|
+
export function createInputController(ctx, km, capabilities, hooks) {
|
|
30
|
+
const { nodeId, socket, tui, editor, containers } = ctx;
|
|
21
31
|
const { setNotice } = hooks;
|
|
22
|
-
// The viewer's fixed capability, resolved once at hello: an `--observer`
|
|
23
|
-
// attach (and a remote one, which is always an observer) may read but never
|
|
24
|
-
// mutate. Every mutating hook below is wired only when this is true; the
|
|
25
|
-
// read-op channel (`onRequest`) and the read-only getters stay wired for all.
|
|
26
|
-
const writable = !remote && role === 'controller';
|
|
27
32
|
// Auth pickers — viewer-local OAuth/API-key flows against the SAME auth.json
|
|
28
33
|
// the broker uses (broker + viewer share a filesystem in the tmux-local attach
|
|
29
34
|
// model), so they run entirely in this process and then tell the broker to
|
|
@@ -37,7 +42,7 @@ export function createInputController(ctx, km, hooks) {
|
|
|
37
42
|
// slash context carries no picker at all, so `/login` and `/logout` report
|
|
38
43
|
// themselves unavailable rather than reaching a `reload_auth` frame.
|
|
39
44
|
const reloadAuth = () => socket.send({ type: 'reload_auth' });
|
|
40
|
-
const authPickers = !
|
|
45
|
+
const authPickers = !capabilities.permits('auth')
|
|
41
46
|
? {}
|
|
42
47
|
: {
|
|
43
48
|
openLoginPicker: () => {
|
|
@@ -56,10 +61,6 @@ export function createInputController(ctx, km, hooks) {
|
|
|
56
61
|
// The slash context: `/promote` targets this node, `/resume-node` opens
|
|
57
62
|
// scoped to its profile, `remote` structurally omits the local-only
|
|
58
63
|
// canvas commands, and `/graph` toggles the overlay.
|
|
59
|
-
nodeId,
|
|
60
|
-
profileId: ctx.meta.profile_id ?? undefined,
|
|
61
|
-
remote,
|
|
62
|
-
role,
|
|
63
64
|
onGraph: hooks.toggleGraph,
|
|
64
65
|
onInbox: hooks.toggleInbox,
|
|
65
66
|
onHelp: hooks.toggleHelp,
|
|
@@ -111,7 +112,7 @@ export function createInputController(ctx, km, hooks) {
|
|
|
111
112
|
// broker (it goes to crtrd via `cliClient`), so leaving it wired for an
|
|
112
113
|
// observer would let a read-only viewer wake and message the node.
|
|
113
114
|
isDormant: hooks.isDormant,
|
|
114
|
-
onDormantSubmit: !
|
|
115
|
+
onDormantSubmit: !capabilities.permits('wake-dormant') ? undefined : (msgText) => {
|
|
115
116
|
void (async () => {
|
|
116
117
|
try {
|
|
117
118
|
// Text typed into a node's box IS the human talking to it — mark it
|
|
@@ -128,6 +129,6 @@ export function createInputController(ctx, km, hooks) {
|
|
|
128
129
|
})();
|
|
129
130
|
},
|
|
130
131
|
...authPickers,
|
|
131
|
-
});
|
|
132
|
+
}, capabilities);
|
|
132
133
|
return input;
|
|
133
134
|
}
|
|
@@ -12,7 +12,12 @@ export interface MouseReporting {
|
|
|
12
12
|
/** Turn off unconditionally — teardown and process exit. */
|
|
13
13
|
disable(): void;
|
|
14
14
|
/** Install the SGR listener; returns the remover. */
|
|
15
|
-
install(tui: TUI,
|
|
15
|
+
install(tui: TUI, handlers: MouseHandlers): () => void;
|
|
16
|
+
}
|
|
17
|
+
export interface MouseHandlers {
|
|
18
|
+
onWheel(direction: 'up' | 'down', lines: number, column: number): void;
|
|
19
|
+
/** A primary-button press with no Shift, Alt, or Control modifier. */
|
|
20
|
+
onPrimaryPress(column: number, row: number): void;
|
|
16
21
|
}
|
|
17
22
|
/** Create per-viewer mouse reporting from the user's saved starting mode. */
|
|
18
23
|
export declare function createMouseReporting(write: (data: string) => void, defaultMode: MouseModeDefault): MouseReporting;
|
|
@@ -41,15 +41,18 @@ export function createMouseReporting(write, defaultMode) {
|
|
|
41
41
|
},
|
|
42
42
|
reassert,
|
|
43
43
|
disable,
|
|
44
|
-
install: (tui,
|
|
44
|
+
install: (tui, handlers) => tui.addInputListener((data) => {
|
|
45
45
|
let consumed = false;
|
|
46
|
-
const withoutSgr = data.replace(/\x1b\[<(\d+);(\d+)
|
|
46
|
+
const withoutSgr = data.replace(/\x1b\[<(\d+);(\d+);(\d+)([Mm])/g, (_match, buttons, column, row, action) => {
|
|
47
47
|
consumed = true;
|
|
48
|
-
const
|
|
48
|
+
const code = Number(buttons);
|
|
49
|
+
const button = code & ~(4 | 8 | 16);
|
|
49
50
|
if (button === 64)
|
|
50
|
-
onWheel('up', WHEEL_LINES, Number(column));
|
|
51
|
+
handlers.onWheel('up', WHEEL_LINES, Number(column));
|
|
51
52
|
if (button === 65)
|
|
52
|
-
onWheel('down', WHEEL_LINES, Number(column));
|
|
53
|
+
handlers.onWheel('down', WHEEL_LINES, Number(column));
|
|
54
|
+
if (code === 0 && action === 'M')
|
|
55
|
+
handlers.onPrimaryPress(Number(column), Number(row));
|
|
53
56
|
return '';
|
|
54
57
|
});
|
|
55
58
|
const withoutMouse = withoutSgr.replace(/\x1b\[M[\s\S]{3}/g, () => {
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
// session/profile-files.ts — fuzzy file search across a node's local profile.
|
|
2
2
|
//
|
|
3
|
-
// The popup searches the current workspace
|
|
4
|
-
//
|
|
5
|
-
// ignore rules disabled, so project
|
|
6
|
-
//
|
|
7
|
-
//
|
|
3
|
+
// The popup searches the current workspace, every project named by the node's
|
|
4
|
+
// profile manifest, and the profile's own memory store. Ancestor
|
|
5
|
+
// `.crouter/memory/` stores are added with ignore rules disabled, so project
|
|
6
|
+
// memory remains findable even when a parent ignore file hides `.crouter/`.
|
|
7
|
+
// fzf owns selection and nvim owns viewing; the attach viewer only resolves the
|
|
8
|
+
// relevant roots and wires the two popups.
|
|
8
9
|
import { constants, accessSync, existsSync, mkdtempSync, readFileSync, rmSync, statSync } from 'node:fs';
|
|
9
10
|
import { tmpdir } from 'node:os';
|
|
10
11
|
import { delimiter, dirname, join, resolve, sep } from 'node:path';
|
|
11
12
|
import { execFile, spawnSync } from 'node:child_process';
|
|
12
|
-
import { loadProfileManifest } from '../../../core/profiles/manifest.js';
|
|
13
|
+
import { loadProfileManifest, profileMemoryDir } from '../../../core/profiles/manifest.js';
|
|
13
14
|
import { shellQuote } from '../../../core/runtime/placement-tmux.js';
|
|
14
15
|
import { surfaceTmuxStyleArgs } from '../../../core/runtime/surface-bg.js';
|
|
15
16
|
function isDirectory(path) {
|
|
@@ -44,14 +45,15 @@ function workingExecutable(name, preferred) {
|
|
|
44
45
|
}
|
|
45
46
|
return null;
|
|
46
47
|
}
|
|
47
|
-
function
|
|
48
|
+
function profileSearchRoots(profileId) {
|
|
48
49
|
if (profileId === null || profileId === '')
|
|
49
|
-
return [];
|
|
50
|
+
return { projects: [], memory: null };
|
|
50
51
|
try {
|
|
51
|
-
|
|
52
|
+
const { profileId: resolvedId, manifest } = loadProfileManifest(profileId);
|
|
53
|
+
return { projects: manifest.projects, memory: profileMemoryDir(resolvedId) };
|
|
52
54
|
}
|
|
53
55
|
catch {
|
|
54
|
-
return [];
|
|
56
|
+
return { projects: [], memory: null };
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
59
|
function dedupeExistingDirs(paths) {
|
|
@@ -119,13 +121,17 @@ export function launchProfileFileSearch(opts) {
|
|
|
119
121
|
opts.onNotice('Neovim is required for profile file search');
|
|
120
122
|
return;
|
|
121
123
|
}
|
|
122
|
-
const
|
|
124
|
+
const profile = profileSearchRoots(opts.profileId);
|
|
125
|
+
const pointers = dedupeExistingDirs([opts.cwd, ...profile.projects]);
|
|
123
126
|
if (pointers.length === 0) {
|
|
124
127
|
opts.onNotice('No profile file-search directories exist');
|
|
125
128
|
return;
|
|
126
129
|
}
|
|
127
130
|
const roots = outermostDirs(pointers);
|
|
128
|
-
const memoryDirs =
|
|
131
|
+
const memoryDirs = dedupeExistingDirs([
|
|
132
|
+
...(profile.memory === null ? [] : [profile.memory]),
|
|
133
|
+
...ancestorMemoryDirs(pointers),
|
|
134
|
+
]);
|
|
129
135
|
const tempDir = mkdtempSync(join(tmpdir(), 'crtr-profile-files-'));
|
|
130
136
|
const selected = join(tempDir, 'selection');
|
|
131
137
|
const scans = [
|
|
@@ -105,7 +105,7 @@ export function createReconnect(ctx, hooks) {
|
|
|
105
105
|
hooks.setNotice(dormant ? '' : '↻ node refreshing — reconnecting…', { sticky: !dormant });
|
|
106
106
|
try {
|
|
107
107
|
const redialed = await Promise.race([
|
|
108
|
-
socket.redial().then(() => true),
|
|
108
|
+
socket.redial({ brokerUnavailableIsExpected: dormant }).then(() => true),
|
|
109
109
|
stoppedSignal.then(() => false),
|
|
110
110
|
]);
|
|
111
111
|
if (!redialed || stopped || hooks.isTornDown())
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
// Everything this viewer knows because the broker told it — role, pi's engine
|
|
5
5
|
// state, context tokens, the queue, the retained display levels — lives in ONE
|
|
6
6
|
// value folded by the shared pure reducer (`core/session-model`), not in a
|
|
7
|
-
// handful of mutable locals patched from a frame switch.
|
|
8
|
-
// same reducer, which is what keeps the two viewers from drifting.
|
|
7
|
+
// handful of mutable locals patched from a frame switch.
|
|
9
8
|
//
|
|
10
9
|
// The dirty tracking IS identity comparison: `reduce` returns the same
|
|
11
10
|
// reference for any frame that changes nothing, and the same sub-object for any
|
|
@@ -16,7 +16,8 @@ export interface ViewerSurfaceHostOptions {
|
|
|
16
16
|
/** Styling supplied by the viewer's status-line palette. */
|
|
17
17
|
formatNotice: (text: string) => string;
|
|
18
18
|
noticeMs: number;
|
|
19
|
-
|
|
19
|
+
/** The session facts; the host itself publishes `selfPane` from below. */
|
|
20
|
+
capabilities: Omit<SurfaceHost['capabilities'], 'selfPane'>;
|
|
20
21
|
selfPane?: string;
|
|
21
22
|
}
|
|
22
23
|
/** The viewer's one host for full-pane surfaces. */
|
|
@@ -53,7 +54,7 @@ export declare class ViewerSurfaceHost implements SurfaceHost {
|
|
|
53
54
|
title?: string;
|
|
54
55
|
}): Promise<string | null>;
|
|
55
56
|
/** Offer wheel input to the topmost surface only. */
|
|
56
|
-
handleWheel(direction: 'up' | 'down', lines: number
|
|
57
|
+
handleWheel(direction: 'up' | 'down', lines: number): boolean;
|
|
57
58
|
/** Whether a full-pane surface currently owns input. */
|
|
58
59
|
hasFullPaneSurface(): boolean;
|
|
59
60
|
/** Close the whole stack before the viewer tears down its TUI. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { truncateToWidth, } from '@earendil-works/pi-tui';
|
|
2
2
|
import { cliClient } from '../../../commands/api-client.js';
|
|
3
|
-
import { focusViewer } from '../../../commands/node.js';
|
|
3
|
+
import { focusViewer } from '../../../commands/surface/node/placement.js';
|
|
4
4
|
import { daemonErrorMessage } from '../../inbox/resolve.js';
|
|
5
5
|
import { buildFileReviewPicker } from '../overlays/file-review.js';
|
|
6
6
|
import { reportInvariant as report } from './invariant.js';
|
|
@@ -37,8 +37,8 @@ export class ViewerSurfaceHost {
|
|
|
37
37
|
this.statusNotice = options.statusNotice;
|
|
38
38
|
this.formatNotice = options.formatNotice;
|
|
39
39
|
this.noticeMs = options.noticeMs;
|
|
40
|
-
this.capabilities = options.capabilities;
|
|
41
40
|
this.selfPane = options.selfPane;
|
|
41
|
+
this.capabilities = { ...options.capabilities, selfPane: options.selfPane };
|
|
42
42
|
}
|
|
43
43
|
mount(component, opts) {
|
|
44
44
|
this.disposeNotice();
|
|
@@ -136,8 +136,8 @@ export class ViewerSurfaceHost {
|
|
|
136
136
|
});
|
|
137
137
|
}
|
|
138
138
|
/** Offer wheel input to the topmost surface only. */
|
|
139
|
-
handleWheel(direction, lines
|
|
140
|
-
return this.stack[this.stack.length - 1]?.component.handleWheel?.(direction, lines
|
|
139
|
+
handleWheel(direction, lines) {
|
|
140
|
+
return this.stack[this.stack.length - 1]?.component.handleWheel?.(direction, lines) ?? false;
|
|
141
141
|
}
|
|
142
142
|
/** Whether a full-pane surface currently owns input. */
|
|
143
143
|
hasFullPaneSurface() {
|