@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,53 +0,0 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
/**
|
|
3
|
-
* Workspace Sidebar — the text presenter (`dump`) for the non-TTY / piped path
|
|
4
|
-
* (`crtr view run workspace-sidebar | cat`). Node-only, no ANSI. A plain
|
|
5
|
-
* snapshot of the current state; the host threads its current banner via `ctx`.
|
|
6
|
-
*
|
|
7
|
-
* `dump` reads the SAME logical `RailRow[]` the TUI/web presenters do. The pure
|
|
8
|
-
* `plural` helper is imported from `core.mjs`.
|
|
9
|
-
*
|
|
10
|
-
* @module workspace-sidebar/text
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { plural } from './core.mjs';
|
|
14
|
-
|
|
15
|
-
/** @typedef {import('./core.mjs').SidebarState} SidebarState */
|
|
16
|
-
/** @typedef {import('./core.mjs').RailRow} RailRow */
|
|
17
|
-
|
|
18
|
-
const STATUS_GLYPH = { active: '●', idle: '○', done: '✓', dead: '✗', canceled: '⊘' };
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Plain-text snapshot for the non-TTY / piped path.
|
|
22
|
-
* @param {SidebarState} state
|
|
23
|
-
* @param {import('../../core/view/contract.js').DumpContext} [ctx]
|
|
24
|
-
* @returns {string}
|
|
25
|
-
*/
|
|
26
|
-
export function dump(state, ctx) {
|
|
27
|
-
/** @type {string[]} */
|
|
28
|
-
const lines = ['Workspace sidebar'];
|
|
29
|
-
const banner = ctx && ctx.banner ? ctx.banner : null;
|
|
30
|
-
if (banner) lines.push('', `[${banner.level}] ${banner.msg}`);
|
|
31
|
-
else if (state.srcError) lines.push('', `[${state.srcError.display.level}] ${state.srcError.display.explanation}`);
|
|
32
|
-
|
|
33
|
-
lines.push('', `${plural(state.graphsHere, 'graph')} · ${state.nodesHere} nodes · ${plural(state.asksHere, 'ask')}`, '');
|
|
34
|
-
|
|
35
|
-
if (state.rows.length === 0) {
|
|
36
|
-
lines.push(state.srcError ? '(canvas unavailable)' : state.lastFetch === 0 ? '(loading…)' : '(no agents in this cwd)');
|
|
37
|
-
return lines.join('\n');
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
for (const r of state.rows) {
|
|
41
|
-
if (r.kind === 'header') {
|
|
42
|
-
lines.push(r.text);
|
|
43
|
-
} else if (r.kind === 'chrome') {
|
|
44
|
-
lines.push(r.text);
|
|
45
|
-
} else {
|
|
46
|
-
const mark = r.attached ? '▸ ' : ' ';
|
|
47
|
-
const glyph = STATUS_GLYPH[r.status] || '?';
|
|
48
|
-
const flag = r.asks > 0 ? ` ⚑${r.asks}` : '';
|
|
49
|
-
lines.push(`${mark}${r.prefix}${glyph} ${r.name}${flag}`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return lines.join('\n');
|
|
53
|
-
}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
/**
|
|
3
|
-
* Workspace Sidebar — the TUI presenter (`render` + `keymap`) for the
|
|
4
|
-
* `workspace-sidebar` view. Node-only (it uses the host's `Draw` API + the
|
|
5
|
-
* `_lib/states.mjs` draw helpers).
|
|
6
|
-
*
|
|
7
|
-
* `render` paints a two-section rail; keystrokes map to named intents through
|
|
8
|
-
* `keymap`. All state + data logic lives in `core.mjs`; this file is a pure
|
|
9
|
-
* read of the logical `RailRow[]`.
|
|
10
|
-
*
|
|
11
|
-
* VISUAL LANGUAGE (mirrors the `canvas` view): hierarchy via weight + hue +
|
|
12
|
-
* position, never boxes. Status glyph hues match `canvas browse` (active=green,
|
|
13
|
-
* idle=yellow, done=cyan, dead=red, canceled=grey; asks=bright-yellow). Color
|
|
14
|
-
* never carries meaning alone — every hue pairs with a glyph/weight (NO_COLOR-
|
|
15
|
-
* safe). The attached node carries a `▸` accent + bold name. ⚑N attention flags
|
|
16
|
-
* right-flush into a clean column.
|
|
17
|
-
*
|
|
18
|
-
* @module workspace-sidebar/tui
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import { loadingState, emptyState, notReadyState } from '../_lib/states.mjs';
|
|
22
|
-
|
|
23
|
-
/** @typedef {import('./core.mjs').SidebarState} SidebarState */
|
|
24
|
-
/** @typedef {import('./core.mjs').RailRow} RailRow */
|
|
25
|
-
|
|
26
|
-
// ── Status vocabulary (single source: core/canvas/browse/render.ts) ───────────
|
|
27
|
-
|
|
28
|
-
/** @type {Record<string,string>} */
|
|
29
|
-
const STATUS_GLYPH = { active: '●', idle: '○', done: '✓', dead: '✗', canceled: '⊘' };
|
|
30
|
-
|
|
31
|
-
/** Load-bearing status hue — NUMERIC SGR, matching `canvas browse` exactly. */
|
|
32
|
-
/** @type {Record<string,string>} */
|
|
33
|
-
const STATUS_FG = { active: '32', idle: '33', done: '36', dead: '31', canceled: '90' };
|
|
34
|
-
|
|
35
|
-
/** @param {string} status @returns {import('../../core/tui/draw.js').Style|undefined} */
|
|
36
|
-
function glyphStyle(status) {
|
|
37
|
-
const fg = STATUS_FG[status];
|
|
38
|
-
return fg ? { fg } : undefined; // hue only — the glyph SHAPE is the mono carrier
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** Name weight = hierarchy: live work LEADS in bold; terminal nodes recede dim.
|
|
42
|
-
* @param {string} status @param {boolean} attached
|
|
43
|
-
* @returns {import('../../core/tui/draw.js').Style|undefined} */
|
|
44
|
-
function nameStyle(status, attached) {
|
|
45
|
-
if (attached) return { fg: '36', bold: true }; // the attached node — cyan accent
|
|
46
|
-
if (status === 'active') return { bold: true };
|
|
47
|
-
if (status === 'done' || status === 'dead' || status === 'canceled') return { dim: true };
|
|
48
|
-
return undefined;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// ── RailRow → ListItemRow (left spans + right-flushed ⚑N) ──────────────────────
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Build one rail list row. A node row: 1-cell gutter (`▸` accent on the attached
|
|
55
|
-
* node, else blank), optional dim tree prefix, the status glyph (hue), the name
|
|
56
|
-
* (weight = status / accent when attached), and a right-flushed bright-yellow ⚑N
|
|
57
|
-
* when the node has pending asks.
|
|
58
|
-
* @param {RailRow} row
|
|
59
|
-
* @returns {import('../../core/tui/draw.js').ListItemRow}
|
|
60
|
-
*/
|
|
61
|
-
function rowToItem(row) {
|
|
62
|
-
if (row.kind === 'header') {
|
|
63
|
-
return { spans: [{ text: row.text, style: { fg: '36', bold: true } }] };
|
|
64
|
-
}
|
|
65
|
-
if (row.kind === 'chrome') {
|
|
66
|
-
return { spans: [{ text: row.text, style: { dim: true } }] };
|
|
67
|
-
}
|
|
68
|
-
// row.kind === 'node'
|
|
69
|
-
/** @type {import('../../core/tui/draw.js').Span[]} */
|
|
70
|
-
const spans = [
|
|
71
|
-
row.attached ? { text: '▸', style: { fg: '36', bold: true } } : { text: ' ' },
|
|
72
|
-
{ text: ' ' },
|
|
73
|
-
];
|
|
74
|
-
if (row.prefix) spans.push({ text: row.prefix, style: { dim: true } });
|
|
75
|
-
spans.push({ text: STATUS_GLYPH[row.status] || '?', style: glyphStyle(row.status) });
|
|
76
|
-
spans.push({ text: ' ' });
|
|
77
|
-
spans.push({ text: row.name, style: nameStyle(row.status, row.attached) });
|
|
78
|
-
if (row.asks > 0) {
|
|
79
|
-
return { spans, right: [{ text: `⚑${row.asks}`, style: { fg: '93', bold: true } }] };
|
|
80
|
-
}
|
|
81
|
-
return { spans };
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// ── render ─────────────────────────────────────────────────────────────────────
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Paint the rail, or one of the four standard states. Pure (reads state, calls
|
|
88
|
-
* draw.*); the only write is storing draw.list's adjusted scroll.
|
|
89
|
-
* @param {SidebarState} state
|
|
90
|
-
* @param {import('../../core/tui/draw.js').Draw} draw
|
|
91
|
-
* @param {import('../../core/tui/draw.js').Rect} content
|
|
92
|
-
*/
|
|
93
|
-
export function render(state, draw, content) {
|
|
94
|
-
if (content.width <= 0 || content.height <= 0) return;
|
|
95
|
-
|
|
96
|
-
if (state.rows.length === 0) {
|
|
97
|
-
// The copy comes from the typed SourceError's `display` VERBATIM (the
|
|
98
|
-
// contract display/kind split — we never branch on `kind`); only the glyph +
|
|
99
|
-
// hue are a presentation map off `display.level`.
|
|
100
|
-
if (state.srcError) {
|
|
101
|
-
const d = state.srcError.display;
|
|
102
|
-
const g = d.level === 'action' ? { glyph: '⊙', fg: '33' } : { glyph: '⚠', fg: '31' };
|
|
103
|
-
notReadyState(draw, content, {
|
|
104
|
-
glyph: g.glyph,
|
|
105
|
-
glyphFg: g.fg,
|
|
106
|
-
headline: d.headline,
|
|
107
|
-
explanation: d.explanation,
|
|
108
|
-
nextStep: d.nextStep,
|
|
109
|
-
});
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
if (state.lastFetch === 0) {
|
|
113
|
-
loadingState(draw, content, { rows: Math.min(5, content.height), label: 'Loading…' });
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
emptyState(draw, content, {
|
|
117
|
-
headline: 'No agents here',
|
|
118
|
-
secondary: ['Nothing started in this cwd.', 'Refresh to try again.'],
|
|
119
|
-
});
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const items = state.rows.map((r) => rowToItem(r));
|
|
124
|
-
const res = draw.list(content, items, state.cursor, state.scroll);
|
|
125
|
-
state.scroll = res.scroll; // store adjusted scroll back (Draw.list contract)
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// ── keymap ───────────────────────────────────────────────────────────────
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Move over node rows, open the selected node in the chat pane, refresh, or
|
|
132
|
-
* leave the view. Footer hints use the host-resolved binding gestures.
|
|
133
|
-
* @type {import('../../core/view/contract.js').KeyBinding<SidebarState>[]}
|
|
134
|
-
*/
|
|
135
|
-
export const keymap = [
|
|
136
|
-
{ bindingId: 'crtr.view.workspace-sidebar.down', intent: 'cursorDown', hint: { label: 'move' } },
|
|
137
|
-
{ bindingId: 'crtr.view.workspace-sidebar.up', intent: 'cursorUp' },
|
|
138
|
-
{ bindingId: 'crtr.view.workspace-sidebar.open', intent: 'open', hint: { label: 'open' } },
|
|
139
|
-
{ bindingId: 'crtr.view.workspace-sidebar.refresh', intent: 'refresh', hint: { label: 'refresh' } },
|
|
140
|
-
{ bindingId: 'crtr.view.workspace-sidebar.quit', intent: 'quit', hint: { label: 'quit' } },
|
|
141
|
-
];
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
/**
|
|
3
|
-
* Workspace Sidebar — the WEB presenter for the `workspace-sidebar` view (React
|
|
4
|
-
* + Tailwind). Browser-only: consumed solely by the web serve path (Vite owns
|
|
5
|
-
* JSX + Tailwind); NEVER Node-imported. The default export is a pure function of
|
|
6
|
-
* `state`; DOM events call `dispatch(intentName, payload?)`.
|
|
7
|
-
*
|
|
8
|
-
* Same logical model as the TUI presenter (`state.rows` + `state.cursor`) read
|
|
9
|
-
* from the SAME portable `core.mjs` — zero shared rendering code with `tui.mjs`.
|
|
10
|
-
* On the web there is no chat pane to drive, so the rail renders as a plain
|
|
11
|
-
* styled node list (this becomes the sidebar of the future crouter web UI): a
|
|
12
|
-
* click selects a row, ↵ no-ops via the core's `open` banner. The outer chrome
|
|
13
|
-
* (title / status / banner / chip) is rendered by `<ViewChrome>`, which wraps
|
|
14
|
-
* this component — do NOT render it here.
|
|
15
|
-
*
|
|
16
|
-
* @module workspace-sidebar/web
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { Loading, Empty, ErrorState, NotReady } from '@north-light/crouter/web';
|
|
20
|
-
|
|
21
|
-
/** @typedef {import('./core.mjs').SidebarState} SidebarState */
|
|
22
|
-
/** @typedef {import('./core.mjs').RailRow} RailRow */
|
|
23
|
-
|
|
24
|
-
// ── Status vocabulary (the web analog of tui.mjs's NUMERIC-SGR maps) ──────────
|
|
25
|
-
|
|
26
|
-
const STATUS = {
|
|
27
|
-
active: { glyph: '●', cls: 'text-green-600' },
|
|
28
|
-
idle: { glyph: '○', cls: 'text-amber-600' },
|
|
29
|
-
done: { glyph: '✓', cls: 'text-cyan-600' },
|
|
30
|
-
dead: { glyph: '✗', cls: 'text-red-600' },
|
|
31
|
-
canceled: { glyph: '⊘', cls: 'text-slate-400' },
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
/** @param {string} status @param {boolean} attached @returns {string} */
|
|
35
|
-
function nameCls(status, attached) {
|
|
36
|
-
if (attached) return 'font-bold text-cyan-700';
|
|
37
|
-
if (status === 'active') return 'font-semibold';
|
|
38
|
-
if (status === 'done' || status === 'dead' || status === 'canceled') return 'text-slate-400';
|
|
39
|
-
return '';
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// ── Rows (the web analog of tui.mjs's rowToItem) ───────────────────────────────
|
|
43
|
-
|
|
44
|
-
/** @param {{ row: RailRow, index: number, selected: boolean, onClick: () => void }} props */
|
|
45
|
-
function Row({ row, selected, onClick }) {
|
|
46
|
-
if (row.kind === 'header') {
|
|
47
|
-
return <li className="px-2 pt-3 pb-0.5 font-semibold text-cyan-700">{row.text}</li>;
|
|
48
|
-
}
|
|
49
|
-
if (row.kind === 'chrome') {
|
|
50
|
-
return <li className="px-2 text-slate-400">{row.text || '\u00a0'}</li>;
|
|
51
|
-
}
|
|
52
|
-
// row.kind === 'node'
|
|
53
|
-
const st = STATUS[row.status] || { glyph: '?', cls: 'text-slate-400' };
|
|
54
|
-
const base = `flex items-baseline gap-1 rounded px-2 py-0.5 cursor-pointer ${selected ? 'bg-slate-200' : 'hover:bg-slate-100'}`;
|
|
55
|
-
return (
|
|
56
|
-
<li className={base} onClick={onClick}>
|
|
57
|
-
<span className={`w-3 shrink-0 ${row.attached ? 'font-bold text-cyan-700' : ''}`}>{row.attached ? '▸' : '\u00a0'}</span>
|
|
58
|
-
{row.prefix ? <span className="whitespace-pre text-slate-400">{row.prefix}</span> : null}
|
|
59
|
-
<span className={st.cls}>{st.glyph}</span>
|
|
60
|
-
<span className={nameCls(row.status, row.attached)}>{row.name}</span>
|
|
61
|
-
{row.asks > 0 ? <span className="ml-auto shrink-0 font-bold text-amber-500">⚑{row.asks}</span> : null}
|
|
62
|
-
</li>
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// ── The view ───────────────────────────────────────────────────────────────────
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* @param {import('../../core/view/contract.js').ViewProps<SidebarState>} props
|
|
70
|
-
*/
|
|
71
|
-
export default function WorkspaceSidebar({ state, dispatch }) {
|
|
72
|
-
if (state.rows.length === 0) {
|
|
73
|
-
// The copy comes from the typed SourceError's `display` VERBATIM (the
|
|
74
|
-
// contract display/kind split — never branch on `kind`); only the four-state
|
|
75
|
-
// component is a presentation map off `display.level` so the hue matches the
|
|
76
|
-
// TUI (error → red ErrorState, action → amber NotReady).
|
|
77
|
-
if (state.srcError) {
|
|
78
|
-
const d = state.srcError.display;
|
|
79
|
-
const Takeover = d.level === 'error' ? ErrorState : NotReady;
|
|
80
|
-
return (
|
|
81
|
-
<Takeover
|
|
82
|
-
headline={d.headline}
|
|
83
|
-
explanation={d.explanation}
|
|
84
|
-
nextStep={d.nextStep}
|
|
85
|
-
onRetry={() => dispatch('refresh')}
|
|
86
|
-
/>
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
if (state.lastFetch === 0) return <Loading label="Loading…" />;
|
|
90
|
-
return <Empty label="No agents in this cwd." />;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return (
|
|
94
|
-
<ul
|
|
95
|
-
className="font-mono text-sm outline-none"
|
|
96
|
-
tabIndex={0}
|
|
97
|
-
onKeyDown={(e) => {
|
|
98
|
-
if (e.key === 'j' || e.key === 'ArrowDown') { dispatch('cursorDown'); e.preventDefault(); }
|
|
99
|
-
else if (e.key === 'k' || e.key === 'ArrowUp') { dispatch('cursorUp'); e.preventDefault(); }
|
|
100
|
-
else if (e.key === 'Enter') { dispatch('open'); e.preventDefault(); }
|
|
101
|
-
else if (e.key === 'g') { dispatch('refresh'); }
|
|
102
|
-
}}
|
|
103
|
-
>
|
|
104
|
-
{state.rows.map((row, i) => (
|
|
105
|
-
<Row key={i} row={row} index={i} selected={i === state.cursor} onClick={() => dispatch('select', i)} />
|
|
106
|
-
))}
|
|
107
|
-
</ul>
|
|
108
|
-
);
|
|
109
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { AttachSession } from './context.js';
|
|
2
|
-
export type Mode = 'normal' | 'spec' | 'plan';
|
|
3
|
-
export declare function nextMode(current: Mode): Mode;
|
|
4
|
-
/** Resolve the mode badge's initial state. Remote never reads the local
|
|
5
|
-
* mode-switch `current` file for `nodeId` — always starts 'normal'. */
|
|
6
|
-
export declare function resolveInitialMode(cwd: string, nodeId: string, remote: boolean, readMode?: (cwd: string, nodeId: string) => Mode | undefined): Mode;
|
|
7
|
-
/** Handle a configured mode-cycle request. Remote no-ops entirely (returns `false`,
|
|
8
|
-
* so the caller leaves `modeState`/the badge untouched) — there is no
|
|
9
|
-
* remote-safe mode-switch protocol, and writing the local `request.json` for a
|
|
10
|
-
* remote node id would target the wrong (or a colliding local) node. */
|
|
11
|
-
export declare function requestModeSwitch(cwd: string, nodeId: string, remote: boolean, mode: Mode, writeRequest?: (cwd: string, nodeId: string, mode: Mode) => void): boolean;
|
|
12
|
-
/** The live badge: the viewer's current mode plus the one way to change it.
|
|
13
|
-
* Owning both here is what keeps `mode` from being a mutable the key handler
|
|
14
|
-
* and the editor painter both reach into. */
|
|
15
|
-
export interface ModeBadge {
|
|
16
|
-
/** Advance to the next mode and repaint. A read-only viewer no-ops entirely,
|
|
17
|
-
* badge included: a REMOTE attach has no remote-safe mode-switch protocol,
|
|
18
|
-
* and an OBSERVER may not change the node's mode at all. */
|
|
19
|
-
cycle: () => void;
|
|
20
|
-
}
|
|
21
|
-
/** Resolve the initial mode, paint the badge, and return the cycle verb. */
|
|
22
|
-
export declare function createModeBadge(ctx: Pick<AttachSession, 'nodeId' | 'remote' | 'role' | 'meta' | 'tui' | 'editor'>): ModeBadge;
|
|
23
|
-
/** The badge chip painted for each mode: spec is blue, plan is amber, normal is
|
|
24
|
-
* unstyled (no badge chrome when there is nothing to say). */
|
|
25
|
-
export declare function modeBadgeStyle(mode: Mode): (s: string) => string;
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
// session/mode.ts — the viewer's spec/plan/normal mode badge and the on-disk
|
|
2
|
-
// mode-switch handshake with the broker.
|
|
3
|
-
//
|
|
4
|
-
// The viewer never mutates engine mode directly: it drops a `request.json` in
|
|
5
|
-
// the node's mode dir (atomic tmp+rename) and reads the
|
|
6
|
-
// broker-written `current` file back for the badge. Both are LOCAL-ONLY reads
|
|
7
|
-
// keyed on `nodeId` — a remote attach (`--canvas`) must never touch them, so
|
|
8
|
-
// every exported entry point takes the session's single `remote` flag rather
|
|
9
|
-
// than re-deriving it.
|
|
10
|
-
import { randomUUID } from 'node:crypto';
|
|
11
|
-
import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
12
|
-
import { join } from 'node:path';
|
|
13
|
-
import { nodeDir } from '../../../core/canvas/paths.js';
|
|
14
|
-
const MODE_CYCLE = ['normal', 'spec', 'plan'];
|
|
15
|
-
function modeSwitchDir(_cwd, nodeId) {
|
|
16
|
-
return join(nodeDir(nodeId), 'mode');
|
|
17
|
-
}
|
|
18
|
-
function modeSwitchRequestPath(cwd, nodeId) {
|
|
19
|
-
return join(modeSwitchDir(cwd, nodeId), 'request.json');
|
|
20
|
-
}
|
|
21
|
-
function modeSwitchCurrentPath(cwd, nodeId) {
|
|
22
|
-
return join(modeSwitchDir(cwd, nodeId), 'current');
|
|
23
|
-
}
|
|
24
|
-
function readCurrentMode(cwd, nodeId) {
|
|
25
|
-
try {
|
|
26
|
-
const raw = readFileSync(modeSwitchCurrentPath(cwd, nodeId), 'utf8').trim();
|
|
27
|
-
return MODE_CYCLE.includes(raw) ? raw : undefined;
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
return undefined;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function writeModeRequest(cwd, nodeId, mode) {
|
|
34
|
-
const dir = modeSwitchDir(cwd, nodeId);
|
|
35
|
-
mkdirSync(dir, { recursive: true });
|
|
36
|
-
const token = randomUUID();
|
|
37
|
-
const tmp = join(dir, `request.${token}.tmp`);
|
|
38
|
-
writeFileSync(tmp, `${JSON.stringify({ mode, token, source: 'attach' })}\n`);
|
|
39
|
-
renameSync(tmp, modeSwitchRequestPath(cwd, nodeId));
|
|
40
|
-
}
|
|
41
|
-
export function nextMode(current) {
|
|
42
|
-
const idx = MODE_CYCLE.indexOf(current);
|
|
43
|
-
return MODE_CYCLE[(idx + 1) % MODE_CYCLE.length];
|
|
44
|
-
}
|
|
45
|
-
/** Resolve the mode badge's initial state. Remote never reads the local
|
|
46
|
-
* mode-switch `current` file for `nodeId` — always starts 'normal'. */
|
|
47
|
-
export function resolveInitialMode(cwd, nodeId, remote, readMode = readCurrentMode) {
|
|
48
|
-
if (remote)
|
|
49
|
-
return 'normal';
|
|
50
|
-
return readMode(cwd, nodeId) ?? 'normal';
|
|
51
|
-
}
|
|
52
|
-
/** Handle a configured mode-cycle request. Remote no-ops entirely (returns `false`,
|
|
53
|
-
* so the caller leaves `modeState`/the badge untouched) — there is no
|
|
54
|
-
* remote-safe mode-switch protocol, and writing the local `request.json` for a
|
|
55
|
-
* remote node id would target the wrong (or a colliding local) node. */
|
|
56
|
-
export function requestModeSwitch(cwd, nodeId, remote, mode, writeRequest = writeModeRequest) {
|
|
57
|
-
if (remote)
|
|
58
|
-
return false;
|
|
59
|
-
writeRequest(cwd, nodeId, mode);
|
|
60
|
-
return true;
|
|
61
|
-
}
|
|
62
|
-
/** Resolve the initial mode, paint the badge, and return the cycle verb. */
|
|
63
|
-
export function createModeBadge(ctx) {
|
|
64
|
-
const { nodeId, remote, role, meta, tui, editor } = ctx;
|
|
65
|
-
let mode = resolveInitialMode(meta.cwd, nodeId, remote);
|
|
66
|
-
const paint = () => {
|
|
67
|
-
editor.mode = mode === 'normal' ? '' : mode;
|
|
68
|
-
editor.modeStyle = modeBadgeStyle(mode);
|
|
69
|
-
};
|
|
70
|
-
paint();
|
|
71
|
-
return {
|
|
72
|
-
cycle: () => {
|
|
73
|
-
// The mode request rewrites how the node's engine behaves, so it rides the
|
|
74
|
-
// session's fixed capability like every other mutation: an observer reads
|
|
75
|
-
// the badge the broker publishes and changes nothing.
|
|
76
|
-
if (role !== 'controller')
|
|
77
|
-
return;
|
|
78
|
-
const next = nextMode(mode);
|
|
79
|
-
if (!requestModeSwitch(meta.cwd, nodeId, remote, next))
|
|
80
|
-
return;
|
|
81
|
-
mode = next;
|
|
82
|
-
paint();
|
|
83
|
-
tui.requestRender();
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
/** The badge chip painted for each mode: spec is blue, plan is amber, normal is
|
|
88
|
-
* unstyled (no badge chrome when there is nothing to say). */
|
|
89
|
-
export function modeBadgeStyle(mode) {
|
|
90
|
-
if (mode === 'spec') {
|
|
91
|
-
return (s) => `\x1b[44m\x1b[97m\x1b[1m ${s} \x1b[0m`;
|
|
92
|
-
}
|
|
93
|
-
if (mode === 'plan') {
|
|
94
|
-
return (s) => `\x1b[48;2;228;152;68m\x1b[30m\x1b[1m ${s} \x1b[0m`;
|
|
95
|
-
}
|
|
96
|
-
return (s) => s;
|
|
97
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import { defineLeaf } from '../../core/command.js';
|
|
3
|
-
import { startWebServer } from '../../clients/web/server.js';
|
|
4
|
-
const DEFAULT_PORT = 7878;
|
|
5
|
-
const PROMPT_STUDIO_PATH = '/views/prompt-review';
|
|
6
|
-
function openBrowser(url) {
|
|
7
|
-
const [cmd, args] = process.platform === 'darwin'
|
|
8
|
-
? ['open', [url]]
|
|
9
|
-
: process.platform === 'win32'
|
|
10
|
-
? ['cmd', ['/c', 'start', '', url]]
|
|
11
|
-
: ['xdg-open', [url]];
|
|
12
|
-
try {
|
|
13
|
-
const child = spawn(cmd, args, { stdio: 'ignore', detached: true });
|
|
14
|
-
child.on('error', () => {
|
|
15
|
-
/* the printed URL is enough when no browser opener is available */
|
|
16
|
-
});
|
|
17
|
-
child.unref();
|
|
18
|
-
}
|
|
19
|
-
catch {
|
|
20
|
-
/* the printed URL is enough when no browser opener is available */
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
export const sysPromptStudioLeaf = defineLeaf({
|
|
24
|
-
name: 'promptstudio',
|
|
25
|
-
description: 'open Prompt Studio in the browser',
|
|
26
|
-
whenToUse: 'you want the Prompt Studio browser UI — a prompt review surface for toggling crouter persona/mode/lifecycle configs, inspecting the assembled system prompt, comparing configurations, and exporting review comments with source-file pointers.',
|
|
27
|
-
help: {
|
|
28
|
-
name: 'sys promptstudio',
|
|
29
|
-
summary: 'start the crouter web server and open Prompt Studio directly',
|
|
30
|
-
params: [
|
|
31
|
-
{ kind: 'flag', name: 'port', type: 'int', required: false, default: DEFAULT_PORT, constraint: `TCP port to bind on 127.0.0.1. Default ${DEFAULT_PORT}.` },
|
|
32
|
-
{ kind: 'flag', name: 'dev', type: 'bool', required: false, default: false, constraint: 'Serve the web shell through Vite middleware/HMR while iterating on Prompt Studio or the web client.' },
|
|
33
|
-
],
|
|
34
|
-
output: [
|
|
35
|
-
{ name: 'url', type: 'string', required: true, constraint: 'Prompt Studio URL opened in the browser.' },
|
|
36
|
-
],
|
|
37
|
-
outputKind: 'object',
|
|
38
|
-
effects: [
|
|
39
|
-
'Binds the same long-running local web server as the surface web serve leaf, opens `/views/prompt-review` in the default browser, and keeps serving until ctrl+c/SIGTERM.',
|
|
40
|
-
'The server is a crtrd `/v1/*` reverse-proxy shell (identical to `surface web serve`) hosting the Prompt Studio SPA; it opens no canvas.db, so crtrd must be running.',
|
|
41
|
-
],
|
|
42
|
-
},
|
|
43
|
-
run: async (input) => {
|
|
44
|
-
const port = input['port'] ?? DEFAULT_PORT;
|
|
45
|
-
const dev = input['dev'] ?? false;
|
|
46
|
-
const server = await startWebServer({ port, dev });
|
|
47
|
-
const url = `${server.url}${PROMPT_STUDIO_PATH}`;
|
|
48
|
-
process.stdout.write(`Prompt Studio serving at ${url}${dev ? ' (--dev: Vite middleware)' : ''}\n` +
|
|
49
|
-
` api proxy: ${server.url}/v1/* → crtrd\n` +
|
|
50
|
-
` events (SSE): GET ${server.url}/__crtr/events\n` +
|
|
51
|
-
` shell assets: ${dev ? 'Vite middleware (HMR)' : server.clientDir}\n` +
|
|
52
|
-
` (ctrl+c to stop)\n`);
|
|
53
|
-
openBrowser(url);
|
|
54
|
-
await new Promise((resolveShutdown) => {
|
|
55
|
-
const shutdown = () => {
|
|
56
|
-
void server.close().then(() => resolveShutdown());
|
|
57
|
-
};
|
|
58
|
-
process.once('SIGINT', shutdown);
|
|
59
|
-
process.once('SIGTERM', shutdown);
|
|
60
|
-
process.once('SIGHUP', shutdown);
|
|
61
|
-
});
|
|
62
|
-
return { url };
|
|
63
|
-
},
|
|
64
|
-
render: () => '',
|
|
65
|
-
});
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
// `crtr surface view cycle` — switch the view hosted in a monitor pane to the
|
|
2
|
-
// next/prev available view, in place. Backs the Alt+V then ] (next) / Alt+V
|
|
3
|
-
// then [ (prev) chord installed by installViewNavBindings, mirroring how
|
|
4
|
-
// `surface node cycle` backs Alt+] / Alt+[ for the node graph (view = the bracket
|
|
5
|
-
// grammar namespaced under the Alt+V view prefix).
|
|
6
|
-
//
|
|
7
|
-
// A view monitor pane is self-identifying: `view run` tags it with the tmux
|
|
8
|
-
// pane option @crtr_view=<id>. Cycle reads that tag, computes the next/prev id
|
|
9
|
-
// in `listViews()` order (the SAME set `view list` enumerates), and respawns
|
|
10
|
-
// the pane on the surface-view run command — `respawn-pane -k` kills the current
|
|
11
|
-
// view process and re-execs in the SAME pane (cycle itself runs in tmux's
|
|
12
|
-
// run-shell context, NOT inside the pane, so the kill never targets the caller).
|
|
13
|
-
// The respawned run re-tags the pane, so a rapid re-cycle reads the right id.
|
|
14
|
-
//
|
|
15
|
-
// tmux-only; a pane with no @crtr_view tag (not a view monitor) is a no-op.
|
|
16
|
-
// Output is discarded by the keybinding, so this just acts.
|
|
17
|
-
import { defineLeaf } from '../core/command.js';
|
|
18
|
-
import { listViews, resolveView, loadCore } from '../core/view/loader.js';
|
|
19
|
-
// Commands reach the tmux driver through placement-tmux.ts (the pure tmux seam,
|
|
20
|
-
// §5.1) — never `./tmux.js` directly, and not placement.ts (which reaches the
|
|
21
|
-
// canvas focuses table a CLI leaf must not touch).
|
|
22
|
-
import { inTmux, currentTmux, getPaneOption, setPaneOption, paneCurrentPath, respawnPaneSync, piCommand, } from '../core/runtime/placement-tmux.js';
|
|
23
|
-
export const viewCycleLeaf = defineLeaf({
|
|
24
|
-
name: 'cycle',
|
|
25
|
-
description: 'switch the monitor pane to the next/prev view in place',
|
|
26
|
-
whenToUse: 'flipping a view monitor to the next or previous available view without re-running a command (bound to Alt+V then ] forward / Alt+V then [ back). The pane must already be hosting a view and the view list must contain a different target. Use run to open a specific view, or list to see the cycle order',
|
|
27
|
-
help: {
|
|
28
|
-
name: 'view cycle',
|
|
29
|
-
summary: 'switch the view hosted in a monitor pane to the next/previous available view, in place — the views walked one monitor at a time, in `view list` order (bound to Alt+V then ] forward / Alt+V then [ back)',
|
|
30
|
-
params: [
|
|
31
|
-
{ kind: 'flag', name: 'dir', type: 'enum', choices: ['next', 'prev'], required: false, default: 'next', constraint: 'Direction along the view list: next (Alt+V then ]) or prev (Alt+V then [). Wraps at the ends.' },
|
|
32
|
-
{ kind: 'flag', name: 'pane', type: 'string', required: false, constraint: 'tmux pane to cycle. Defaults to $TMUX_PANE / your current pane. The Alt+V then ]/[ bindings pass this for you.' },
|
|
33
|
-
],
|
|
34
|
-
output: [
|
|
35
|
-
{ name: 'cycled', type: 'boolean', required: true, constraint: 'True when the pane was switched to another view.' },
|
|
36
|
-
{ name: 'view', type: 'string', required: false, constraint: 'The view now hosted in the pane.' },
|
|
37
|
-
{ name: 'from', type: 'string', required: false, constraint: 'The view it switched away from (absent when the pane was not a view monitor).' },
|
|
38
|
-
],
|
|
39
|
-
outputKind: 'object',
|
|
40
|
-
effects: [
|
|
41
|
-
'Respawns the target pane in place running the next view; the prior view process is replaced.',
|
|
42
|
-
'Re-tags the pane @crtr_view=<next-id>. No-op outside tmux or when the pane is not a view monitor.',
|
|
43
|
-
],
|
|
44
|
-
},
|
|
45
|
-
run: async (input) => {
|
|
46
|
-
if (!inTmux())
|
|
47
|
-
return { cycled: false };
|
|
48
|
-
const dir = (input['dir'] ?? 'next');
|
|
49
|
-
const pane = input['pane'] ?? process.env['TMUX_PANE'] ?? currentTmux()?.pane;
|
|
50
|
-
if (pane === undefined || pane === '')
|
|
51
|
-
return { cycled: false };
|
|
52
|
-
// Self-identification: only a pane `view run` tagged is a view monitor.
|
|
53
|
-
const current = getPaneOption(pane, '@crtr_view');
|
|
54
|
-
if (current === undefined || current === '')
|
|
55
|
-
return { cycled: false };
|
|
56
|
-
const ids = listViews().map((v) => v.id); // SAME set + order as `view list`
|
|
57
|
-
if (ids.length < 2)
|
|
58
|
-
return { cycled: false, from: current };
|
|
59
|
-
// Build the candidate order: views after `current` in `dir`, wrapping. If
|
|
60
|
-
// `current` was renamed/removed (i === -1) start at the head (next) / tail
|
|
61
|
-
// (prev) so the cycle lands on the FIRST available view (m3). Then advance
|
|
62
|
-
// past any view that fails to load, so a malformed view never closes the
|
|
63
|
-
// monitor on respawn (m4) — bounded to one full lap.
|
|
64
|
-
const n = ids.length;
|
|
65
|
-
const mod = (x) => ((x % n) + n) % n;
|
|
66
|
-
const step = dir === 'next' ? 1 : -1;
|
|
67
|
-
const i = ids.indexOf(current);
|
|
68
|
-
const candidates = [];
|
|
69
|
-
if (i === -1) {
|
|
70
|
-
const startIdx = dir === 'next' ? 0 : n - 1;
|
|
71
|
-
for (let k = 0; k < n; k++)
|
|
72
|
-
candidates.push(ids[mod(startIdx + step * k)]);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
for (let k = 1; k < n; k++)
|
|
76
|
-
candidates.push(ids[mod(i + step * k)]);
|
|
77
|
-
}
|
|
78
|
-
let targetId;
|
|
79
|
-
for (const cand of candidates) {
|
|
80
|
-
if (cand === current)
|
|
81
|
-
continue;
|
|
82
|
-
const rv = resolveView(cand);
|
|
83
|
-
if (rv === null)
|
|
84
|
-
continue;
|
|
85
|
-
try {
|
|
86
|
-
await loadCore(rv);
|
|
87
|
-
targetId = cand;
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
catch { /* skip malformed */ }
|
|
91
|
-
}
|
|
92
|
-
if (targetId === undefined)
|
|
93
|
-
return { cycled: false, from: current };
|
|
94
|
-
// Replay the connection params the monitor was opened with (M2): a view
|
|
95
|
-
// configured with --port/--target keeps them across a cycle, so a round-trip
|
|
96
|
-
// doesn't silently drop e.g. the LinkedIn view's CDP port. Params stick to
|
|
97
|
-
// the MONITOR (pane), not the view, and are harmless to views that ignore them.
|
|
98
|
-
const keepPort = getPaneOption(pane, '@crtr_view_port');
|
|
99
|
-
const keepTarget = getPaneOption(pane, '@crtr_view_target');
|
|
100
|
-
const argv = ['surface', 'view', 'run', targetId];
|
|
101
|
-
if (keepPort !== undefined && keepPort !== '')
|
|
102
|
-
argv.push('--port', keepPort);
|
|
103
|
-
if (keepTarget !== undefined && keepTarget !== '')
|
|
104
|
-
argv.push('--target', keepTarget);
|
|
105
|
-
// Preserve the monitor's cwd so project-scoped views still resolve.
|
|
106
|
-
const cwd = paneCurrentPath(pane) ?? process.cwd();
|
|
107
|
-
const command = piCommand(argv, 'crtr');
|
|
108
|
-
const ok = respawnPaneSync({ pane, cwd, env: {}, command });
|
|
109
|
-
if (!ok)
|
|
110
|
-
return { cycled: false, from: current };
|
|
111
|
-
// The respawned `view run` re-tags @crtr_view (+ params), but set them now
|
|
112
|
-
// too so a rapid re-cycle reads the right state before the new run boots.
|
|
113
|
-
try {
|
|
114
|
-
setPaneOption(pane, '@crtr_view', targetId);
|
|
115
|
-
setPaneOption(pane, '@crtr_view_port', keepPort ?? '');
|
|
116
|
-
setPaneOption(pane, '@crtr_view_target', keepTarget ?? '');
|
|
117
|
-
}
|
|
118
|
-
catch { /* best-effort */ }
|
|
119
|
-
return { cycled: true, view: targetId, from: current };
|
|
120
|
-
},
|
|
121
|
-
render: (r) => {
|
|
122
|
-
if (r['cycled'] === true) {
|
|
123
|
-
return `Cycled the monitor to view "${r['view']}" (from "${r['from']}").`;
|
|
124
|
-
}
|
|
125
|
-
if (r['from'] !== undefined) {
|
|
126
|
-
return `No other view to switch to — the pane is still on "${r['from']}".`;
|
|
127
|
-
}
|
|
128
|
-
return 'Nothing to cycle — this pane is not hosting a view.';
|
|
129
|
-
},
|
|
130
|
-
});
|