@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
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
// `crtr surface view list` — enumerate every resolvable view across scopes.
|
|
2
|
-
//
|
|
3
|
-
// Lists id · title · description · scope. Loads each view's core.mjs to read its
|
|
4
|
-
// manifest title/description; a malformed view is shown with an error marker (it
|
|
5
|
-
// never crashes the listing). Plain text — pipeable as-is. The raw array is
|
|
6
|
-
// available behind --json for tooling.
|
|
7
|
-
import { defineLeaf } from '../core/command.js';
|
|
8
|
-
import { listViews, loadCore } from '../core/view/loader.js';
|
|
9
|
-
export const viewListLeaf = defineLeaf({
|
|
10
|
-
name: 'list',
|
|
11
|
-
description: 'enumerate available views (id · title · description · scope)',
|
|
12
|
-
whenToUse: 'you want to see which views exist before running one — a flat roster across project, user, and builtin scopes. Pipeable plain text; pass --json for the raw array. Use run to open one and new to scaffold one',
|
|
13
|
-
help: {
|
|
14
|
-
name: 'view list',
|
|
15
|
-
summary: 'list every resolvable view (id, title, description, scope); pipeable plain text',
|
|
16
|
-
inputNote: 'No input parameters.',
|
|
17
|
-
output: [
|
|
18
|
-
{ name: 'views', type: 'array', required: true, constraint: 'One entry per view: { id, title, description, scope, error? }.' },
|
|
19
|
-
],
|
|
20
|
-
outputKind: 'object',
|
|
21
|
-
effects: ['None. Read-only.'],
|
|
22
|
-
},
|
|
23
|
-
run: async (input) => {
|
|
24
|
-
const rows = [];
|
|
25
|
-
for (const r of listViews()) {
|
|
26
|
-
try {
|
|
27
|
-
const core = await loadCore(r);
|
|
28
|
-
rows.push({
|
|
29
|
-
id: r.id,
|
|
30
|
-
title: core.manifest.title,
|
|
31
|
-
description: core.manifest.description ?? '',
|
|
32
|
-
scope: r.scope,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
catch (e) {
|
|
36
|
-
// Tolerate a malformed view — show it with an error marker, don't crash.
|
|
37
|
-
rows.push({
|
|
38
|
-
id: r.id,
|
|
39
|
-
title: '(failed to load)',
|
|
40
|
-
description: '',
|
|
41
|
-
scope: r.scope,
|
|
42
|
-
error: e instanceof Error ? e.message : String(e),
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return { views: rows };
|
|
47
|
-
},
|
|
48
|
-
render: (result) => {
|
|
49
|
-
const rows = result['views'] ?? [];
|
|
50
|
-
if (rows.length === 0) {
|
|
51
|
-
return 'No views found. Scaffold one with the view new leaf.';
|
|
52
|
-
}
|
|
53
|
-
const idW = Math.max(...rows.map((r) => r.id.length), 2);
|
|
54
|
-
const titleW = Math.max(...rows.map((r) => r.title.length), 5);
|
|
55
|
-
const lines = rows.map((r) => {
|
|
56
|
-
const id = r.id.padEnd(idW);
|
|
57
|
-
const title = r.title.padEnd(titleW);
|
|
58
|
-
if (r.error !== undefined) {
|
|
59
|
-
return `${id} ${title} [${r.scope}] ⚠ ${r.error}`;
|
|
60
|
-
}
|
|
61
|
-
const desc = r.description !== '' ? ` ${r.description}` : '';
|
|
62
|
-
return `${id} ${title} [${r.scope}]${desc}`;
|
|
63
|
-
});
|
|
64
|
-
return lines.join('\n');
|
|
65
|
-
},
|
|
66
|
-
});
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
// `crtr surface view new` — scaffold a runnable dual-target view into a scope dir.
|
|
2
|
-
//
|
|
3
|
-
// Writes the four contract files (core.mjs + tui.mjs + web.jsx + text.mjs) under
|
|
4
|
-
// <viewsDir(scope)>/<name>/ from the stubs in prompts/view.ts (mkdir -p first).
|
|
5
|
-
// Refuses if a view of that name already resolves. The scaffold runs as-is via
|
|
6
|
-
// the surface view host (TUI/static) and the surface web server. Mirrors the
|
|
7
|
-
// scope → ensure dir → write → point-at-run shape of other authoring commands.
|
|
8
|
-
import { mkdirSync, existsSync } from 'node:fs';
|
|
9
|
-
import { writeFileSync } from 'node:fs';
|
|
10
|
-
import { join } from 'node:path';
|
|
11
|
-
import { defineLeaf } from '../core/command.js';
|
|
12
|
-
import { usage } from '../core/errors.js';
|
|
13
|
-
import { resolveView, findViewDir } from '../core/view/loader.js';
|
|
14
|
-
import { viewsDir, projectScopeRoot, ensureProjectScopeRoot } from '../core/scope.js';
|
|
15
|
-
import { viewScaffold } from '../prompts/view.js';
|
|
16
|
-
export const viewNewLeaf = defineLeaf({
|
|
17
|
-
name: 'new',
|
|
18
|
-
description: 'scaffold a runnable dual-target view directory into a scope dir',
|
|
19
|
-
whenToUse: 'you want to author a new view — this writes the four contract files (core.mjs + tui.mjs + web.jsx + text.mjs, with the contract documented inline) into the user or project scope, ready to open in either host and to edit from there. Reach for it to start a new view rather than hand-writing the directory',
|
|
20
|
-
help: {
|
|
21
|
-
name: 'view new',
|
|
22
|
-
summary: 'scaffold <viewsDir(scope)>/<name>/{core,tui,text}.mjs + web.jsx from the stubs; refuses if the name already resolves',
|
|
23
|
-
params: [
|
|
24
|
-
{ kind: 'positional', name: 'name', required: true, constraint: 'View id / directory name. Must not already resolve as a view.' },
|
|
25
|
-
{ kind: 'flag', name: 'scope', type: 'enum', choices: ['user', 'project'], required: false, constraint: 'Where to scaffold. Default: project if available, else user.' },
|
|
26
|
-
{ kind: 'flag', name: 'title', type: 'string', required: false, constraint: 'Manifest title (header + picker). Default: the name.' },
|
|
27
|
-
{ kind: 'flag', name: 'description', type: 'string', required: false, constraint: 'Manifest description (picker and list). Default: empty.' },
|
|
28
|
-
],
|
|
29
|
-
output: [
|
|
30
|
-
{ name: 'path', type: 'string', required: true, constraint: 'Absolute path to the scaffolded view directory.' },
|
|
31
|
-
{ name: 'files', type: 'array', required: true, constraint: 'The filenames written into the view directory.' },
|
|
32
|
-
{ name: 'scope', type: 'string', required: true, constraint: 'The scope it was written to (user|project).' },
|
|
33
|
-
{ name: 'run', type: 'string', required: true, constraint: 'The command to run the new view.' },
|
|
34
|
-
],
|
|
35
|
-
outputKind: 'object',
|
|
36
|
-
effects: [
|
|
37
|
-
'Creates the view directory and the four contract files (core.mjs + tui.mjs + web.jsx + text.mjs) at the resolved location (mkdir -p).',
|
|
38
|
-
'Initializes the project scope dir if --scope project is chosen and none exists yet.',
|
|
39
|
-
],
|
|
40
|
-
},
|
|
41
|
-
run: async (input) => {
|
|
42
|
-
const name = input['name'];
|
|
43
|
-
const scopeArg = input['scope'];
|
|
44
|
-
const title = input['title'] ?? name;
|
|
45
|
-
const description = input['description'] ?? '';
|
|
46
|
-
// Default scope: project if a project scope exists, else user.
|
|
47
|
-
const scope = scopeArg === 'project' || scopeArg === 'user'
|
|
48
|
-
? scopeArg
|
|
49
|
-
: (projectScopeRoot() !== null ? 'project' : 'user');
|
|
50
|
-
// Refuse if a view of this name already resolves (any scope wins).
|
|
51
|
-
const existing = resolveView(name);
|
|
52
|
-
if (existing !== null) {
|
|
53
|
-
throw usage(`view already exists: ${name} (${existing.scope}) at ${existing.dir}. ` +
|
|
54
|
-
`Pick another name, or edit it directly.`);
|
|
55
|
-
}
|
|
56
|
-
// Ensure the project scope root exists before computing its views dir.
|
|
57
|
-
if (scope === 'project')
|
|
58
|
-
ensureProjectScopeRoot();
|
|
59
|
-
const baseDir = viewsDir(scope);
|
|
60
|
-
if (baseDir === null) {
|
|
61
|
-
throw usage(`no ${scope} scope available to scaffold into — try --scope user.`);
|
|
62
|
-
}
|
|
63
|
-
const dir = join(baseDir, name);
|
|
64
|
-
if (findViewDir(name) !== null || existsSync(join(dir, 'core.mjs'))) {
|
|
65
|
-
throw usage(`view directory already exists: ${dir}`);
|
|
66
|
-
}
|
|
67
|
-
mkdirSync(dir, { recursive: true });
|
|
68
|
-
const files = viewScaffold({ id: name, title, description });
|
|
69
|
-
for (const [filename, content] of Object.entries(files)) {
|
|
70
|
-
writeFileSync(join(dir, filename), content, 'utf8');
|
|
71
|
-
}
|
|
72
|
-
return { path: dir, files: Object.keys(files), scope, run: `crtr surface view run ${name}` };
|
|
73
|
-
},
|
|
74
|
-
});
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { LeafDef } from '../core/command.js';
|
|
2
|
-
import { type BindingId, type BindingResolution, type RawTerminalInput } from '../core/keybindings/index.js';
|
|
3
|
-
declare const VIEW_PICK_ACTIONS: readonly ["crtr.view-picker.quit", "crtr.view-picker.down", "crtr.view-picker.up", "crtr.view-picker.run"];
|
|
4
|
-
export declare function resolveViewPickAction(bindings: BindingResolution<BindingId>, raw: RawTerminalInput): (typeof VIEW_PICK_ACTIONS)[number] | null;
|
|
5
|
-
export declare const viewPickLeaf: LeafDef;
|
|
6
|
-
export {};
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
// `crtr surface view pick` — hidden raw-ANSI picker over the available views.
|
|
2
|
-
//
|
|
3
|
-
// Backs the /view popup: a minimal full-screen list of listViews(); j/k move,
|
|
4
|
-
// Enter hands off to the surface-view run command (execFileSync, stdio inherit — a
|
|
5
|
-
// one-way handoff, the picker exits as the view takes over, same pattern as
|
|
6
|
-
// browse's selectAndFocus), q/Esc/Ctrl-C quit. Outside a TTY it prints the
|
|
7
|
-
// plain list and exits 0. Reuses the core/tui terminal + draw primitives.
|
|
8
|
-
import { execFileSync } from 'node:child_process';
|
|
9
|
-
import { defineLeaf } from '../core/command.js';
|
|
10
|
-
import { listViews } from '../core/view/loader.js';
|
|
11
|
-
import { setupTerminal, restoreTerminal, getTerminalSize, parseKeypress, } from '../core/tui/terminal.js';
|
|
12
|
-
import { createDraw, detectColorCaps } from '../core/tui/draw.js';
|
|
13
|
-
import { formatBinding, matchesTerminalInput, resolveUserKeybindings, } from '../core/keybindings/index.js';
|
|
14
|
-
const VIEW_PICK_ACTIONS = [
|
|
15
|
-
'crtr.view-picker.quit',
|
|
16
|
-
'crtr.view-picker.down',
|
|
17
|
-
'crtr.view-picker.up',
|
|
18
|
-
'crtr.view-picker.run',
|
|
19
|
-
];
|
|
20
|
-
export function resolveViewPickAction(bindings, raw) {
|
|
21
|
-
return VIEW_PICK_ACTIONS.find((id) => matchesTerminalInput(bindings, id, raw)) ?? null;
|
|
22
|
-
}
|
|
23
|
-
export const viewPickLeaf = defineLeaf({
|
|
24
|
-
name: 'pick',
|
|
25
|
-
tier: 'hidden',
|
|
26
|
-
description: 'raw-ANSI view picker (used by the /view popup)',
|
|
27
|
-
whenToUse: 'internal — the picker chooses a view for the popup, then hands off to the view host. You normally use run or list directly',
|
|
28
|
-
help: {
|
|
29
|
-
name: 'view pick',
|
|
30
|
-
summary: 'interactive picker over available views; Enter runs the chosen view. Outside a TTY it prints the list and exits',
|
|
31
|
-
inputNote: 'No input parameters.',
|
|
32
|
-
output: [],
|
|
33
|
-
outputKind: 'object',
|
|
34
|
-
effects: [
|
|
35
|
-
'Inside a TTY: takes over the terminal in raw mode until you pick (Enter) or quit (q/Esc/Ctrl-C).',
|
|
36
|
-
'On Enter: hands off to the chosen view host (stdio inherited) — a one-way handoff; the picker exits.',
|
|
37
|
-
'Outside a TTY: prints the plain view list and exits 0.',
|
|
38
|
-
],
|
|
39
|
-
},
|
|
40
|
-
run: async () => {
|
|
41
|
-
const views = listViews();
|
|
42
|
-
// Non-TTY: print the plain list and exit 0.
|
|
43
|
-
if (!process.stdin.isTTY) {
|
|
44
|
-
const text = views.length > 0
|
|
45
|
-
? views.map((v) => `${v.id}\t${v.scope}`).join('\n')
|
|
46
|
-
: '(no views)';
|
|
47
|
-
process.stdout.write(text + '\n');
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
if (views.length === 0) {
|
|
51
|
-
process.stdout.write('No views found. Scaffold one with the view new leaf.\n');
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
const caps = detectColorCaps();
|
|
55
|
-
const bindings = resolveUserKeybindings();
|
|
56
|
-
let cursor = 0;
|
|
57
|
-
let scroll = 0;
|
|
58
|
-
let restored = false;
|
|
59
|
-
const cleanup = () => {
|
|
60
|
-
if (restored)
|
|
61
|
-
return;
|
|
62
|
-
restored = true;
|
|
63
|
-
try {
|
|
64
|
-
restoreTerminal();
|
|
65
|
-
}
|
|
66
|
-
catch { /* best-effort */ }
|
|
67
|
-
};
|
|
68
|
-
process.once('exit', cleanup);
|
|
69
|
-
const render = () => {
|
|
70
|
-
const size = getTerminalSize();
|
|
71
|
-
const { draw, frame } = createDraw(size, caps);
|
|
72
|
-
draw.text(0, 0, `crtr views — ${formatBinding(bindings, 'crtr.view-picker.down')}/${formatBinding(bindings, 'crtr.view-picker.up')} move · ${formatBinding(bindings, 'crtr.view-picker.run')} run · ${formatBinding(bindings, 'crtr.view-picker.quit')} quit`, { bold: true });
|
|
73
|
-
draw.hline(1, 0, size.cols);
|
|
74
|
-
const rect = { row: 2, col: 0, width: size.cols, height: Math.max(1, size.rows - 3) };
|
|
75
|
-
const items = views.map((v) => ({
|
|
76
|
-
spans: [
|
|
77
|
-
{ text: v.id, style: { bold: true } },
|
|
78
|
-
{ text: ` [${v.scope}]`, style: { dim: true } },
|
|
79
|
-
],
|
|
80
|
-
}));
|
|
81
|
-
const res = draw.list(rect, items, cursor, scroll);
|
|
82
|
-
scroll = res.scroll;
|
|
83
|
-
process.stdout.write(frame());
|
|
84
|
-
};
|
|
85
|
-
setupTerminal();
|
|
86
|
-
render();
|
|
87
|
-
await new Promise((resolve) => {
|
|
88
|
-
const finish = () => {
|
|
89
|
-
cleanup();
|
|
90
|
-
process.exit(0);
|
|
91
|
-
};
|
|
92
|
-
const launch = (id) => {
|
|
93
|
-
cleanup();
|
|
94
|
-
try {
|
|
95
|
-
execFileSync('crtr', ['surface', 'view', 'run', id], { stdio: 'inherit' });
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
// The view takes the terminal over; a sync handoff may be interrupted.
|
|
99
|
-
}
|
|
100
|
-
process.exit(0);
|
|
101
|
-
};
|
|
102
|
-
process.stdin.on('data', (d) => {
|
|
103
|
-
let parsed;
|
|
104
|
-
try {
|
|
105
|
-
parsed = parseKeypress(d);
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
const { input, key } = parsed;
|
|
111
|
-
const action = resolveViewPickAction(bindings, { input, ...key });
|
|
112
|
-
if (action === 'crtr.view-picker.quit')
|
|
113
|
-
finish();
|
|
114
|
-
if (action === 'crtr.view-picker.down') {
|
|
115
|
-
cursor = Math.min(views.length - 1, cursor + 1);
|
|
116
|
-
render();
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
if (action === 'crtr.view-picker.up') {
|
|
120
|
-
cursor = Math.max(0, cursor - 1);
|
|
121
|
-
render();
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
if (action === 'crtr.view-picker.run')
|
|
125
|
-
launch(views[cursor].id);
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
},
|
|
129
|
-
});
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
// `crtr surface view run` — resolve, load, and host a view's TUI target.
|
|
2
|
-
//
|
|
3
|
-
// Resolves the view across scopes (project→user→builtin), loads its core.mjs +
|
|
4
|
-
// tui.mjs (+ optional text.mjs), then hands them to the dual-target core host.
|
|
5
|
-
// The host owns the screen and the non-TTY path: when stdin is NOT a TTY it
|
|
6
|
-
// prints the text presenter's dump and exits 0, so a pipe gets a static
|
|
7
|
-
// snapshot. A view that ships no core.mjs is not a view — run fails with a
|
|
8
|
-
// clear error naming the contract, never a fallback. The interactive path is
|
|
9
|
-
// tmux-only (crtr is tmux-only) — outside tmux with a TTY we notify + no-op,
|
|
10
|
-
// never a non-tmux fallback. --port / --target forward verbatim onto
|
|
11
|
-
// host.options (camelCased, stringified); crtr does not interpret them.
|
|
12
|
-
//
|
|
13
|
-
// --window / --split open the view as a PERSISTENT MONITOR instead of taking
|
|
14
|
-
// over the current pane: --window in a new background (non-focus-stealing)
|
|
15
|
-
// tmux window, --split in a right-hand split of the current pane. Both shell a
|
|
16
|
-
// plain inner surface-view run command into the new pane, which hosts the view
|
|
17
|
-
// there and self-tags the pane with @crtr_view so the Alt+V then ]/[ view-cycle
|
|
18
|
-
// can flip it to the next/prev view in place. Both are tmux-only by nature; in
|
|
19
|
-
// a pipe (non-TTY) placement is meaningless, so they degrade to the static dump.
|
|
20
|
-
import { defineLeaf } from '../core/command.js';
|
|
21
|
-
import { InputError } from '../core/io.js';
|
|
22
|
-
import { runCoreView } from '../core/tui/host.js';
|
|
23
|
-
import { resolveView, findViewDir, loadCore, loadTui, loadText, requireTui, listViews, } from '../core/view/loader.js';
|
|
24
|
-
// Commands reach the tmux driver through placement-tmux.ts (the pure tmux seam,
|
|
25
|
-
// §5.1) — never `./tmux.js` directly, and not placement.ts (which reaches the
|
|
26
|
-
// canvas focuses table a CLI leaf must not touch).
|
|
27
|
-
import { inTmux, currentTmux, openNodeWindow, splitWindow, piCommand, setPaneOption, } from '../core/runtime/placement-tmux.js';
|
|
28
|
-
export const viewRunLeaf = defineLeaf({
|
|
29
|
-
name: 'run',
|
|
30
|
-
description: 'resolve, load, and host a view (in this pane, a new window, or a split)',
|
|
31
|
-
whenToUse: 'you want to open a view by name — a full-screen raw-ANSI surface. By default it hosts in the current pane (tmux-only interactive; piped it prints a static snapshot). Pass --window to open it as a background monitor window, or --split to open it beside the current pane so it stays available as a live monitor. Pass --port/--target to forward connection details. Use list first to see what is available, or new to scaffold one',
|
|
32
|
-
help: {
|
|
33
|
-
name: 'view run',
|
|
34
|
-
summary: 'host a view in the current pane, a new window (--window), or a split (--split); outside a TTY it prints the view\'s static dump and exits 0',
|
|
35
|
-
params: [
|
|
36
|
-
{ kind: 'positional', name: 'name', required: true, constraint: 'View id to run (its directory name). Resolves project→user→builtin.' },
|
|
37
|
-
{ kind: 'flag', name: 'window', type: 'bool', required: false, constraint: 'Open the view in a NEW background tmux window (non-focus-stealing) instead of the current pane — a persistent monitor. tmux-only; ignored (static dump) in a pipe. Mutually exclusive with --split.' },
|
|
38
|
-
{ kind: 'flag', name: 'split', type: 'bool', required: false, constraint: 'Open the view in a right-hand SPLIT of the current pane instead of taking it over — a side-by-side monitor. tmux-only; ignored (static dump) in a pipe. Mutually exclusive with --window.' },
|
|
39
|
-
{ kind: 'flag', name: 'port', type: 'int', required: false, constraint: 'Forwarded verbatim to the view as options.port for views that connect to a network service.' },
|
|
40
|
-
{ kind: 'flag', name: 'target', type: 'string', required: false, constraint: 'Forwarded verbatim to the view as options.target for views that need an external target identifier.' },
|
|
41
|
-
],
|
|
42
|
-
output: [
|
|
43
|
-
{ name: 'hosted', type: 'string', required: false, constraint: 'For --window/--split: "window" or "split" — where the monitor opened. Absent for an in-pane host (which holds the terminal until you quit).' },
|
|
44
|
-
{ name: 'view', type: 'string', required: false, constraint: 'The view id opened (only on the --window/--split path).' },
|
|
45
|
-
{ name: 'window', type: 'string', required: false, constraint: 'The new tmux window id (--window only).' },
|
|
46
|
-
{ name: 'pane', type: 'string', required: false, constraint: 'The new tmux pane id (--window/--split).' },
|
|
47
|
-
],
|
|
48
|
-
outputKind: 'object',
|
|
49
|
-
effects: [
|
|
50
|
-
'Default (no flag) inside a TTY+tmux: takes over the current pane in raw mode (alt-screen) until you quit (q/Ctrl-C), and tags the pane @crtr_view=<name> so Alt+V then ]/[ can cycle it.',
|
|
51
|
-
'--window: opens a new background tmux window running the view (does not steal focus); returns immediately.',
|
|
52
|
-
'--split: opens a right-hand split of the current pane running the view; you stay in your pane.',
|
|
53
|
-
'Outside a TTY: writes the view\'s static dump to stdout and exits 0 (no raw mode); --window/--split degrade to this.',
|
|
54
|
-
'Forwards --port/--target onto host.options for the view; mutates nothing on the canvas.',
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
run: async (input) => {
|
|
58
|
-
const name = input['name'];
|
|
59
|
-
const port = input['port'];
|
|
60
|
-
const target = input['target'];
|
|
61
|
-
const asWindow = input['window'] === true;
|
|
62
|
-
const asSplit = input['split'] === true;
|
|
63
|
-
if (asWindow && asSplit) {
|
|
64
|
-
throw new InputError({
|
|
65
|
-
error: 'conflicting_flags',
|
|
66
|
-
message: '--window and --split are mutually exclusive',
|
|
67
|
-
next: 'Pass at most one: --window (new background window) or --split (split the current pane).',
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
const r = resolveView(name);
|
|
71
|
-
if (r === null) {
|
|
72
|
-
// A directory exists but holds no core.mjs — it is not a valid view (e.g. a
|
|
73
|
-
// pre-contract `view.mjs`-only dir). Name the contract, don't fall back.
|
|
74
|
-
const dir = findViewDir(name);
|
|
75
|
-
if (dir !== null) {
|
|
76
|
-
throw new InputError({
|
|
77
|
-
error: 'view_invalid',
|
|
78
|
-
message: `'${name}' is not a valid view: ${dir} has no core.mjs`,
|
|
79
|
-
received: name,
|
|
80
|
-
next: 'A view is a directory containing core.mjs (the portable core) plus optional tui.mjs (render + keymap), web.jsx, and text.mjs. Use the surface view new leaf to scaffold the shape.',
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
const avail = listViews().map((v) => v.id);
|
|
84
|
-
throw new InputError({
|
|
85
|
-
error: 'view_not_found',
|
|
86
|
-
message: `no view: ${name}`,
|
|
87
|
-
received: name,
|
|
88
|
-
next: avail.length > 0
|
|
89
|
-
? `Available views: ${avail.join(', ')}. Or scaffold one with the surface view new leaf.`
|
|
90
|
-
: 'No views found. Scaffold one with the surface view new leaf.',
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
const options = {};
|
|
94
|
-
if (port !== undefined)
|
|
95
|
-
options.port = String(port);
|
|
96
|
-
if (target !== undefined)
|
|
97
|
-
options.target = target;
|
|
98
|
-
// Load + host the resolved view via the matching path (works for both the
|
|
99
|
-
// non-TTY dump and the interactive alt-screen — each host handles the TTY
|
|
100
|
-
// gate internally).
|
|
101
|
-
const hostView = async () => {
|
|
102
|
-
requireTui(r);
|
|
103
|
-
const core = await loadCore(r);
|
|
104
|
-
const tui = await loadTui(r);
|
|
105
|
-
const txt = await loadText(r);
|
|
106
|
-
await runCoreView(core, tui, txt, { options });
|
|
107
|
-
};
|
|
108
|
-
// --window / --split: open the view as a persistent monitor in a new pane.
|
|
109
|
-
if (asWindow || asSplit) {
|
|
110
|
-
// Placement is tmux-only. In a pipe (non-TTY) it is meaningless — degrade
|
|
111
|
-
// to the static dump (the host handles the non-TTY path internally).
|
|
112
|
-
if (!process.stdin.isTTY) {
|
|
113
|
-
await hostView();
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
if (!inTmux()) {
|
|
117
|
-
throw new InputError({
|
|
118
|
-
error: 'not_in_tmux',
|
|
119
|
-
message: '--window/--split are tmux-only — run crtr inside its tmux session',
|
|
120
|
-
next: 'Open it from inside tmux, or drop the placement flag to host in the current pane. For a static snapshot, pipe the command output.',
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
const here = currentTmux();
|
|
124
|
-
if (here === null) {
|
|
125
|
-
throw new InputError({
|
|
126
|
-
error: 'no_tmux_location',
|
|
127
|
-
message: 'could not resolve the current tmux pane',
|
|
128
|
-
next: 'Run this inside a tmux pane.',
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
// The inner command re-enters this leaf with NO placement flag, so it
|
|
132
|
-
// hosts the view in its own (new) pane and self-tags it via @crtr_view.
|
|
133
|
-
const argv = ['surface', 'view', 'run', name];
|
|
134
|
-
if (port !== undefined)
|
|
135
|
-
argv.push('--port', String(port));
|
|
136
|
-
if (target !== undefined)
|
|
137
|
-
argv.push('--target', target);
|
|
138
|
-
const command = piCommand(argv, 'crtr');
|
|
139
|
-
const cwd = process.cwd();
|
|
140
|
-
if (asWindow) {
|
|
141
|
-
const win = openNodeWindow({ session: here.session, name: `view:${name}`, cwd, env: {}, command });
|
|
142
|
-
if (win === null) {
|
|
143
|
-
throw new InputError({
|
|
144
|
-
error: 'window_open_failed',
|
|
145
|
-
message: `tmux could not open a window for view ${name}`,
|
|
146
|
-
next: 'Check the tmux server is reachable, then retry.',
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
return { hosted: 'window', view: name, window: win.window, pane: win.pane };
|
|
150
|
-
}
|
|
151
|
-
// --split: a right-hand split (-h, the splitWindow default); -d keeps you put.
|
|
152
|
-
const pane = splitWindow(here.pane, { cwd, env: {}, command });
|
|
153
|
-
if (pane === null) {
|
|
154
|
-
throw new InputError({
|
|
155
|
-
error: 'split_failed',
|
|
156
|
-
message: `tmux could not split the pane for view ${name}`,
|
|
157
|
-
next: 'Check the tmux server is reachable, then retry.',
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
return { hosted: 'split', view: name, pane };
|
|
161
|
-
}
|
|
162
|
-
// The interactive path is tmux-only; the piped/non-TTY dump path works
|
|
163
|
-
// anywhere (the host handles it internally), so only guard when stdin is a
|
|
164
|
-
// TTY. Outside tmux with a TTY: notify + no-op — never a non-tmux fallback.
|
|
165
|
-
if (process.stdin.isTTY && !inTmux()) {
|
|
166
|
-
throw new InputError({
|
|
167
|
-
error: 'not_in_tmux',
|
|
168
|
-
message: 'crtr surface view is tmux-only — run it inside the crtr tmux session',
|
|
169
|
-
next: 'Open it from inside tmux, or pipe the command output for a static snapshot.',
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
// Self-tag this pane with the view id (+ any forwarded --port/--target) so
|
|
173
|
-
// the Alt+V then ]/[ view-cycle can switch it to the next/prev view in place
|
|
174
|
-
// AND replay the connection params it was opened with. Best-effort; tmux-only.
|
|
175
|
-
const tagPane = (process.stdin.isTTY && inTmux())
|
|
176
|
-
? (process.env['TMUX_PANE'] ?? currentTmux()?.pane)
|
|
177
|
-
: undefined;
|
|
178
|
-
if (tagPane !== undefined && tagPane !== '') {
|
|
179
|
-
try {
|
|
180
|
-
setPaneOption(tagPane, '@crtr_view', name);
|
|
181
|
-
setPaneOption(tagPane, '@crtr_view_port', port !== undefined ? String(port) : '');
|
|
182
|
-
setPaneOption(tagPane, '@crtr_view_target', target ?? '');
|
|
183
|
-
}
|
|
184
|
-
catch { /* best-effort */ }
|
|
185
|
-
}
|
|
186
|
-
try {
|
|
187
|
-
await hostView();
|
|
188
|
-
}
|
|
189
|
-
finally {
|
|
190
|
-
// On a clean quit (q) the host returns to the shell/pi that launched this
|
|
191
|
-
// pane — clear the monitor tag so a stray Alt+V ]/[ can't respawn-pane -k
|
|
192
|
-
// (and kill) whatever now owns the pane. When the cycle itself replaces
|
|
193
|
-
// this view it SIGKILLs us mid-await (this finally never runs); cycle + the
|
|
194
|
-
// new view-run re-tag, so that path stays correct.
|
|
195
|
-
if (tagPane !== undefined && tagPane !== '') {
|
|
196
|
-
try {
|
|
197
|
-
setPaneOption(tagPane, '@crtr_view', '');
|
|
198
|
-
}
|
|
199
|
-
catch { /* best-effort */ }
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
},
|
|
203
|
-
render: (result) => {
|
|
204
|
-
const hosted = result['hosted'];
|
|
205
|
-
if (hosted === 'window') {
|
|
206
|
-
return `Opened view "${result['view']}" as a window monitor — window ${result['window']}, pane ${result['pane']}.`;
|
|
207
|
-
}
|
|
208
|
-
if (hosted === 'split') {
|
|
209
|
-
return `Opened view "${result['view']}" as a split monitor — pane ${result['pane']}.`;
|
|
210
|
-
}
|
|
211
|
-
// In-pane host: the terminal was held until quit; nothing to report.
|
|
212
|
-
return '';
|
|
213
|
-
},
|
|
214
|
-
});
|
package/dist/commands/view.d.ts
DELETED
package/dist/commands/view.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// `crtr surface view` — the TUI view library.
|
|
2
|
-
//
|
|
3
|
-
// Views are switchable surfaces with two targets from one portable core.mjs:
|
|
4
|
-
// the tmux TUI (`run`) and a React+Tailwind web page. This branch assembles the
|
|
5
|
-
// TUI-side leaves: `list` enumerates what's available, `run` hosts the TUI
|
|
6
|
-
// target (interactive in tmux, static dump when piped), `new` scaffolds a fresh
|
|
7
|
-
// view directory, and the hidden `pick` backs the /view popup. Each leaf owns
|
|
8
|
-
// its own help one level down. The web target is no longer served per-view here:
|
|
9
|
-
// it is hosted by the unified surface web server (the shell's /view/<id> route).
|
|
10
|
-
import { defineBranch } from '../core/command.js';
|
|
11
|
-
import { viewListLeaf } from './view-list.js';
|
|
12
|
-
import { viewRunLeaf } from './view-run.js';
|
|
13
|
-
import { viewCycleLeaf } from './view-cycle.js';
|
|
14
|
-
import { viewNewLeaf } from './view-new.js';
|
|
15
|
-
import { viewPickLeaf } from './view-pick.js';
|
|
16
|
-
export function registerView() {
|
|
17
|
-
return defineBranch({
|
|
18
|
-
name: 'view',
|
|
19
|
-
rootEntry: {
|
|
20
|
-
concept: 'switchable raw-ANSI terminal views — full-screen surfaces hosted in a pane, each a self-contained module',
|
|
21
|
-
desc: 'list, run, and author TUI views',
|
|
22
|
-
useWhen: 'you want a live full-screen surface (a monitor, an inbox, a dashboard) rather than one-shot command output — run a view by name, list what exists, or scaffold a new one. Views have no pi session; they render + take keystrokes until you quit.',
|
|
23
|
-
},
|
|
24
|
-
help: {
|
|
25
|
-
name: 'view',
|
|
26
|
-
summary: 'host and author switchable raw-ANSI terminal views',
|
|
27
|
-
model: 'The branch divides into listing, hosting, cycling, authoring, and the hidden picker. `list` is the roster; `run` hosts a named view in the current pane or a monitor pane; `cycle` advances a monitor in place; `new` scaffolds a view directory; `pick` backs the popup. The browser target is part of the web surface, not this branch.',
|
|
28
|
-
},
|
|
29
|
-
children: [viewListLeaf, viewRunLeaf, viewCycleLeaf, viewNewLeaf, viewPickLeaf],
|
|
30
|
-
});
|
|
31
|
-
}
|