@north-light/crouter 0.3.170 → 0.3.172
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/dist/api/client.d.ts +37 -11
- package/dist/api/client.js +84 -15
- package/dist/api/dto/human.d.ts +53 -39
- package/dist/api/dto/human.js +2 -3
- package/dist/api/dto/inbox.d.ts +0 -1
- package/dist/api/dto/nodes.d.ts +12 -0
- package/dist/api/dto/review-comments.d.ts +137 -0
- package/dist/api/dto/review-comments.js +5 -0
- package/dist/api/dto/reviews.d.ts +109 -0
- package/dist/api/dto/reviews.js +5 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/routes.d.ts +17 -4
- package/dist/api/routes.js +21 -5
- package/dist/build-root.d.ts +1 -16
- package/dist/build-root.js +1 -25
- package/dist/builtin-memory/00-runtime-base.md +7 -5
- package/dist/builtin-memory/04-base-worker.md +1 -1
- package/dist/builtin-memory/04-orchestration-kernel.md +7 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/design/01-orchestrator.md +1 -1
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/plan/01-orchestrator.md +1 -1
- package/dist/builtin-memory/05-kinds/review/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +20 -0
- package/dist/builtin-memory/05-kinds/spec/00-base.md +3 -7
- package/dist/builtin-memory/05-kinds/spec/01-orchestrator.md +3 -3
- package/dist/builtin-memory/05-kinds/spec/requirements.md +3 -3
- package/dist/builtin-memory/design.md +2 -2
- package/dist/builtin-memory/insights/capture.md +50 -0
- package/dist/builtin-memory/insights/init.md +45 -0
- package/dist/builtin-memory/insights/listen.md +9 -0
- package/dist/builtin-memory/internal/agent-shaping.md +2 -2
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +12 -11
- package/dist/builtin-memory/internal/storage-tiers.md +2 -2
- package/dist/builtin-memory/{planning.md → plan/roadmap.md} +3 -3
- package/dist/builtin-memory/plan.md +19 -0
- package/dist/builtin-memory/spec/guide.md +38 -0
- package/dist/builtin-memory/spec/requirements.md +31 -0
- package/dist/builtin-memory/spec/roadmap.md +35 -0
- package/dist/builtin-memory/spec.md +10 -86
- package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +3 -4
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +49 -5
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +56 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +920 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +221 -156
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +4 -5
- package/dist/cli.js +2 -6
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +7 -35
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +32 -16
- package/dist/clients/attach/__tests__/context-message.test.js +142 -6
- package/dist/clients/attach/__tests__/crtr-output.test.js +29 -45
- package/dist/clients/attach/__tests__/diagram.test.js +1 -1
- package/dist/clients/attach/__tests__/file-review-focus.test.js +48 -0
- package/dist/clients/attach/__tests__/group-activity.test.js +266 -0
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +32 -0
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +32 -0
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +1 -2
- package/dist/clients/attach/chrome/header.d.ts +10 -0
- package/dist/clients/attach/chrome/header.js +30 -0
- package/dist/clients/attach/chrome/recap.d.ts +7 -0
- package/dist/clients/attach/chrome/recap.js +19 -0
- package/dist/clients/attach/chrome/status-line.d.ts +3 -0
- package/dist/clients/attach/chrome/status-line.js +5 -0
- package/dist/clients/attach/chrome/widgets.js +11 -21
- package/dist/clients/attach/command.js +11 -7
- package/dist/clients/attach/config.d.ts +4 -0
- package/dist/clients/attach/config.js +3 -0
- package/dist/clients/attach/input/controller.d.ts +19 -0
- package/dist/clients/attach/input/controller.js +62 -28
- package/dist/clients/attach/input/titled-editor.d.ts +0 -4
- package/dist/clients/attach/input/titled-editor.js +2 -10
- package/dist/clients/attach/overlays/file-review.d.ts +9 -5
- package/dist/clients/attach/overlays/file-review.js +9 -70
- package/dist/clients/attach/overlays/help.d.ts +33 -0
- package/dist/clients/attach/overlays/help.js +204 -0
- package/dist/clients/attach/render/activity-slot.d.ts +4 -0
- package/dist/clients/attach/render/activity-slot.js +13 -0
- package/dist/clients/attach/render/chat-view.d.ts +117 -12
- package/dist/clients/attach/render/chat-view.js +604 -135
- package/dist/clients/attach/render/context-message.d.ts +2 -1
- package/dist/clients/attach/render/context-message.js +17 -13
- package/dist/clients/attach/render/crtr-output.js +1 -3
- package/dist/clients/attach/render/diagram.js +2 -2
- package/dist/clients/attach/render/edit-diff.d.ts +4 -1
- package/dist/clients/attach/render/edit-diff.js +7 -11
- package/dist/clients/attach/render/group-activity.d.ts +32 -0
- package/dist/clients/attach/render/group-activity.js +206 -0
- package/dist/clients/attach/render/group-recap.d.ts +10 -0
- package/dist/clients/attach/render/group-recap.js +93 -0
- package/dist/clients/attach/render/html-markdown.d.ts +17 -0
- package/dist/clients/attach/render/html-markdown.js +228 -0
- package/dist/clients/attach/render/measured-container.d.ts +96 -0
- package/dist/clients/attach/render/measured-container.js +322 -0
- package/dist/clients/attach/render/scroll-animation.d.ts +8 -0
- package/dist/clients/attach/render/scroll-animation.js +80 -0
- package/dist/clients/attach/render/tool-calls.js +6 -6
- package/dist/clients/attach/render/transcript-copy.d.ts +9 -0
- package/dist/clients/attach/render/transcript-copy.js +81 -0
- package/dist/clients/attach/render/viewport.d.ts +29 -0
- package/dist/clients/attach/render/viewport.js +159 -0
- package/dist/clients/attach/session/bindings.d.ts +10 -7
- package/dist/clients/attach/session/bindings.js +23 -8
- package/dist/clients/attach/session/connection.js +4 -5
- package/dist/clients/attach/session/context.d.ts +6 -4
- package/dist/clients/attach/session/frame.d.ts +34 -0
- package/dist/clients/attach/session/frame.js +176 -0
- package/dist/clients/attach/session/frames.d.ts +4 -1
- package/dist/clients/attach/session/frames.js +14 -1
- package/dist/clients/attach/session/identity.js +4 -3
- package/dist/clients/attach/session/input-wiring.d.ts +14 -4
- package/dist/clients/attach/session/input-wiring.js +15 -13
- package/dist/clients/attach/session/invariant.d.ts +9 -0
- package/dist/clients/attach/session/invariant.js +15 -0
- package/dist/clients/attach/session/keys.d.ts +10 -2
- package/dist/clients/attach/session/keys.js +13 -5
- package/dist/clients/attach/session/layout.d.ts +10 -8
- package/dist/clients/attach/session/layout.js +33 -34
- package/dist/clients/attach/session/mouse.d.ts +18 -0
- package/dist/clients/attach/session/mouse.js +64 -0
- package/dist/clients/attach/session/pane-tag.d.ts +3 -0
- package/dist/clients/attach/session/pane-tag.js +51 -8
- package/dist/clients/attach/session/reconnect.d.ts +3 -0
- package/dist/clients/attach/session/reconnect.js +42 -5
- package/dist/clients/attach/session/surface-frame.d.ts +20 -0
- package/dist/clients/attach/session/surface-frame.js +73 -0
- package/dist/clients/attach/session/surface-host.d.ts +64 -0
- package/dist/clients/attach/session/surface-host.js +255 -0
- package/dist/clients/attach/session/whip.d.ts +17 -0
- package/dist/clients/attach/session/whip.js +334 -0
- package/dist/clients/attach/slash/dispatch.d.ts +13 -1
- package/dist/clients/attach/slash/dispatch.js +51 -29
- package/dist/clients/attach/viewer.js +907 -819
- package/dist/clients/conversation/conversation.d.ts +65 -0
- package/dist/clients/conversation/conversation.js +318 -0
- package/dist/clients/conversation/frames.d.ts +30 -0
- package/dist/clients/conversation/frames.js +52 -0
- package/dist/clients/conversation/region.d.ts +51 -0
- package/dist/clients/conversation/region.js +265 -0
- package/dist/clients/conversation/submit.d.ts +38 -0
- package/dist/clients/conversation/submit.js +51 -0
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +247 -0
- package/dist/clients/inbox/__tests__/mount-panel.test.js +776 -0
- package/dist/clients/inbox/controller.d.ts +79 -0
- package/dist/clients/inbox/controller.js +448 -0
- package/dist/clients/inbox/deck-adapter.d.ts +29 -0
- package/dist/clients/inbox/deck-adapter.js +62 -0
- package/dist/clients/inbox/layout.d.ts +8 -0
- package/dist/clients/inbox/layout.js +9 -0
- package/dist/clients/inbox/resolve.d.ts +10 -0
- package/dist/clients/inbox/resolve.js +34 -0
- package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +29 -0
- package/dist/clients/inbox/review/__tests__/remap.test.js +196 -0
- package/dist/clients/inbox/review/__tests__/review-core.test.js +341 -0
- package/dist/clients/inbox/review/anchors.d.ts +41 -0
- package/dist/clients/inbox/review/anchors.js +89 -0
- package/dist/clients/inbox/review/columns.d.ts +22 -0
- package/dist/clients/inbox/review/columns.js +40 -0
- package/dist/clients/inbox/review/comments-client.d.ts +66 -0
- package/dist/clients/inbox/review/comments-client.js +98 -0
- package/dist/clients/inbox/review/composition.d.ts +60 -0
- package/dist/clients/inbox/review/composition.js +278 -0
- package/dist/clients/inbox/review/document-region.d.ts +120 -0
- package/dist/clients/inbox/review/document-region.js +902 -0
- package/dist/clients/inbox/review/frame.d.ts +45 -0
- package/dist/clients/inbox/review/frame.js +215 -0
- package/dist/clients/inbox/review/keys.d.ts +67 -0
- package/dist/clients/inbox/review/keys.js +130 -0
- package/dist/clients/inbox/review/launch.d.ts +10 -0
- package/dist/clients/inbox/review/launch.js +129 -0
- package/dist/clients/inbox/review/live-source.d.ts +24 -0
- package/dist/clients/inbox/review/live-source.js +160 -0
- package/dist/clients/inbox/review/nvim.d.ts +13 -0
- package/dist/clients/inbox/review/nvim.js +42 -0
- package/dist/clients/inbox/review/remap.d.ts +51 -0
- package/dist/clients/inbox/review/remap.js +157 -0
- package/dist/clients/inbox/review/review-client.d.ts +30 -0
- package/dist/clients/inbox/review/review-client.js +107 -0
- package/dist/clients/inbox/review/roundtrip.d.ts +5 -0
- package/dist/clients/inbox/review/roundtrip.js +36 -0
- package/dist/clients/inbox/review/state.d.ts +143 -0
- package/dist/clients/inbox/review/state.js +282 -0
- package/dist/clients/inbox/review-adapter.d.ts +29 -0
- package/dist/clients/inbox/review-adapter.js +92 -0
- package/dist/clients/inbox/review-visibility.d.ts +5 -0
- package/dist/clients/inbox/review-visibility.js +19 -0
- package/dist/clients/inbox/surface.d.ts +19 -0
- package/dist/clients/inbox/surface.js +128 -0
- package/dist/clients/inbox/tui/ansi.d.ts +66 -0
- package/dist/clients/inbox/tui/ansi.js +317 -0
- package/dist/clients/inbox/tui/clipboard.d.ts +2 -0
- package/dist/clients/inbox/tui/clipboard.js +26 -0
- package/dist/clients/inbox/tui/input.d.ts +7 -0
- package/dist/clients/inbox/tui/input.js +653 -0
- package/dist/clients/inbox/tui/keys.d.ts +28 -0
- package/dist/clients/inbox/tui/keys.js +111 -0
- package/dist/clients/inbox/tui/panel.d.ts +2 -0
- package/dist/clients/inbox/tui/panel.js +217 -0
- package/dist/clients/inbox/tui/render.d.ts +37 -0
- package/dist/clients/inbox/tui/render.js +476 -0
- package/dist/clients/inbox/tui/types.d.ts +57 -0
- package/dist/clients/inbox/tui/types.js +1 -0
- package/dist/clients/inbox/tui.d.ts +6 -0
- package/dist/clients/inbox/tui.js +74 -0
- package/dist/clients/surfaces/host.d.ts +66 -0
- package/dist/clients/surfaces/host.js +1 -0
- package/dist/clients/surfaces/region.d.ts +16 -0
- package/dist/clients/surfaces/region.js +1 -0
- package/dist/clients/web/__tests__/push-engine.test.js +14 -158
- package/dist/clients/web/dev-server.d.ts +3 -3
- package/dist/clients/web/dev-server.js +9 -23
- package/dist/clients/web/events.js +4 -6
- package/dist/clients/web/push-engine.d.ts +2 -66
- package/dist/clients/web/push-engine.js +30 -161
- package/dist/clients/web/push-registry.d.ts +0 -4
- package/dist/clients/web/push-registry.js +2 -7
- package/dist/clients/web/server.js +3 -35
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -108
- package/dist/clients/web/web-cmd.js +2 -2
- package/dist/commands/__tests__/human.test.js +27 -15
- package/dist/commands/api-client.js +3 -3
- package/dist/commands/canvas-browse.js +1 -1
- package/dist/commands/canvas-issue.js +1 -1
- package/dist/commands/canvas-use.js +1 -1
- package/dist/commands/human/doc.d.ts +2 -0
- package/dist/commands/human/doc.js +98 -0
- package/dist/commands/human/inbox.d.ts +2 -0
- package/dist/commands/human/inbox.js +101 -0
- package/dist/commands/human/prompts.d.ts +2 -3
- package/dist/commands/human/prompts.js +27 -180
- package/dist/commands/human/queue.d.ts +1 -5
- package/dist/commands/human/queue.js +54 -216
- package/dist/commands/human/review.d.ts +2 -0
- package/dist/commands/human/review.js +298 -0
- package/dist/commands/human/shared.d.ts +2 -69
- package/dist/commands/human/shared.js +1 -181
- package/dist/commands/human.js +15 -20
- package/dist/commands/memory/__tests__/lint.test.d.ts +1 -0
- package/dist/commands/memory/__tests__/lint.test.js +15 -0
- package/dist/commands/memory/delete.js +2 -2
- package/dist/commands/memory/lint.d.ts +1 -0
- package/dist/commands/memory/lint.js +21 -3
- package/dist/commands/memory/read.js +4 -4
- package/dist/commands/node.js +8 -7
- package/dist/commands/pkg/plugin-manage.js +143 -68
- package/dist/commands/surface-inspect.js +2 -2
- package/dist/commands/surface.js +6 -12
- package/dist/commands/sys/__tests__/setup-core.test.js +9 -5
- package/dist/commands/sys/__tests__/setup-front-door.test.js +7 -42
- package/dist/commands/sys/config.js +29 -3
- package/dist/commands/sys/feedback.js +1 -1
- package/dist/commands/sys/setup-core.d.ts +12 -11
- package/dist/commands/sys/setup-core.js +55 -46
- package/dist/commands/sys/setup-wizard.d.ts +4 -1
- package/dist/commands/sys/setup-wizard.js +50 -9
- package/dist/commands/sys/sync-deps.js +1 -1
- package/dist/commands/sys.js +4 -6
- package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -1
- package/dist/core/__tests__/broker-snapshot-history.test.js +9 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +3 -4
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +8 -5
- package/dist/core/__tests__/fixtures/fake-engine.js +28 -2
- package/dist/core/__tests__/full/broker-provider-retry.test.js +87 -2
- package/dist/core/__tests__/full/broker-whip-interrupt.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-whip-interrupt.test.js +39 -0
- package/dist/core/__tests__/full/detach-focus.test.js +1 -1
- package/dist/core/__tests__/human-deliver-e2e.test.js +64 -64
- package/dist/core/__tests__/human-deliver.test.js +71 -345
- package/dist/core/__tests__/inline-memory-refs.test.js +2 -12
- package/dist/core/__tests__/memory-resolver-precedence.test.js +12 -15
- package/dist/core/__tests__/migration.test.js +10 -0
- package/dist/core/__tests__/model-pin-durability.test.js +14 -0
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +1 -0
- package/dist/core/__tests__/phase4-review-migration.test.js +100 -0
- package/dist/core/__tests__/phase4-review-store.test.d.ts +1 -0
- package/dist/core/__tests__/phase4-review-store.test.js +143 -0
- package/dist/core/__tests__/remote-canvas-target.test.js +2 -2
- package/dist/core/__tests__/revive.test.js +22 -53
- package/dist/core/__tests__/session-cycles.test.js +48 -18
- package/dist/core/__tests__/spawn-no-kickoff.test.js +8 -12
- package/dist/core/__tests__/stop-guard.test.js +16 -1
- package/dist/core/__tests__/tmux-surface.test.js +21 -25
- package/dist/core/asset-root.d.ts +7 -0
- package/dist/core/asset-root.js +18 -0
- package/dist/core/broker-client/client.d.ts +0 -7
- package/dist/core/broker-client/client.js +4 -10
- package/dist/core/broker-client/transport-relay.d.ts +3 -4
- package/dist/core/broker-client/transport-relay.js +3 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -1
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +1 -1
- package/dist/core/canvas/__tests__/remote-transport.test.d.ts +1 -0
- package/dist/core/{view/__tests__/transport-remote.test.js → canvas/__tests__/remote-transport.test.js} +2 -2
- package/dist/core/canvas/__tests__/render-remote.test.js +1 -1
- package/dist/core/canvas/attention.js +4 -4
- package/dist/core/canvas/canvas.d.ts +6 -11
- package/dist/core/canvas/canvas.js +11 -33
- package/dist/core/canvas/db.js +207 -38
- package/dist/core/canvas/extensions.d.ts +1 -1
- package/dist/core/canvas/extensions.js +8 -1
- package/dist/core/canvas/index.d.ts +0 -1
- package/dist/core/canvas/index.js +0 -1
- package/dist/core/canvas/nav-model.d.ts +1 -1
- package/dist/core/canvas/nav-model.js +1 -1
- package/dist/core/canvas/paths.d.ts +5 -0
- package/dist/core/canvas/paths.js +16 -0
- package/dist/core/canvas/remote-canvas-source.js +2 -2
- package/dist/core/canvas/remote-transport.d.ts +7 -0
- package/dist/core/{view/transport-remote.js → canvas/remote-transport.js} +3 -4
- package/dist/core/canvas/source.js +1 -1
- package/dist/core/canvas/status-glyph.js +4 -12
- package/dist/core/canvas/types.d.ts +10 -35
- package/dist/core/clipboard-text.d.ts +8 -0
- package/dist/core/clipboard-text.js +18 -0
- package/dist/core/command-manifests/registry.d.ts +1 -3
- package/dist/core/command-plugins/bundle.d.ts +29 -0
- package/dist/core/command-plugins/bundle.js +198 -0
- package/dist/core/command-plugins/discovery.d.ts +0 -8
- package/dist/core/command-plugins/discovery.js +2 -39
- package/dist/core/command-plugins/transport/http-fetch.d.ts +4 -30
- package/dist/core/command-plugins/transport/http-fetch.js +17 -95
- package/dist/core/command.d.ts +1 -13
- package/dist/core/command.js +1 -16
- package/dist/core/config.d.ts +4 -0
- package/dist/core/config.js +28 -3
- package/dist/core/document-lines.d.ts +4 -0
- package/dist/core/document-lines.js +6 -0
- package/dist/core/feed/feed.d.ts +2 -0
- package/dist/core/feed/feed.js +11 -7
- package/dist/core/human/__tests__/inbox-cancel-worker.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-cancel-worker.js +7 -0
- package/dist/core/human/__tests__/inbox-claim-worker.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-claim-worker.js +17 -0
- package/dist/core/human/__tests__/inbox-core.test.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-core.test.js +144 -0
- package/dist/core/human/__tests__/inbox-stale-claim-worker.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-stale-claim-worker.js +8 -0
- package/dist/core/human/__tests__/visible-paths.test.d.ts +1 -0
- package/dist/{clients/attach → core/human}/__tests__/visible-paths.test.js +9 -0
- package/dist/core/human/claim.d.ts +23 -0
- package/dist/core/human/claim.js +67 -0
- package/dist/core/human/convention.d.ts +30 -0
- package/dist/core/human/convention.js +202 -0
- package/dist/core/human/deck-factories.d.ts +8 -0
- package/dist/core/human/deck-factories.js +15 -0
- package/dist/core/human/deck-schema.d.ts +70 -0
- package/dist/core/human/deck-schema.js +92 -0
- package/dist/core/human/root.d.ts +7 -0
- package/dist/core/human/root.js +37 -0
- package/dist/core/human/scan.d.ts +3 -0
- package/dist/core/human/scan.js +76 -0
- package/dist/core/human/summary.d.ts +8 -0
- package/dist/core/human/summary.js +44 -0
- package/dist/core/human/tickets.d.ts +49 -0
- package/dist/core/human/tickets.js +190 -0
- package/dist/core/human/types.d.ts +136 -0
- package/dist/core/human/types.js +5 -0
- package/dist/{clients/attach → core/human}/visible-paths.d.ts +1 -1
- package/dist/{clients/attach → core/human}/visible-paths.js +3 -2
- package/dist/core/inspector/chrome.d.ts +6 -0
- package/dist/core/inspector/chrome.js +14 -0
- package/dist/core/inspector/contract.d.ts +105 -0
- package/dist/core/inspector/contract.js +1 -0
- package/dist/core/inspector/core.d.ts +4 -5
- package/dist/core/inspector/core.js +3 -5
- package/dist/core/inspector/host.d.ts +46 -0
- package/dist/core/{tui → inspector}/host.js +42 -208
- package/dist/core/inspector/text.d.ts +2 -2
- package/dist/core/inspector/transport.d.ts +6 -0
- package/dist/core/inspector/transport.js +36 -0
- package/dist/core/inspector/tui.d.ts +2 -2
- package/dist/core/inspector/tui.js +15 -15
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +11 -11
- package/dist/core/keybindings/__tests__/resolve.test.js +10 -19
- package/dist/core/keybindings/attach-control.d.ts +9 -3
- package/dist/core/keybindings/attach-control.js +3 -1
- package/dist/core/keybindings/catalog.d.ts +6 -5
- package/dist/core/keybindings/catalog.js +61 -133
- package/dist/core/keybindings/inbox.d.ts +5 -6
- package/dist/core/keybindings/inbox.js +9 -10
- package/dist/core/keybindings/index.d.ts +3 -3
- package/dist/core/keybindings/index.js +3 -3
- package/dist/core/keybindings/persistence.d.ts +5 -1
- package/dist/core/keybindings/persistence.js +24 -6
- package/dist/core/keybindings/resolve.d.ts +6 -0
- package/dist/core/keybindings/resolve.js +10 -3
- package/dist/core/memory/inline-ref-grammar.js +2 -3
- package/dist/core/memory-resolver.d.ts +27 -29
- package/dist/core/memory-resolver.js +45 -39
- package/dist/core/model-routes.d.ts +33 -0
- package/dist/core/model-routes.js +42 -3
- package/dist/core/preview-registry.js +17 -55
- package/dist/core/profiles/select.js +3 -3
- package/dist/core/{view/remote-canvas-target.d.ts → remote-canvas-target.d.ts} +2 -2
- package/dist/core/{view/remote-canvas-target.js → remote-canvas-target.js} +4 -4
- package/dist/core/review/__tests__/capture-origin.test.d.ts +1 -0
- package/dist/core/review/__tests__/capture-origin.test.js +139 -0
- package/dist/core/review/__tests__/comments.test.d.ts +1 -0
- package/dist/core/review/__tests__/comments.test.js +98 -0
- package/dist/core/review/__tests__/project.test.d.ts +1 -0
- package/dist/core/review/__tests__/project.test.js +71 -0
- package/dist/core/review/__tests__/remap.test.d.ts +1 -0
- package/dist/core/review/__tests__/remap.test.js +159 -0
- package/dist/core/review/__tests__/stage-identity.test.d.ts +1 -0
- package/dist/core/review/__tests__/stage-identity.test.js +140 -0
- package/dist/core/review/birth.d.ts +7 -0
- package/dist/core/review/birth.js +23 -0
- package/dist/core/review/comments.d.ts +69 -0
- package/dist/core/review/comments.js +295 -0
- package/dist/core/review/companion.d.ts +35 -0
- package/dist/core/review/companion.js +205 -0
- package/dist/core/review/document.d.ts +27 -0
- package/dist/core/review/document.js +138 -0
- package/dist/core/review/project.d.ts +13 -0
- package/dist/core/review/project.js +58 -0
- package/dist/core/review/realize.d.ts +19 -0
- package/dist/core/review/realize.js +217 -0
- package/dist/core/review/remap.d.ts +24 -0
- package/dist/core/review/remap.js +156 -0
- package/dist/core/review/signal.d.ts +5 -0
- package/dist/core/review/signal.js +31 -0
- package/dist/core/review/stage.d.ts +26 -0
- package/dist/core/review/stage.js +184 -0
- package/dist/core/review/store.d.ts +46 -0
- package/dist/core/review/store.js +163 -0
- package/dist/core/review/ticket-filter.d.ts +17 -0
- package/dist/core/review/ticket-filter.js +32 -0
- package/dist/core/review/types.d.ts +130 -0
- package/dist/core/review/types.js +23 -0
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +1 -0
- package/dist/core/runtime/__tests__/session-visibility.test.js +119 -0
- package/dist/core/runtime/bearings.d.ts +5 -17
- package/dist/core/runtime/bearings.js +88 -71
- package/dist/core/runtime/broker-protocol.d.ts +31 -8
- package/dist/core/runtime/broker.d.ts +15 -1
- package/dist/core/runtime/broker.js +573 -141
- package/dist/core/runtime/canvas-extensions.d.ts +4 -5
- package/dist/core/runtime/canvas-extensions.js +5 -5
- package/dist/core/runtime/front-door.js +4 -4
- package/dist/core/runtime/headless-pi.d.ts +24 -0
- package/dist/core/runtime/headless-pi.js +152 -0
- package/dist/core/runtime/kickoff.d.ts +1 -5
- package/dist/core/runtime/kickoff.js +1 -5
- package/dist/core/runtime/model-registry.d.ts +3 -0
- package/dist/core/runtime/model-registry.js +13 -0
- package/dist/core/runtime/naming-persist.d.ts +4 -0
- package/dist/core/runtime/naming-persist.js +27 -1
- package/dist/core/runtime/naming.d.ts +17 -12
- package/dist/core/runtime/naming.js +91 -140
- package/dist/core/runtime/node-read.js +19 -10
- package/dist/core/runtime/nodes.d.ts +9 -14
- package/dist/core/runtime/nodes.js +3 -53
- package/dist/core/runtime/package-health.d.ts +6 -21
- package/dist/core/runtime/package-health.js +12 -123
- package/dist/core/runtime/placement-tmux.d.ts +2 -1
- package/dist/core/runtime/placement-tmux.js +6 -4
- package/dist/core/runtime/placement.d.ts +1 -0
- package/dist/core/runtime/placement.js +4 -8
- package/dist/core/runtime/promote.js +3 -0
- package/dist/core/runtime/recap.d.ts +2 -7
- package/dist/core/runtime/recap.js +35 -69
- package/dist/core/runtime/revive.js +34 -77
- package/dist/core/runtime/session-cycles.d.ts +4 -0
- package/dist/core/runtime/session-cycles.js +14 -1
- package/dist/core/runtime/session-visibility.d.ts +37 -0
- package/dist/core/runtime/session-visibility.js +83 -0
- package/dist/core/runtime/spawn.js +10 -22
- package/dist/core/runtime/stop-guard.d.ts +1 -1
- package/dist/core/runtime/stop-guard.js +18 -13
- package/dist/core/runtime/surface-bg.js +1 -1
- package/dist/core/runtime/tmux-chrome.d.ts +1 -1
- package/dist/core/runtime/tmux-chrome.js +1 -1
- package/dist/core/runtime/tmux.d.ts +35 -7
- package/dist/core/runtime/tmux.js +439 -62
- package/dist/core/runtime/tool-group-summary.d.ts +19 -0
- package/dist/core/runtime/tool-group-summary.js +88 -0
- package/dist/core/scope.d.ts +2 -7
- package/dist/core/scope.js +9 -35
- package/dist/core/substrate/schema.d.ts +2 -2
- package/dist/core/termrender/code-doc.d.ts +12 -0
- package/dist/core/termrender/code-doc.js +92 -0
- package/dist/core/termrender/display.d.ts +12 -0
- package/dist/core/termrender/display.js +19 -0
- package/dist/core/termrender/termrender.d.ts +73 -0
- package/dist/core/termrender/termrender.js +795 -0
- package/dist/core/termrender/version.d.ts +1 -0
- package/dist/core/termrender/version.js +1 -0
- package/dist/core/tui/terminal.js +1 -2
- package/dist/core/user-settings.d.ts +71 -3
- package/dist/core/user-settings.js +83 -1
- package/dist/daemon/api/__tests__/inbox.test.js +44 -133
- package/dist/daemon/api/handlers/human.d.ts +0 -10
- package/dist/daemon/api/handlers/human.js +104 -702
- package/dist/daemon/api/handlers/inbox.js +113 -142
- package/dist/daemon/api/handlers/review-comments.d.ts +2 -0
- package/dist/daemon/api/handlers/review-comments.js +500 -0
- package/dist/daemon/api/handlers/reviews.d.ts +2 -0
- package/dist/daemon/api/handlers/reviews.js +287 -0
- package/dist/daemon/api/map.d.ts +22 -7
- package/dist/daemon/api/map.js +159 -11
- package/dist/daemon/api/server.js +4 -0
- package/dist/daemon/cron-run.js +6 -9
- package/dist/daemon/crtrd.js +17 -33
- package/dist/daemon/fleet.d.ts +1 -8
- package/dist/daemon/fleet.js +4 -30
- package/dist/daemon/human/finish.d.ts +14 -0
- package/dist/daemon/human/finish.js +115 -0
- package/dist/daemon/human/sweep.d.ts +6 -0
- package/dist/daemon/human/sweep.js +49 -0
- package/dist/daemon/messaging/node-message.d.ts +18 -0
- package/dist/daemon/messaging/node-message.js +70 -0
- package/dist/daemon/review/comment-notify.d.ts +26 -0
- package/dist/daemon/review/comment-notify.js +107 -0
- package/dist/daemon/review/deliver.d.ts +7 -0
- package/dist/daemon/review/deliver.js +56 -0
- package/dist/daemon/review/finish.d.ts +22 -0
- package/dist/daemon/review/finish.js +254 -0
- package/dist/daemon/review/sweep.d.ts +11 -0
- package/dist/daemon/review/sweep.js +120 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -2
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +42 -64
- package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +1 -0
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +159 -0
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +16 -38
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +1 -0
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +63 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +8 -11
- package/dist/pi-extensions/canvas-context-intro.js +50 -104
- package/dist/pi-extensions/canvas-recap.d.ts +15 -2
- package/dist/pi-extensions/canvas-recap.js +192 -69
- package/dist/pi-extensions/canvas-review-boundary.d.ts +59 -0
- package/dist/pi-extensions/canvas-review-boundary.js +81 -0
- package/dist/pi-extensions/canvas-stophook.d.ts +3 -3
- package/dist/pi-extensions/canvas-stophook.js +78 -128
- package/dist/pi-extensions/canvas-structured-output.js +52 -8
- package/dist/shared/generated-context.d.ts +29 -4
- package/dist/shared/generated-context.js +122 -7
- package/dist/shared/tool-groups.d.ts +23 -0
- package/dist/shared/tool-groups.js +60 -0
- package/dist/shared/working-activity.d.ts +8 -0
- package/dist/shared/working-activity.js +26 -0
- package/dist/types.d.ts +36 -2
- package/dist/types.js +51 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +2 -0
- package/dist/web-client/assets/index-kyOWsnZK.js +86 -0
- package/dist/web-client/index.html +2 -2
- package/dist/web-client/sw.js +1 -1
- package/docs/compat/hearth-crtr-v4.md +2 -2
- package/docs/compat/hearth-crtr-v5.md +4 -2
- package/docs/public-api.md +3 -3
- package/package.json +21 -14
- package/runtime.lock.json +4661 -1453
- package/scripts/postinstall.mjs +15 -2
- package/dist/builtin-pi-packages/pi-mode-switch/README.md +0 -36
- package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +0 -36
- package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +0 -449
- package/dist/builtin-pi-packages/pi-mode-switch/package.json +0 -14
- package/dist/builtin-pi-packages/pi-mode-switch/tsconfig.json +0 -9
- package/dist/builtin-views/_lib/states.mjs +0 -161
- package/dist/builtin-views/canvas/core.mjs +0 -657
- package/dist/builtin-views/canvas/text.mjs +0 -58
- package/dist/builtin-views/canvas/tui.mjs +0 -168
- package/dist/builtin-views/canvas/web.jsx +0 -121
- package/dist/builtin-views/chat/core.mjs +0 -684
- package/dist/builtin-views/chat/text.mjs +0 -101
- package/dist/builtin-views/chat/tui.mjs +0 -360
- package/dist/builtin-views/chat/web.jsx +0 -362
- package/dist/builtin-views/git-pr/core.mjs +0 -673
- package/dist/builtin-views/git-pr/text.mjs +0 -84
- package/dist/builtin-views/git-pr/tui.mjs +0 -301
- package/dist/builtin-views/git-pr/web.jsx +0 -216
- package/dist/builtin-views/inbox/_lib/render.mjs +0 -175
- package/dist/builtin-views/inbox/core.mjs +0 -1273
- package/dist/builtin-views/inbox/text.mjs +0 -73
- package/dist/builtin-views/inbox/tui.mjs +0 -314
- package/dist/builtin-views/inbox/web.jsx +0 -188
- package/dist/builtin-views/linkedin/core.mjs +0 -906
- package/dist/builtin-views/linkedin/text.mjs +0 -69
- package/dist/builtin-views/linkedin/tui.mjs +0 -413
- package/dist/builtin-views/linkedin/web.jsx +0 -206
- package/dist/builtin-views/prompt-review/core.mjs +0 -735
- package/dist/builtin-views/prompt-review/text.mjs +0 -15
- package/dist/builtin-views/prompt-review/tui.mjs +0 -196
- package/dist/builtin-views/prompt-review/web.jsx +0 -484
- package/dist/builtin-views/workspace-sidebar/__tests__/core.test.js +0 -50
- package/dist/builtin-views/workspace-sidebar/__tests__/core.test.ts +0 -53
- package/dist/builtin-views/workspace-sidebar/core.mjs +0 -670
- package/dist/builtin-views/workspace-sidebar/text.mjs +0 -53
- package/dist/builtin-views/workspace-sidebar/tui.mjs +0 -141
- package/dist/builtin-views/workspace-sidebar/web.jsx +0 -109
- package/dist/clients/attach/session/mode.d.ts +0 -25
- package/dist/clients/attach/session/mode.js +0 -97
- package/dist/commands/sys/promptstudio.d.ts +0 -2
- package/dist/commands/sys/promptstudio.js +0 -65
- package/dist/commands/view-cycle.d.ts +0 -2
- package/dist/commands/view-cycle.js +0 -130
- package/dist/commands/view-list.d.ts +0 -2
- package/dist/commands/view-list.js +0 -66
- package/dist/commands/view-new.d.ts +0 -2
- package/dist/commands/view-new.js +0 -74
- package/dist/commands/view-pick.d.ts +0 -6
- package/dist/commands/view-pick.js +0 -129
- package/dist/commands/view-run.d.ts +0 -2
- package/dist/commands/view-run.js +0 -214
- package/dist/commands/view.d.ts +0 -2
- package/dist/commands/view.js +0 -31
- package/dist/commands/workspace.d.ts +0 -2
- package/dist/commands/workspace.js +0 -165
- package/dist/core/__tests__/chat-view-reconnect.test.js +0 -105
- package/dist/core/__tests__/full/consult-startup-failure.test.js +0 -124
- package/dist/core/canvas/__tests__/human-work-outbox.test.js +0 -123
- package/dist/core/canvas/human-work-outbox.d.ts +0 -73
- package/dist/core/canvas/human-work-outbox.js +0 -261
- package/dist/core/command-plugins/store.d.ts +0 -16
- package/dist/core/command-plugins/store.js +0 -64
- package/dist/core/keybindings/__tests__/bespoke-consumers.test.js +0 -40
- package/dist/core/runtime/fault-recovery-nudge.d.ts +0 -3
- package/dist/core/runtime/fault-recovery-nudge.js +0 -3
- package/dist/core/tui/__tests__/host-keybindings.test.js +0 -113
- package/dist/core/tui/host.d.ts +0 -66
- package/dist/core/view/__tests__/transport-cache.test.js +0 -62
- package/dist/core/view/bridge.d.ts +0 -10
- package/dist/core/view/bridge.js +0 -31
- package/dist/core/view/chrome.d.ts +0 -9
- package/dist/core/view/chrome.js +0 -22
- package/dist/core/view/contract.d.ts +0 -205
- package/dist/core/view/contract.js +0 -23
- package/dist/core/view/loader.d.ts +0 -31
- package/dist/core/view/loader.js +0 -188
- package/dist/core/view/stream-local.d.ts +0 -3
- package/dist/core/view/stream-local.js +0 -231
- package/dist/core/view/transport-cache.d.ts +0 -8
- package/dist/core/view/transport-cache.js +0 -38
- package/dist/core/view/transport-local.d.ts +0 -7
- package/dist/core/view/transport-local.js +0 -83
- package/dist/core/view/transport-remote.d.ts +0 -2
- package/dist/core/view/transport.d.ts +0 -10
- package/dist/core/view/transport.js +0 -15
- package/dist/pi-extensions/naming-tool.d.ts +0 -24
- package/dist/pi-extensions/naming-tool.js +0 -67
- package/dist/prompts/view.d.ts +0 -7
- package/dist/prompts/view.js +0 -172
- package/dist/web/ViewChrome.d.ts +0 -7
- package/dist/web/ViewChrome.js +0 -28
- package/dist/web/ViewPane.d.ts +0 -39
- package/dist/web/ViewPane.js +0 -48
- package/dist/web/index.d.ts +0 -8
- package/dist/web/index.js +0 -22
- package/dist/web/runtime.d.ts +0 -39
- package/dist/web/runtime.js +0 -232
- package/dist/web/states.d.ts +0 -24
- package/dist/web/states.js +0 -24
- package/dist/web/transport-http.d.ts +0 -5
- package/dist/web/transport-http.js +0 -34
- package/dist/web/transport-stream.d.ts +0 -3
- package/dist/web/transport-stream.js +0 -204
- package/dist/web-client/assets/index-U_NZ66VE.js +0 -79
- package/dist/web-client/assets/index-aaeu4adv.css +0 -2
- /package/dist/{builtin-views/workspace-sidebar/__tests__/core.test.d.ts → clients/attach/__tests__/file-review-focus.test.d.ts} +0 -0
- /package/dist/clients/attach/__tests__/{visible-paths.test.d.ts → group-activity.test.d.ts} +0 -0
- /package/dist/{core/__tests__/chat-view-reconnect.test.d.ts → clients/attach/__tests__/input-controller-extension-command.test.d.ts} +0 -0
- /package/dist/{core/__tests__/full/consult-startup-failure.test.d.ts → clients/attach/__tests__/session-identity-refresh.test.d.ts} +0 -0
- /package/dist/{core/canvas/__tests__/human-work-outbox.test.d.ts → clients/inbox/__tests__/inbox-controller.test.d.ts} +0 -0
- /package/dist/{core/keybindings/__tests__/bespoke-consumers.test.d.ts → clients/inbox/__tests__/mount-panel.test.d.ts} +0 -0
- /package/dist/{core/tui/__tests__/host-keybindings.test.d.ts → clients/inbox/review/__tests__/editor-roundtrip.test.d.ts} +0 -0
- /package/dist/{core/view/__tests__/transport-cache.test.d.ts → clients/inbox/review/__tests__/remap.test.d.ts} +0 -0
- /package/dist/{core/view/__tests__/transport-remote.test.d.ts → clients/inbox/review/__tests__/review-core.test.d.ts} +0 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// render/scroll-animation.ts — smooth keyboard scrolling for the transcript.
|
|
2
|
+
//
|
|
3
|
+
// A scroll step follows a short ease-out trajectory rather than teleporting.
|
|
4
|
+
// Each timer opportunity resolves its position from elapsed time, so a delayed
|
|
5
|
+
// render skips stale deltas and still lands at the intended position on time.
|
|
6
|
+
// Repeated presses fold the untravelled distance into a fresh trajectory rather
|
|
7
|
+
// than building a lagging queue.
|
|
8
|
+
import { performance } from 'node:perf_hooks';
|
|
9
|
+
/** Duration of the full ease-out trajectory, including the synchronous start. */
|
|
10
|
+
const BURST_MS = 100;
|
|
11
|
+
/** Leave enough time between visible positions for the terminal to present them. */
|
|
12
|
+
const FRAME_MS = 25;
|
|
13
|
+
/** Fraction of the viewport each press travels — a half page keeps context in view. */
|
|
14
|
+
const PAGE_FRACTION = 0.5;
|
|
15
|
+
/** Start partway through the trajectory so the keypress moves synchronously. */
|
|
16
|
+
const INITIAL_PROGRESS = 0.15;
|
|
17
|
+
function easeOut(t) {
|
|
18
|
+
return 1 - (1 - t) * (1 - t);
|
|
19
|
+
}
|
|
20
|
+
export function createScrollAnimator(viewport, requestRender) {
|
|
21
|
+
let timer;
|
|
22
|
+
let startedAt = 0;
|
|
23
|
+
let target = 0;
|
|
24
|
+
let travelled = 0;
|
|
25
|
+
const stop = () => {
|
|
26
|
+
if (timer !== undefined)
|
|
27
|
+
clearTimeout(timer);
|
|
28
|
+
timer = undefined;
|
|
29
|
+
target = 0;
|
|
30
|
+
travelled = 0;
|
|
31
|
+
};
|
|
32
|
+
const schedule = (now) => {
|
|
33
|
+
const remaining = Math.max(0, startedAt + BURST_MS - now);
|
|
34
|
+
timer = setTimeout(() => {
|
|
35
|
+
timer = undefined;
|
|
36
|
+
advance(performance.now(), true);
|
|
37
|
+
}, Math.min(FRAME_MS, remaining));
|
|
38
|
+
};
|
|
39
|
+
const advance = (now, scheduleNext) => {
|
|
40
|
+
const progress = Math.min(1, (now - startedAt) / BURST_MS);
|
|
41
|
+
const position = Math.round(target * easeOut(progress));
|
|
42
|
+
const step = position - travelled;
|
|
43
|
+
if (step !== 0) {
|
|
44
|
+
// A clamped scroll (already at an end of the transcript) reports no state
|
|
45
|
+
// change — no later point on this trajectory can help, so stop early.
|
|
46
|
+
if (!viewport.scrollBy(step))
|
|
47
|
+
return stop();
|
|
48
|
+
travelled = position;
|
|
49
|
+
requestRender();
|
|
50
|
+
}
|
|
51
|
+
if (progress === 1)
|
|
52
|
+
return stop();
|
|
53
|
+
if (scheduleNext)
|
|
54
|
+
schedule(now);
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
page(direction) {
|
|
58
|
+
const now = performance.now();
|
|
59
|
+
if (timer !== undefined) {
|
|
60
|
+
clearTimeout(timer);
|
|
61
|
+
timer = undefined;
|
|
62
|
+
// Bring the old trajectory to its current time before carrying only its
|
|
63
|
+
// untravelled distance into this newly pressed page.
|
|
64
|
+
advance(now, false);
|
|
65
|
+
}
|
|
66
|
+
const pending = target - travelled;
|
|
67
|
+
const step = Math.max(1, Math.round(viewport.pageRows() * PAGE_FRACTION));
|
|
68
|
+
const delta = (direction === 'up' ? -1 : 1) * step;
|
|
69
|
+
target = pending + delta;
|
|
70
|
+
travelled = 0;
|
|
71
|
+
if (target === 0)
|
|
72
|
+
return stop();
|
|
73
|
+
// The first position is immediately visible to input handling, while its
|
|
74
|
+
// virtual start keeps every later position on one time-based curve.
|
|
75
|
+
startedAt = now - BURST_MS * INITIAL_PROGRESS;
|
|
76
|
+
advance(now, true);
|
|
77
|
+
},
|
|
78
|
+
cancel: stop,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
@@ -55,11 +55,11 @@ function lineChangesDisplay(changes, theme) {
|
|
|
55
55
|
counts.push(theme.fg('toolDiffRemoved', `-${changes.removed}`));
|
|
56
56
|
return counts.length > 0 ? ` ${counts.join(' ')}` : '';
|
|
57
57
|
}
|
|
58
|
-
/** A write has no before/after diff, so report
|
|
58
|
+
/** A write has no before/after diff, so report every output line as added. */
|
|
59
59
|
function lineCountDisplay(lines, theme) {
|
|
60
60
|
if (lines === undefined)
|
|
61
61
|
return '';
|
|
62
|
-
return ` ${theme.fg('
|
|
62
|
+
return ` ${theme.fg('toolDiffAdded', `+${lines}`)}`;
|
|
63
63
|
}
|
|
64
64
|
/** The one-line folded form of a file tool's call: `<icon> <label> <path>`,
|
|
65
65
|
* optionally followed by its green/red changed-line counts. */
|
|
@@ -72,15 +72,15 @@ function shortenPath(path) {
|
|
|
72
72
|
const home = homedir();
|
|
73
73
|
return path.startsWith(home) ? `~${path.slice(home.length)}` : path;
|
|
74
74
|
}
|
|
75
|
-
/**
|
|
75
|
+
/** Plain, OSC-8-linked path — the same affordance pi gives file tools. */
|
|
76
76
|
function pathDisplay(rawPath, theme, cwd) {
|
|
77
77
|
if (!rawPath)
|
|
78
78
|
return theme.fg('toolOutput', '...');
|
|
79
|
-
const
|
|
79
|
+
const path = shortenPath(rawPath);
|
|
80
80
|
if (!getCapabilities().hyperlinks)
|
|
81
|
-
return
|
|
81
|
+
return path;
|
|
82
82
|
const absolute = isAbsolute(rawPath) ? rawPath : resolve(cwd, rawPath);
|
|
83
|
-
return hyperlink(
|
|
83
|
+
return hyperlink(path, pathToFileURL(absolute).href);
|
|
84
84
|
}
|
|
85
85
|
/** `<icon> <label>` — the glyph in accent, the tool name in pi's tool title style. */
|
|
86
86
|
function header(icon, label, theme) {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ChatView } from './chat-view.js';
|
|
2
|
+
import type { ViewportSource } from './measured-container.js';
|
|
3
|
+
import type { TranscriptViewport } from './viewport.js';
|
|
4
|
+
export type CopyTarget = 'message' | 'last-assistant' | 'tool' | 'transcript';
|
|
5
|
+
export interface TranscriptCopy {
|
|
6
|
+
/** Copy `target`; returns the status-region confirmation to show. */
|
|
7
|
+
copy(target: CopyTarget): string;
|
|
8
|
+
}
|
|
9
|
+
export declare function createTranscriptCopy(chat: ChatView, viewport: TranscriptViewport, source: ViewportSource): TranscriptCopy;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { writeClipboardTextEverywhere } from '../../../core/clipboard-text.js';
|
|
2
|
+
function hasText(text) {
|
|
3
|
+
return text !== undefined && text.trim() !== '';
|
|
4
|
+
}
|
|
5
|
+
function lineCount(text) {
|
|
6
|
+
return text.split('\n').length;
|
|
7
|
+
}
|
|
8
|
+
function copiedTo(system, tmux) {
|
|
9
|
+
if (system && tmux)
|
|
10
|
+
return 'clipboard + tmux buffer';
|
|
11
|
+
if (system)
|
|
12
|
+
return 'clipboard';
|
|
13
|
+
if (tmux)
|
|
14
|
+
return 'tmux buffer';
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
/** Resolves the newest copyable block wholly visible before falling back to one
|
|
18
|
+
* merely intersecting the current viewport. */
|
|
19
|
+
function visibleMessageText(chat, viewport, source) {
|
|
20
|
+
const { first, last, lastFullyVisible } = viewport.visibleBlocks();
|
|
21
|
+
const textAt = (index) => {
|
|
22
|
+
const block = source.blockAt(index);
|
|
23
|
+
return block ? chat.blockText(block) : undefined;
|
|
24
|
+
};
|
|
25
|
+
for (let index = Math.min(last, lastFullyVisible); index >= first; index--) {
|
|
26
|
+
const text = textAt(index);
|
|
27
|
+
if (hasText(text))
|
|
28
|
+
return text;
|
|
29
|
+
}
|
|
30
|
+
for (let index = last; index >= first; index--) {
|
|
31
|
+
const text = textAt(index);
|
|
32
|
+
if (hasText(text))
|
|
33
|
+
return text;
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
export function createTranscriptCopy(chat, viewport, source) {
|
|
38
|
+
return {
|
|
39
|
+
copy(target) {
|
|
40
|
+
let resolved;
|
|
41
|
+
let emptyNotice;
|
|
42
|
+
switch (target) {
|
|
43
|
+
case 'message': {
|
|
44
|
+
const text = visibleMessageText(chat, viewport, source);
|
|
45
|
+
if (hasText(text))
|
|
46
|
+
resolved = { text, label: 'message' };
|
|
47
|
+
emptyNotice = 'Nothing to copy — no visible message';
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
case 'last-assistant': {
|
|
51
|
+
const text = chat.getLastAssistantText();
|
|
52
|
+
if (hasText(text))
|
|
53
|
+
resolved = { text, label: 'last assistant message' };
|
|
54
|
+
emptyNotice = 'Nothing to copy — no assistant message yet';
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
case 'tool': {
|
|
58
|
+
const text = chat.getLastToolOutputText();
|
|
59
|
+
if (hasText(text))
|
|
60
|
+
resolved = { text, label: 'tool output' };
|
|
61
|
+
emptyNotice = 'Nothing to copy — no tool output yet';
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case 'transcript': {
|
|
65
|
+
const text = chat.getTranscriptPlainText();
|
|
66
|
+
if (hasText(text))
|
|
67
|
+
resolved = { text, label: 'transcript' };
|
|
68
|
+
emptyNotice = 'Nothing to copy — transcript is empty';
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!resolved)
|
|
73
|
+
return emptyNotice;
|
|
74
|
+
const { system, tmux } = writeClipboardTextEverywhere(resolved.text);
|
|
75
|
+
const destination = copiedTo(system, tmux);
|
|
76
|
+
if (!destination)
|
|
77
|
+
return 'Copy failed — no clipboard tool found';
|
|
78
|
+
return `Copied ${resolved.label} (${lineCount(resolved.text)} lines) — ${destination}`;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ViewportSource } from './measured-container.js';
|
|
2
|
+
/** The flat block range occupied by the most recently rendered viewport. */
|
|
3
|
+
type VisibleBlocks = {
|
|
4
|
+
first: number;
|
|
5
|
+
last: number;
|
|
6
|
+
lastFullyVisible: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* A virtualized, identity-anchored transcript viewport. It owns only scroll
|
|
10
|
+
* state; all measurement and line caching remain with its ViewportSource.
|
|
11
|
+
*/
|
|
12
|
+
export interface TranscriptViewport {
|
|
13
|
+
/** Exactly `rows` lines, bottom-aligned and top-padded with empty rows. */
|
|
14
|
+
renderSlice(width: number, rows: number): string[];
|
|
15
|
+
/** Scroll by `lines` (negative = toward older content). */
|
|
16
|
+
scrollBy(lines: number): boolean;
|
|
17
|
+
/** Lines in one page jump — the viewport height less one overlap row. */
|
|
18
|
+
pageRows(): number;
|
|
19
|
+
/** Pin back to the live bottom. */
|
|
20
|
+
goLive(): void;
|
|
21
|
+
/** True while the viewport is pinned to the bottom. */
|
|
22
|
+
isLive(): boolean;
|
|
23
|
+
/** Flat blocks intersecting the visible slice and its last whole block. */
|
|
24
|
+
visibleBlocks(): VisibleBlocks;
|
|
25
|
+
/** Forward frame invalidation without exposing the source to the frame. */
|
|
26
|
+
invalidate(): void;
|
|
27
|
+
}
|
|
28
|
+
export declare function createTranscriptViewport(source: ViewportSource): TranscriptViewport;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/** Exactly one line retained for each clipped row of an inline-image block. */
|
|
2
|
+
const CLIPPED_IMAGE_ROW = '\x1b[2m⌸ image — scroll to view\x1b[22m';
|
|
3
|
+
const NO_VISIBLE_BLOCKS = { first: -1, last: -1, lastFullyVisible: -1 };
|
|
4
|
+
function isInlineImageBlock(lines) {
|
|
5
|
+
return lines.some((line) => line.includes('\x1b_G') || line.includes('\x1b]1337;File='));
|
|
6
|
+
}
|
|
7
|
+
/** The first block whose rendered range extends beyond `line`. */
|
|
8
|
+
function firstBlockAfter(source, line, width) {
|
|
9
|
+
let low = 0;
|
|
10
|
+
let high = source.blockCount();
|
|
11
|
+
while (low < high) {
|
|
12
|
+
const middle = Math.floor((low + high) / 2);
|
|
13
|
+
const end = source.blockStart(middle, width) + source.blockHeight(middle, width);
|
|
14
|
+
if (end > line)
|
|
15
|
+
high = middle;
|
|
16
|
+
else
|
|
17
|
+
low = middle + 1;
|
|
18
|
+
}
|
|
19
|
+
return low;
|
|
20
|
+
}
|
|
21
|
+
export function createTranscriptViewport(source) {
|
|
22
|
+
const state = { follow: true, anchor: undefined };
|
|
23
|
+
let lastWidth;
|
|
24
|
+
let lastRows = 0;
|
|
25
|
+
let cachedVisibleBlocks = NO_VISIBLE_BLOCKS;
|
|
26
|
+
let cachedVisibleRevision;
|
|
27
|
+
/** Resolve the identity anchor only against the source's current measurements. */
|
|
28
|
+
function resolveTop(width, rows, total) {
|
|
29
|
+
const bottom = Math.max(0, total - rows);
|
|
30
|
+
if (state.follow)
|
|
31
|
+
return bottom;
|
|
32
|
+
if (!state.anchor) {
|
|
33
|
+
state.follow = true;
|
|
34
|
+
return bottom;
|
|
35
|
+
}
|
|
36
|
+
const anchoredTop = source.anchorLine(state.anchor, width);
|
|
37
|
+
if (anchoredTop === undefined) {
|
|
38
|
+
state.follow = true;
|
|
39
|
+
state.anchor = undefined;
|
|
40
|
+
return bottom;
|
|
41
|
+
}
|
|
42
|
+
return Math.min(Math.max(0, anchoredTop), bottom);
|
|
43
|
+
}
|
|
44
|
+
function visibleRange(width, rows, total, top) {
|
|
45
|
+
const bottom = Math.min(total, top + rows);
|
|
46
|
+
if (top >= bottom)
|
|
47
|
+
return { top, bottom, total, blocks: NO_VISIBLE_BLOCKS };
|
|
48
|
+
const count = source.blockCount();
|
|
49
|
+
let index = firstBlockAfter(source, top, width);
|
|
50
|
+
let first = -1;
|
|
51
|
+
let last = -1;
|
|
52
|
+
let lastFullyVisible = -1;
|
|
53
|
+
while (index < count) {
|
|
54
|
+
const start = source.blockStart(index, width);
|
|
55
|
+
if (start >= bottom)
|
|
56
|
+
break;
|
|
57
|
+
const height = source.blockHeight(index, width);
|
|
58
|
+
const end = start + height;
|
|
59
|
+
if (end > top) {
|
|
60
|
+
if (first === -1)
|
|
61
|
+
first = index;
|
|
62
|
+
last = index;
|
|
63
|
+
if (start >= top && end <= bottom)
|
|
64
|
+
lastFullyVisible = index;
|
|
65
|
+
}
|
|
66
|
+
index++;
|
|
67
|
+
}
|
|
68
|
+
return { top, bottom, total, blocks: first === -1 ? NO_VISIBLE_BLOCKS : { first, last, lastFullyVisible } };
|
|
69
|
+
}
|
|
70
|
+
function currentSlice() {
|
|
71
|
+
if (lastWidth === undefined || lastRows <= 0)
|
|
72
|
+
return undefined;
|
|
73
|
+
const total = source.totalHeight(lastWidth);
|
|
74
|
+
const top = resolveTop(lastWidth, lastRows, total);
|
|
75
|
+
return visibleRange(lastWidth, lastRows, total, top);
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
renderSlice(width, rows) {
|
|
79
|
+
const viewportRows = Math.max(0, rows);
|
|
80
|
+
lastWidth = width;
|
|
81
|
+
lastRows = viewportRows;
|
|
82
|
+
if (viewportRows === 0) {
|
|
83
|
+
cachedVisibleBlocks = NO_VISIBLE_BLOCKS;
|
|
84
|
+
cachedVisibleRevision = source.revision();
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
const total = source.totalHeight(width);
|
|
88
|
+
const top = resolveTop(width, viewportRows, total);
|
|
89
|
+
const slice = visibleRange(width, viewportRows, total, top);
|
|
90
|
+
const content = [];
|
|
91
|
+
for (let index = slice.blocks.first; index !== -1 && index <= slice.blocks.last; index++) {
|
|
92
|
+
const start = source.blockStart(index, width);
|
|
93
|
+
const lines = source.blockLines(index, width);
|
|
94
|
+
const height = source.blockHeight(index, width);
|
|
95
|
+
const end = start + height;
|
|
96
|
+
const visibleStart = Math.max(0, slice.top - start);
|
|
97
|
+
const visibleEnd = Math.min(height, slice.bottom - start);
|
|
98
|
+
if (visibleStart >= visibleEnd)
|
|
99
|
+
continue;
|
|
100
|
+
const partiallyClipped = start < slice.top || end > slice.bottom;
|
|
101
|
+
if (partiallyClipped && isInlineImageBlock(lines)) {
|
|
102
|
+
content.push(...Array(visibleEnd - visibleStart).fill(CLIPPED_IMAGE_ROW));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
content.push(...lines.slice(visibleStart, visibleEnd));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const padded = content.length >= viewportRows
|
|
109
|
+
? content.slice(0, viewportRows)
|
|
110
|
+
: [...Array(viewportRows - content.length).fill(''), ...content];
|
|
111
|
+
cachedVisibleBlocks = slice.blocks;
|
|
112
|
+
cachedVisibleRevision = source.revision();
|
|
113
|
+
return padded;
|
|
114
|
+
},
|
|
115
|
+
scrollBy(lines) {
|
|
116
|
+
if (lastWidth === undefined || lastRows <= 0 || lines === 0)
|
|
117
|
+
return false;
|
|
118
|
+
const beforeFollow = state.follow;
|
|
119
|
+
const beforeAnchor = state.anchor;
|
|
120
|
+
const total = source.totalHeight(lastWidth);
|
|
121
|
+
const currentTop = resolveTop(lastWidth, lastRows, total);
|
|
122
|
+
const bottom = Math.max(0, total - lastRows);
|
|
123
|
+
const newTop = Math.min(Math.max(0, currentTop + lines), bottom);
|
|
124
|
+
if (newTop >= bottom) {
|
|
125
|
+
state.follow = true;
|
|
126
|
+
state.anchor = undefined;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
state.follow = false;
|
|
130
|
+
state.anchor = source.anchorAt(newTop, lastWidth);
|
|
131
|
+
if (!state.anchor)
|
|
132
|
+
state.follow = true;
|
|
133
|
+
}
|
|
134
|
+
return state.follow !== beforeFollow || state.anchor !== beforeAnchor;
|
|
135
|
+
},
|
|
136
|
+
pageRows() {
|
|
137
|
+
return Math.max(0, lastRows - 1);
|
|
138
|
+
},
|
|
139
|
+
goLive() {
|
|
140
|
+
state.follow = true;
|
|
141
|
+
state.anchor = undefined;
|
|
142
|
+
},
|
|
143
|
+
isLive() {
|
|
144
|
+
return state.follow;
|
|
145
|
+
},
|
|
146
|
+
visibleBlocks() {
|
|
147
|
+
const revision = source.revision();
|
|
148
|
+
if (cachedVisibleRevision === revision)
|
|
149
|
+
return cachedVisibleBlocks;
|
|
150
|
+
const slice = currentSlice();
|
|
151
|
+
cachedVisibleBlocks = slice?.blocks ?? NO_VISIBLE_BLOCKS;
|
|
152
|
+
cachedVisibleRevision = revision;
|
|
153
|
+
return cachedVisibleBlocks;
|
|
154
|
+
},
|
|
155
|
+
invalidate() {
|
|
156
|
+
source.invalidate();
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import { type AttachBindingId, type BindingId, type BindingResolution } from '../../../core/keybindings/index.js';
|
|
1
|
+
import { type AttachBindingId, type BindingId, type BindingResolution, type UserKeybindingSettings } from '../../../core/keybindings/index.js';
|
|
2
2
|
export type { AttachBindingId } from '../../../core/keybindings/index.js';
|
|
3
3
|
export type AttachBindings = BindingResolution<BindingId>;
|
|
4
4
|
export type AttachActions = Record<AttachBindingId, () => void>;
|
|
5
|
+
export declare const ATTACH_VIEWPORT_BINDINGS: readonly ["crtr.attach.scroll.up", "crtr.attach.scroll.down", "crtr.attach.scroll.page-up", "crtr.attach.scroll.page-down", "crtr.attach.scroll.live", "crtr.attach.mouse.toggle", "crtr.attach.copy.message"];
|
|
6
|
+
export type AttachViewportBindingId = typeof ATTACH_VIEWPORT_BINDINGS[number];
|
|
7
|
+
export type AttachViewportActions = Record<AttachViewportBindingId, () => void>;
|
|
5
8
|
export { inboxOpenHint } from '../../../core/keybindings/index.js';
|
|
6
|
-
export declare function matchesAttachBinding(bindings: AttachBindings, id:
|
|
9
|
+
export declare function matchesAttachBinding(bindings: AttachBindings, id: BindingId, data: string): boolean;
|
|
7
10
|
export declare function dispatchAttachAction(id: AttachBindingId, actions: AttachActions): void;
|
|
8
11
|
export declare function dispatchAttachBinding(bindings: AttachBindings, data: string, actions: AttachActions): boolean;
|
|
12
|
+
export declare function dispatchAttachViewportBinding(bindings: AttachBindings, data: string, actions: AttachViewportActions): boolean;
|
|
9
13
|
export declare function detachHint(bindings: AttachBindings): string | undefined;
|
|
10
|
-
/** Re-resolve the user's binding
|
|
11
|
-
* the graph overlay
|
|
12
|
-
*
|
|
13
|
-
|
|
14
|
-
export declare function refreshAttachBindingSnapshot(resolve: () => AttachBindings, setGraphBindings: (bindings: AttachBindings) => void, inTmuxNow: () => boolean, install: (bindings: AttachBindings) => void): AttachBindings;
|
|
14
|
+
/** Re-resolve the user's binding settings once and republish the same snapshot
|
|
15
|
+
* to every consumer: attach dispatch, the graph overlay, and tmux. Binding
|
|
16
|
+
* diagnostics must never fail an attach, so an install error is swallowed. */
|
|
17
|
+
export declare function refreshAttachBindingSnapshot(resolve: () => UserKeybindingSettings, setGraphBindings: (bindings: AttachBindings) => void, inTmuxNow: () => boolean, install: (bindings: AttachBindings, tmuxPassthrough: readonly BindingId[]) => void): UserKeybindingSettings;
|
|
@@ -6,6 +6,13 @@
|
|
|
6
6
|
// literals, so a user's rebind is honored by the viewer and tmux alike.
|
|
7
7
|
import { matchesKey } from '@earendil-works/pi-tui';
|
|
8
8
|
import { ATTACH_CONTROL_BINDINGS, formatBinding, matchesPiTuiInput, } from '../../../core/keybindings/index.js';
|
|
9
|
+
export const ATTACH_VIEWPORT_BINDINGS = [
|
|
10
|
+
'crtr.attach.scroll.up', 'crtr.attach.scroll.down',
|
|
11
|
+
'crtr.attach.scroll.page-up', 'crtr.attach.scroll.page-down',
|
|
12
|
+
'crtr.attach.scroll.live',
|
|
13
|
+
'crtr.attach.mouse.toggle',
|
|
14
|
+
'crtr.attach.copy.message',
|
|
15
|
+
];
|
|
9
16
|
export { inboxOpenHint } from '../../../core/keybindings/index.js';
|
|
10
17
|
export function matchesAttachBinding(bindings, id, data) {
|
|
11
18
|
return matchesPiTuiInput(bindings, id, data, (input, gesture) => matchesKey(input, gesture));
|
|
@@ -22,6 +29,15 @@ export function dispatchAttachBinding(bindings, data, actions) {
|
|
|
22
29
|
}
|
|
23
30
|
return false;
|
|
24
31
|
}
|
|
32
|
+
export function dispatchAttachViewportBinding(bindings, data, actions) {
|
|
33
|
+
for (const actionId of ATTACH_VIEWPORT_BINDINGS) {
|
|
34
|
+
if (matchesAttachBinding(bindings, actionId, data)) {
|
|
35
|
+
actions[actionId]();
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
25
41
|
export function detachHint(bindings) {
|
|
26
42
|
for (const id of ['crtr.attach.clear-or-detach', 'crtr.attach.detach']) {
|
|
27
43
|
if (bindings.gestures(id).length > 0)
|
|
@@ -29,18 +45,17 @@ export function detachHint(bindings) {
|
|
|
29
45
|
}
|
|
30
46
|
return undefined;
|
|
31
47
|
}
|
|
32
|
-
/** Re-resolve the user's binding
|
|
33
|
-
* the graph overlay
|
|
34
|
-
*
|
|
35
|
-
* is swallowed. */
|
|
48
|
+
/** Re-resolve the user's binding settings once and republish the same snapshot
|
|
49
|
+
* to every consumer: attach dispatch, the graph overlay, and tmux. Binding
|
|
50
|
+
* diagnostics must never fail an attach, so an install error is swallowed. */
|
|
36
51
|
export function refreshAttachBindingSnapshot(resolve, setGraphBindings, inTmuxNow, install) {
|
|
37
|
-
const
|
|
38
|
-
setGraphBindings(bindings);
|
|
52
|
+
const settings = resolve();
|
|
53
|
+
setGraphBindings(settings.bindings);
|
|
39
54
|
if (inTmuxNow()) {
|
|
40
55
|
try {
|
|
41
|
-
install(bindings);
|
|
56
|
+
install(settings.bindings, settings.tmuxPassthrough);
|
|
42
57
|
}
|
|
43
58
|
catch { /* attaching must not fail on binding diagnostics */ }
|
|
44
59
|
}
|
|
45
|
-
return
|
|
60
|
+
return settings;
|
|
46
61
|
}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import { createConnection } from 'node:net';
|
|
11
11
|
import { viewSocketPath } from '../../../core/canvas/paths.js';
|
|
12
12
|
import { BrokerClient, BrokerUnavailableError, RelayTransport } from '../../../core/broker-client/index.js';
|
|
13
|
-
import { resolveRemoteCanvasTarget } from '../../../core/
|
|
13
|
+
import { resolveRemoteCanvasTarget } from '../../../core/remote-canvas-target.js';
|
|
14
14
|
import { ApiCanvasSource, cliCanvasSource, cliClient, rethrowAsCliError } from '../../../commands/api-client.js';
|
|
15
15
|
import { InputError } from '../../../core/io.js';
|
|
16
16
|
/** The hello handshake's initial role. A REMOTE attach (`--canvas`) is a
|
|
@@ -68,10 +68,9 @@ export async function connectToNode(nodeId, canvasName) {
|
|
|
68
68
|
// not-found guard is wrong for `--canvas`. Build a minimal local `meta`
|
|
69
69
|
// stand-in instead: `meta.cwd` is a legitimately viewer-local concern
|
|
70
70
|
// (theming, this pane's own git status) — not a remote-node concern — so
|
|
71
|
-
// pointing it at the CLI's own cwd is correct, not a hack. The
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
// sites, not here.
|
|
71
|
+
// pointing it at the CLI's own cwd is correct, not a hack. The `getRow`-based
|
|
72
|
+
// reconnect give-up is the other local-canvas dependency `--canvas` must skip;
|
|
73
|
+
// it gates on `remote` at its own use site, not here.
|
|
75
74
|
let meta;
|
|
76
75
|
let nodeIdentity;
|
|
77
76
|
let transport;
|
|
@@ -5,15 +5,17 @@ import type { NodeMeta } from '../../../core/canvas/types.js';
|
|
|
5
5
|
import type { BrokerClient } from '../../../core/broker-client/index.js';
|
|
6
6
|
import type { AttachPalette } from '../config.js';
|
|
7
7
|
import type { TitledEditor } from '../input/titled-editor.js';
|
|
8
|
-
/** The
|
|
8
|
+
/** The pinned cockpit plus transcript/header regions, in frame render order.
|
|
9
9
|
* Owned by the layout step; every painter writes into exactly one of these. */
|
|
10
10
|
export interface AttachContainers {
|
|
11
|
-
/** Scrolling transcript
|
|
11
|
+
/** Scrolling transcript source, rendered by the virtualized viewport. */
|
|
12
12
|
readonly chat: Container;
|
|
13
|
-
/**
|
|
14
|
-
readonly
|
|
13
|
+
/** Pinned recap above the transcript; empty when no recap widget exists. */
|
|
14
|
+
readonly header: Container;
|
|
15
15
|
/** Extension widgets placed `aboveEditor`, including the inactivity brief. */
|
|
16
16
|
readonly aboveWidgets: Container;
|
|
17
|
+
/** Live activity loader, fixed at the top of the bottom region. */
|
|
18
|
+
readonly activity: Container;
|
|
17
19
|
/** Relationship roster / wait rows, below the editor. */
|
|
18
20
|
readonly reports: Container;
|
|
19
21
|
/** Pending steering messages, above the editor. */
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type Component, type Terminal } from '@earendil-works/pi-tui';
|
|
2
|
+
import type { TranscriptViewport } from '../render/viewport.js';
|
|
3
|
+
export declare const MIN_TRANSCRIPT_ROWS = 3;
|
|
4
|
+
export declare const HEADER_MAX_ROWS = 12;
|
|
5
|
+
export declare const EDITOR_MIN_ROWS = 1;
|
|
6
|
+
export declare const STATUS_ROWS = 1;
|
|
7
|
+
export type BottomSlot = 'queued' | 'aboveWidgets' | 'activity' | 'cockpitPadding' | 'editor' | 'pickerPanel' | 'belowWidgets' | 'reports' | 'footer';
|
|
8
|
+
/** Crop `lines` to `alloc` rows, guaranteeing the CURSOR_MARKER row survives
|
|
9
|
+
* (§2.1). No marker → the tail is kept. */
|
|
10
|
+
export declare function cropAroundCursor(lines: readonly string[], alloc: number): string[];
|
|
11
|
+
export interface ViewerFrameParts {
|
|
12
|
+
/** Rendered above the transcript; 0 rows when empty. */
|
|
13
|
+
header: Component;
|
|
14
|
+
viewport: TranscriptViewport;
|
|
15
|
+
/** The bottom slots, in VISUAL order, tagged with their allocation identity
|
|
16
|
+
* so the allocator can apply the §2.1 priority table. */
|
|
17
|
+
bottom: readonly {
|
|
18
|
+
slot: BottomSlot;
|
|
19
|
+
component: Component;
|
|
20
|
+
}[];
|
|
21
|
+
}
|
|
22
|
+
/** The TUI's ONE child. Renders exactly `terminal.rows` lines, every frame. */
|
|
23
|
+
export declare class ViewerFrame implements Component {
|
|
24
|
+
private readonly terminal;
|
|
25
|
+
private readonly parts;
|
|
26
|
+
private viewportRows;
|
|
27
|
+
constructor(terminal: Terminal, parts: ViewerFrameParts);
|
|
28
|
+
render(width: number): string[];
|
|
29
|
+
invalidate(): void;
|
|
30
|
+
/** Rows the transcript viewport got in the last frame — the page size. */
|
|
31
|
+
lastViewportRows(): number;
|
|
32
|
+
/** Retain exactly one editor marker if the focused editor rendered one. */
|
|
33
|
+
private ensureCursorMarker;
|
|
34
|
+
}
|