@north-light/crouter 0.3.173 → 0.3.174
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/runtime-selector.mjs +8 -1
- package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
- package/dist/api/client.d.ts +12 -21
- package/dist/api/client.js +22 -31
- package/dist/api/dto/broker-ops.d.ts +158 -0
- package/dist/api/dto/broker-ops.js +6 -0
- package/dist/api/dto/crons.d.ts +6 -0
- package/dist/api/dto/human.d.ts +7 -1
- package/dist/api/dto/inbox.d.ts +1 -71
- package/dist/api/dto/inbox.js +1 -9
- package/dist/api/dto/nodes.d.ts +6 -7
- package/dist/api/dto/reviews.d.ts +1 -11
- package/dist/api/routes.d.ts +7 -4
- package/dist/api/routes.js +8 -5
- package/dist/build-root.js +3 -3
- package/dist/builtin-memory/04-base-worker.md +1 -4
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
- package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
- package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
- package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
- package/dist/builtin-memory/advisor/council.md +1 -6
- package/dist/builtin-memory/design.md +2 -7
- package/dist/builtin-memory/development.md +9 -14
- package/dist/builtin-memory/internal/marketplaces.md +2 -6
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +2 -8
- package/dist/builtin-memory/internal/storage-tiers.md +1 -2
- package/dist/builtin-memory/testing.md +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
- package/dist/cli.js +2 -2
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
- package/dist/clients/attach/__tests__/context-message.test.js +16 -174
- package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
- package/dist/clients/attach/__tests__/diagram.test.js +2 -2
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
- package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
- package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
- package/dist/clients/attach/command.d.ts +2 -1
- package/dist/clients/attach/command.js +81 -76
- package/dist/clients/attach/input/capabilities.d.ts +27 -0
- package/dist/clients/attach/input/capabilities.js +96 -0
- package/dist/clients/attach/input/controller.d.ts +20 -182
- package/dist/clients/attach/input/controller.js +128 -537
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/overlays/file-review.d.ts +0 -4
- package/dist/clients/attach/overlays/file-review.js +13 -5
- package/dist/clients/attach/overlays/graph.js +2 -10
- package/dist/clients/attach/render/chat-view.d.ts +4 -3
- package/dist/clients/attach/render/chat-view.js +39 -33
- package/dist/clients/attach/render/group-activity.d.ts +1 -0
- package/dist/clients/attach/render/group-activity.js +20 -13
- package/dist/clients/attach/render/group-recap.js +12 -3
- package/dist/clients/attach/session/connection.js +9 -15
- package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
- package/dist/clients/attach/session/editor-inventory.js +7 -8
- package/dist/clients/attach/session/file-links.d.ts +13 -0
- package/dist/clients/attach/session/file-links.js +107 -0
- package/dist/clients/attach/session/frame.d.ts +3 -0
- package/dist/clients/attach/session/frame.js +10 -1
- package/dist/clients/attach/session/frames.js +2 -3
- package/dist/clients/attach/session/input-wiring.d.ts +4 -1
- package/dist/clients/attach/session/input-wiring.js +15 -14
- package/dist/clients/attach/session/mouse.d.ts +6 -1
- package/dist/clients/attach/session/mouse.js +8 -5
- package/dist/clients/attach/session/profile-files.js +18 -12
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/session/state-sync.js +1 -2
- package/dist/clients/attach/session/surface-host.d.ts +3 -2
- package/dist/clients/attach/session/surface-host.js +4 -4
- package/dist/clients/attach/slash/dispatch.d.ts +8 -31
- package/dist/clients/attach/slash/dispatch.js +34 -81
- package/dist/clients/attach/viewer.js +820 -860
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +341 -0
- package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
- package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
- package/dist/clients/inbox/controller.d.ts +0 -4
- package/dist/clients/inbox/controller.js +0 -2
- package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
- package/dist/clients/inbox/review/comments-client.d.ts +3 -2
- package/dist/clients/inbox/review/comments-client.js +12 -12
- package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
- package/dist/clients/inbox/review/companion-pane.js +86 -0
- package/dist/clients/inbox/review/document-surface.d.ts +182 -0
- package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
- package/dist/clients/inbox/review/frame.js +5 -4
- package/dist/clients/inbox/review/launch.d.ts +8 -8
- package/dist/clients/inbox/review/launch.js +52 -92
- package/dist/clients/inbox/review/nvim.d.ts +2 -0
- package/dist/clients/inbox/review/nvim.js +14 -12
- package/dist/clients/inbox/review/review-client.d.ts +12 -8
- package/dist/clients/inbox/review/review-client.js +46 -35
- package/dist/clients/inbox/review-adapter.d.ts +3 -10
- package/dist/clients/inbox/review-adapter.js +27 -19
- package/dist/clients/inbox/surface.d.ts +0 -4
- package/dist/clients/inbox/surface.js +0 -2
- package/dist/clients/surfaces/host.d.ts +11 -3
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
- package/dist/commands/__tests__/human.test.js +11 -322
- package/dist/commands/api-client.d.ts +5 -5
- package/dist/commands/api-client.js +6 -85
- package/dist/commands/canvas-browse.js +3 -29
- package/dist/commands/canvas-config.js +1 -1
- package/dist/commands/canvas-use.js +3 -3
- package/dist/commands/canvas.js +1 -1
- package/dist/commands/cron.js +5 -1
- package/dist/commands/human/queue.d.ts +0 -4
- package/dist/commands/human/queue.js +7 -40
- package/dist/commands/memory/list.d.ts +14 -0
- package/dist/commands/memory/list.js +35 -31
- package/dist/commands/memory/read.d.ts +7 -0
- package/dist/commands/memory/read.js +14 -8
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +198 -0
- package/dist/commands/node/create.d.ts +23 -0
- package/dist/commands/node/create.js +207 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +302 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +415 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +164 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +82 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +159 -0
- package/dist/commands/node-lifecycle-revive.js +10 -57
- package/dist/commands/node.d.ts +0 -42
- package/dist/commands/node.js +11 -2065
- package/dist/commands/search.js +1 -1
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +67 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +46 -0
- package/dist/commands/surface/node/placement.js +124 -0
- package/dist/commands/surface-node.js +4 -1
- package/dist/commands/surface-reload.js +1 -2
- package/dist/commands/surface-tmux-spread.js +1 -1
- package/dist/commands/surface.js +5 -20
- package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
- package/dist/commands/sys/config.js +6 -6
- package/dist/commands/sys/logs.js +1 -1
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
- package/dist/commands/sys/panels/keys-panel.js +60 -0
- package/dist/commands/sys/panels/models-panel.d.ts +77 -0
- package/dist/commands/sys/panels/models-panel.js +647 -0
- package/dist/commands/sys/panels/panel.d.ts +45 -0
- package/dist/commands/sys/panels/panel.js +137 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +80 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
- package/dist/commands/sys/panels/prefs-panel.js +85 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
- package/dist/commands/sys/panels/provider-panel.js +538 -0
- package/dist/commands/sys/settings-shell.d.ts +55 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +31 -0
- package/dist/commands/sys/setup-core.d.ts +3 -33
- package/dist/commands/sys/setup-core.js +27 -78
- package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
- package/dist/commands/sys/setup-settings-runner.js +63 -0
- package/dist/commands/sys/setup-wizard.d.ts +26 -125
- package/dist/commands/sys/setup-wizard.js +209 -2473
- package/dist/commands/sys/setup.js +5 -7
- package/dist/commands/sys.js +3 -2
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
- package/dist/core/__tests__/broker-preflight.test.js +1 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
- package/dist/core/__tests__/canvas.test.js +2 -36
- package/dist/core/__tests__/close.test.js +14 -3
- package/dist/core/__tests__/context-intro.test.js +32 -143
- package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
- package/dist/core/__tests__/daemon-boot.test.js +2 -20
- package/dist/core/__tests__/daemon-wedge.test.js +1 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +4 -98
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
- package/dist/core/__tests__/helpers/broker-clients.js +0 -14
- package/dist/core/__tests__/helpers/harness.d.ts +0 -8
- package/dist/core/__tests__/helpers/harness.js +7 -87
- package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
- package/dist/core/__tests__/kickoff.test.js +1 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
- package/dist/core/__tests__/migration.test.js +35 -48
- package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
- package/dist/core/__tests__/passive-subscription.test.js +26 -49
- package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
- package/dist/core/__tests__/prune.test.js +94 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -32
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
- package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
- package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
- package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
- package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
- package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
- package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
- package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
- package/dist/core/__tests__/secrets.test.js +1 -7
- package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
- package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
- package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
- package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
- package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
- package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
- package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
- package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
- package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
- package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
- package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
- package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
- package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
- package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
- package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
- package/dist/core/__tests__/session-model.test.js +0 -18
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
- package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
- package/dist/core/broker-client/client.d.ts +2 -2
- package/dist/core/broker-client/client.js +4 -7
- package/dist/core/broker-client/transport-relay.d.ts +13 -19
- package/dist/core/broker-client/transport-relay.js +19 -34
- package/dist/core/broker-client/transport-socket.d.ts +2 -2
- package/dist/core/broker-client/transport-socket.js +9 -2
- package/dist/core/broker-client/transport.d.ts +7 -3
- package/dist/core/broker-client/transport.js +4 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -18
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
- package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
- package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
- package/dist/core/canvas/browse/app.d.ts +2 -17
- package/dist/core/canvas/browse/app.js +16 -88
- package/dist/core/canvas/browse/model.d.ts +0 -4
- package/dist/core/canvas/browse/model.js +1 -12
- package/dist/core/canvas/browse/render.js +6 -3
- package/dist/core/canvas/crons.d.ts +8 -5
- package/dist/core/canvas/crons.js +7 -6
- package/dist/core/canvas/extensions.d.ts +7 -3
- package/dist/core/canvas/extensions.js +16 -4
- package/dist/core/canvas/nav-model.d.ts +0 -4
- package/dist/core/canvas/nav-model.js +2 -14
- package/dist/core/canvas/node-order.d.ts +3 -0
- package/dist/core/canvas/node-order.js +12 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
- package/dist/core/canvas/remote-canvas-source.js +8 -15
- package/dist/core/command.js +11 -4
- package/dist/core/config.js +3 -1
- package/dist/core/events/envelope.js +1 -1
- package/dist/core/events/read.js +7 -21
- package/dist/core/events/source.d.ts +0 -2
- package/dist/core/events/source.js +0 -16
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/fault-classifier.d.ts +1 -1
- package/dist/core/feed/passive.d.ts +0 -11
- package/dist/core/feed/passive.js +1 -62
- package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
- package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
- package/dist/core/keybindings/background-bash.js +3 -4
- package/dist/core/keybindings/catalog.js +1 -1
- package/dist/core/memory/inline-ref-grammar.js +3 -3
- package/dist/core/memory-resolver.d.ts +11 -25
- package/dist/core/memory-resolver.js +51 -33
- package/dist/core/model-routes.d.ts +15 -0
- package/dist/core/model-routes.js +12 -0
- package/dist/core/pool-credential-store.js +1 -1
- package/dist/core/preview-registry.js +8 -9
- package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
- package/dist/core/review/realize.d.ts +0 -13
- package/dist/core/review/realize.js +0 -40
- package/dist/core/review/types.d.ts +1 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
- package/dist/core/runtime/bearings.js +1 -11
- package/dist/core/runtime/broker/client-registry.d.ts +33 -0
- package/dist/core/runtime/broker/client-registry.js +164 -0
- package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
- package/dist/core/runtime/broker/daemon-ops.js +49 -0
- package/dist/core/runtime/broker/event-projection.d.ts +42 -0
- package/dist/core/runtime/broker/event-projection.js +178 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
- package/dist/core/runtime/broker/fault-retry.js +277 -0
- package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
- package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
- package/dist/core/runtime/broker/inbox.d.ts +22 -0
- package/dist/core/runtime/broker/inbox.js +167 -0
- package/dist/core/runtime/broker/passive.d.ts +16 -0
- package/dist/core/runtime/broker/passive.js +44 -0
- package/dist/core/runtime/broker/read-ops.d.ts +23 -0
- package/dist/core/runtime/broker/read-ops.js +150 -0
- package/dist/core/runtime/broker/rebind.d.ts +74 -0
- package/dist/core/runtime/broker/rebind.js +211 -0
- package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
- package/dist/core/runtime/broker/tool-groups.js +244 -0
- package/dist/core/runtime/broker-extension-render.d.ts +11 -0
- package/dist/core/runtime/broker-extension-render.js +181 -0
- package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
- package/dist/core/runtime/broker-persona-guidance.js +58 -0
- package/dist/core/runtime/broker-protocol.d.ts +1 -1
- package/dist/core/runtime/broker-protocol.js +1 -1
- package/dist/core/runtime/broker.d.ts +5 -196
- package/dist/core/runtime/broker.js +276 -3059
- package/dist/core/runtime/canvas-extensions.js +11 -2
- package/dist/core/runtime/fault.js +1 -1
- package/dist/core/runtime/model-selection.d.ts +9 -0
- package/dist/core/runtime/model-selection.js +12 -0
- package/dist/core/runtime/model-swap.d.ts +3 -3
- package/dist/core/runtime/model-swap.js +33 -25
- package/dist/core/runtime/placement-tmux.d.ts +3 -14
- package/dist/core/runtime/placement-tmux.js +11 -80
- package/dist/core/runtime/placement.d.ts +4 -2
- package/dist/core/runtime/placement.js +7 -12
- package/dist/core/runtime/promote.d.ts +14 -1
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/reset.d.ts +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/runtime/spawn.d.ts +8 -0
- package/dist/core/runtime/spawn.js +36 -6
- package/dist/core/runtime/stop-guard.d.ts +4 -3
- package/dist/core/runtime/stop-guard.js +36 -18
- package/dist/core/runtime/stop-signals.d.ts +4 -1
- package/dist/core/runtime/stream-watchdog.js +4 -5
- package/dist/core/runtime/structured-output.d.ts +15 -2
- package/dist/core/runtime/structured-output.js +35 -12
- package/dist/core/runtime/tmux-bindings.d.ts +25 -0
- package/dist/core/runtime/tmux-bindings.js +682 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -1
- package/dist/core/runtime/tmux-chrome.js +3 -2
- package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
- package/dist/core/runtime/tmux-driver.js +598 -0
- package/dist/core/runtime/view-socket.d.ts +14 -0
- package/dist/core/runtime/view-socket.js +83 -0
- package/dist/core/session-model/session-state.d.ts +1 -2
- package/dist/core/session-model/session-state.js +5 -8
- package/dist/core/spawn.d.ts +1 -1
- package/dist/core/spawn.js +2 -2
- package/dist/core/substrate/gate.d.ts +1 -1
- package/dist/core/substrate/on-read-pure.d.ts +7 -0
- package/dist/core/substrate/on-read-pure.js +272 -0
- package/dist/core/termrender/termrender.js +32 -2
- package/dist/core/user-settings.d.ts +23 -1
- package/dist/core/user-settings.js +18 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
- package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
- package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
- package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
- package/dist/daemon/api/bridge.js +40 -81
- package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
- package/dist/daemon/api/handlers/broker-ops.js +383 -0
- package/dist/daemon/api/handlers/crons.js +9 -4
- package/dist/daemon/api/handlers/files.js +6 -7
- package/dist/daemon/api/handlers/inbox.js +2 -340
- package/dist/daemon/api/handlers/nodes.d.ts +10 -1
- package/dist/daemon/api/handlers/nodes.js +74 -39
- package/dist/daemon/api/handlers/review-comments.js +5 -1
- package/dist/daemon/api/handlers/reviews.js +0 -19
- package/dist/daemon/api/map.js +25 -4
- package/dist/daemon/api/router.js +2 -3
- package/dist/daemon/api/server.js +5 -7
- package/dist/daemon/cron-run.d.ts +4 -0
- package/dist/daemon/cron-run.js +30 -13
- package/dist/daemon/crtrd.d.ts +3 -58
- package/dist/daemon/crtrd.js +28 -1244
- package/dist/daemon/manage.js +0 -1
- package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
- package/dist/daemon/reconcilers/broker-supervision.js +549 -0
- package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
- package/dist/daemon/reconcilers/cron-lane.js +32 -0
- package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
- package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
- package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
- package/dist/daemon/review/finish.js +2 -5
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
- package/dist/pi-extensions/broker-local.d.ts +20 -0
- package/dist/pi-extensions/broker-local.js +89 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
- package/dist/pi-extensions/canvas-context-intro.js +22 -11
- package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
- package/dist/pi-extensions/canvas-goal-capture.js +7 -12
- package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
- package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
- package/dist/pi-extensions/canvas-passive-context.js +22 -18
- package/dist/pi-extensions/canvas-recap.d.ts +2 -2
- package/dist/pi-extensions/canvas-recap.js +48 -21
- package/dist/pi-extensions/canvas-review-boundary.js +10 -4
- package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
- package/dist/pi-extensions/canvas-stophook.js +149 -431
- package/dist/pi-extensions/canvas-structured-output.js +52 -30
- package/dist/pi-extensions/envelope-merge.d.ts +13 -0
- package/dist/pi-extensions/envelope-merge.js +29 -0
- package/dist/shared/working-activity.d.ts +3 -2
- package/dist/shared/working-activity.js +3 -2
- package/dist/types.d.ts +6 -5
- package/dist/types.js +2 -2
- package/docs/compat/hearth-crtr-v1.md +4 -12
- package/docs/compat/hearth-crtr-v2.md +3 -11
- package/docs/compat/hearth-crtr-v3.md +4 -12
- package/docs/compat/hearth-crtr-v4.md +3 -11
- package/docs/compat/hearth-crtr-v5.md +3 -11
- package/docs/public-api.md +3 -7
- package/package.json +7 -49
- package/runtime.lock.json +2766 -14533
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
- package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
- package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
- package/dist/clients/conversation/conversation.d.ts +0 -65
- package/dist/clients/conversation/conversation.js +0 -318
- package/dist/clients/conversation/frames.d.ts +0 -30
- package/dist/clients/conversation/frames.js +0 -52
- package/dist/clients/conversation/region.d.ts +0 -51
- package/dist/clients/conversation/region.js +0 -265
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
- package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
- package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
- package/dist/clients/inbox/review/columns.d.ts +0 -22
- package/dist/clients/inbox/review/columns.js +0 -40
- package/dist/clients/inbox/review/composition.d.ts +0 -60
- package/dist/clients/inbox/review/composition.js +0 -278
- package/dist/clients/inbox/review/document-region.d.ts +0 -120
- package/dist/clients/surfaces/region.d.ts +0 -16
- package/dist/clients/web/__tests__/push-engine.test.js +0 -158
- package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
- package/dist/clients/web/__tests__/push-registry.test.js +0 -177
- package/dist/clients/web/dev-server.d.ts +0 -7
- package/dist/clients/web/dev-server.js +0 -46
- package/dist/clients/web/events.d.ts +0 -19
- package/dist/clients/web/events.js +0 -163
- package/dist/clients/web/push-engine.d.ts +0 -44
- package/dist/clients/web/push-engine.js +0 -125
- package/dist/clients/web/push-registry.d.ts +0 -85
- package/dist/clients/web/push-registry.js +0 -373
- package/dist/clients/web/server.d.ts +0 -19
- package/dist/clients/web/server.js +0 -661
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
- package/dist/clients/web/web-client/shared/protocol.js +0 -8
- package/dist/clients/web/web-cmd.d.ts +0 -2
- package/dist/clients/web/web-cmd.js +0 -141
- package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
- package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
- package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
- package/dist/commands/__tests__/canvas-config.test.js +0 -107
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
- package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
- package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
- package/dist/commands/__tests__/search-contents.test.js +0 -52
- package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/lint.test.js +0 -15
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
- package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
- package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
- package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
- package/dist/core/__tests__/finalization-migration.test.js +0 -38
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
- package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
- package/dist/core/__tests__/fork.test.d.ts +0 -1
- package/dist/core/__tests__/fork.test.js +0 -108
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
- package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
- package/dist/core/__tests__/full/cascade-close.test.js +0 -240
- package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/detach-focus.test.js +0 -126
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
- package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
- package/dist/core/__tests__/memory-index-render.test.js +0 -60
- package/dist/core/__tests__/model-routes.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes.test.js +0 -41
- package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-identity.test.js +0 -61
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
- package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
- package/dist/core/__tests__/prune-to-limit.test.js +0 -126
- package/dist/core/__tests__/reset.test.d.ts +0 -1
- package/dist/core/__tests__/reset.test.js +0 -69
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
- package/dist/core/__tests__/steer-note.test.d.ts +0 -1
- package/dist/core/__tests__/steer-note.test.js +0 -41
- package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
- package/dist/core/__tests__/subcommand-tier.test.js +0 -99
- package/dist/core/__tests__/subscription-delivery.test.js +0 -211
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
- package/dist/core/__tests__/tmux-surface.test.js +0 -484
- package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
- package/dist/core/__tests__/wake-bearings.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
- package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
- package/dist/core/canvas/remote-event-stream.d.ts +0 -24
- package/dist/core/canvas/remote-event-stream.js +0 -94
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
- package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
- package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
- package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
- package/dist/core/human/__tests__/visible-paths.test.js +0 -28
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
- package/dist/core/review/__tests__/project.test.d.ts +0 -1
- package/dist/core/review/__tests__/project.test.js +0 -71
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
- package/dist/core/runtime/tmux.js +0 -1314
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
- package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/inbox.test.js +0 -489
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
- package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +0 -17
- package/dist/web-client/manifest.webmanifest +0 -1
- package/dist/web-client/sw.js +0 -1
- /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
- /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
- /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
- /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
- /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
- /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
- /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
- /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
- /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
- /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
- /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
- /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
- /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { buildLineMap, remapRange } from '../remap.js';
|
|
4
|
-
describe('remap', () => {
|
|
5
|
-
describe('buildLineMap', () => {
|
|
6
|
-
it('identity mapping when content unchanged', () => {
|
|
7
|
-
const lines = ['line 1', 'line 2', 'line 3'];
|
|
8
|
-
const map = buildLineMap(lines, lines);
|
|
9
|
-
assert.equal(map.get(0), 0);
|
|
10
|
-
assert.equal(map.get(1), 1);
|
|
11
|
-
assert.equal(map.get(2), 2);
|
|
12
|
-
});
|
|
13
|
-
it('preserves normalized equivalence', () => {
|
|
14
|
-
const oldLines = ['line 1', ' line 2 ', 'line 3'];
|
|
15
|
-
const newLines = ['line 1', 'line 2', 'line 3'];
|
|
16
|
-
const map = buildLineMap(oldLines, newLines);
|
|
17
|
-
// All lines are normalized equivalent, so they map 1:1
|
|
18
|
-
assert.equal(map.get(0), 0);
|
|
19
|
-
assert.equal(map.get(1), 1);
|
|
20
|
-
assert.equal(map.get(2), 2);
|
|
21
|
-
});
|
|
22
|
-
it('handles common prefix', () => {
|
|
23
|
-
const oldLines = ['a', 'b', 'c', 'x'];
|
|
24
|
-
const newLines = ['a', 'b', 'c', 'x'];
|
|
25
|
-
const map = buildLineMap(oldLines, newLines);
|
|
26
|
-
// All lines match 1:1
|
|
27
|
-
assert.equal(map.get(0), 0);
|
|
28
|
-
assert.equal(map.get(1), 1);
|
|
29
|
-
assert.equal(map.get(2), 2);
|
|
30
|
-
assert.equal(map.get(3), 3);
|
|
31
|
-
});
|
|
32
|
-
it('handles common suffix', () => {
|
|
33
|
-
const oldLines = ['x', 'a', 'b', 'c'];
|
|
34
|
-
const newLines = ['x', 'a', 'b', 'c'];
|
|
35
|
-
const map = buildLineMap(oldLines, newLines);
|
|
36
|
-
assert.equal(map.get(0), 0);
|
|
37
|
-
assert.equal(map.get(1), 1);
|
|
38
|
-
assert.equal(map.get(2), 2);
|
|
39
|
-
assert.equal(map.get(3), 3);
|
|
40
|
-
});
|
|
41
|
-
it('handles insertion above range', () => {
|
|
42
|
-
const oldLines = ['x', 'y', 'z'];
|
|
43
|
-
const newLines = ['a', 'b', 'x', 'y', 'z'];
|
|
44
|
-
const map = buildLineMap(oldLines, newLines);
|
|
45
|
-
// Original lines are shifted down by 2
|
|
46
|
-
assert.equal(map.get(0), 2); // 'x'
|
|
47
|
-
assert.equal(map.get(1), 3); // 'y'
|
|
48
|
-
assert.equal(map.get(2), 4); // 'z'
|
|
49
|
-
});
|
|
50
|
-
it('handles deletion creating gaps', () => {
|
|
51
|
-
const oldLines = ['a', 'b', 'c', 'd', 'e'];
|
|
52
|
-
const newLines = ['a', 'c', 'e'];
|
|
53
|
-
const map = buildLineMap(oldLines, newLines);
|
|
54
|
-
assert.equal(map.get(0), 0); // 'a'
|
|
55
|
-
assert.equal(map.get(1), undefined); // 'b' deleted
|
|
56
|
-
assert.equal(map.get(2), 1); // 'c'
|
|
57
|
-
assert.equal(map.get(3), undefined); // 'd' deleted
|
|
58
|
-
assert.equal(map.get(4), 2); // 'e'
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
describe('remapRange', () => {
|
|
62
|
-
it('returns kept when both endpoints unmoved', () => {
|
|
63
|
-
const oldLines = ['a', 'b', 'c', 'd'];
|
|
64
|
-
const newLines = ['a', 'b', 'c', 'd'];
|
|
65
|
-
const map = buildLineMap(oldLines, newLines);
|
|
66
|
-
const result = remapRange(map, { line: 1, endLine: 3 });
|
|
67
|
-
assert.equal(result.kind, 'kept');
|
|
68
|
-
if (result.kind === 'kept') {
|
|
69
|
-
assert.equal(result.line, 1);
|
|
70
|
-
assert.equal(result.endLine, 3);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
it('pure insertion above range keeps content identity', () => {
|
|
74
|
-
const oldLines = ['x', 'y', 'z'];
|
|
75
|
-
const newLines = ['a', 'b', 'x', 'y', 'z'];
|
|
76
|
-
const map = buildLineMap(oldLines, newLines);
|
|
77
|
-
// Range [0, 2] in old file → should map to [2, 4] in new
|
|
78
|
-
const result = remapRange(map, { line: 0, endLine: 2 });
|
|
79
|
-
assert.equal(result.kind, 'shifted');
|
|
80
|
-
if (result.kind === 'shifted') {
|
|
81
|
-
assert.equal(result.line, 2);
|
|
82
|
-
assert.equal(result.endLine, 4);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
it('pure deletion of whole range yields detached', () => {
|
|
86
|
-
const oldLines = ['a', 'b', 'c', 'd', 'e'];
|
|
87
|
-
const newLines = ['a', 'e'];
|
|
88
|
-
const map = buildLineMap(oldLines, newLines);
|
|
89
|
-
// Range [1, 4] contains only deleted lines
|
|
90
|
-
const result = remapRange(map, { line: 1, endLine: 4 });
|
|
91
|
-
assert.equal(result.kind, 'detached');
|
|
92
|
-
});
|
|
93
|
-
it('partial range deletion yields shifted', () => {
|
|
94
|
-
const oldLines = ['a', 'b', 'c', 'd', 'e'];
|
|
95
|
-
const newLines = ['a', 'c', 'e'];
|
|
96
|
-
const map = buildLineMap(oldLines, newLines);
|
|
97
|
-
// Range [0, 3] contains 'a' (survives), 'b' (deleted), 'c' (survives), 'd' (deleted)
|
|
98
|
-
// Should remap to min=0, max=1 (the span of survivors)
|
|
99
|
-
const result = remapRange(map, { line: 0, endLine: 3 });
|
|
100
|
-
assert.equal(result.kind, 'shifted');
|
|
101
|
-
if (result.kind === 'shifted') {
|
|
102
|
-
assert.equal(result.line, 0); // min of survivors
|
|
103
|
-
assert.equal(result.endLine, 2); // max + 1
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
it('reindentation of entire file yields kept', () => {
|
|
107
|
-
const oldLines = [' line 1', ' line 2', ' line 3'];
|
|
108
|
-
const newLines = [' line 1', ' line 2', ' line 3'];
|
|
109
|
-
const map = buildLineMap(oldLines, newLines);
|
|
110
|
-
// After normalization, all lines match 1:1
|
|
111
|
-
const result = remapRange(map, { line: 0, endLine: 3 });
|
|
112
|
-
assert.equal(result.kind, 'kept');
|
|
113
|
-
if (result.kind === 'kept') {
|
|
114
|
-
assert.equal(result.line, 0);
|
|
115
|
-
assert.equal(result.endLine, 3);
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
it('handles range with one survivor in middle', () => {
|
|
119
|
-
const oldLines = [
|
|
120
|
-
'keep1',
|
|
121
|
-
'delete1',
|
|
122
|
-
'delete2',
|
|
123
|
-
'keep2',
|
|
124
|
-
'delete3',
|
|
125
|
-
];
|
|
126
|
-
const newLines = ['keep1', 'keep2'];
|
|
127
|
-
const map = buildLineMap(oldLines, newLines);
|
|
128
|
-
// Range [1, 4] covers delete1, delete2, keep2
|
|
129
|
-
// Only keep2 survives at index 1
|
|
130
|
-
const result = remapRange(map, { line: 1, endLine: 4 });
|
|
131
|
-
assert.equal(result.kind, 'shifted');
|
|
132
|
-
if (result.kind === 'shifted') {
|
|
133
|
-
assert.equal(result.line, 1);
|
|
134
|
-
assert.equal(result.endLine, 2);
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
it('detached when entire range deleted', () => {
|
|
138
|
-
const oldLines = ['a', 'b', 'c', 'd'];
|
|
139
|
-
const newLines = ['a', 'd'];
|
|
140
|
-
const map = buildLineMap(oldLines, newLines);
|
|
141
|
-
// Range [1, 3] contains only 'b' and 'c', both deleted
|
|
142
|
-
const result = remapRange(map, { line: 1, endLine: 3 });
|
|
143
|
-
assert.equal(result.kind, 'detached');
|
|
144
|
-
});
|
|
145
|
-
it('handles range at start', () => {
|
|
146
|
-
const oldLines = ['x', 'keep1', 'keep2', 'keep3'];
|
|
147
|
-
const newLines = ['keep1', 'keep2', 'keep3'];
|
|
148
|
-
const map = buildLineMap(oldLines, newLines);
|
|
149
|
-
// Range [1, 3] should map to [0, 2]
|
|
150
|
-
const result = remapRange(map, { line: 1, endLine: 3 });
|
|
151
|
-
assert.equal(result.kind, 'shifted');
|
|
152
|
-
if (result.kind === 'shifted') {
|
|
153
|
-
assert.equal(result.line, 0);
|
|
154
|
-
assert.equal(result.endLine, 2);
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
it('handles range at end', () => {
|
|
158
|
-
const oldLines = ['keep1', 'keep2', 'keep3', 'x'];
|
|
159
|
-
const newLines = ['keep1', 'keep2', 'keep3'];
|
|
160
|
-
const map = buildLineMap(oldLines, newLines);
|
|
161
|
-
// Range [1, 4] should map to [1, 3]
|
|
162
|
-
const result = remapRange(map, { line: 1, endLine: 4 });
|
|
163
|
-
assert.equal(result.kind, 'shifted');
|
|
164
|
-
if (result.kind === 'shifted') {
|
|
165
|
-
assert.equal(result.line, 1);
|
|
166
|
-
assert.equal(result.endLine, 3);
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
describe('performance', () => {
|
|
171
|
-
it('5000-line file with 20-line edit completes quickly', () => {
|
|
172
|
-
// Build old file: 5000 identical lines
|
|
173
|
-
const oldLines = [];
|
|
174
|
-
for (let i = 0; i < 5000; i++) {
|
|
175
|
-
oldLines.push(`line ${i}`);
|
|
176
|
-
}
|
|
177
|
-
// Build new file: insert 20 lines at position 2000
|
|
178
|
-
const newLines = [
|
|
179
|
-
...oldLines.slice(0, 2000),
|
|
180
|
-
...Array.from({ length: 20 }, (_, i) => `inserted ${i}`),
|
|
181
|
-
...oldLines.slice(2000),
|
|
182
|
-
];
|
|
183
|
-
// Measure time
|
|
184
|
-
const start = performance.now();
|
|
185
|
-
const map = buildLineMap(oldLines, newLines);
|
|
186
|
-
const elapsed = performance.now() - start;
|
|
187
|
-
// Should complete in well under 10s (the ordinary test budget)
|
|
188
|
-
// Even a naive implementation should handle this in <100ms
|
|
189
|
-
assert(elapsed < 1000, `buildLineMap took ${elapsed}ms, should be <1000ms`);
|
|
190
|
-
// Verify a few mappings
|
|
191
|
-
assert.equal(map.get(1999), 1999);
|
|
192
|
-
assert.equal(map.get(2000), 2020); // shifted by 20
|
|
193
|
-
assert.equal(map.get(2001), 2021);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
});
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export declare const MIN_DOC_COLS = 56;
|
|
2
|
-
export declare const MIN_CHAT_COLS = 40;
|
|
3
|
-
export declare const GUTTER_COLS = 3;
|
|
4
|
-
export declare const SPLIT_MIN_COLS: number;
|
|
5
|
-
export declare const DOC_TARGET = 0.58;
|
|
6
|
-
export declare const DOC_CAP = 126;
|
|
7
|
-
export declare const MIN_REGION_ROWS = 8;
|
|
8
|
-
export type FocusOwner = 'document' | 'companion';
|
|
9
|
-
export interface Rect {
|
|
10
|
-
readonly col: number;
|
|
11
|
-
readonly cols: number;
|
|
12
|
-
readonly rows: number;
|
|
13
|
-
}
|
|
14
|
-
export interface Layout {
|
|
15
|
-
readonly mode: 'split' | 'single';
|
|
16
|
-
readonly docRect?: Rect;
|
|
17
|
-
readonly chatRect?: Rect;
|
|
18
|
-
readonly visible?: FocusOwner;
|
|
19
|
-
readonly gutterCol?: number;
|
|
20
|
-
readonly statusRow: number | undefined;
|
|
21
|
-
}
|
|
22
|
-
export declare function solveReviewLayout(cols: number, rows: number, focusOwner: FocusOwner): Layout;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
export const MIN_DOC_COLS = 56;
|
|
2
|
-
export const MIN_CHAT_COLS = 40;
|
|
3
|
-
export const GUTTER_COLS = 3;
|
|
4
|
-
export const SPLIT_MIN_COLS = MIN_DOC_COLS + GUTTER_COLS + MIN_CHAT_COLS;
|
|
5
|
-
export const DOC_TARGET = 0.58;
|
|
6
|
-
export const DOC_CAP = 126;
|
|
7
|
-
export const MIN_REGION_ROWS = 8;
|
|
8
|
-
function singleLayout(cols, rows, focusOwner, mode, statusRow) {
|
|
9
|
-
const rect = { col: 0, cols, rows: statusRow === undefined ? rows : rows - 1 };
|
|
10
|
-
return {
|
|
11
|
-
mode,
|
|
12
|
-
...(focusOwner === 'document' ? { docRect: rect } : { chatRect: rect }),
|
|
13
|
-
visible: focusOwner,
|
|
14
|
-
statusRow,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
export function solveReviewLayout(cols, rows, focusOwner) {
|
|
18
|
-
const statusRow = rows >= MIN_REGION_ROWS ? rows - 1 : undefined;
|
|
19
|
-
if (cols < SPLIT_MIN_COLS) {
|
|
20
|
-
return singleLayout(cols, rows, focusOwner, 'single', statusRow);
|
|
21
|
-
}
|
|
22
|
-
const regionRows = statusRow === undefined ? rows : rows - 1;
|
|
23
|
-
let docCols = Math.min(DOC_CAP, Math.max(MIN_DOC_COLS, Math.round(cols * DOC_TARGET)));
|
|
24
|
-
let chatCols = cols - GUTTER_COLS - docCols;
|
|
25
|
-
if (chatCols < MIN_CHAT_COLS) {
|
|
26
|
-
docCols = cols - GUTTER_COLS - MIN_CHAT_COLS;
|
|
27
|
-
chatCols = MIN_CHAT_COLS;
|
|
28
|
-
}
|
|
29
|
-
if (docCols < MIN_DOC_COLS) {
|
|
30
|
-
return singleLayout(cols, rows, focusOwner, 'single', statusRow);
|
|
31
|
-
}
|
|
32
|
-
const gutterCol = docCols + 1;
|
|
33
|
-
return {
|
|
34
|
-
mode: 'split',
|
|
35
|
-
docRect: { col: 0, cols: docCols, rows: regionRows },
|
|
36
|
-
chatRect: { col: docCols + GUTTER_COLS, cols: chatCols, rows: regionRows },
|
|
37
|
-
gutterCol,
|
|
38
|
-
statusRow,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import type { SurfaceComponent, SurfaceHandle } from '../../surfaces/host.js';
|
|
2
|
-
import type { SurfaceRegion } from '../../surfaces/region.js';
|
|
3
|
-
/** The document's one optional composition seam. `DocumentRegion` adds this
|
|
4
|
-
* method when it can state whether Esc would discard typed, unsubmitted text. */
|
|
5
|
-
export interface ReviewDocumentRegion extends SurfaceRegion {
|
|
6
|
-
hasUnsentCompose?(): boolean;
|
|
7
|
-
}
|
|
8
|
-
export interface ReviewCompositionOptions {
|
|
9
|
-
document: ReviewDocumentRegion;
|
|
10
|
-
companion: SurfaceRegion;
|
|
11
|
-
/** Surface-wide transients only. */
|
|
12
|
-
notice(text: string): void;
|
|
13
|
-
/** Runs after both regions have released their resources. */
|
|
14
|
-
onRequestClose(): void;
|
|
15
|
-
}
|
|
16
|
-
/** The one mounted review surface. Its children are rectangles, never nested
|
|
17
|
-
* host surfaces, so this component owns their shared geometry and cursor. */
|
|
18
|
-
export declare class ReviewCompositionComponent implements SurfaceComponent {
|
|
19
|
-
private readonly document;
|
|
20
|
-
private readonly companion;
|
|
21
|
-
private readonly notice;
|
|
22
|
-
private readonly onRequestClose;
|
|
23
|
-
private handle;
|
|
24
|
-
private rows;
|
|
25
|
-
private focusOwner;
|
|
26
|
-
private rootFocused;
|
|
27
|
-
private closed;
|
|
28
|
-
private closeRequested;
|
|
29
|
-
private suspendCount;
|
|
30
|
-
private escapeConfirmArmed;
|
|
31
|
-
private layout;
|
|
32
|
-
constructor(opts: ReviewCompositionOptions);
|
|
33
|
-
get focused(): boolean;
|
|
34
|
-
set focused(value: boolean);
|
|
35
|
-
setRows(rows: number): void;
|
|
36
|
-
render(width: number): string[];
|
|
37
|
-
handleInput(data: string): void;
|
|
38
|
-
/** The host reports SGR columns as 1-based. This is the sole conversion
|
|
39
|
-
* boundary; all layout rectangles and comparisons are 0-based. */
|
|
40
|
-
handleWheel(direction: 'up' | 'down', lines: number, column: number): boolean;
|
|
41
|
-
/** Region dirty callbacks call this only while the mounted composition can
|
|
42
|
-
* repaint. */
|
|
43
|
-
invalidate(): void;
|
|
44
|
-
setHandle(handle: SurfaceHandle): void;
|
|
45
|
-
/** Called alongside the host's suspend/resume closure by the future composed
|
|
46
|
-
* owner. It withholds all paints until every outstanding child suspension has
|
|
47
|
-
* resumed, without owning or importing the host terminal operation itself. */
|
|
48
|
-
suspendForChild(): () => void;
|
|
49
|
-
/** Ordered, idempotent release: the document first stops its watcher and
|
|
50
|
-
* cache, then no late dirty callback may repaint, then the companion ends its
|
|
51
|
-
* redial/socket/chat resources before the owner releases its references. */
|
|
52
|
-
close(): void;
|
|
53
|
-
private renderSingle;
|
|
54
|
-
private renderSplit;
|
|
55
|
-
private focusedRegion;
|
|
56
|
-
private visibleRegion;
|
|
57
|
-
private setFocus;
|
|
58
|
-
private syncFocus;
|
|
59
|
-
private requestClose;
|
|
60
|
-
}
|
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
import { CURSOR_MARKER, Key, matchesKey } from '@earendil-works/pi-tui';
|
|
2
|
-
import { clipLine, CYAN, DIM, RESET, visibleWidth } from '../tui/ansi.js';
|
|
3
|
-
import { solveReviewLayout } from './columns.js';
|
|
4
|
-
/** The one mounted review surface. Its children are rectangles, never nested
|
|
5
|
-
* host surfaces, so this component owns their shared geometry and cursor. */
|
|
6
|
-
export class ReviewCompositionComponent {
|
|
7
|
-
document;
|
|
8
|
-
companion;
|
|
9
|
-
notice;
|
|
10
|
-
onRequestClose;
|
|
11
|
-
handle;
|
|
12
|
-
rows = 0;
|
|
13
|
-
focusOwner = 'document';
|
|
14
|
-
rootFocused = false;
|
|
15
|
-
closed = false;
|
|
16
|
-
closeRequested = false;
|
|
17
|
-
suspendCount = 0;
|
|
18
|
-
escapeConfirmArmed = false;
|
|
19
|
-
layout;
|
|
20
|
-
constructor(opts) {
|
|
21
|
-
this.document = opts.document;
|
|
22
|
-
this.companion = opts.companion;
|
|
23
|
-
this.notice = opts.notice;
|
|
24
|
-
this.onRequestClose = opts.onRequestClose;
|
|
25
|
-
this.document.onDirty(() => this.invalidate());
|
|
26
|
-
this.companion.onDirty(() => this.invalidate());
|
|
27
|
-
this.syncFocus();
|
|
28
|
-
}
|
|
29
|
-
get focused() {
|
|
30
|
-
return this.rootFocused;
|
|
31
|
-
}
|
|
32
|
-
set focused(value) {
|
|
33
|
-
if (this.rootFocused === value)
|
|
34
|
-
return;
|
|
35
|
-
this.rootFocused = value;
|
|
36
|
-
this.syncFocus();
|
|
37
|
-
this.invalidate();
|
|
38
|
-
}
|
|
39
|
-
setRows(rows) {
|
|
40
|
-
this.rows = Math.max(0, Math.floor(rows));
|
|
41
|
-
}
|
|
42
|
-
render(width) {
|
|
43
|
-
const cols = Math.max(0, Math.floor(width));
|
|
44
|
-
if (this.closed || this.suspendCount > 0)
|
|
45
|
-
return blankFrame(cols, this.rows);
|
|
46
|
-
const solved = solveReviewLayout(cols, this.rows, this.focusOwner);
|
|
47
|
-
const layout = solved.statusRow === undefined ? focusedOnlyLayout(cols, this.rows, this.focusOwner) : solved;
|
|
48
|
-
this.layout = layout;
|
|
49
|
-
this.syncFocus();
|
|
50
|
-
if (layout.mode === 'single')
|
|
51
|
-
return this.renderSingle(layout, cols);
|
|
52
|
-
return this.renderSplit(layout, cols);
|
|
53
|
-
}
|
|
54
|
-
handleInput(data) {
|
|
55
|
-
if (this.closed || this.suspendCount > 0)
|
|
56
|
-
return;
|
|
57
|
-
if (isFocusLeft(data)) {
|
|
58
|
-
this.setFocus('document');
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
if (isFocusRight(data)) {
|
|
62
|
-
this.setFocus('companion');
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
if (this.focusOwner === 'document' && isEscape(data)) {
|
|
66
|
-
if (this.escapeConfirmArmed) {
|
|
67
|
-
this.escapeConfirmArmed = false;
|
|
68
|
-
if (this.document.handleInput(data))
|
|
69
|
-
return;
|
|
70
|
-
this.requestClose();
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
if (this.document.hasUnsentCompose?.() === true) {
|
|
74
|
-
this.escapeConfirmArmed = true;
|
|
75
|
-
this.notice('unsent comment — press esc again to discard');
|
|
76
|
-
this.invalidate();
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
// Compose mode owns Esc when its buffer is empty; view mode deliberately
|
|
80
|
-
// returns false so the composition can close the full pane.
|
|
81
|
-
if (this.document.handleInput(data))
|
|
82
|
-
return;
|
|
83
|
-
this.requestClose();
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
if (this.escapeConfirmArmed)
|
|
87
|
-
this.escapeConfirmArmed = false;
|
|
88
|
-
this.focusedRegion().handleInput(data);
|
|
89
|
-
}
|
|
90
|
-
/** The host reports SGR columns as 1-based. This is the sole conversion
|
|
91
|
-
* boundary; all layout rectangles and comparisons are 0-based. */
|
|
92
|
-
handleWheel(direction, lines, column) {
|
|
93
|
-
if (this.closed || this.suspendCount > 0)
|
|
94
|
-
return true;
|
|
95
|
-
const layout = this.layout;
|
|
96
|
-
if (layout === undefined)
|
|
97
|
-
return true;
|
|
98
|
-
const zeroColumn = Math.floor(column) - 1;
|
|
99
|
-
if (layout.mode === 'single') {
|
|
100
|
-
this.visibleRegion(layout).handleWheel(direction, lines);
|
|
101
|
-
return true;
|
|
102
|
-
}
|
|
103
|
-
if (contains(layout.docRect, zeroColumn))
|
|
104
|
-
this.document.handleWheel(direction, lines);
|
|
105
|
-
else if (contains(layout.chatRect, zeroColumn))
|
|
106
|
-
this.companion.handleWheel(direction, lines);
|
|
107
|
-
// A gutter or out-of-rectangle wheel is intentionally consumed: the outer
|
|
108
|
-
// transcript must never scroll while a full-pane review is mounted.
|
|
109
|
-
return true;
|
|
110
|
-
}
|
|
111
|
-
/** Region dirty callbacks call this only while the mounted composition can
|
|
112
|
-
* repaint. */
|
|
113
|
-
invalidate() {
|
|
114
|
-
if (!this.closed && this.suspendCount === 0)
|
|
115
|
-
this.handle?.invalidate();
|
|
116
|
-
}
|
|
117
|
-
setHandle(handle) {
|
|
118
|
-
if (this.handle !== undefined)
|
|
119
|
-
return;
|
|
120
|
-
this.handle = handle;
|
|
121
|
-
handle.onClose(() => this.close());
|
|
122
|
-
}
|
|
123
|
-
/** Called alongside the host's suspend/resume closure by the future composed
|
|
124
|
-
* owner. It withholds all paints until every outstanding child suspension has
|
|
125
|
-
* resumed, without owning or importing the host terminal operation itself. */
|
|
126
|
-
suspendForChild() {
|
|
127
|
-
if (this.closed)
|
|
128
|
-
return () => { };
|
|
129
|
-
this.suspendCount++;
|
|
130
|
-
let resumed = false;
|
|
131
|
-
return () => {
|
|
132
|
-
if (resumed)
|
|
133
|
-
return;
|
|
134
|
-
resumed = true;
|
|
135
|
-
this.suspendCount = Math.max(0, this.suspendCount - 1);
|
|
136
|
-
if (!this.closed && this.suspendCount === 0)
|
|
137
|
-
this.invalidate();
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
/** Ordered, idempotent release: the document first stops its watcher and
|
|
141
|
-
* cache, then no late dirty callback may repaint, then the companion ends its
|
|
142
|
-
* redial/socket/chat resources before the owner releases its references. */
|
|
143
|
-
close() {
|
|
144
|
-
if (this.closed)
|
|
145
|
-
return;
|
|
146
|
-
this.document.close();
|
|
147
|
-
this.closed = true;
|
|
148
|
-
this.companion.close();
|
|
149
|
-
this.onRequestClose();
|
|
150
|
-
}
|
|
151
|
-
renderSingle(layout, cols) {
|
|
152
|
-
const visible = this.visibleRegion(layout);
|
|
153
|
-
const hidden = layout.visible === 'document' ? this.companion : this.document;
|
|
154
|
-
// CompanionRegion treats zero geometry as its unread-count signal. Push it
|
|
155
|
-
// every layout pass rather than only when crossing the narrow breakpoint.
|
|
156
|
-
hidden.setViewport(0, 0);
|
|
157
|
-
const rect = layout.visible === 'document' ? layout.docRect : layout.chatRect;
|
|
158
|
-
const lines = renderRect(visible, rect);
|
|
159
|
-
return layout.statusRow === undefined
|
|
160
|
-
? exactFrame(lines, cols, this.rows)
|
|
161
|
-
: [...lines, statusLine(this.document.summary(), this.companion.summary(), this.focusOwner, cols)];
|
|
162
|
-
}
|
|
163
|
-
renderSplit(layout, cols) {
|
|
164
|
-
const docRect = layout.docRect;
|
|
165
|
-
const chatRect = layout.chatRect;
|
|
166
|
-
const document = renderRect(this.document, docRect);
|
|
167
|
-
const companion = renderRect(this.companion, chatRect);
|
|
168
|
-
const gutter = `${DIM} │ ${RESET}`;
|
|
169
|
-
const lines = [];
|
|
170
|
-
for (let row = 0; row < docRect.rows; row++) {
|
|
171
|
-
const docLine = this.focusOwner === 'document' ? document[row] : stripMarkers(document[row]);
|
|
172
|
-
const chatLine = this.focusOwner === 'companion' ? companion[row] : stripMarkers(companion[row]);
|
|
173
|
-
lines.push(padLine(`${docLine}${gutter}${chatLine}`, cols));
|
|
174
|
-
}
|
|
175
|
-
lines.push(statusLine(this.document.summary(), this.companion.summary(), this.focusOwner, cols));
|
|
176
|
-
return exactFrame(lines, cols, this.rows);
|
|
177
|
-
}
|
|
178
|
-
focusedRegion() {
|
|
179
|
-
return this.focusOwner === 'document' ? this.document : this.companion;
|
|
180
|
-
}
|
|
181
|
-
visibleRegion(layout) {
|
|
182
|
-
return layout.visible === 'document' ? this.document : this.companion;
|
|
183
|
-
}
|
|
184
|
-
setFocus(owner) {
|
|
185
|
-
if (this.focusOwner === owner)
|
|
186
|
-
return;
|
|
187
|
-
this.focusOwner = owner;
|
|
188
|
-
this.escapeConfirmArmed = false;
|
|
189
|
-
this.syncFocus();
|
|
190
|
-
this.invalidate();
|
|
191
|
-
}
|
|
192
|
-
syncFocus() {
|
|
193
|
-
this.document.setFocused(this.rootFocused && this.focusOwner === 'document');
|
|
194
|
-
this.companion.setFocused(this.rootFocused && this.focusOwner === 'companion');
|
|
195
|
-
}
|
|
196
|
-
requestClose() {
|
|
197
|
-
if (this.closeRequested || this.closed)
|
|
198
|
-
return;
|
|
199
|
-
this.closeRequested = true;
|
|
200
|
-
if (this.handle !== undefined) {
|
|
201
|
-
this.handle.close();
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
this.close();
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
function isFocusLeft(data) {
|
|
208
|
-
return matchesKey(data, Key.altShift('left')) || data === '\x1b[1;4D';
|
|
209
|
-
}
|
|
210
|
-
function isFocusRight(data) {
|
|
211
|
-
return matchesKey(data, Key.altShift('right')) || data === '\x1b[1;4C';
|
|
212
|
-
}
|
|
213
|
-
function isEscape(data) {
|
|
214
|
-
return matchesKey(data, Key.escape);
|
|
215
|
-
}
|
|
216
|
-
/** Below the minimum useful height, the focused region owns the entire pane;
|
|
217
|
-
* no status row or short split is rendered. */
|
|
218
|
-
function focusedOnlyLayout(cols, rows, focusOwner) {
|
|
219
|
-
const rect = { col: 0, cols, rows };
|
|
220
|
-
return {
|
|
221
|
-
mode: 'single',
|
|
222
|
-
...(focusOwner === 'document' ? { docRect: rect } : { chatRect: rect }),
|
|
223
|
-
visible: focusOwner,
|
|
224
|
-
statusRow: undefined,
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
function renderRect(region, rect) {
|
|
228
|
-
region.setViewport(rect.cols, rect.rows);
|
|
229
|
-
return exactFrame(region.render(), rect.cols, rect.rows);
|
|
230
|
-
}
|
|
231
|
-
function contains(rect, column) {
|
|
232
|
-
return rect !== undefined && column >= rect.col && column < rect.col + rect.cols;
|
|
233
|
-
}
|
|
234
|
-
function stripMarkers(line) {
|
|
235
|
-
return line.split(CURSOR_MARKER).join('');
|
|
236
|
-
}
|
|
237
|
-
function blankFrame(cols, rows) {
|
|
238
|
-
return new Array(rows).fill(' '.repeat(cols));
|
|
239
|
-
}
|
|
240
|
-
function exactFrame(lines, cols, rows) {
|
|
241
|
-
const frame = lines.slice(0, rows).map((line) => padLine(line, cols));
|
|
242
|
-
while (frame.length < rows)
|
|
243
|
-
frame.push(' '.repeat(cols));
|
|
244
|
-
return frame;
|
|
245
|
-
}
|
|
246
|
-
function padLine(line, cols) {
|
|
247
|
-
const markerAt = line.indexOf(CURSOR_MARKER);
|
|
248
|
-
if (markerAt === -1) {
|
|
249
|
-
const clipped = clipLine(line, cols);
|
|
250
|
-
return clipped + ' '.repeat(Math.max(0, cols - visibleWidth(clipped)));
|
|
251
|
-
}
|
|
252
|
-
// `string-width` correctly ignores ANSI but cannot know pi-tui's private
|
|
253
|
-
// marker is zero-width. Fit the visible text on either side independently,
|
|
254
|
-
// then restore the marker only when its cursor cell remains in the rectangle.
|
|
255
|
-
const before = line.slice(0, markerAt);
|
|
256
|
-
const after = line.slice(markerAt + CURSOR_MARKER.length);
|
|
257
|
-
const clippedBefore = clipLine(before, cols);
|
|
258
|
-
const beforeWidth = visibleWidth(clippedBefore);
|
|
259
|
-
if (beforeWidth >= cols)
|
|
260
|
-
return padLine(stripMarkers(line), cols);
|
|
261
|
-
const clippedAfter = clipLine(after, cols - beforeWidth);
|
|
262
|
-
const fitted = `${clippedBefore}${CURSOR_MARKER}${clippedAfter}`;
|
|
263
|
-
return fitted + ' '.repeat(Math.max(0, cols - visibleWidth(stripMarkers(fitted))));
|
|
264
|
-
}
|
|
265
|
-
function statusLine(document, companion, focusOwner, cols) {
|
|
266
|
-
const left = tint(document, focusOwner === 'document');
|
|
267
|
-
const right = tint(companion, focusOwner === 'companion');
|
|
268
|
-
const availableForLeft = Math.max(0, cols - visibleWidth(right) - (document === '' || companion === '' ? 0 : 1));
|
|
269
|
-
const clippedLeft = clipLine(left, availableForLeft);
|
|
270
|
-
const separator = document === '' || companion === '' ? '' : ' ';
|
|
271
|
-
const body = `${clippedLeft}${' '.repeat(Math.max(0, cols - visibleWidth(clippedLeft) - visibleWidth(right) - visibleWidth(separator)))}${separator}${right}`;
|
|
272
|
-
return padLine(body, cols);
|
|
273
|
-
}
|
|
274
|
-
function tint(text, focused) {
|
|
275
|
-
if (text === '')
|
|
276
|
-
return '';
|
|
277
|
-
return `${focused ? CYAN : DIM}${text}${RESET}`;
|
|
278
|
-
}
|