@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
|
@@ -1,22 +1,29 @@
|
|
|
1
1
|
import { relative, resolve } from 'node:path';
|
|
2
|
-
import { CURSOR_MARKER } from '@earendil-works/pi-tui';
|
|
2
|
+
import { CURSOR_MARKER, Key, matchesKey } from '@earendil-works/pi-tui';
|
|
3
3
|
import { documentLines } from '../../../core/document-lines.js';
|
|
4
4
|
import { codeRenderedDoc } from '../../../core/termrender/code-doc.js';
|
|
5
5
|
import { deriveAnchorUnits, remapUnitIndex, unitIndexForLine, unitRangeForSpan } from './anchors.js';
|
|
6
|
-
import { centerHorizontal, clipLine, CYAN, DIM, RESET, REVERSE, sanitize, truncate, YELLOW } from '../tui/ansi.js';
|
|
6
|
+
import { centerHorizontal, clipLine, CYAN, DIM, RESET, REVERSE, sanitize, truncate, visibleWidth, YELLOW } from '../tui/ansi.js';
|
|
7
7
|
import { ReviewDocumentError } from './comments-client.js';
|
|
8
|
+
import { closeCompanionPane, companionPaneLive, openCompanionPane } from './companion-pane.js';
|
|
8
9
|
import { PAN_STEP, docSurface, maxHScroll, panBy, renderReviewDoc, renderReviewFrame, renderWidthForCols, reservedRows, } from './frame.js';
|
|
9
10
|
import { matchReviewKey, reviewKeyText } from './keys.js';
|
|
10
11
|
import { renderInputBuffer } from '../tui/render.js';
|
|
11
12
|
import { openReviewedFileInEditor } from './nvim.js';
|
|
12
13
|
import { buildLineMap, remapRange } from './remap.js';
|
|
13
14
|
import { cleanPastedText, closeCompose, closeHelp, closeList, commitCompose, ensureAnchorVisible, initReviewState, moveActiveUnit, moveListIndex, openComposeEdit, openComposeNew, openHelp, openList, scrollBy, textBackspace, textDelete, textEnd, textHome, textInsert, textVerticalWrapped, textWordBackspace, textWordLeft, textWordRight, deleteAtListIndex, undoLast, } from './state.js';
|
|
14
|
-
/** The
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
/** The widest the document is ever rendered, however wide the pane is. */
|
|
16
|
+
const DOC_MAX_COLS = 126;
|
|
17
|
+
/** The one mounted review surface: existing review rendering and navigation
|
|
18
|
+
* over a live file, with comments projected from the daemon and ranges
|
|
19
|
+
* remapped by this terminal as the file changes, plus a status row naming the
|
|
20
|
+
* companion pane the conversation lives in. */
|
|
21
|
+
export class ReviewDocumentSurface {
|
|
18
22
|
absFile;
|
|
19
23
|
fileLabel;
|
|
24
|
+
companionNodeId;
|
|
25
|
+
companionCwd;
|
|
26
|
+
callerPane;
|
|
20
27
|
kind;
|
|
21
28
|
source;
|
|
22
29
|
comments;
|
|
@@ -24,25 +31,46 @@ export class DocumentRegion {
|
|
|
24
31
|
unsubscribeComments;
|
|
25
32
|
ready;
|
|
26
33
|
cols = 0;
|
|
27
|
-
|
|
28
|
-
|
|
34
|
+
/** Rows the host assigned this surface; the document frame renders one
|
|
35
|
+
* fewer, because the last line is this surface's status row. */
|
|
36
|
+
hostRows = 0;
|
|
37
|
+
/** The `hostRows` the current state was last reflowed against. A height
|
|
38
|
+
* change matters as much as a width one: `reflow` is what re-runs
|
|
39
|
+
* `ensureAnchorVisible` against the new body height, so a pane shrink
|
|
40
|
+
* cannot strand the active anchor below the visible body. */
|
|
41
|
+
flowedRows = -1;
|
|
42
|
+
_focused = false;
|
|
29
43
|
closed = false;
|
|
30
44
|
spaceArmed = false;
|
|
45
|
+
escapeConfirmArmed = false;
|
|
46
|
+
cancelArmed = false;
|
|
47
|
+
tornDown = false;
|
|
48
|
+
/** The disposition {@link teardown} stated, kept only while there was no
|
|
49
|
+
* handle to close: the mount that follows disposes every standing notice,
|
|
50
|
+
* so {@link setHandle} states it again once the surface is gone. */
|
|
51
|
+
tornDownNotice;
|
|
52
|
+
handle;
|
|
53
|
+
/** The companion pane this surface is bound to, and how it came to be.
|
|
54
|
+
* `paneOrigin` is status-row copy only: teardown reads `paneId`. */
|
|
55
|
+
paneId;
|
|
56
|
+
paneOrigin;
|
|
31
57
|
state;
|
|
32
58
|
cache;
|
|
33
59
|
/** Every non-deleted comment the daemon currently projects, newest last. */
|
|
34
60
|
projection = [];
|
|
35
61
|
status = 'preparing';
|
|
36
|
-
/**
|
|
62
|
+
/** This surface's own error/summary state — never a host notice (D1). */
|
|
37
63
|
problem;
|
|
38
64
|
composeAnchorLost = false;
|
|
39
|
-
dirty;
|
|
40
65
|
/** Serializes base-hash transitions so B→C cannot overtake A→B. */
|
|
41
66
|
remapChain = Promise.resolve();
|
|
42
67
|
constructor(opts) {
|
|
43
|
-
this.absFile = opts.
|
|
44
|
-
this.fileLabel = labelFor(opts.cwd, opts.
|
|
45
|
-
this.
|
|
68
|
+
this.absFile = opts.review.file;
|
|
69
|
+
this.fileLabel = labelFor(opts.review.cwd, opts.review.file);
|
|
70
|
+
this.companionNodeId = opts.review.companionNodeId;
|
|
71
|
+
this.companionCwd = opts.review.cwd;
|
|
72
|
+
this.callerPane = opts.callerPane;
|
|
73
|
+
this.kind = docSurface(opts.review.file);
|
|
46
74
|
this.source = opts.source;
|
|
47
75
|
this.comments = opts.comments;
|
|
48
76
|
this.services = opts.services;
|
|
@@ -71,19 +99,40 @@ export class DocumentRegion {
|
|
|
71
99
|
const state = this.state;
|
|
72
100
|
return state?.mode === 'compose' && state.compose !== null && state.compose.buffer.length > 0;
|
|
73
101
|
}
|
|
74
|
-
// ──
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
102
|
+
// ── SurfaceComponent ──────────────────────────────────────────────────────
|
|
103
|
+
get focused() {
|
|
104
|
+
return this._focused;
|
|
105
|
+
}
|
|
106
|
+
set focused(value) {
|
|
107
|
+
if (this._focused === value)
|
|
79
108
|
return;
|
|
80
|
-
this.
|
|
81
|
-
this.
|
|
82
|
-
this.reflow();
|
|
109
|
+
this._focused = value;
|
|
110
|
+
this.repaint();
|
|
83
111
|
}
|
|
84
|
-
|
|
85
|
-
|
|
112
|
+
setRows(rows) {
|
|
113
|
+
this.hostRows = Math.max(0, Math.floor(rows));
|
|
114
|
+
}
|
|
115
|
+
/** Exactly the rows the host assigned: the document frame, then this
|
|
116
|
+
* surface's status row. The document is capped at {@link DOC_MAX_COLS} and
|
|
117
|
+
* every line is padded out to the full pane width. */
|
|
118
|
+
render(width) {
|
|
119
|
+
const frameWidth = Math.max(0, Math.floor(width));
|
|
120
|
+
if (this.hostRows <= 0)
|
|
86
121
|
return [];
|
|
122
|
+
const cols = Math.min(frameWidth, DOC_MAX_COLS);
|
|
123
|
+
if (cols !== this.cols || this.hostRows !== this.flowedRows) {
|
|
124
|
+
this.cols = cols;
|
|
125
|
+
this.flowedRows = this.hostRows;
|
|
126
|
+
this.reflow();
|
|
127
|
+
}
|
|
128
|
+
const body = this.rows <= 0 || this.cols <= 0 ? [] : this.renderDocument();
|
|
129
|
+
return [...exactRows(body, this.rows, frameWidth), this.statusRow(frameWidth)];
|
|
130
|
+
}
|
|
131
|
+
/** Rows the document frame itself owns. */
|
|
132
|
+
get rows() {
|
|
133
|
+
return Math.max(0, this.hostRows - 1);
|
|
134
|
+
}
|
|
135
|
+
renderDocument() {
|
|
87
136
|
if (this.status !== 'ready' || this.state === undefined)
|
|
88
137
|
return this.renderPlaceholder();
|
|
89
138
|
const doc = this.document(this.cols, this.state.sourceRevision);
|
|
@@ -99,8 +148,51 @@ export class DocumentRegion {
|
|
|
99
148
|
: grouped;
|
|
100
149
|
return this.focused ? this.markCursorLocation(rendered, this.state) : rendered;
|
|
101
150
|
}
|
|
151
|
+
/** The surface consumes every chunk: nothing typed into a mounted review may
|
|
152
|
+
* reach the transcript beneath it. Esc is the one key this surface answers
|
|
153
|
+
* itself — it closes the review unless an unsent comment holds it open. */
|
|
102
154
|
handleInput(data) {
|
|
103
|
-
if (this.closed
|
|
155
|
+
if (this.closed)
|
|
156
|
+
return;
|
|
157
|
+
// An armed cancel is answered before every other ladder, and disarms on
|
|
158
|
+
// any key: only a second `x` cancels, and anything else is the ordinary
|
|
159
|
+
// keypress it would have been. `escapeConfirmArmed` is left alone.
|
|
160
|
+
if (this.cancelArmed) {
|
|
161
|
+
this.cancelArmed = false;
|
|
162
|
+
const key = matchReviewKey(data);
|
|
163
|
+
if (key !== null && reviewKeyText(key) === 'x') {
|
|
164
|
+
this.services.cancel();
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (matchesKey(data, Key.escape)) {
|
|
169
|
+
if (this.escapeConfirmArmed) {
|
|
170
|
+
this.escapeConfirmArmed = false;
|
|
171
|
+
if (this.consume(data))
|
|
172
|
+
return;
|
|
173
|
+
this.services.requestClose();
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (this.hasUnsentCompose()) {
|
|
177
|
+
this.escapeConfirmArmed = true;
|
|
178
|
+
this.services.notice('unsent comment — press esc again to discard');
|
|
179
|
+
this.repaint();
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
// Compose mode owns Esc when its buffer is empty; view mode leaves it
|
|
183
|
+
// unconsumed so this surface can close.
|
|
184
|
+
if (this.consume(data))
|
|
185
|
+
return;
|
|
186
|
+
this.services.requestClose();
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (this.escapeConfirmArmed)
|
|
190
|
+
this.escapeConfirmArmed = false;
|
|
191
|
+
this.consume(data);
|
|
192
|
+
}
|
|
193
|
+
/** True when the document's own modes took the chunk. */
|
|
194
|
+
consume(data) {
|
|
195
|
+
if (this.status !== 'ready')
|
|
104
196
|
return false;
|
|
105
197
|
const state = this.state;
|
|
106
198
|
if (state === undefined)
|
|
@@ -137,22 +229,45 @@ export class DocumentRegion {
|
|
|
137
229
|
}
|
|
138
230
|
return this.handleViewKey(key);
|
|
139
231
|
}
|
|
232
|
+
/** A mounted review consumes every notch, ready or not: the transcript
|
|
233
|
+
* beneath it must never scroll while the document stands over it. */
|
|
140
234
|
handleWheel(direction, lines) {
|
|
141
|
-
|
|
142
|
-
if (this.closed || this.status !== 'ready' || state === undefined)
|
|
235
|
+
if (this.closed)
|
|
143
236
|
return false;
|
|
237
|
+
const state = this.state;
|
|
238
|
+
if (this.status !== 'ready' || state === undefined)
|
|
239
|
+
return true;
|
|
144
240
|
const doc = this.document(this.cols, state.sourceRevision);
|
|
145
241
|
const delta = (direction === 'up' ? -1 : 1) * Math.max(1, Math.floor(lines));
|
|
146
242
|
this.state = scrollBy(state, delta, this.bodyHeight(state), doc.lines.length);
|
|
147
243
|
this.repaint();
|
|
148
244
|
return true;
|
|
149
245
|
}
|
|
150
|
-
|
|
151
|
-
|
|
246
|
+
/** Repaints are scheduled by the host; this surface never draws directly. */
|
|
247
|
+
invalidate() {
|
|
248
|
+
if (!this.closed)
|
|
249
|
+
this.handle?.invalidate();
|
|
250
|
+
}
|
|
251
|
+
/** The mounted handle is this surface's repaint and close channel, and the
|
|
252
|
+
* host's close is what releases the document's resources. */
|
|
253
|
+
setHandle(handle) {
|
|
254
|
+
if (this.handle !== undefined)
|
|
152
255
|
return;
|
|
153
|
-
this.
|
|
154
|
-
this.
|
|
256
|
+
this.handle = handle;
|
|
257
|
+
handle.onClose(() => this.close());
|
|
258
|
+
// A teardown that landed before the mount had no handle to close, so the
|
|
259
|
+
// fresh one is closed the moment it arrives: a review settled elsewhere
|
|
260
|
+
// never stands mounted. Its disposition is stated after the close, which
|
|
261
|
+
// is what disposes the notice the earlier teardown raised.
|
|
262
|
+
if (this.tornDown) {
|
|
263
|
+
handle.close();
|
|
264
|
+
const notice = this.tornDownNotice;
|
|
265
|
+
this.tornDownNotice = undefined;
|
|
266
|
+
if (notice !== undefined)
|
|
267
|
+
this.services.notice(notice);
|
|
268
|
+
}
|
|
155
269
|
}
|
|
270
|
+
/** The status row's left segment: this document's state in one line. */
|
|
156
271
|
summary() {
|
|
157
272
|
if (this.status === 'refused')
|
|
158
273
|
return `${this.fileLabel} — unavailable`;
|
|
@@ -167,21 +282,82 @@ export class DocumentRegion {
|
|
|
167
282
|
parts.push(`stale (${this.source.current().staleReason ?? 'unreadable'})`);
|
|
168
283
|
return parts.join(' · ');
|
|
169
284
|
}
|
|
170
|
-
|
|
171
|
-
|
|
285
|
+
/** The status row's right segment: where the companion conversation is. */
|
|
286
|
+
companionSegment() {
|
|
287
|
+
return this.paneOrigin === undefined ? 'companion none' : `companion ${this.paneOrigin}`;
|
|
288
|
+
}
|
|
289
|
+
statusRow(width) {
|
|
290
|
+
if (width <= 0)
|
|
291
|
+
return '';
|
|
292
|
+
const right = clipLine(this.companionSegment(), width);
|
|
293
|
+
const left = clipLine(this.summary(), Math.max(0, width - visibleWidth(right) - 1));
|
|
294
|
+
const gap = Math.max(0, width - visibleWidth(left) - visibleWidth(right));
|
|
295
|
+
return `${DIM}${left}${' '.repeat(gap)}${right}${RESET}`;
|
|
296
|
+
}
|
|
297
|
+
// ── Companion pane ────────────────────────────────────────────────
|
|
298
|
+
/** Bind the conversation's pane, opening one only when this surface holds no
|
|
299
|
+
* live pane already and there is no live companion viewer to adopt. A second
|
|
300
|
+
* call therefore keeps the bound pane, whatever state its viewer is in. */
|
|
301
|
+
openCompanion() {
|
|
302
|
+
if (this.closed || this.tornDown)
|
|
303
|
+
return;
|
|
304
|
+
// Adoption can only see a pane once its viewer has tagged it, so through
|
|
305
|
+
// the whole revive-and-connect window the recorded pane is the only thing
|
|
306
|
+
// that keeps this idempotent: without it a retry splits a second pane and
|
|
307
|
+
// orphans the first. A pane that has since died falls through and reopens.
|
|
308
|
+
if (this.paneId !== undefined && companionPaneLive(this.paneId))
|
|
309
|
+
return;
|
|
310
|
+
const result = openCompanionPane({
|
|
311
|
+
companionNodeId: this.companionNodeId,
|
|
312
|
+
cwd: this.companionCwd,
|
|
313
|
+
callerPane: this.callerPane,
|
|
314
|
+
});
|
|
315
|
+
if (result.ok) {
|
|
316
|
+
this.paneId = result.paneId;
|
|
317
|
+
this.paneOrigin = result.origin;
|
|
318
|
+
this.repaint();
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
if (result.reason === 'split_refused') {
|
|
322
|
+
this.services.notice('tmux refused the companion split — press space a to retry');
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
// Without tmux the person still has a way to reach the conversation, and
|
|
326
|
+
// that instruction has to outlive an auto-clearing notice.
|
|
327
|
+
this.services.notice(`The review companion needs tmux — run: crtr surface attach to ${this.companionNodeId}`, { sticky: true });
|
|
328
|
+
}
|
|
329
|
+
/** The one path out of a review that has reached a terminal state — approved,
|
|
330
|
+
* canceled here, or decided elsewhere. The pane goes with the review, never
|
|
331
|
+
* with Esc: closing the document leaves the conversation standing so the
|
|
332
|
+
* review can be re-opened over it. Idempotent. The disposition is stated
|
|
333
|
+
* only after the close, because the host's restoring close disposes every
|
|
334
|
+
* notice raised over the closing surface — a notice raised first would die
|
|
335
|
+
* with the surface and the disposition would never paint. */
|
|
336
|
+
teardown(notice) {
|
|
337
|
+
if (this.tornDown)
|
|
338
|
+
return;
|
|
339
|
+
this.tornDown = true;
|
|
340
|
+
if (this.paneId !== undefined)
|
|
341
|
+
closeCompanionPane(this.paneId, this.companionNodeId);
|
|
342
|
+
this.paneId = undefined;
|
|
343
|
+
this.paneOrigin = undefined;
|
|
344
|
+
if (this.handle === undefined)
|
|
345
|
+
this.tornDownNotice = notice;
|
|
346
|
+
this.handle?.close();
|
|
347
|
+
this.services.notice(notice);
|
|
172
348
|
}
|
|
173
|
-
/** Releases this
|
|
174
|
-
* This
|
|
349
|
+
/** Releases this surface's render cache and stops every projected repaint.
|
|
350
|
+
* This surface closes the source it was handed; that close stops its watcher.
|
|
351
|
+
* The companion pane deliberately survives: only {@link teardown} closes it. */
|
|
175
352
|
close() {
|
|
176
353
|
if (this.closed)
|
|
177
354
|
return;
|
|
178
355
|
// Stop the only source of new synchronous callbacks before closing the
|
|
179
|
-
//
|
|
356
|
+
// surface to every already-in-flight asynchronous continuation.
|
|
180
357
|
this.source.close();
|
|
181
358
|
this.closed = true;
|
|
182
359
|
this.unsubscribeComments();
|
|
183
360
|
this.cache = undefined;
|
|
184
|
-
this.dirty = undefined;
|
|
185
361
|
}
|
|
186
362
|
// ── Open-time base alignment ──────────────────────────────────────────────
|
|
187
363
|
/** Bring the daemon's comment coordinates onto the bytes now on disk, then
|
|
@@ -235,7 +411,7 @@ export class DocumentRegion {
|
|
|
235
411
|
const current = this.source.current();
|
|
236
412
|
return current.status === 'live' && current.sha256 !== snapshot.sha256;
|
|
237
413
|
}
|
|
238
|
-
/** Re-derive this
|
|
414
|
+
/** Re-derive this surface from the daemon's own coordinate base. The only
|
|
239
415
|
* honest recovery once a batch is rejected: the local map that produced it
|
|
240
416
|
* is no longer a true description of what the daemon holds. */
|
|
241
417
|
async realign() {
|
|
@@ -338,7 +514,7 @@ export class DocumentRegion {
|
|
|
338
514
|
this.remapChain = this.remapChain.then(() => this.submitBatch(previous.sha256, next.sha256, commentRanges), () => this.submitBatch(previous.sha256, next.sha256, commentRanges));
|
|
339
515
|
}
|
|
340
516
|
/** One transaction covering every non-deleted comment. A rejection is stated
|
|
341
|
-
* in this
|
|
517
|
+
* in this surface's own footer and the projection is re-read from the
|
|
342
518
|
* authority, which is the only thing that can still be true afterwards. */
|
|
343
519
|
async submitBatch(fromDocHash, toDocHash, ranges) {
|
|
344
520
|
if (this.closed)
|
|
@@ -551,8 +727,20 @@ export class DocumentRegion {
|
|
|
551
727
|
this.services.submit();
|
|
552
728
|
}
|
|
553
729
|
}
|
|
730
|
+
else if (input === 'a') {
|
|
731
|
+
this.openCompanion();
|
|
732
|
+
}
|
|
733
|
+
else if (input === 'x') {
|
|
734
|
+
this.armCancel();
|
|
735
|
+
}
|
|
554
736
|
this.repaint();
|
|
555
737
|
}
|
|
738
|
+
/** Cancelling discards the whole review, so it asks once. The armed state is
|
|
739
|
+
* answered in {@link handleInput}, ahead of every mode's ladder. */
|
|
740
|
+
armCancel() {
|
|
741
|
+
this.cancelArmed = true;
|
|
742
|
+
this.services.notice('cancel this review? press x again to confirm');
|
|
743
|
+
}
|
|
556
744
|
handleListKey(key) {
|
|
557
745
|
const state = this.state;
|
|
558
746
|
if (state === undefined)
|
|
@@ -620,8 +808,8 @@ export class DocumentRegion {
|
|
|
620
808
|
this.state = openHelp(state);
|
|
621
809
|
}
|
|
622
810
|
else if (key.type === 'cancel' && key.text === undefined) {
|
|
623
|
-
// Esc
|
|
624
|
-
// whether an unsent comment should hold the
|
|
811
|
+
// Esc in view mode belongs to this surface's own ladder, which decides
|
|
812
|
+
// whether an unsent comment should hold the review open.
|
|
625
813
|
return false;
|
|
626
814
|
}
|
|
627
815
|
else if (key.type === 'cancel') {
|
|
@@ -634,7 +822,7 @@ export class DocumentRegion {
|
|
|
634
822
|
return true;
|
|
635
823
|
}
|
|
636
824
|
/** The reviewed file is the deliverable: the person's own editor writes it,
|
|
637
|
-
* this
|
|
825
|
+
* this surface never does. The source is re-read the moment the editor exits
|
|
638
826
|
* rather than waiting for the watcher's coalescing window. */
|
|
639
827
|
editInEditor() {
|
|
640
828
|
const state = this.state;
|
|
@@ -653,9 +841,9 @@ export class DocumentRegion {
|
|
|
653
841
|
this.source.refreshNow();
|
|
654
842
|
}
|
|
655
843
|
// ── Geometry and rendering ────────────────────────────────────────────────
|
|
656
|
-
/** The
|
|
657
|
-
*
|
|
658
|
-
*
|
|
844
|
+
/** The host owns cursor focus; a focused surface contributes exactly one
|
|
845
|
+
* whole marker at the same visual location the document already calls
|
|
846
|
+
* active. There is deliberately no synthetic fallback row: a marker is
|
|
659
847
|
* only valid when it belongs to a rendered anchor or the compose/list cursor. */
|
|
660
848
|
markCursorLocation(lines, state) {
|
|
661
849
|
if (state.mode === 'compose')
|
|
@@ -723,7 +911,7 @@ export class DocumentRegion {
|
|
|
723
911
|
gutterWidth() {
|
|
724
912
|
return this.kind.doc === 'code' ? String(this.source.current().lines.length).length : 0;
|
|
725
913
|
}
|
|
726
|
-
/** The
|
|
914
|
+
/** The document frame's own footer line: its error, then its stale verdict. */
|
|
727
915
|
footerLine() {
|
|
728
916
|
if (this.problem !== undefined)
|
|
729
917
|
return this.problem;
|
|
@@ -806,12 +994,28 @@ export class DocumentRegion {
|
|
|
806
994
|
return 1;
|
|
807
995
|
}
|
|
808
996
|
repaint() {
|
|
809
|
-
|
|
810
|
-
return;
|
|
811
|
-
this.dirty?.();
|
|
997
|
+
this.invalidate();
|
|
812
998
|
}
|
|
813
999
|
}
|
|
814
1000
|
// ── Pure helpers ─────────────────────────────────────────────────────────────
|
|
1001
|
+
/** Exactly `rows` lines, each exactly `width` cells. */
|
|
1002
|
+
function exactRows(lines, rows, width) {
|
|
1003
|
+
const frame = lines.slice(0, rows).map((line) => padTo(line, width));
|
|
1004
|
+
while (frame.length < rows)
|
|
1005
|
+
frame.push(' '.repeat(width));
|
|
1006
|
+
return frame;
|
|
1007
|
+
}
|
|
1008
|
+
/** `string-width` correctly ignores ANSI but cannot know pi-tui's private
|
|
1009
|
+
* cursor marker is zero-width, so the marker is measured out of the line. */
|
|
1010
|
+
function padTo(line, width) {
|
|
1011
|
+
const bare = line.split(CURSOR_MARKER).join('');
|
|
1012
|
+
const cells = visibleWidth(bare);
|
|
1013
|
+
if (cells > width) {
|
|
1014
|
+
const clipped = clipLine(bare, width);
|
|
1015
|
+
return clipped + ' '.repeat(Math.max(0, width - visibleWidth(clipped)));
|
|
1016
|
+
}
|
|
1017
|
+
return line + ' '.repeat(width - cells);
|
|
1018
|
+
}
|
|
815
1019
|
function labelFor(cwd, absFile) {
|
|
816
1020
|
const rel = relative(cwd, absFile);
|
|
817
1021
|
return rel === '' || rel.startsWith('..') ? absFile : rel;
|
|
@@ -133,13 +133,14 @@ export function renderReviewFrame(state, fileLabel, doc, cols, rows, opts) {
|
|
|
133
133
|
footer.push(` ${DIM}space c${RESET} compose comment ${DIM}space l${RESET} list comments`);
|
|
134
134
|
footer.push(` ${DIM}space u${RESET} undo last comment ${DIM}space e${RESET} edit in $EDITOR`);
|
|
135
135
|
footer.push(` ${DIM}space s${RESET} submit review`);
|
|
136
|
+
footer.push(` ${DIM}space a${RESET} open the companion pane`);
|
|
137
|
+
footer.push(` ${DIM}space x${RESET} cancel review`);
|
|
136
138
|
footer.push(` ${DIM}?${RESET} toggle this help ${DIM}esc${RESET} close/cancel`);
|
|
137
|
-
footer.push('');
|
|
138
|
-
footer.push(` ${DIM}esc / ?${RESET} close`);
|
|
139
139
|
}
|
|
140
140
|
else {
|
|
141
|
-
footer.push(` ${DIM}
|
|
142
|
-
`${DIM}space
|
|
141
|
+
footer.push(` ${DIM}space c${RESET} · ${DIM}space l${RESET} · ${DIM}space u${RESET} · ${DIM}space e${RESET} · ` +
|
|
142
|
+
`${DIM}space a${RESET} companion · ${DIM}space s${RESET} submit · ${DIM}space x${RESET} cancel · ` +
|
|
143
|
+
`${DIM}?${RESET} · ${DIM}esc${RESET}`);
|
|
143
144
|
}
|
|
144
145
|
if (opts?.notice !== undefined && footer.length > 0) {
|
|
145
146
|
footer[footer.length - 1] = ` ${YELLOW}${opts.notice}${RESET}`;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { TUI } from '@earendil-works/pi-tui';
|
|
2
|
-
import type { CanvasSource } from '../../../core/canvas/source.js';
|
|
3
1
|
import type { SurfaceHost } from '../../surfaces/host.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
canvasSource: CanvasSource;
|
|
2
|
+
import { type ResolvedReview } from './review-client.js';
|
|
3
|
+
export interface ReviewSurfaceOptions {
|
|
4
|
+
review: ResolvedReview;
|
|
8
5
|
}
|
|
9
|
-
/** Mount the
|
|
10
|
-
|
|
6
|
+
/** Mount the review document. Both callers — the inbox's `ReviewAdapter` and
|
|
7
|
+
* the viewer's `launchFileReview` — refuse a remote attach and resolve the
|
|
8
|
+
* review record themselves, so this function is never reached from a remote
|
|
9
|
+
* viewer and never reads a review record of its own. */
|
|
10
|
+
export declare function openReviewSurface(host: SurfaceHost, opts: ReviewSurfaceOptions): Promise<void>;
|