@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,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { spawn } from 'node:child_process';
3
3
  import { dirname, join, resolve } from 'node:path';
4
- import { fileURLToPath } from 'node:url';
4
+ import { fileURLToPath, pathToFileURL } from 'node:url';
5
5
  import { patchPiTreeRootOrdering } from './patch-pi-tree-root-ordering.mjs';
6
6
 
7
7
  const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
@@ -15,6 +15,18 @@ function installRuntime() {
15
15
  });
16
16
  }
17
17
 
18
+ async function provisionRenderer() {
19
+ try {
20
+ const mod = await import(pathToFileURL(join(ROOT, 'dist/core/termrender/termrender.js')).href);
21
+ mod.ensureRenderer();
22
+ if (!mod.isRendererReady()) {
23
+ process.stderr.write('[crtr postinstall] termrender not provisioned at install time; it will be repaired lazily on first render.\n');
24
+ }
25
+ } catch (error) {
26
+ process.stderr.write(`[crtr postinstall] termrender provisioning skipped: ${error?.message ?? error}\n`);
27
+ }
28
+ }
29
+
18
30
  async function main() {
19
31
  try {
20
32
  await patchPiTreeRootOrdering(ROOT);
@@ -27,7 +39,8 @@ async function main() {
27
39
  } catch (error) {
28
40
  console.warn('[crtr postinstall] runtime installation failed (non-fatal); no runtime generation was produced. Run `crtr` for remediation guidance or reinstall:', error?.message ?? error);
29
41
  }
30
- console.log('crouter installed. Run `crtr sys setup` to install companion pi plugins (mode-switch, crtr-extensions, Claude OAuth), tmux/nvim, and your Exa key.');
42
+ await provisionRenderer();
43
+ console.log('crouter installed. Run `crtr sys setup` to install the companion pi extensions, Claude OAuth, tmux/nvim, and your Exa key.');
31
44
  }
32
45
 
33
46
  await main();
@@ -1,36 +0,0 @@
1
- # pi-mode-switch
2
-
3
- Cycle between operating modes with crouter's configurable **Cycle mode** binding (default **Alt+Shift+P**) — the way Claude's Shift+Tab cycles plan / accept-edits. Whenever the mode changes, the new mode's operating instructions are injected invisibly before your next message.
4
-
5
- ## Modes
6
-
7
- | Mode | What it does |
8
- |---|---|
9
- | `normal` | Full tool access (default). Restrictions lifted. |
10
- | `spec` | Write a specification before any code. No edits. |
11
- | `plan` | Produce an implementation plan. Read-only, no changes. |
12
-
13
- ## Usage
14
-
15
- - the configured `crtr.mode.cycle` binding (default `Alt+Shift+P`) — cycle `normal → spec → plan → normal`
16
- - `/mode` — cycle without using the shortcut
17
- - `/mode <normal\|spec\|plan>` — jump to a specific mode
18
- - the agent can switch its own mode by running the bundled `bin/mode` CLI through its bash tool — e.g. `bash <plugin>/bin/mode normal` after a spec/plan is approved. The command prints that mode's guidance, so the text only enters context at the moment of the switch (no always-on tool)
19
-
20
- The current mode renders as a badge on the **bottom-right of the input box**, diagonally opposite the session-name badge (top-left). Mode persists across `--resume`.
21
-
22
- ## How it works
23
-
24
- The extension tracks the active mode and the mode whose guidance was last injected. On `before_agent_start` it compares the two: if they differ, it prepends that mode's guidance to the turn as a hidden `mode-switch-context` message and records the injection. Stay in the same mode and nothing extra is added. Returning to `normal` also strips stale guidance from context.
25
-
26
- The agent can also switch its own mode without a permanent tool. The bundled `bin/mode` CLI, run through the normal bash tool, writes the requested mode to `nodes/<node-id>/mode/request.json` and prints that mode's operating instructions to stdout. The extension mirrors each mode's guidance to `mode/guidance/<mode>.txt` at session start, watches the request file to keep the badge and session state in sync, and applies each tokenized request once. The guidance reaches the agent through the command's own output, so it only enters context at the moment of the switch — no tool sits in the context window, and there's no coupling to an external runtime beyond the shared files.
27
-
28
- This is guidance-only — it does not hard-restrict tools. The instructions tell the agent not to edit in spec/plan mode; combine with a tool gate if you want enforcement.
29
-
30
- The input badge is drawn by wrapping whatever editor is already installed (for example, a session-name badge extension) in a transparent Proxy that overrides only `render()`. It composes instead of replacing, so other editor decorations keep working.
31
-
32
- ## Install
33
-
34
- This package ships inside crouter. `crtr sys setup` registers its built package path with pi; there is no separate repository or package to install.
35
-
36
- Run `/reload` in pi after setup. The extension resolves `crtr.mode.cycle` from the sparse `keybindings` object in `~/.crouter/config.json`; missing overrides use Alt+Shift+P, multiple gestures all register, and an empty list disables the shortcut. `/mode` remains available when the shortcut is disabled. Pi's stock actions and `~/.pi/agent/keybindings.json` remain untouched.
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Mode-switch CLI — lets the agent change its own operating mode.
3
- #
4
- # Usage: mode <normal|spec|plan>
5
- #
6
- # Writes the requested mode to the running node's channel, then prints that
7
- # mode's operating instructions so guidance enters context only on switching.
8
- set -euo pipefail
9
-
10
- mode="${1:-}"
11
- case "$mode" in
12
- normal | spec | plan) ;;
13
- *)
14
- echo "usage: mode <normal|spec|plan>" >&2
15
- exit 1
16
- ;;
17
- esac
18
-
19
- : "${CRTR_NODE_ID:?pi-mode-switch requires CRTR_NODE_ID}"
20
- : "${CRTR_CONTEXT_DIR:?pi-mode-switch requires CRTR_CONTEXT_DIR}"
21
- dir="$(dirname "$CRTR_CONTEXT_DIR")/mode"
22
- mkdir -p "$dir"
23
-
24
- # Signal the running extension. Atomic write via temp + rename so the watcher
25
- # never reads a half-written file.
26
- tmp="$(mktemp "$dir/request.XXXXXX")"
27
- printf '{"mode":"%s","token":"%s","source":"cli"}\n' "$mode" "$(date +%s)-$$-${RANDOM:-0}" >"$tmp"
28
- mv -f "$tmp" "$dir/request.json"
29
-
30
- # Hand the new mode's operating instructions to the agent.
31
- guidance="$dir/guidance/$mode.txt"
32
- if [ -f "$guidance" ]; then
33
- cat "$guidance"
34
- else
35
- echo "[$mode mode] requested. (No running mode-switch extension detected for this node, so detailed guidance is unavailable.)"
36
- fi
@@ -1,449 +0,0 @@
1
- /**
2
- * Mode Switch Extension
3
- *
4
- * Use the configured crouter mode-cycle binding to cycle between operating
5
- * modes, the way Claude's Shift+Tab cycles plan / accept-edits. Modes here:
6
- *
7
- * normal → full access (default)
8
- * spec → write a specification before any code
9
- * plan → produce an implementation plan, no changes
10
- *
11
- * The only behaviour is context injection: whenever the active mode differs
12
- * from the mode whose guidance was last injected, the mode's operating
13
- * instructions are prepended (invisibly) to the next agent turn. Stay in the
14
- * same mode across turns and nothing extra is injected.
15
- *
16
- * - The configured shortcut or /mode cycles; /mode <name> jumps to a mode
17
- * - The agent can switch its own mode by running the bundled `bin/mode` CLI via
18
- * its bash tool; the command prints the new mode's guidance to stdout, so that
19
- * text only enters context at the moment of the switch (no always-on tool)
20
- * - The active mode is mirrored to a tiny `current` file the attach viewer
21
- * reads for its footer indicator; when a real UI exists, it still also renders
22
- * as a badge on the bottom-right of the input box by wrapping the previous
23
- * editor instead of replacing it.
24
- * - State persists across session resume
25
- */
26
-
27
- import { CustomEditor, type ExtensionAPI, type ExtensionContext } from "@earendil-works/pi-coding-agent";
28
- import type { KeyId, TUI } from "@earendil-works/pi-tui";
29
- import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
30
- import { type FSWatcher, mkdirSync, readFileSync, rmSync, watch, writeFileSync } from "node:fs";
31
- import { dirname, join } from "node:path";
32
- import { fileURLToPath } from "node:url";
33
- import { nodeDir } from "../../../core/canvas/paths.js";
34
- import { resolveUserKeybindings } from "../../../core/keybindings/index.js";
35
-
36
- type Mode = "normal" | "spec" | "plan";
37
-
38
- // Absolute path to the bundled mode-switch CLI (extensions/../bin/mode). The
39
- // extension runs from its package source dir, so we resolve it relative to this
40
- // file. The agent runs it through its normal bash tool, so it costs zero context
41
- // until the moment it's used.
42
- const CLI_PATH = join(dirname(fileURLToPath(import.meta.url)), "..", "bin", "mode");
43
- const MODE_CLI = `bash "${CLI_PATH}"`;
44
-
45
- // Per-node channel the CLI, attach viewer, and this extension share:
46
- // <canvas>/nodes/<node-id>/mode/{request.json,current,guidance/*}.
47
- function modeSwitchDir(nodeId: string = requiredNodeId()): string {
48
- return join(nodeDir(nodeId), "mode");
49
- }
50
-
51
- function requiredNodeId(): string {
52
- const nodeId = process.env["CRTR_NODE_ID"];
53
- if (nodeId === undefined || nodeId === "") throw new Error("pi-mode-switch requires CRTR_NODE_ID");
54
- return nodeId;
55
- }
56
-
57
- function ensureArtifactDirs(): void {
58
- try {
59
- mkdirSync(join(modeSwitchDir(), "guidance"), { recursive: true });
60
- } catch {
61
- // Best-effort: never block session start on a filesystem hiccup.
62
- }
63
- }
64
-
65
- // The order used by the shortcut and /mode command.
66
- const CYCLE: Mode[] = ["normal", "spec", "plan"];
67
-
68
- interface ModeDef {
69
- /** Badge label shown in the input box. */
70
- label: string;
71
- /** Guidance injected before the next turn when this mode becomes active. */
72
- context: string;
73
- }
74
-
75
- const MODES: Record<Mode, ModeDef> = {
76
- normal: {
77
- label: "normal",
78
- context: `[NORMAL MODE]
79
- Mode restrictions are lifted — you have full tool access again.
80
-
81
- Proceed with the work as discussed. If a spec or plan was produced earlier in
82
- this session, follow it. You may read, edit, write, and run commands freely. If a
83
- request is large enough to need a written spec or plan first, switch modes by
84
- running \`${MODE_CLI} spec\` (or \`plan\`); the command prints that mode's
85
- operating instructions to follow.`,
86
- },
87
- spec: {
88
- label: "spec",
89
- context: `[SPEC MODE]
90
- You are in spec mode. Your job is to turn a rough request into a clear, written
91
- specification BEFORE any code is written.
92
-
93
- How to operate:
94
- - Do NOT implement, edit, or write production code. Hold off on changes entirely.
95
- - Resolve open questions as you go. Whenever something is ambiguous — scope,
96
- inputs and outputs, edge cases, constraints, or what "done" means — put the
97
- question to the user with the \`crtr human ask\` command rather than asking
98
- inline, then fold the answer into the spec. Do this before drafting for the
99
- unknowns you can see up front, and again whenever a new question surfaces while
100
- you write. The finished spec records decisions, not open questions.
101
- - Explore the codebase read-only to ground the spec in how things actually work.
102
- - Then write the specification to your node context directory as \`<slug>.md\`.
103
- In bash, \`$CRTR_CONTEXT_DIR\` expands to that directory; before using a non-shell
104
- write tool, run \`printf '%s\\n' "$CRTR_CONTEXT_DIR"\` and use the printed absolute
105
- path rather than pasting the literal variable token. Cover: problem statement, goals and
106
- non-goals, requirements, a high-level approach, and acceptance criteria. Keep
107
- it tight and reviewable.
108
- - Then validate the spec with a reviewer node first: spawn one with
109
- \`crtr node new "Review the spec at <absolute-path>" --kind review\` — you
110
- auto-subscribe to it and are woken when it finishes — the wake message
111
- already carries the digest: short reports include their content and file path,
112
- while larger reports remain refs to dereference. It flags
113
- completeness gaps, contradictions, ambiguity, scope creep, and unspecified
114
- failure modes on critical paths. Resolve every Issue it raises before showing
115
- the spec to anyone;
116
- Recommendations are advisory.
117
- - Finally, ALWAYS open the finished spec for the human with
118
- \`crtr human review <absolute-path-to-the-spec.md>\` — this is required, not
119
- optional. Do NOT just tell the user the spec is done or point them at the file
120
- path: the user cannot easily open the spec file themselves, so \`crtr human
121
- review\` is the way to put it in front of them for line-by-line comments. Run
122
- it the moment the spec is complete (after the reviewer node's Issues are
123
- resolved), then incorporate the returned comments. Do not move on until the
124
- user has reviewed it. Once they approve it, run \`${MODE_CLI} normal\` to lift
125
- the restrictions and begin implementing — the command prints your normal-mode
126
- operating instructions.`,
127
- },
128
- plan: {
129
- label: "plan",
130
- context: `[PLAN MODE]
131
- You are in plan mode. Your job is to produce an actionable implementation plan —
132
- no changes yet.
133
-
134
- How to operate:
135
- - Do NOT edit production code. Read-only exploration only (writing the plan file
136
- itself is allowed).
137
- - Resolve open questions as you go. Whenever something is ambiguous or a decision
138
- needs a call, put it to the user with the \`crtr human ask\` command rather than
139
- asking inline, then fold the answer into the plan. Do this before drafting for
140
- the unknowns you can see up front, and again whenever a new question surfaces
141
- while you write. The finished plan records decisions, not open questions.
142
- - Investigate the relevant code to understand how the change fits in.
143
- - Then write the plan to your node context directory as \`<slug>.md\`.
144
- In bash, \`$CRTR_CONTEXT_DIR\` expands to that directory; before using a non-shell
145
- write tool, run \`printf '%s\\n' "$CRTR_CONTEXT_DIR"\` and use the printed absolute
146
- path rather than pasting the literal variable token. The plan is a numbered, ordered list
147
- of concrete steps: which files to touch, which functions to add or modify,
148
- which tests to write, plus risks and dependencies.
149
- - Then validate the plan with a reviewer node first: spawn one with
150
- \`crtr node new "Review the plan at <absolute-path>" --kind review\` — you
151
- auto-subscribe to it and are woken when it finishes — the wake message
152
- already carries the digest: short reports include their content and file path,
153
- while larger reports remain refs to dereference. It flags
154
- completeness gaps, spec misalignment, unresolved decisions, buildability
155
- problems, quality smells
156
- (timelines, "for now" shortcuts, magic values, fallbacks, missing type
157
- contracts), and overlapping file ownership across parallel tasks. Resolve every
158
- Issue before moving on; Recommendations are advisory.
159
- - Finally, present the finished plan for review with
160
- \`crtr human review <absolute-path-to-the-plan.md>\` and incorporate the
161
- returned comments. Wait for approval before moving on. Once the user approves,
162
- run \`${MODE_CLI} normal\` to begin implementation — the command prints your
163
- normal-mode operating instructions.`,
164
- },
165
- };
166
-
167
- export default function modeSwitchExtension(pi: ExtensionAPI): void {
168
- let currentMode: Mode = "normal";
169
- // The mode whose guidance was last injected. Injection only fires when the
170
- // active mode differs from this.
171
- let lastInjectedMode: Mode | null = "normal";
172
- // TUI handle, captured by the editor factory, so mode changes can repaint the
173
- // input badge.
174
- let activeTui: TUI | undefined;
175
- // Watches this node's mode/request.json for agent-initiated CLI switches.
176
- let modeWatcher: FSWatcher | undefined;
177
- // UI toast, available only when the session has a UI.
178
- let uiNotify: ((message: string, type?: "info" | "warning" | "error") => void) | undefined;
179
- // Token of the most recent CLI request this instance has applied. Lets us
180
- // reconcile to the request file WITHOUT deleting it: deleting was racy because
181
- // /reload can leave extra extension instances behind, and a stale one could
182
- // consume the request before the on-screen instance ever observed it.
183
- let lastAppliedToken: string | undefined;
184
-
185
- /** Append the mode badge to the bottom-right of the input box border. */
186
- function decorateInput(
187
- lines: string[],
188
- width: number,
189
- theme: { fg(color: string, text: string): string; bg(color: string, text: string): string },
190
- ): string[] {
191
- if (lines.length === 0) return lines;
192
- const def = MODES[currentMode];
193
- const badge = theme.bg("selectedBg", theme.fg("text", ` ${def.label} `));
194
- const badgeWidth = visibleWidth(badge);
195
- if (badgeWidth + 2 >= width) return lines;
196
- // Replace the rightmost cells of the bottom border line with the badge.
197
- const last = lines.length - 1;
198
- lines[last] = truncateToWidth(lines[last]!, width - badgeWidth, "") + badge;
199
- return lines;
200
- }
201
-
202
- function repaint(): void {
203
- activeTui?.requestRender();
204
- }
205
-
206
- function persist(): void {
207
- pi.appendEntry("mode-switch", { mode: currentMode });
208
- }
209
-
210
- function persistCurrent(): void {
211
- try {
212
- writeFileSync(join(modeSwitchDir(), "current"), `${currentMode}\n`);
213
- } catch {
214
- // Best-effort: the viewer treats the file as a hint, not authority.
215
- }
216
- }
217
-
218
- // Apply a mode change to state and persistence. Shared by every path: the
219
- // Shortcut/command changes add a UI toast and inject guidance on the next
220
- // turn; the CLI path has already handed the agent its guidance via stdout.
221
- function applyMode(next: Mode): void {
222
- currentMode = next;
223
- repaint();
224
- persist();
225
- persistCurrent();
226
- }
227
-
228
- function setMode(next: Mode, ctx: ExtensionContext): void {
229
- if (next === currentMode) {
230
- ctx.ui.notify(`Already in ${next} mode.`, "info");
231
- return;
232
- }
233
- applyMode(next);
234
- ctx.ui.notify(
235
- currentMode === "normal"
236
- ? "Normal mode — full access restored."
237
- : `${currentMode[0].toUpperCase()}${currentMode.slice(1)} mode — guidance will be applied on your next message.`,
238
- );
239
- }
240
-
241
- // The agent switches its own mode by running the bundled CLI, which writes the
242
- // requested mode to this node's mode/request.json. We pick that up live via
243
- // fs.watch (with a before_agent_start reconcile as a backstop) only to sync the
244
- // badge and persisted state — never to inject guidance, since the CLI already
245
- // printed it to the agent's bash output. Token gating ensures a later
246
- // shortcut-driven change can't be clobbered by a stale request.
247
- function applyFromRequest(next: Mode, source: "cli" | "attach"): void {
248
- if (next === currentMode) return;
249
- applyMode(next);
250
- if (source === "cli") lastInjectedMode = next;
251
- uiNotify?.(source === "cli" ? `Mode → ${next} (agent)` : `Mode → ${next} (viewer)`, "info");
252
- }
253
-
254
- function reconcileFromCli(): void {
255
- let raw: string;
256
- try {
257
- raw = readFileSync(join(modeSwitchDir(), "request.json"), "utf8");
258
- } catch {
259
- return; // no pending request
260
- }
261
- let parsed: { mode?: string; token?: string; source?: "cli" | "attach" };
262
- try {
263
- parsed = JSON.parse(raw) as { mode?: string; token?: string; source?: "cli" | "attach" };
264
- } catch {
265
- return; // half-written; a later watch event or turn catches the final write
266
- }
267
- // Apply each CLI request at most once (token-gated) and never delete it, so
268
- // every live instance — including the one actually on screen — converges to the
269
- // requested mode regardless of /reload leftovers. A lingering request whose
270
- // token we already applied can't clobber a later shortcut-driven change.
271
- if (parsed.token && parsed.token === lastAppliedToken) return;
272
- lastAppliedToken = parsed.token;
273
- if (parsed.mode && (CYCLE as string[]).includes(parsed.mode)) {
274
- applyFromRequest(parsed.mode as Mode, parsed.source ?? "cli");
275
- }
276
- }
277
-
278
- function startModeWatcher(dir: string): void {
279
- modeWatcher?.close();
280
- try {
281
- modeWatcher = watch(dir, (_event, filename) => {
282
- if (filename && filename !== "request.json") return;
283
- reconcileFromCli();
284
- });
285
- } catch {
286
- // fs.watch unsupported here — the before_agent_start reconcile still covers it.
287
- }
288
- }
289
-
290
- function cycleMode(ctx: ExtensionContext): void {
291
- const idx = CYCLE.indexOf(currentMode);
292
- setMode(CYCLE[(idx + 1) % CYCLE.length], ctx);
293
- }
294
-
295
- const piNamedKeys = new Set(["escape", "enter", "tab", "backspace", "delete", "space", "up", "down", "left", "right", "pageUp", "pageDown", "home", "end"]);
296
- const piSymbolKeys = new Set(["`", "-", "=", "[", "]", "\\", ";", "'", ",", ".", "/", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", "|", "~", "{", "}", ":", "<", ">", "?"]);
297
-
298
- function isPiKeyId(value: string): value is KeyId {
299
- const parts = value === "+" ? ["+"] : value.endsWith("++") ? [...value.slice(0, -2).split("+"), "+"] : value.split("+");
300
- const key = parts.pop();
301
- if (key === undefined) return false;
302
- const validKey = /^[a-z0-9]$/.test(key) || piSymbolKeys.has(key) || piNamedKeys.has(key);
303
- return validKey && parts.every((modifier) => ["ctrl", "alt", "shift", "super"].includes(modifier));
304
- }
305
-
306
- function piKeyId(gesture: string): KeyId {
307
- const keyId = gesture.replace(/pageup|pagedown/, (key) => key === "pageup" ? "pageUp" : "pageDown");
308
- if (!isPiKeyId(keyId)) throw new Error(`Invalid mode-cycle keybinding: ${gesture}`);
309
- return keyId;
310
- }
311
-
312
- // Resolve once when the extension loads. Crouter's sparse user config owns
313
- // this semantic action; pi's stock action bindings remain independently owned
314
- // by pi and are neither read nor rewritten here.
315
- const bindings = resolveUserKeybindings();
316
- for (const gesture of bindings.gestures("crtr.mode.cycle")) {
317
- pi.registerShortcut(piKeyId(gesture), {
318
- description: "Cycle mode (normal → spec → plan)",
319
- handler: async (ctx) => cycleMode(ctx),
320
- });
321
- }
322
-
323
- // /mode cycles; /mode <name> jumps to a specific mode.
324
- pi.registerCommand("mode", {
325
- description: "Cycle operating mode, or /mode <normal|spec|plan> to set one",
326
- getArgumentCompletions: (prefix: string) => {
327
- const items = CYCLE.map((m) => ({ value: m, label: m }));
328
- const filtered = items.filter((i) => i.value.startsWith(prefix));
329
- return filtered.length > 0 ? filtered : null;
330
- },
331
- handler: async (args, ctx) => {
332
- const arg = args.trim().toLowerCase();
333
- if (!arg) {
334
- cycleMode(ctx);
335
- return;
336
- }
337
- if ((CYCLE as string[]).includes(arg)) {
338
- setMode(arg as Mode, ctx);
339
- } else {
340
- ctx.ui.notify(`Unknown mode "${arg}". Use: ${CYCLE.join(", ")}.`, "error");
341
- }
342
- },
343
- });
344
-
345
- // The core behaviour: inject the active mode's guidance before the turn, but
346
- // only when the mode has changed since the last injection. We first reconcile
347
- // any agent-initiated CLI switch the fs.watch may have missed.
348
- pi.on("before_agent_start", async () => {
349
- reconcileFromCli();
350
- if (currentMode === lastInjectedMode) return;
351
- lastInjectedMode = currentMode;
352
- return {
353
- message: {
354
- customType: "mode-switch-context",
355
- content: MODES[currentMode].context,
356
- display: false,
357
- },
358
- };
359
- });
360
-
361
- // Keep only the most recent mode-guidance message and drop the older ones, so
362
- // the LLM always sees the current mode's instructions (including the
363
- // "restrictions lifted" note when returning to normal) and never stale
364
- // guidance from a previous mode.
365
- pi.on("context", async (event) => {
366
- const messages = event.messages;
367
- let lastIdx = -1;
368
- for (let i = messages.length - 1; i >= 0; i--) {
369
- if ((messages[i] as { customType?: string }).customType === "mode-switch-context") {
370
- lastIdx = i;
371
- break;
372
- }
373
- }
374
- if (lastIdx === -1) return;
375
- return {
376
- messages: messages.filter((m, i) => {
377
- return (m as { customType?: string }).customType !== "mode-switch-context" || i === lastIdx;
378
- }),
379
- };
380
- });
381
-
382
- // Restore persisted mode on session start / resume, and install the input
383
- // badge.
384
- pi.on("session_start", async (_event, ctx) => {
385
- // Guarantee the node-local mode channel exists before reading or watching it.
386
- ensureArtifactDirs();
387
-
388
- const entries = ctx.sessionManager.getEntries();
389
- const last = entries
390
- .filter((e: { type: string; customType?: string }) => e.type === "custom" && e.customType === "mode-switch")
391
- .pop() as { data?: { mode?: Mode } } | undefined;
392
-
393
- if (last?.data?.mode && (CYCLE as string[]).includes(last.data.mode)) {
394
- currentMode = last.data.mode;
395
- }
396
-
397
- // Re-establish non-normal mode guidance on the next turn after a resume;
398
- // normal mode needs no re-injection.
399
- lastInjectedMode = currentMode === "normal" ? "normal" : null;
400
-
401
- // Mirror each mode's guidance to disk so the CLI can hand the right one to the
402
- // agent on stdout, clear any stale request from a previous session, write the
403
- // current mode hint for the viewer, and start watching for mode requests.
404
- const dir = modeSwitchDir();
405
- try {
406
- for (const mode of CYCLE) {
407
- writeFileSync(join(dir, "guidance", `${mode}.txt`), MODES[mode].context);
408
- }
409
- writeFileSync(join(dir, "current"), `${currentMode}\n`);
410
- rmSync(join(dir, "request.json"), { force: true });
411
- } catch {
412
- // Best-effort: the before_agent_start reconcile still covers switches.
413
- }
414
- lastAppliedToken = undefined;
415
- startModeWatcher(dir);
416
-
417
- if (!ctx.hasUI) return;
418
- uiNotify = (message, type) => ctx.ui.notify(message, type);
419
-
420
- // Wrap whatever editor is already installed (e.g. a session-name badge on
421
- // the top border) so both decorations coexist. A transparent Proxy forwards
422
- // every method/property to the base editor and overrides only render() to
423
- // append the mode badge on the bottom-right border line.
424
- const previousFactory = ctx.ui.getEditorComponent();
425
- const uiTheme = ctx.ui.theme;
426
- ctx.ui.setEditorComponent((tui, theme, keybindings) => {
427
- activeTui = tui;
428
- const base = previousFactory
429
- ? previousFactory(tui, theme, keybindings)
430
- : new CustomEditor(tui, theme, keybindings);
431
- return new Proxy(base, {
432
- get(target, prop, receiver) {
433
- if (prop === "render") {
434
- return (width: number): string[] => decorateInput(target.render(width), width, uiTheme);
435
- }
436
- const value = Reflect.get(target, prop, target);
437
- return typeof value === "function" ? value.bind(target) : value;
438
- },
439
- });
440
- });
441
- repaint();
442
- });
443
-
444
- // Stop watching the request file when the session ends.
445
- pi.on("session_shutdown", async () => {
446
- modeWatcher?.close();
447
- modeWatcher = undefined;
448
- });
449
- }
@@ -1,14 +0,0 @@
1
- {
2
- "name": "pi-mode-switch",
3
- "version": "0.1.0",
4
- "type": "module",
5
- "description": "Cycle between spec, plan, and normal modes with crouter's configurable mode binding. Injects mode-specific guidance whenever the mode changes.",
6
- "keywords": ["pi-package", "modes", "spec", "plan"],
7
- "license": "MIT",
8
- "peerDependencies": {
9
- "@earendil-works/pi-coding-agent": "*"
10
- },
11
- "pi": {
12
- "extensions": ["./extensions"]
13
- }
14
- }
@@ -1,9 +0,0 @@
1
- {
2
- "extends": "../../../tsconfig.json",
3
- "compilerOptions": {
4
- "noEmit": true,
5
- "rootDir": "../.."
6
- },
7
- "include": ["extensions/**/*.ts"],
8
- "exclude": ["node_modules"]
9
- }