@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.
Files changed (670) hide show
  1. package/dist/api/client.d.ts +37 -11
  2. package/dist/api/client.js +84 -15
  3. package/dist/api/dto/human.d.ts +53 -39
  4. package/dist/api/dto/human.js +2 -3
  5. package/dist/api/dto/inbox.d.ts +0 -1
  6. package/dist/api/dto/nodes.d.ts +12 -0
  7. package/dist/api/dto/review-comments.d.ts +137 -0
  8. package/dist/api/dto/review-comments.js +5 -0
  9. package/dist/api/dto/reviews.d.ts +109 -0
  10. package/dist/api/dto/reviews.js +5 -0
  11. package/dist/api/index.d.ts +2 -0
  12. package/dist/api/index.js +2 -0
  13. package/dist/api/routes.d.ts +17 -4
  14. package/dist/api/routes.js +21 -5
  15. package/dist/build-root.d.ts +1 -16
  16. package/dist/build-root.js +1 -25
  17. package/dist/builtin-memory/00-runtime-base.md +7 -5
  18. package/dist/builtin-memory/04-base-worker.md +1 -1
  19. package/dist/builtin-memory/04-orchestration-kernel.md +7 -7
  20. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -1
  21. package/dist/builtin-memory/05-kinds/design/01-orchestrator.md +1 -1
  22. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -1
  23. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -1
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -1
  25. package/dist/builtin-memory/05-kinds/plan/01-orchestrator.md +1 -1
  26. package/dist/builtin-memory/05-kinds/review/00-base.md +1 -1
  27. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +20 -0
  28. package/dist/builtin-memory/05-kinds/spec/00-base.md +3 -7
  29. package/dist/builtin-memory/05-kinds/spec/01-orchestrator.md +3 -3
  30. package/dist/builtin-memory/05-kinds/spec/requirements.md +3 -3
  31. package/dist/builtin-memory/design.md +2 -2
  32. package/dist/builtin-memory/insights/capture.md +50 -0
  33. package/dist/builtin-memory/insights/init.md +45 -0
  34. package/dist/builtin-memory/insights/listen.md +9 -0
  35. package/dist/builtin-memory/internal/agent-shaping.md +2 -2
  36. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  37. package/dist/builtin-memory/internal/plugins.md +12 -11
  38. package/dist/builtin-memory/internal/storage-tiers.md +2 -2
  39. package/dist/builtin-memory/{planning.md → plan/roadmap.md} +3 -3
  40. package/dist/builtin-memory/plan.md +19 -0
  41. package/dist/builtin-memory/spec/guide.md +38 -0
  42. package/dist/builtin-memory/spec/requirements.md +31 -0
  43. package/dist/builtin-memory/spec/roadmap.md +35 -0
  44. package/dist/builtin-memory/spec.md +10 -86
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +3 -4
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +49 -5
  47. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +56 -0
  48. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +920 -0
  49. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +221 -156
  50. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +4 -5
  51. package/dist/cli.js +2 -6
  52. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +7 -35
  53. package/dist/clients/attach/__tests__/attach-keybindings.test.js +32 -16
  54. package/dist/clients/attach/__tests__/context-message.test.js +142 -6
  55. package/dist/clients/attach/__tests__/crtr-output.test.js +29 -45
  56. package/dist/clients/attach/__tests__/diagram.test.js +1 -1
  57. package/dist/clients/attach/__tests__/file-review-focus.test.js +48 -0
  58. package/dist/clients/attach/__tests__/group-activity.test.js +266 -0
  59. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +32 -0
  60. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +32 -0
  61. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +1 -2
  62. package/dist/clients/attach/chrome/header.d.ts +10 -0
  63. package/dist/clients/attach/chrome/header.js +30 -0
  64. package/dist/clients/attach/chrome/recap.d.ts +7 -0
  65. package/dist/clients/attach/chrome/recap.js +19 -0
  66. package/dist/clients/attach/chrome/status-line.d.ts +3 -0
  67. package/dist/clients/attach/chrome/status-line.js +5 -0
  68. package/dist/clients/attach/chrome/widgets.js +11 -21
  69. package/dist/clients/attach/command.js +11 -7
  70. package/dist/clients/attach/config.d.ts +4 -0
  71. package/dist/clients/attach/config.js +3 -0
  72. package/dist/clients/attach/input/controller.d.ts +19 -0
  73. package/dist/clients/attach/input/controller.js +62 -28
  74. package/dist/clients/attach/input/titled-editor.d.ts +0 -4
  75. package/dist/clients/attach/input/titled-editor.js +2 -10
  76. package/dist/clients/attach/overlays/file-review.d.ts +9 -5
  77. package/dist/clients/attach/overlays/file-review.js +9 -70
  78. package/dist/clients/attach/overlays/help.d.ts +33 -0
  79. package/dist/clients/attach/overlays/help.js +204 -0
  80. package/dist/clients/attach/render/activity-slot.d.ts +4 -0
  81. package/dist/clients/attach/render/activity-slot.js +13 -0
  82. package/dist/clients/attach/render/chat-view.d.ts +117 -12
  83. package/dist/clients/attach/render/chat-view.js +604 -135
  84. package/dist/clients/attach/render/context-message.d.ts +2 -1
  85. package/dist/clients/attach/render/context-message.js +17 -13
  86. package/dist/clients/attach/render/crtr-output.js +1 -3
  87. package/dist/clients/attach/render/diagram.js +2 -2
  88. package/dist/clients/attach/render/edit-diff.d.ts +4 -1
  89. package/dist/clients/attach/render/edit-diff.js +7 -11
  90. package/dist/clients/attach/render/group-activity.d.ts +32 -0
  91. package/dist/clients/attach/render/group-activity.js +206 -0
  92. package/dist/clients/attach/render/group-recap.d.ts +10 -0
  93. package/dist/clients/attach/render/group-recap.js +93 -0
  94. package/dist/clients/attach/render/html-markdown.d.ts +17 -0
  95. package/dist/clients/attach/render/html-markdown.js +228 -0
  96. package/dist/clients/attach/render/measured-container.d.ts +96 -0
  97. package/dist/clients/attach/render/measured-container.js +322 -0
  98. package/dist/clients/attach/render/scroll-animation.d.ts +8 -0
  99. package/dist/clients/attach/render/scroll-animation.js +80 -0
  100. package/dist/clients/attach/render/tool-calls.js +6 -6
  101. package/dist/clients/attach/render/transcript-copy.d.ts +9 -0
  102. package/dist/clients/attach/render/transcript-copy.js +81 -0
  103. package/dist/clients/attach/render/viewport.d.ts +29 -0
  104. package/dist/clients/attach/render/viewport.js +159 -0
  105. package/dist/clients/attach/session/bindings.d.ts +10 -7
  106. package/dist/clients/attach/session/bindings.js +23 -8
  107. package/dist/clients/attach/session/connection.js +4 -5
  108. package/dist/clients/attach/session/context.d.ts +6 -4
  109. package/dist/clients/attach/session/frame.d.ts +34 -0
  110. package/dist/clients/attach/session/frame.js +176 -0
  111. package/dist/clients/attach/session/frames.d.ts +4 -1
  112. package/dist/clients/attach/session/frames.js +14 -1
  113. package/dist/clients/attach/session/identity.js +4 -3
  114. package/dist/clients/attach/session/input-wiring.d.ts +14 -4
  115. package/dist/clients/attach/session/input-wiring.js +15 -13
  116. package/dist/clients/attach/session/invariant.d.ts +9 -0
  117. package/dist/clients/attach/session/invariant.js +15 -0
  118. package/dist/clients/attach/session/keys.d.ts +10 -2
  119. package/dist/clients/attach/session/keys.js +13 -5
  120. package/dist/clients/attach/session/layout.d.ts +10 -8
  121. package/dist/clients/attach/session/layout.js +33 -34
  122. package/dist/clients/attach/session/mouse.d.ts +18 -0
  123. package/dist/clients/attach/session/mouse.js +64 -0
  124. package/dist/clients/attach/session/pane-tag.d.ts +3 -0
  125. package/dist/clients/attach/session/pane-tag.js +51 -8
  126. package/dist/clients/attach/session/reconnect.d.ts +3 -0
  127. package/dist/clients/attach/session/reconnect.js +42 -5
  128. package/dist/clients/attach/session/surface-frame.d.ts +20 -0
  129. package/dist/clients/attach/session/surface-frame.js +73 -0
  130. package/dist/clients/attach/session/surface-host.d.ts +64 -0
  131. package/dist/clients/attach/session/surface-host.js +255 -0
  132. package/dist/clients/attach/session/whip.d.ts +17 -0
  133. package/dist/clients/attach/session/whip.js +334 -0
  134. package/dist/clients/attach/slash/dispatch.d.ts +13 -1
  135. package/dist/clients/attach/slash/dispatch.js +51 -29
  136. package/dist/clients/attach/viewer.js +907 -819
  137. package/dist/clients/conversation/conversation.d.ts +65 -0
  138. package/dist/clients/conversation/conversation.js +318 -0
  139. package/dist/clients/conversation/frames.d.ts +30 -0
  140. package/dist/clients/conversation/frames.js +52 -0
  141. package/dist/clients/conversation/region.d.ts +51 -0
  142. package/dist/clients/conversation/region.js +265 -0
  143. package/dist/clients/conversation/submit.d.ts +38 -0
  144. package/dist/clients/conversation/submit.js +51 -0
  145. package/dist/clients/inbox/__tests__/inbox-controller.test.js +247 -0
  146. package/dist/clients/inbox/__tests__/mount-panel.test.js +776 -0
  147. package/dist/clients/inbox/controller.d.ts +79 -0
  148. package/dist/clients/inbox/controller.js +448 -0
  149. package/dist/clients/inbox/deck-adapter.d.ts +29 -0
  150. package/dist/clients/inbox/deck-adapter.js +62 -0
  151. package/dist/clients/inbox/layout.d.ts +8 -0
  152. package/dist/clients/inbox/layout.js +9 -0
  153. package/dist/clients/inbox/resolve.d.ts +10 -0
  154. package/dist/clients/inbox/resolve.js +34 -0
  155. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +29 -0
  156. package/dist/clients/inbox/review/__tests__/remap.test.js +196 -0
  157. package/dist/clients/inbox/review/__tests__/review-core.test.js +341 -0
  158. package/dist/clients/inbox/review/anchors.d.ts +41 -0
  159. package/dist/clients/inbox/review/anchors.js +89 -0
  160. package/dist/clients/inbox/review/columns.d.ts +22 -0
  161. package/dist/clients/inbox/review/columns.js +40 -0
  162. package/dist/clients/inbox/review/comments-client.d.ts +66 -0
  163. package/dist/clients/inbox/review/comments-client.js +98 -0
  164. package/dist/clients/inbox/review/composition.d.ts +60 -0
  165. package/dist/clients/inbox/review/composition.js +278 -0
  166. package/dist/clients/inbox/review/document-region.d.ts +120 -0
  167. package/dist/clients/inbox/review/document-region.js +902 -0
  168. package/dist/clients/inbox/review/frame.d.ts +45 -0
  169. package/dist/clients/inbox/review/frame.js +215 -0
  170. package/dist/clients/inbox/review/keys.d.ts +67 -0
  171. package/dist/clients/inbox/review/keys.js +130 -0
  172. package/dist/clients/inbox/review/launch.d.ts +10 -0
  173. package/dist/clients/inbox/review/launch.js +129 -0
  174. package/dist/clients/inbox/review/live-source.d.ts +24 -0
  175. package/dist/clients/inbox/review/live-source.js +160 -0
  176. package/dist/clients/inbox/review/nvim.d.ts +13 -0
  177. package/dist/clients/inbox/review/nvim.js +42 -0
  178. package/dist/clients/inbox/review/remap.d.ts +51 -0
  179. package/dist/clients/inbox/review/remap.js +157 -0
  180. package/dist/clients/inbox/review/review-client.d.ts +30 -0
  181. package/dist/clients/inbox/review/review-client.js +107 -0
  182. package/dist/clients/inbox/review/roundtrip.d.ts +5 -0
  183. package/dist/clients/inbox/review/roundtrip.js +36 -0
  184. package/dist/clients/inbox/review/state.d.ts +143 -0
  185. package/dist/clients/inbox/review/state.js +282 -0
  186. package/dist/clients/inbox/review-adapter.d.ts +29 -0
  187. package/dist/clients/inbox/review-adapter.js +92 -0
  188. package/dist/clients/inbox/review-visibility.d.ts +5 -0
  189. package/dist/clients/inbox/review-visibility.js +19 -0
  190. package/dist/clients/inbox/surface.d.ts +19 -0
  191. package/dist/clients/inbox/surface.js +128 -0
  192. package/dist/clients/inbox/tui/ansi.d.ts +66 -0
  193. package/dist/clients/inbox/tui/ansi.js +317 -0
  194. package/dist/clients/inbox/tui/clipboard.d.ts +2 -0
  195. package/dist/clients/inbox/tui/clipboard.js +26 -0
  196. package/dist/clients/inbox/tui/input.d.ts +7 -0
  197. package/dist/clients/inbox/tui/input.js +653 -0
  198. package/dist/clients/inbox/tui/keys.d.ts +28 -0
  199. package/dist/clients/inbox/tui/keys.js +111 -0
  200. package/dist/clients/inbox/tui/panel.d.ts +2 -0
  201. package/dist/clients/inbox/tui/panel.js +217 -0
  202. package/dist/clients/inbox/tui/render.d.ts +37 -0
  203. package/dist/clients/inbox/tui/render.js +476 -0
  204. package/dist/clients/inbox/tui/types.d.ts +57 -0
  205. package/dist/clients/inbox/tui/types.js +1 -0
  206. package/dist/clients/inbox/tui.d.ts +6 -0
  207. package/dist/clients/inbox/tui.js +74 -0
  208. package/dist/clients/surfaces/host.d.ts +66 -0
  209. package/dist/clients/surfaces/host.js +1 -0
  210. package/dist/clients/surfaces/region.d.ts +16 -0
  211. package/dist/clients/surfaces/region.js +1 -0
  212. package/dist/clients/web/__tests__/push-engine.test.js +14 -158
  213. package/dist/clients/web/dev-server.d.ts +3 -3
  214. package/dist/clients/web/dev-server.js +9 -23
  215. package/dist/clients/web/events.js +4 -6
  216. package/dist/clients/web/push-engine.d.ts +2 -66
  217. package/dist/clients/web/push-engine.js +30 -161
  218. package/dist/clients/web/push-registry.d.ts +0 -4
  219. package/dist/clients/web/push-registry.js +2 -7
  220. package/dist/clients/web/server.js +3 -35
  221. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -108
  222. package/dist/clients/web/web-cmd.js +2 -2
  223. package/dist/commands/__tests__/human.test.js +27 -15
  224. package/dist/commands/api-client.js +3 -3
  225. package/dist/commands/canvas-browse.js +1 -1
  226. package/dist/commands/canvas-issue.js +1 -1
  227. package/dist/commands/canvas-use.js +1 -1
  228. package/dist/commands/human/doc.d.ts +2 -0
  229. package/dist/commands/human/doc.js +98 -0
  230. package/dist/commands/human/inbox.d.ts +2 -0
  231. package/dist/commands/human/inbox.js +101 -0
  232. package/dist/commands/human/prompts.d.ts +2 -3
  233. package/dist/commands/human/prompts.js +27 -180
  234. package/dist/commands/human/queue.d.ts +1 -5
  235. package/dist/commands/human/queue.js +54 -216
  236. package/dist/commands/human/review.d.ts +2 -0
  237. package/dist/commands/human/review.js +298 -0
  238. package/dist/commands/human/shared.d.ts +2 -69
  239. package/dist/commands/human/shared.js +1 -181
  240. package/dist/commands/human.js +15 -20
  241. package/dist/commands/memory/__tests__/lint.test.d.ts +1 -0
  242. package/dist/commands/memory/__tests__/lint.test.js +15 -0
  243. package/dist/commands/memory/delete.js +2 -2
  244. package/dist/commands/memory/lint.d.ts +1 -0
  245. package/dist/commands/memory/lint.js +21 -3
  246. package/dist/commands/memory/read.js +4 -4
  247. package/dist/commands/node.js +8 -7
  248. package/dist/commands/pkg/plugin-manage.js +143 -68
  249. package/dist/commands/surface-inspect.js +2 -2
  250. package/dist/commands/surface.js +6 -12
  251. package/dist/commands/sys/__tests__/setup-core.test.js +9 -5
  252. package/dist/commands/sys/__tests__/setup-front-door.test.js +7 -42
  253. package/dist/commands/sys/config.js +29 -3
  254. package/dist/commands/sys/feedback.js +1 -1
  255. package/dist/commands/sys/setup-core.d.ts +12 -11
  256. package/dist/commands/sys/setup-core.js +55 -46
  257. package/dist/commands/sys/setup-wizard.d.ts +4 -1
  258. package/dist/commands/sys/setup-wizard.js +50 -9
  259. package/dist/commands/sys/sync-deps.js +1 -1
  260. package/dist/commands/sys.js +4 -6
  261. package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -1
  262. package/dist/core/__tests__/broker-snapshot-history.test.js +9 -1
  263. package/dist/core/__tests__/dead-node-policy-table.test.js +3 -4
  264. package/dist/core/__tests__/fixtures/fake-engine.d.ts +8 -5
  265. package/dist/core/__tests__/fixtures/fake-engine.js +28 -2
  266. package/dist/core/__tests__/full/broker-provider-retry.test.js +87 -2
  267. package/dist/core/__tests__/full/broker-whip-interrupt.test.d.ts +1 -0
  268. package/dist/core/__tests__/full/broker-whip-interrupt.test.js +39 -0
  269. package/dist/core/__tests__/full/detach-focus.test.js +1 -1
  270. package/dist/core/__tests__/human-deliver-e2e.test.js +64 -64
  271. package/dist/core/__tests__/human-deliver.test.js +71 -345
  272. package/dist/core/__tests__/inline-memory-refs.test.js +2 -12
  273. package/dist/core/__tests__/memory-resolver-precedence.test.js +12 -15
  274. package/dist/core/__tests__/migration.test.js +10 -0
  275. package/dist/core/__tests__/model-pin-durability.test.js +14 -0
  276. package/dist/core/__tests__/phase4-review-migration.test.d.ts +1 -0
  277. package/dist/core/__tests__/phase4-review-migration.test.js +100 -0
  278. package/dist/core/__tests__/phase4-review-store.test.d.ts +1 -0
  279. package/dist/core/__tests__/phase4-review-store.test.js +143 -0
  280. package/dist/core/__tests__/remote-canvas-target.test.js +2 -2
  281. package/dist/core/__tests__/revive.test.js +22 -53
  282. package/dist/core/__tests__/session-cycles.test.js +48 -18
  283. package/dist/core/__tests__/spawn-no-kickoff.test.js +8 -12
  284. package/dist/core/__tests__/stop-guard.test.js +16 -1
  285. package/dist/core/__tests__/tmux-surface.test.js +21 -25
  286. package/dist/core/asset-root.d.ts +7 -0
  287. package/dist/core/asset-root.js +18 -0
  288. package/dist/core/broker-client/client.d.ts +0 -7
  289. package/dist/core/broker-client/client.js +4 -10
  290. package/dist/core/broker-client/transport-relay.d.ts +3 -4
  291. package/dist/core/broker-client/transport-relay.js +3 -4
  292. package/dist/core/canvas/__tests__/attention.test.js +1 -1
  293. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +1 -1
  294. package/dist/core/canvas/__tests__/remote-transport.test.d.ts +1 -0
  295. package/dist/core/{view/__tests__/transport-remote.test.js → canvas/__tests__/remote-transport.test.js} +2 -2
  296. package/dist/core/canvas/__tests__/render-remote.test.js +1 -1
  297. package/dist/core/canvas/attention.js +4 -4
  298. package/dist/core/canvas/canvas.d.ts +6 -11
  299. package/dist/core/canvas/canvas.js +11 -33
  300. package/dist/core/canvas/db.js +207 -38
  301. package/dist/core/canvas/extensions.d.ts +1 -1
  302. package/dist/core/canvas/extensions.js +8 -1
  303. package/dist/core/canvas/index.d.ts +0 -1
  304. package/dist/core/canvas/index.js +0 -1
  305. package/dist/core/canvas/nav-model.d.ts +1 -1
  306. package/dist/core/canvas/nav-model.js +1 -1
  307. package/dist/core/canvas/paths.d.ts +5 -0
  308. package/dist/core/canvas/paths.js +16 -0
  309. package/dist/core/canvas/remote-canvas-source.js +2 -2
  310. package/dist/core/canvas/remote-transport.d.ts +7 -0
  311. package/dist/core/{view/transport-remote.js → canvas/remote-transport.js} +3 -4
  312. package/dist/core/canvas/source.js +1 -1
  313. package/dist/core/canvas/status-glyph.js +4 -12
  314. package/dist/core/canvas/types.d.ts +10 -35
  315. package/dist/core/clipboard-text.d.ts +8 -0
  316. package/dist/core/clipboard-text.js +18 -0
  317. package/dist/core/command-manifests/registry.d.ts +1 -3
  318. package/dist/core/command-plugins/bundle.d.ts +29 -0
  319. package/dist/core/command-plugins/bundle.js +198 -0
  320. package/dist/core/command-plugins/discovery.d.ts +0 -8
  321. package/dist/core/command-plugins/discovery.js +2 -39
  322. package/dist/core/command-plugins/transport/http-fetch.d.ts +4 -30
  323. package/dist/core/command-plugins/transport/http-fetch.js +17 -95
  324. package/dist/core/command.d.ts +1 -13
  325. package/dist/core/command.js +1 -16
  326. package/dist/core/config.d.ts +4 -0
  327. package/dist/core/config.js +28 -3
  328. package/dist/core/document-lines.d.ts +4 -0
  329. package/dist/core/document-lines.js +6 -0
  330. package/dist/core/feed/feed.d.ts +2 -0
  331. package/dist/core/feed/feed.js +11 -7
  332. package/dist/core/human/__tests__/inbox-cancel-worker.d.ts +1 -0
  333. package/dist/core/human/__tests__/inbox-cancel-worker.js +7 -0
  334. package/dist/core/human/__tests__/inbox-claim-worker.d.ts +1 -0
  335. package/dist/core/human/__tests__/inbox-claim-worker.js +17 -0
  336. package/dist/core/human/__tests__/inbox-core.test.d.ts +1 -0
  337. package/dist/core/human/__tests__/inbox-core.test.js +144 -0
  338. package/dist/core/human/__tests__/inbox-stale-claim-worker.d.ts +1 -0
  339. package/dist/core/human/__tests__/inbox-stale-claim-worker.js +8 -0
  340. package/dist/core/human/__tests__/visible-paths.test.d.ts +1 -0
  341. package/dist/{clients/attach → core/human}/__tests__/visible-paths.test.js +9 -0
  342. package/dist/core/human/claim.d.ts +23 -0
  343. package/dist/core/human/claim.js +67 -0
  344. package/dist/core/human/convention.d.ts +30 -0
  345. package/dist/core/human/convention.js +202 -0
  346. package/dist/core/human/deck-factories.d.ts +8 -0
  347. package/dist/core/human/deck-factories.js +15 -0
  348. package/dist/core/human/deck-schema.d.ts +70 -0
  349. package/dist/core/human/deck-schema.js +92 -0
  350. package/dist/core/human/root.d.ts +7 -0
  351. package/dist/core/human/root.js +37 -0
  352. package/dist/core/human/scan.d.ts +3 -0
  353. package/dist/core/human/scan.js +76 -0
  354. package/dist/core/human/summary.d.ts +8 -0
  355. package/dist/core/human/summary.js +44 -0
  356. package/dist/core/human/tickets.d.ts +49 -0
  357. package/dist/core/human/tickets.js +190 -0
  358. package/dist/core/human/types.d.ts +136 -0
  359. package/dist/core/human/types.js +5 -0
  360. package/dist/{clients/attach → core/human}/visible-paths.d.ts +1 -1
  361. package/dist/{clients/attach → core/human}/visible-paths.js +3 -2
  362. package/dist/core/inspector/chrome.d.ts +6 -0
  363. package/dist/core/inspector/chrome.js +14 -0
  364. package/dist/core/inspector/contract.d.ts +105 -0
  365. package/dist/core/inspector/contract.js +1 -0
  366. package/dist/core/inspector/core.d.ts +4 -5
  367. package/dist/core/inspector/core.js +3 -5
  368. package/dist/core/inspector/host.d.ts +46 -0
  369. package/dist/core/{tui → inspector}/host.js +42 -208
  370. package/dist/core/inspector/text.d.ts +2 -2
  371. package/dist/core/inspector/transport.d.ts +6 -0
  372. package/dist/core/inspector/transport.js +36 -0
  373. package/dist/core/inspector/tui.d.ts +2 -2
  374. package/dist/core/inspector/tui.js +15 -15
  375. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +11 -11
  376. package/dist/core/keybindings/__tests__/resolve.test.js +10 -19
  377. package/dist/core/keybindings/attach-control.d.ts +9 -3
  378. package/dist/core/keybindings/attach-control.js +3 -1
  379. package/dist/core/keybindings/catalog.d.ts +6 -5
  380. package/dist/core/keybindings/catalog.js +61 -133
  381. package/dist/core/keybindings/inbox.d.ts +5 -6
  382. package/dist/core/keybindings/inbox.js +9 -10
  383. package/dist/core/keybindings/index.d.ts +3 -3
  384. package/dist/core/keybindings/index.js +3 -3
  385. package/dist/core/keybindings/persistence.d.ts +5 -1
  386. package/dist/core/keybindings/persistence.js +24 -6
  387. package/dist/core/keybindings/resolve.d.ts +6 -0
  388. package/dist/core/keybindings/resolve.js +10 -3
  389. package/dist/core/memory/inline-ref-grammar.js +2 -3
  390. package/dist/core/memory-resolver.d.ts +27 -29
  391. package/dist/core/memory-resolver.js +45 -39
  392. package/dist/core/model-routes.d.ts +33 -0
  393. package/dist/core/model-routes.js +42 -3
  394. package/dist/core/preview-registry.js +17 -55
  395. package/dist/core/profiles/select.js +3 -3
  396. package/dist/core/{view/remote-canvas-target.d.ts → remote-canvas-target.d.ts} +2 -2
  397. package/dist/core/{view/remote-canvas-target.js → remote-canvas-target.js} +4 -4
  398. package/dist/core/review/__tests__/capture-origin.test.d.ts +1 -0
  399. package/dist/core/review/__tests__/capture-origin.test.js +139 -0
  400. package/dist/core/review/__tests__/comments.test.d.ts +1 -0
  401. package/dist/core/review/__tests__/comments.test.js +98 -0
  402. package/dist/core/review/__tests__/project.test.d.ts +1 -0
  403. package/dist/core/review/__tests__/project.test.js +71 -0
  404. package/dist/core/review/__tests__/remap.test.d.ts +1 -0
  405. package/dist/core/review/__tests__/remap.test.js +159 -0
  406. package/dist/core/review/__tests__/stage-identity.test.d.ts +1 -0
  407. package/dist/core/review/__tests__/stage-identity.test.js +140 -0
  408. package/dist/core/review/birth.d.ts +7 -0
  409. package/dist/core/review/birth.js +23 -0
  410. package/dist/core/review/comments.d.ts +69 -0
  411. package/dist/core/review/comments.js +295 -0
  412. package/dist/core/review/companion.d.ts +35 -0
  413. package/dist/core/review/companion.js +205 -0
  414. package/dist/core/review/document.d.ts +27 -0
  415. package/dist/core/review/document.js +138 -0
  416. package/dist/core/review/project.d.ts +13 -0
  417. package/dist/core/review/project.js +58 -0
  418. package/dist/core/review/realize.d.ts +19 -0
  419. package/dist/core/review/realize.js +217 -0
  420. package/dist/core/review/remap.d.ts +24 -0
  421. package/dist/core/review/remap.js +156 -0
  422. package/dist/core/review/signal.d.ts +5 -0
  423. package/dist/core/review/signal.js +31 -0
  424. package/dist/core/review/stage.d.ts +26 -0
  425. package/dist/core/review/stage.js +184 -0
  426. package/dist/core/review/store.d.ts +46 -0
  427. package/dist/core/review/store.js +163 -0
  428. package/dist/core/review/ticket-filter.d.ts +17 -0
  429. package/dist/core/review/ticket-filter.js +32 -0
  430. package/dist/core/review/types.d.ts +130 -0
  431. package/dist/core/review/types.js +23 -0
  432. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +1 -0
  433. package/dist/core/runtime/__tests__/session-visibility.test.js +119 -0
  434. package/dist/core/runtime/bearings.d.ts +5 -17
  435. package/dist/core/runtime/bearings.js +88 -71
  436. package/dist/core/runtime/broker-protocol.d.ts +31 -8
  437. package/dist/core/runtime/broker.d.ts +15 -1
  438. package/dist/core/runtime/broker.js +573 -141
  439. package/dist/core/runtime/canvas-extensions.d.ts +4 -5
  440. package/dist/core/runtime/canvas-extensions.js +5 -5
  441. package/dist/core/runtime/front-door.js +4 -4
  442. package/dist/core/runtime/headless-pi.d.ts +24 -0
  443. package/dist/core/runtime/headless-pi.js +152 -0
  444. package/dist/core/runtime/kickoff.d.ts +1 -5
  445. package/dist/core/runtime/kickoff.js +1 -5
  446. package/dist/core/runtime/model-registry.d.ts +3 -0
  447. package/dist/core/runtime/model-registry.js +13 -0
  448. package/dist/core/runtime/naming-persist.d.ts +4 -0
  449. package/dist/core/runtime/naming-persist.js +27 -1
  450. package/dist/core/runtime/naming.d.ts +17 -12
  451. package/dist/core/runtime/naming.js +91 -140
  452. package/dist/core/runtime/node-read.js +19 -10
  453. package/dist/core/runtime/nodes.d.ts +9 -14
  454. package/dist/core/runtime/nodes.js +3 -53
  455. package/dist/core/runtime/package-health.d.ts +6 -21
  456. package/dist/core/runtime/package-health.js +12 -123
  457. package/dist/core/runtime/placement-tmux.d.ts +2 -1
  458. package/dist/core/runtime/placement-tmux.js +6 -4
  459. package/dist/core/runtime/placement.d.ts +1 -0
  460. package/dist/core/runtime/placement.js +4 -8
  461. package/dist/core/runtime/promote.js +3 -0
  462. package/dist/core/runtime/recap.d.ts +2 -7
  463. package/dist/core/runtime/recap.js +35 -69
  464. package/dist/core/runtime/revive.js +34 -77
  465. package/dist/core/runtime/session-cycles.d.ts +4 -0
  466. package/dist/core/runtime/session-cycles.js +14 -1
  467. package/dist/core/runtime/session-visibility.d.ts +37 -0
  468. package/dist/core/runtime/session-visibility.js +83 -0
  469. package/dist/core/runtime/spawn.js +10 -22
  470. package/dist/core/runtime/stop-guard.d.ts +1 -1
  471. package/dist/core/runtime/stop-guard.js +18 -13
  472. package/dist/core/runtime/surface-bg.js +1 -1
  473. package/dist/core/runtime/tmux-chrome.d.ts +1 -1
  474. package/dist/core/runtime/tmux-chrome.js +1 -1
  475. package/dist/core/runtime/tmux.d.ts +35 -7
  476. package/dist/core/runtime/tmux.js +439 -62
  477. package/dist/core/runtime/tool-group-summary.d.ts +19 -0
  478. package/dist/core/runtime/tool-group-summary.js +88 -0
  479. package/dist/core/scope.d.ts +2 -7
  480. package/dist/core/scope.js +9 -35
  481. package/dist/core/substrate/schema.d.ts +2 -2
  482. package/dist/core/termrender/code-doc.d.ts +12 -0
  483. package/dist/core/termrender/code-doc.js +92 -0
  484. package/dist/core/termrender/display.d.ts +12 -0
  485. package/dist/core/termrender/display.js +19 -0
  486. package/dist/core/termrender/termrender.d.ts +73 -0
  487. package/dist/core/termrender/termrender.js +795 -0
  488. package/dist/core/termrender/version.d.ts +1 -0
  489. package/dist/core/termrender/version.js +1 -0
  490. package/dist/core/tui/terminal.js +1 -2
  491. package/dist/core/user-settings.d.ts +71 -3
  492. package/dist/core/user-settings.js +83 -1
  493. package/dist/daemon/api/__tests__/inbox.test.js +44 -133
  494. package/dist/daemon/api/handlers/human.d.ts +0 -10
  495. package/dist/daemon/api/handlers/human.js +104 -702
  496. package/dist/daemon/api/handlers/inbox.js +113 -142
  497. package/dist/daemon/api/handlers/review-comments.d.ts +2 -0
  498. package/dist/daemon/api/handlers/review-comments.js +500 -0
  499. package/dist/daemon/api/handlers/reviews.d.ts +2 -0
  500. package/dist/daemon/api/handlers/reviews.js +287 -0
  501. package/dist/daemon/api/map.d.ts +22 -7
  502. package/dist/daemon/api/map.js +159 -11
  503. package/dist/daemon/api/server.js +4 -0
  504. package/dist/daemon/cron-run.js +6 -9
  505. package/dist/daemon/crtrd.js +17 -33
  506. package/dist/daemon/fleet.d.ts +1 -8
  507. package/dist/daemon/fleet.js +4 -30
  508. package/dist/daemon/human/finish.d.ts +14 -0
  509. package/dist/daemon/human/finish.js +115 -0
  510. package/dist/daemon/human/sweep.d.ts +6 -0
  511. package/dist/daemon/human/sweep.js +49 -0
  512. package/dist/daemon/messaging/node-message.d.ts +18 -0
  513. package/dist/daemon/messaging/node-message.js +70 -0
  514. package/dist/daemon/review/comment-notify.d.ts +26 -0
  515. package/dist/daemon/review/comment-notify.js +107 -0
  516. package/dist/daemon/review/deliver.d.ts +7 -0
  517. package/dist/daemon/review/deliver.js +56 -0
  518. package/dist/daemon/review/finish.d.ts +22 -0
  519. package/dist/daemon/review/finish.js +254 -0
  520. package/dist/daemon/review/sweep.d.ts +11 -0
  521. package/dist/daemon/review/sweep.js +120 -0
  522. package/dist/index.d.ts +2 -0
  523. package/dist/index.js +2 -2
  524. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +42 -64
  525. package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +1 -0
  526. package/dist/pi-extensions/__tests__/canvas-recap.test.js +159 -0
  527. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +16 -38
  528. package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +1 -0
  529. package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +63 -0
  530. package/dist/pi-extensions/canvas-context-intro.d.ts +8 -11
  531. package/dist/pi-extensions/canvas-context-intro.js +50 -104
  532. package/dist/pi-extensions/canvas-recap.d.ts +15 -2
  533. package/dist/pi-extensions/canvas-recap.js +192 -69
  534. package/dist/pi-extensions/canvas-review-boundary.d.ts +59 -0
  535. package/dist/pi-extensions/canvas-review-boundary.js +81 -0
  536. package/dist/pi-extensions/canvas-stophook.d.ts +3 -3
  537. package/dist/pi-extensions/canvas-stophook.js +78 -128
  538. package/dist/pi-extensions/canvas-structured-output.js +52 -8
  539. package/dist/shared/generated-context.d.ts +29 -4
  540. package/dist/shared/generated-context.js +122 -7
  541. package/dist/shared/tool-groups.d.ts +23 -0
  542. package/dist/shared/tool-groups.js +60 -0
  543. package/dist/shared/working-activity.d.ts +8 -0
  544. package/dist/shared/working-activity.js +26 -0
  545. package/dist/types.d.ts +36 -2
  546. package/dist/types.js +51 -0
  547. package/dist/web-client/assets/index-CCPaLeW7.css +2 -0
  548. package/dist/web-client/assets/index-kyOWsnZK.js +86 -0
  549. package/dist/web-client/index.html +2 -2
  550. package/dist/web-client/sw.js +1 -1
  551. package/docs/compat/hearth-crtr-v4.md +2 -2
  552. package/docs/compat/hearth-crtr-v5.md +4 -2
  553. package/docs/public-api.md +3 -3
  554. package/package.json +21 -14
  555. package/runtime.lock.json +4661 -1453
  556. package/scripts/postinstall.mjs +15 -2
  557. package/dist/builtin-pi-packages/pi-mode-switch/README.md +0 -36
  558. package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +0 -36
  559. package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +0 -449
  560. package/dist/builtin-pi-packages/pi-mode-switch/package.json +0 -14
  561. package/dist/builtin-pi-packages/pi-mode-switch/tsconfig.json +0 -9
  562. package/dist/builtin-views/_lib/states.mjs +0 -161
  563. package/dist/builtin-views/canvas/core.mjs +0 -657
  564. package/dist/builtin-views/canvas/text.mjs +0 -58
  565. package/dist/builtin-views/canvas/tui.mjs +0 -168
  566. package/dist/builtin-views/canvas/web.jsx +0 -121
  567. package/dist/builtin-views/chat/core.mjs +0 -684
  568. package/dist/builtin-views/chat/text.mjs +0 -101
  569. package/dist/builtin-views/chat/tui.mjs +0 -360
  570. package/dist/builtin-views/chat/web.jsx +0 -362
  571. package/dist/builtin-views/git-pr/core.mjs +0 -673
  572. package/dist/builtin-views/git-pr/text.mjs +0 -84
  573. package/dist/builtin-views/git-pr/tui.mjs +0 -301
  574. package/dist/builtin-views/git-pr/web.jsx +0 -216
  575. package/dist/builtin-views/inbox/_lib/render.mjs +0 -175
  576. package/dist/builtin-views/inbox/core.mjs +0 -1273
  577. package/dist/builtin-views/inbox/text.mjs +0 -73
  578. package/dist/builtin-views/inbox/tui.mjs +0 -314
  579. package/dist/builtin-views/inbox/web.jsx +0 -188
  580. package/dist/builtin-views/linkedin/core.mjs +0 -906
  581. package/dist/builtin-views/linkedin/text.mjs +0 -69
  582. package/dist/builtin-views/linkedin/tui.mjs +0 -413
  583. package/dist/builtin-views/linkedin/web.jsx +0 -206
  584. package/dist/builtin-views/prompt-review/core.mjs +0 -735
  585. package/dist/builtin-views/prompt-review/text.mjs +0 -15
  586. package/dist/builtin-views/prompt-review/tui.mjs +0 -196
  587. package/dist/builtin-views/prompt-review/web.jsx +0 -484
  588. package/dist/builtin-views/workspace-sidebar/__tests__/core.test.js +0 -50
  589. package/dist/builtin-views/workspace-sidebar/__tests__/core.test.ts +0 -53
  590. package/dist/builtin-views/workspace-sidebar/core.mjs +0 -670
  591. package/dist/builtin-views/workspace-sidebar/text.mjs +0 -53
  592. package/dist/builtin-views/workspace-sidebar/tui.mjs +0 -141
  593. package/dist/builtin-views/workspace-sidebar/web.jsx +0 -109
  594. package/dist/clients/attach/session/mode.d.ts +0 -25
  595. package/dist/clients/attach/session/mode.js +0 -97
  596. package/dist/commands/sys/promptstudio.d.ts +0 -2
  597. package/dist/commands/sys/promptstudio.js +0 -65
  598. package/dist/commands/view-cycle.d.ts +0 -2
  599. package/dist/commands/view-cycle.js +0 -130
  600. package/dist/commands/view-list.d.ts +0 -2
  601. package/dist/commands/view-list.js +0 -66
  602. package/dist/commands/view-new.d.ts +0 -2
  603. package/dist/commands/view-new.js +0 -74
  604. package/dist/commands/view-pick.d.ts +0 -6
  605. package/dist/commands/view-pick.js +0 -129
  606. package/dist/commands/view-run.d.ts +0 -2
  607. package/dist/commands/view-run.js +0 -214
  608. package/dist/commands/view.d.ts +0 -2
  609. package/dist/commands/view.js +0 -31
  610. package/dist/commands/workspace.d.ts +0 -2
  611. package/dist/commands/workspace.js +0 -165
  612. package/dist/core/__tests__/chat-view-reconnect.test.js +0 -105
  613. package/dist/core/__tests__/full/consult-startup-failure.test.js +0 -124
  614. package/dist/core/canvas/__tests__/human-work-outbox.test.js +0 -123
  615. package/dist/core/canvas/human-work-outbox.d.ts +0 -73
  616. package/dist/core/canvas/human-work-outbox.js +0 -261
  617. package/dist/core/command-plugins/store.d.ts +0 -16
  618. package/dist/core/command-plugins/store.js +0 -64
  619. package/dist/core/keybindings/__tests__/bespoke-consumers.test.js +0 -40
  620. package/dist/core/runtime/fault-recovery-nudge.d.ts +0 -3
  621. package/dist/core/runtime/fault-recovery-nudge.js +0 -3
  622. package/dist/core/tui/__tests__/host-keybindings.test.js +0 -113
  623. package/dist/core/tui/host.d.ts +0 -66
  624. package/dist/core/view/__tests__/transport-cache.test.js +0 -62
  625. package/dist/core/view/bridge.d.ts +0 -10
  626. package/dist/core/view/bridge.js +0 -31
  627. package/dist/core/view/chrome.d.ts +0 -9
  628. package/dist/core/view/chrome.js +0 -22
  629. package/dist/core/view/contract.d.ts +0 -205
  630. package/dist/core/view/contract.js +0 -23
  631. package/dist/core/view/loader.d.ts +0 -31
  632. package/dist/core/view/loader.js +0 -188
  633. package/dist/core/view/stream-local.d.ts +0 -3
  634. package/dist/core/view/stream-local.js +0 -231
  635. package/dist/core/view/transport-cache.d.ts +0 -8
  636. package/dist/core/view/transport-cache.js +0 -38
  637. package/dist/core/view/transport-local.d.ts +0 -7
  638. package/dist/core/view/transport-local.js +0 -83
  639. package/dist/core/view/transport-remote.d.ts +0 -2
  640. package/dist/core/view/transport.d.ts +0 -10
  641. package/dist/core/view/transport.js +0 -15
  642. package/dist/pi-extensions/naming-tool.d.ts +0 -24
  643. package/dist/pi-extensions/naming-tool.js +0 -67
  644. package/dist/prompts/view.d.ts +0 -7
  645. package/dist/prompts/view.js +0 -172
  646. package/dist/web/ViewChrome.d.ts +0 -7
  647. package/dist/web/ViewChrome.js +0 -28
  648. package/dist/web/ViewPane.d.ts +0 -39
  649. package/dist/web/ViewPane.js +0 -48
  650. package/dist/web/index.d.ts +0 -8
  651. package/dist/web/index.js +0 -22
  652. package/dist/web/runtime.d.ts +0 -39
  653. package/dist/web/runtime.js +0 -232
  654. package/dist/web/states.d.ts +0 -24
  655. package/dist/web/states.js +0 -24
  656. package/dist/web/transport-http.d.ts +0 -5
  657. package/dist/web/transport-http.js +0 -34
  658. package/dist/web/transport-stream.d.ts +0 -3
  659. package/dist/web/transport-stream.js +0 -204
  660. package/dist/web-client/assets/index-U_NZ66VE.js +0 -79
  661. package/dist/web-client/assets/index-aaeu4adv.css +0 -2
  662. /package/dist/{builtin-views/workspace-sidebar/__tests__/core.test.d.ts → clients/attach/__tests__/file-review-focus.test.d.ts} +0 -0
  663. /package/dist/clients/attach/__tests__/{visible-paths.test.d.ts → group-activity.test.d.ts} +0 -0
  664. /package/dist/{core/__tests__/chat-view-reconnect.test.d.ts → clients/attach/__tests__/input-controller-extension-command.test.d.ts} +0 -0
  665. /package/dist/{core/__tests__/full/consult-startup-failure.test.d.ts → clients/attach/__tests__/session-identity-refresh.test.d.ts} +0 -0
  666. /package/dist/{core/canvas/__tests__/human-work-outbox.test.d.ts → clients/inbox/__tests__/inbox-controller.test.d.ts} +0 -0
  667. /package/dist/{core/keybindings/__tests__/bespoke-consumers.test.d.ts → clients/inbox/__tests__/mount-panel.test.d.ts} +0 -0
  668. /package/dist/{core/tui/__tests__/host-keybindings.test.d.ts → clients/inbox/review/__tests__/editor-roundtrip.test.d.ts} +0 -0
  669. /package/dist/{core/view/__tests__/transport-cache.test.d.ts → clients/inbox/review/__tests__/remap.test.d.ts} +0 -0
  670. /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,2 +0,0 @@
1
- import type { LeafDef } from '../../core/command.js';
2
- export declare const sysPromptStudioLeaf: LeafDef;
@@ -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,2 +0,0 @@
1
- import type { LeafDef } from '../core/command.js';
2
- export declare const viewCycleLeaf: LeafDef;
@@ -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
- });
@@ -1,2 +0,0 @@
1
- import type { LeafDef } from '../core/command.js';
2
- export declare const viewListLeaf: LeafDef;