@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
package/dist/core/view/bridge.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// bridge.ts — the server side of the local web transport (Node only).
|
|
2
|
-
//
|
|
3
|
-
// `crtr view serve` runs the portable core CLIENT-SIDE in the browser; its
|
|
4
|
-
// sources resolve over an HTTP Transport that POSTs each SourceRequest here.
|
|
5
|
-
// This helper decodes that POST body and runs it through any Transport (the
|
|
6
|
-
// local exec/file/http one today) — the single endpoint a cloud deploy
|
|
7
|
-
// replaces. Kept transport-agnostic + framework-free so it is trivially
|
|
8
|
-
// testable and tear-out-able.
|
|
9
|
-
function bad(stderr) {
|
|
10
|
-
const raw = { ok: false, stdout: '', stderr };
|
|
11
|
-
return { status: 400, body: JSON.stringify(raw) };
|
|
12
|
-
}
|
|
13
|
-
/** Decode a POST body as a SourceRequest and run it through `transport`,
|
|
14
|
-
* returning the HTTP status + JSON-encoded RawResponse the bridge should send
|
|
15
|
-
* back. Never throws — a malformed body or a transport failure both come back
|
|
16
|
-
* as a RawResponse with ok:false. */
|
|
17
|
-
export async function runSourceRequest(transport, rawBody) {
|
|
18
|
-
let req;
|
|
19
|
-
try {
|
|
20
|
-
req = JSON.parse(rawBody);
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
return bad('bridge: request body is not valid JSON');
|
|
24
|
-
}
|
|
25
|
-
const kind = req.kind;
|
|
26
|
-
if (!req || typeof req !== 'object' || (kind !== 'exec' && kind !== 'file' && kind !== 'http')) {
|
|
27
|
-
return bad(`bridge: request body is not a SourceRequest (kind must be exec|file|http, got ${JSON.stringify(kind)})`);
|
|
28
|
-
}
|
|
29
|
-
const raw = await transport.send(req);
|
|
30
|
-
return { status: 200, body: JSON.stringify(raw) };
|
|
31
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { ChromeState } from './contract.js';
|
|
2
|
-
export type ChipState = 'working' | 'blocked' | 'attention' | 'ready' | 'idle';
|
|
3
|
-
/** Derive the state chip from host signals: busy→working, error banner→blocked,
|
|
4
|
-
* action banner→attention, else ready (once loaded) / idle. An info banner does
|
|
5
|
-
* not block. An explicit interaction mode (setMode) overrides the chip — that
|
|
6
|
-
* precedence is applied by each target's chrome renderer, not here. */
|
|
7
|
-
export declare function deriveState(c: ChromeState): ChipState;
|
|
8
|
-
/** A fresh chrome record (the shape both hosts start from). */
|
|
9
|
-
export declare function initialChrome(): ChromeState;
|
package/dist/core/view/chrome.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
// chrome.ts — portable chrome-state derivation shared by both targets.
|
|
2
|
-
//
|
|
3
|
-
// The TUI's drawChrome and the web's <ViewChrome> both derive the one state
|
|
4
|
-
// chip from the same host signals via deriveState, so the two targets never
|
|
5
|
-
// drift on what "blocked" / "working" / "ready" mean.
|
|
6
|
-
/** Derive the state chip from host signals: busy→working, error banner→blocked,
|
|
7
|
-
* action banner→attention, else ready (once loaded) / idle. An info banner does
|
|
8
|
-
* not block. An explicit interaction mode (setMode) overrides the chip — that
|
|
9
|
-
* precedence is applied by each target's chrome renderer, not here. */
|
|
10
|
-
export function deriveState(c) {
|
|
11
|
-
if (c.busy)
|
|
12
|
-
return 'working';
|
|
13
|
-
if (c.banner?.level === 'error')
|
|
14
|
-
return 'blocked';
|
|
15
|
-
if (c.banner?.level === 'action')
|
|
16
|
-
return 'attention';
|
|
17
|
-
return c.loaded ? 'ready' : 'idle';
|
|
18
|
-
}
|
|
19
|
-
/** A fresh chrome record (the shape both hosts start from). */
|
|
20
|
-
export function initialChrome() {
|
|
21
|
-
return { status: null, banner: null, subtitle: null, mode: null, busy: false, loaded: false, lastRefresh: 0 };
|
|
22
|
-
}
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import type { Draw, Rect } from '../tui/draw.js';
|
|
2
|
-
export interface ViewManifest {
|
|
3
|
-
id: string;
|
|
4
|
-
title: string;
|
|
5
|
-
subtitle?: string;
|
|
6
|
-
description: string;
|
|
7
|
-
refreshMs?: number;
|
|
8
|
-
}
|
|
9
|
-
/** Severity of a {@link HostSignals.setBanner} banner — drives glyph + hue and
|
|
10
|
-
* the derived state chip (error→blocked, action→attention, info→neutral). */
|
|
11
|
-
export type BannerLevel = 'info' | 'action' | 'error';
|
|
12
|
-
export interface Banner {
|
|
13
|
-
msg: string;
|
|
14
|
-
level: BannerLevel;
|
|
15
|
-
}
|
|
16
|
-
/** Optional host context passed to the text presenter's dump on the piped path. */
|
|
17
|
-
export interface DumpContext {
|
|
18
|
-
banner: Banner | null;
|
|
19
|
-
}
|
|
20
|
-
/** Semantic chrome signals the core raises; each target renders them in its own
|
|
21
|
-
* idiom (TUI footer/banner/title-chip vs web status line/alert bar/pill). */
|
|
22
|
-
export interface HostSignals {
|
|
23
|
-
setStatus(msg: string | null): void;
|
|
24
|
-
setBanner(msg: string, level: BannerLevel): void;
|
|
25
|
-
clearBanner(): void;
|
|
26
|
-
setSubtitle(s: string | null): void;
|
|
27
|
-
/** Interaction-mode chip override (compose/react); null returns to derived. */
|
|
28
|
-
setMode(mode: string | null): void;
|
|
29
|
-
/** TUI: leave the pane; web: no-op/close tab. */
|
|
30
|
-
quit(): void;
|
|
31
|
-
}
|
|
32
|
-
/** The host-tracked chrome record both targets render. */
|
|
33
|
-
export interface ChromeState {
|
|
34
|
-
status: string | null;
|
|
35
|
-
banner: Banner | null;
|
|
36
|
-
subtitle: string | null;
|
|
37
|
-
mode: string | null;
|
|
38
|
-
busy: boolean;
|
|
39
|
-
loaded: boolean;
|
|
40
|
-
lastRefresh: number;
|
|
41
|
-
}
|
|
42
|
-
/** A transport-agnostic request descriptor the host fulfills. The core never
|
|
43
|
-
* executes anything itself — it describes WHAT to run/read/fetch and the
|
|
44
|
-
* host's Transport decides HOW (local exec today, a cloud endpoint later). */
|
|
45
|
-
export type SourceRequest = {
|
|
46
|
-
kind: 'exec';
|
|
47
|
-
bin: string;
|
|
48
|
-
args: string[];
|
|
49
|
-
cwd?: string;
|
|
50
|
-
stdin?: string;
|
|
51
|
-
} | {
|
|
52
|
-
kind: 'file';
|
|
53
|
-
path: string;
|
|
54
|
-
} | {
|
|
55
|
-
kind: 'http';
|
|
56
|
-
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
57
|
-
url: string;
|
|
58
|
-
headers?: Record<string, string>;
|
|
59
|
-
body?: string;
|
|
60
|
-
};
|
|
61
|
-
export type StreamRole = 'controller' | 'observer';
|
|
62
|
-
export interface StreamRequest {
|
|
63
|
-
kind: 'stream';
|
|
64
|
-
target: string;
|
|
65
|
-
role?: StreamRole;
|
|
66
|
-
}
|
|
67
|
-
export interface StreamChannel {
|
|
68
|
-
readonly id: string;
|
|
69
|
-
send(frame: unknown): void;
|
|
70
|
-
close(): void;
|
|
71
|
-
}
|
|
72
|
-
export interface StreamSource<A = void> {
|
|
73
|
-
id: string;
|
|
74
|
-
request(args: A): StreamRequest;
|
|
75
|
-
onFrame: string;
|
|
76
|
-
onOpen?: string;
|
|
77
|
-
onClose?: string;
|
|
78
|
-
}
|
|
79
|
-
export interface RawResponse {
|
|
80
|
-
ok: boolean;
|
|
81
|
-
exitCode?: number;
|
|
82
|
-
status?: number;
|
|
83
|
-
stdout: string;
|
|
84
|
-
stderr: string;
|
|
85
|
-
}
|
|
86
|
-
/** Typed error with a render-ready display. Presenters render `display`
|
|
87
|
-
* VERBATIM and never branch on `kind` (the view-internal taxonomy). */
|
|
88
|
-
export interface SourceError {
|
|
89
|
-
kind: string;
|
|
90
|
-
display: {
|
|
91
|
-
headline: string;
|
|
92
|
-
explanation: string;
|
|
93
|
-
nextStep: string;
|
|
94
|
-
level: BannerLevel;
|
|
95
|
-
blocking: boolean;
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
export type Result<T> = {
|
|
99
|
-
ok: true;
|
|
100
|
-
data: T;
|
|
101
|
-
} | {
|
|
102
|
-
ok: false;
|
|
103
|
-
error: SourceError;
|
|
104
|
-
};
|
|
105
|
-
/** A READ: declarative descriptor + pure parse + optional cadence. Resolved by
|
|
106
|
-
* the host through its Transport via `ctx.resolve(source, args)`. */
|
|
107
|
-
export interface Source<T, A = void> {
|
|
108
|
-
id: string;
|
|
109
|
-
request(args: A): SourceRequest;
|
|
110
|
-
parse(raw: RawResponse): Result<T>;
|
|
111
|
-
refreshMs?: number;
|
|
112
|
-
}
|
|
113
|
-
/** A WRITE: same {request, parse} pair, no cadence — invoked by an intent via
|
|
114
|
-
* `ctx.execute(command, args)`. */
|
|
115
|
-
export interface Command<T, A = void> {
|
|
116
|
-
id: string;
|
|
117
|
-
request(args: A): SourceRequest;
|
|
118
|
-
parse(raw: RawResponse): Result<T>;
|
|
119
|
-
}
|
|
120
|
-
/** A semantic action. State updates are immutable via `ctx.set`; async effects
|
|
121
|
-
* (transport calls) live in the same handler — a thunk, not a pure reducer.
|
|
122
|
-
* Sync intents call `ctx.set` once; async intents `await ctx.resolve/execute`
|
|
123
|
-
* between `set`s. The host serializes async intents in its single-flight lane. */
|
|
124
|
-
export type Intent<S, P = void> = (ctx: IntentCtx<S>, payload: P) => void | Promise<void>;
|
|
125
|
-
export interface IntentCtx<S> {
|
|
126
|
-
/** Snapshot of state at read time. */
|
|
127
|
-
readonly state: S;
|
|
128
|
-
/** Immutable update → triggers a re-render. Value or (prev)=>next fn. */
|
|
129
|
-
set(next: S | ((prev: S) => S)): void;
|
|
130
|
-
/** Run a READ source through the host's transport → typed Result. */
|
|
131
|
-
resolve<T, A>(source: Source<T, A>, args?: A): Promise<Result<T>>;
|
|
132
|
-
/** Run a WRITE command through the host's transport → typed Result. */
|
|
133
|
-
execute<T, A>(command: Command<T, A>, args?: A): Promise<Result<T>>;
|
|
134
|
-
connect<A>(source: StreamSource<A>, args?: A): StreamChannel;
|
|
135
|
-
/** Semantic chrome signals (status/banner/subtitle/mode/quit). */
|
|
136
|
-
signal: HostSignals;
|
|
137
|
-
/** Chain another intent by name. */
|
|
138
|
-
dispatch(intent: string, payload?: unknown): Promise<void>;
|
|
139
|
-
}
|
|
140
|
-
export interface ViewCore<S = unknown> {
|
|
141
|
-
manifest: ViewManifest;
|
|
142
|
-
/** Cheap, synchronous initial state. No fetch, no screen. The host mounts,
|
|
143
|
-
* paints a loading frame, then dispatches the first 'refresh'. */
|
|
144
|
-
init(opts: Readonly<Record<string, string>>): S;
|
|
145
|
-
/** Declarative READ dependencies the host resolves through the transport. */
|
|
146
|
-
sources?: Record<string, Source<any, any>>;
|
|
147
|
-
streams?: Record<string, StreamSource<any>>;
|
|
148
|
-
/** WRITE descriptors invoked from intents. */
|
|
149
|
-
commands?: Record<string, Command<any, any>>;
|
|
150
|
-
/** Semantic actions. Both presenters emit these. */
|
|
151
|
-
intents: Record<string, Intent<S, any>>;
|
|
152
|
-
}
|
|
153
|
-
export interface KeyHint {
|
|
154
|
-
keys: string;
|
|
155
|
-
label: string;
|
|
156
|
-
}
|
|
157
|
-
/** A catalog binding supplies only its semantic hint label: the host derives
|
|
158
|
-
* the rendered key label from the effective user binding snapshot. */
|
|
159
|
-
export interface CatalogKeyHint {
|
|
160
|
-
label: string;
|
|
161
|
-
}
|
|
162
|
-
export type KeyBinding<S> = {
|
|
163
|
-
/** Closed crouter catalog action. Shipped presenters use this form. */
|
|
164
|
-
bindingId: import('../keybindings/index.js').BindingId;
|
|
165
|
-
intent: string;
|
|
166
|
-
payload?: (state: S) => unknown;
|
|
167
|
-
when?: (state: S) => boolean;
|
|
168
|
-
hint?: CatalogKeyHint;
|
|
169
|
-
} | {
|
|
170
|
-
/** Literal keys remain owned by custom/plugin views, outside crouter's catalog. */
|
|
171
|
-
keys: string[];
|
|
172
|
-
intent: string;
|
|
173
|
-
payload?: (state: S) => unknown;
|
|
174
|
-
when?: (state: S) => boolean;
|
|
175
|
-
hint?: KeyHint;
|
|
176
|
-
} | {
|
|
177
|
-
/** Text-capture binding: while `when(state)` is true the host runs a
|
|
178
|
-
* built-in line-edit buffer over raw printable keys and dispatches
|
|
179
|
-
* `capture` with the next draft value on each edit. Deletion is the
|
|
180
|
-
* host catalog action `crtr.view.host.editor.backspace`. */
|
|
181
|
-
capture: string;
|
|
182
|
-
when: (state: S) => boolean;
|
|
183
|
-
hint?: KeyHint | CatalogKeyHint;
|
|
184
|
-
};
|
|
185
|
-
export interface TuiPresenter<S = unknown> {
|
|
186
|
-
/** Pure read of state, paints via draw.*; never ANSI. */
|
|
187
|
-
render(state: S, draw: Draw, content: Rect): void;
|
|
188
|
-
/** Pure input→intent mapping. */
|
|
189
|
-
keymap: KeyBinding<S>[];
|
|
190
|
-
}
|
|
191
|
-
/** Props handed to web.jsx's default-export React component. The component is a
|
|
192
|
-
* pure function of state; DOM events call `dispatch`. (Typed loosely here so
|
|
193
|
-
* the core contract carries no React type dependency.) */
|
|
194
|
-
export interface ViewProps<S = unknown> {
|
|
195
|
-
state: S;
|
|
196
|
-
dispatch: (intent: string, payload?: unknown) => void;
|
|
197
|
-
chrome: ChromeState;
|
|
198
|
-
}
|
|
199
|
-
export type WebPresenter<S = unknown> = (props: ViewProps<S>) => unknown;
|
|
200
|
-
export interface TextPresenter<S = unknown> {
|
|
201
|
-
/** Static text for the non-TTY / piped path. Snapshot of current state. */
|
|
202
|
-
dump(state: S, ctx?: DumpContext): string;
|
|
203
|
-
}
|
|
204
|
-
export declare function ok<T>(data: T): Result<T>;
|
|
205
|
-
export declare function fail<T = never>(error: SourceError): Result<T>;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
// contract.ts — the dual-target view contract (portable core + thin presenters).
|
|
2
|
-
//
|
|
3
|
-
// One view definition renders to two targets — the tmux TUI (`crtr view run`)
|
|
4
|
-
// and a React+Tailwind web page (`crtr view serve`) — from ONE portable core.
|
|
5
|
-
// On disk a view is a directory of up to four files, each loaded only by the
|
|
6
|
-
// runtime that can execute it:
|
|
7
|
-
//
|
|
8
|
-
// <view>/
|
|
9
|
-
// core.mjs REQUIRED manifest · init · sources · commands · intents.
|
|
10
|
-
// Runs in BOTH Node and the browser. Imports NOTHING —
|
|
11
|
-
// no `node:*`, no crtr. Pure JS + the injected ctx.
|
|
12
|
-
// tui.mjs optional render(state, draw, content) + keymap (Node only)
|
|
13
|
-
// web.jsx optional default React component (Tailwind) (browser only)
|
|
14
|
-
// text.mjs optional dump(state, ctx) for the piped path (Node only)
|
|
15
|
-
//
|
|
16
|
-
// The invariant: ALL state + ALL behavior live in the core; presenters are pure
|
|
17
|
-
// reads of state that emit named intents. It is enforced structurally — only
|
|
18
|
-
// `core.mjs` ever sees a mutating `IntentCtx`; presenters receive `state` plus a
|
|
19
|
-
// `dispatch`/`keymap` that names intents, so a presenter has no path to data or
|
|
20
|
-
// logic.
|
|
21
|
-
// ── Result helpers (re-exported for view authors' convenience in tests) ─────
|
|
22
|
-
export function ok(data) { return { ok: true, data }; }
|
|
23
|
-
export function fail(error) { return { ok: false, error }; }
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { ViewCore, TuiPresenter, TextPresenter } from './contract.js';
|
|
2
|
-
export interface ResolvedView {
|
|
3
|
-
id: string;
|
|
4
|
-
dir: string;
|
|
5
|
-
scope: 'project' | 'user' | 'builtin';
|
|
6
|
-
core: string;
|
|
7
|
-
tui: string | null;
|
|
8
|
-
web: string | null;
|
|
9
|
-
text: string | null;
|
|
10
|
-
}
|
|
11
|
-
/** Scope search project→user→builtin; first hit wins. null if no scope holds a
|
|
12
|
-
* `<name>/core.mjs`. */
|
|
13
|
-
export declare function resolveView(name: string): ResolvedView | null;
|
|
14
|
-
/** Find a directory named `name` across scopes even when it holds no core.mjs —
|
|
15
|
-
* lets a caller distinguish "no such view" from "a dir that isn't a valid view"
|
|
16
|
-
* (e.g. a pre-contract `view.mjs`-only dir) and name the contract in the error. */
|
|
17
|
-
export declare function findViewDir(name: string): string | null;
|
|
18
|
-
/** Enumerate every resolvable core-shaped view across scopes (first scope wins
|
|
19
|
-
* per id). Targets per view are derivable from the tui/web/text fields. */
|
|
20
|
-
export declare function listViews(): ResolvedView[];
|
|
21
|
-
/** Import + validate the portable core. Throws a guided error if malformed. */
|
|
22
|
-
export declare function loadCore(r: ResolvedView): Promise<ViewCore>;
|
|
23
|
-
/** Import + validate the TUI presenter. Call requireTui first. */
|
|
24
|
-
export declare function loadTui(r: ResolvedView): Promise<TuiPresenter>;
|
|
25
|
-
/** Import the text presenter if present; null otherwise (the host synthesizes a
|
|
26
|
-
* generic one-line dump when a view ships no text.mjs). */
|
|
27
|
-
export declare function loadText(r: ResolvedView): Promise<TextPresenter | null>;
|
|
28
|
-
/** Per-host presenter validation: `view run` requires a TUI presenter. */
|
|
29
|
-
export declare function requireTui(r: ResolvedView): void;
|
|
30
|
-
/** Per-host presenter validation: `view serve` requires a web presenter. */
|
|
31
|
-
export declare function requireWeb(r: ResolvedView): void;
|
package/dist/core/view/loader.js
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
// loader.ts — resolve + load dual-target (core.mjs) views across scopes.
|
|
2
|
-
//
|
|
3
|
-
// A view = a directory containing `core.mjs` (the portable core). Up to three
|
|
4
|
-
// presenter files sit beside it: `tui.mjs` (Node), `web.jsx`/`web.tsx` (browser,
|
|
5
|
-
// via Vite — NEVER Node-imported), `text.mjs` (Node, piped path). Targets are
|
|
6
|
-
// derived from which presenter files exist — no manifest field.
|
|
7
|
-
//
|
|
8
|
-
// Resolution order: project → user → builtin, first hit wins (scope.ts
|
|
9
|
-
// viewsDir). Node-side loads are plain `import(pathToFileURL())` — no
|
|
10
|
-
// transpile, no bundle. A directory without a `core.mjs` is not a view.
|
|
11
|
-
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
12
|
-
import { join } from 'node:path';
|
|
13
|
-
import { pathToFileURL } from 'node:url';
|
|
14
|
-
import { viewsDir } from '../scope.js';
|
|
15
|
-
import { InputError } from '../io.js';
|
|
16
|
-
const SCOPE_ORDER = ['project', 'user', 'builtin'];
|
|
17
|
-
function probe(dir, scope, id) {
|
|
18
|
-
const core = join(dir, 'core.mjs');
|
|
19
|
-
if (!existsSync(core))
|
|
20
|
-
return null;
|
|
21
|
-
const tui = join(dir, 'tui.mjs');
|
|
22
|
-
const webJsx = join(dir, 'web.jsx');
|
|
23
|
-
const webTsx = join(dir, 'web.tsx');
|
|
24
|
-
const text = join(dir, 'text.mjs');
|
|
25
|
-
return {
|
|
26
|
-
id, dir, scope, core,
|
|
27
|
-
tui: existsSync(tui) ? tui : null,
|
|
28
|
-
web: existsSync(webJsx) ? webJsx : existsSync(webTsx) ? webTsx : null,
|
|
29
|
-
text: existsSync(text) ? text : null,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
/** Scope search project→user→builtin; first hit wins. null if no scope holds a
|
|
33
|
-
* `<name>/core.mjs`. */
|
|
34
|
-
export function resolveView(name) {
|
|
35
|
-
for (const scope of SCOPE_ORDER) {
|
|
36
|
-
const root = viewsDir(scope);
|
|
37
|
-
if (!root)
|
|
38
|
-
continue;
|
|
39
|
-
const r = probe(join(root, name), scope, name);
|
|
40
|
-
if (r)
|
|
41
|
-
return r;
|
|
42
|
-
}
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
/** Find a directory named `name` across scopes even when it holds no core.mjs —
|
|
46
|
-
* lets a caller distinguish "no such view" from "a dir that isn't a valid view"
|
|
47
|
-
* (e.g. a pre-contract `view.mjs`-only dir) and name the contract in the error. */
|
|
48
|
-
export function findViewDir(name) {
|
|
49
|
-
for (const scope of SCOPE_ORDER) {
|
|
50
|
-
const root = viewsDir(scope);
|
|
51
|
-
if (!root)
|
|
52
|
-
continue;
|
|
53
|
-
const dir = join(root, name);
|
|
54
|
-
try {
|
|
55
|
-
if (statSync(dir).isDirectory())
|
|
56
|
-
return dir;
|
|
57
|
-
}
|
|
58
|
-
catch { /* not here */ }
|
|
59
|
-
}
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
/** Enumerate every resolvable core-shaped view across scopes (first scope wins
|
|
63
|
-
* per id). Targets per view are derivable from the tui/web/text fields. */
|
|
64
|
-
export function listViews() {
|
|
65
|
-
const seen = new Set();
|
|
66
|
-
const out = [];
|
|
67
|
-
for (const scope of SCOPE_ORDER) {
|
|
68
|
-
const root = viewsDir(scope);
|
|
69
|
-
if (!root || !existsSync(root))
|
|
70
|
-
continue;
|
|
71
|
-
let names;
|
|
72
|
-
try {
|
|
73
|
-
names = readdirSync(root);
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
for (const name of names.sort()) {
|
|
79
|
-
if (seen.has(name))
|
|
80
|
-
continue; // first scope wins
|
|
81
|
-
const dir = join(root, name);
|
|
82
|
-
let isDir = false;
|
|
83
|
-
try {
|
|
84
|
-
isDir = statSync(dir).isDirectory();
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
isDir = false;
|
|
88
|
-
}
|
|
89
|
-
if (!isDir)
|
|
90
|
-
continue;
|
|
91
|
-
const r = probe(dir, scope, name);
|
|
92
|
-
if (!r)
|
|
93
|
-
continue;
|
|
94
|
-
seen.add(name);
|
|
95
|
-
out.push(r);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return out;
|
|
99
|
-
}
|
|
100
|
-
/** Import + validate the portable core. Throws a guided error if malformed. */
|
|
101
|
-
export async function loadCore(r) {
|
|
102
|
-
let mod;
|
|
103
|
-
try {
|
|
104
|
-
mod = (await import(pathToFileURL(r.core).href));
|
|
105
|
-
}
|
|
106
|
-
catch (e) {
|
|
107
|
-
throw guided(r, 'core.mjs', `failed to import: ${errText(e)}`);
|
|
108
|
-
}
|
|
109
|
-
const c = mod['default'];
|
|
110
|
-
if (!c || typeof c !== 'object')
|
|
111
|
-
throw guided(r, 'core.mjs', 'no default export that is a ViewCore object');
|
|
112
|
-
const m = c.manifest;
|
|
113
|
-
if (!m || typeof m.id !== 'string' || typeof m.title !== 'string') {
|
|
114
|
-
throw guided(r, 'core.mjs', 'manifest.id and manifest.title must be strings');
|
|
115
|
-
}
|
|
116
|
-
if (typeof c.init !== 'function')
|
|
117
|
-
throw guided(r, 'core.mjs', 'init() is required');
|
|
118
|
-
if (!c.intents || typeof c.intents !== 'object')
|
|
119
|
-
throw guided(r, 'core.mjs', 'intents must be an object of intent functions');
|
|
120
|
-
return c;
|
|
121
|
-
}
|
|
122
|
-
/** Import + validate the TUI presenter. Call requireTui first. */
|
|
123
|
-
export async function loadTui(r) {
|
|
124
|
-
if (!r.tui)
|
|
125
|
-
throw notTarget(r, 'tui');
|
|
126
|
-
let mod;
|
|
127
|
-
try {
|
|
128
|
-
mod = (await import(pathToFileURL(r.tui).href));
|
|
129
|
-
}
|
|
130
|
-
catch (e) {
|
|
131
|
-
throw guided(r, 'tui.mjs', `failed to import: ${errText(e)}`);
|
|
132
|
-
}
|
|
133
|
-
// Accept named exports { render, keymap } or a default-exported object.
|
|
134
|
-
const candidate = (typeof mod['render'] === 'function' ? mod : mod['default']);
|
|
135
|
-
if (!candidate || typeof candidate.render !== 'function')
|
|
136
|
-
throw guided(r, 'tui.mjs', 'render(state, draw, content) is required');
|
|
137
|
-
if (!Array.isArray(candidate.keymap))
|
|
138
|
-
throw guided(r, 'tui.mjs', 'keymap must be an array of key bindings');
|
|
139
|
-
return candidate;
|
|
140
|
-
}
|
|
141
|
-
/** Import the text presenter if present; null otherwise (the host synthesizes a
|
|
142
|
-
* generic one-line dump when a view ships no text.mjs). */
|
|
143
|
-
export async function loadText(r) {
|
|
144
|
-
if (!r.text)
|
|
145
|
-
return null;
|
|
146
|
-
let mod;
|
|
147
|
-
try {
|
|
148
|
-
mod = (await import(pathToFileURL(r.text).href));
|
|
149
|
-
}
|
|
150
|
-
catch (e) {
|
|
151
|
-
throw guided(r, 'text.mjs', `failed to import: ${errText(e)}`);
|
|
152
|
-
}
|
|
153
|
-
const candidate = (typeof mod['dump'] === 'function' ? mod : mod['default']);
|
|
154
|
-
if (!candidate || typeof candidate.dump !== 'function')
|
|
155
|
-
throw guided(r, 'text.mjs', 'dump(state, ctx) is required');
|
|
156
|
-
return candidate;
|
|
157
|
-
}
|
|
158
|
-
/** Per-host presenter validation: `view run` requires a TUI presenter. */
|
|
159
|
-
export function requireTui(r) {
|
|
160
|
-
if (!r.tui) {
|
|
161
|
-
throw new InputError({
|
|
162
|
-
error: 'view_web_only',
|
|
163
|
-
message: `'${r.id}' is web-only — it ships no tui.mjs presenter`,
|
|
164
|
-
next: 'Open it in the browser through the surface web server.',
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
/** Per-host presenter validation: `view serve` requires a web presenter. */
|
|
169
|
-
export function requireWeb(r) {
|
|
170
|
-
if (!r.web) {
|
|
171
|
-
throw new InputError({
|
|
172
|
-
error: 'view_tui_only',
|
|
173
|
-
message: `'${r.id}' is tui-only — it ships no web.jsx presenter`,
|
|
174
|
-
next: 'Open it in a tmux pane with the surface view run leaf.',
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
function notTarget(r, target) {
|
|
179
|
-
return new Error(`view "${r.id}" has no ${target} presenter`);
|
|
180
|
-
}
|
|
181
|
-
function guided(r, file, problem) {
|
|
182
|
-
return new Error(`invalid view "${r.id}" (${r.scope}) at ${join(r.dir, file)}: ${problem}.\n` +
|
|
183
|
-
'A dual-target view dir holds core.mjs (default export: { manifest: { id, title }, init(), intents }) ' +
|
|
184
|
-
'plus optional tui.mjs (render + keymap), web.jsx, text.mjs (dump).');
|
|
185
|
-
}
|
|
186
|
-
function errText(e) {
|
|
187
|
-
return e instanceof Error ? e.message : String(e);
|
|
188
|
-
}
|