@north-light/crouter 0.3.352 → 0.3.354

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 (616) hide show
  1. package/dist/api/client.d.ts +35 -25
  2. package/dist/api/client.js +2 -2
  3. package/dist/api/dto/broker-ops.d.ts +2 -36
  4. package/dist/api/dto/canvas.d.ts +8 -13
  5. package/dist/api/dto/config.d.ts +4 -0
  6. package/dist/api/dto/delivery.d.ts +61 -0
  7. package/dist/api/dto/docs.d.ts +133 -0
  8. package/dist/api/dto/docs.js +1 -0
  9. package/dist/api/dto/health.d.ts +26 -79
  10. package/dist/api/dto/node-outcomes.d.ts +1 -3
  11. package/dist/api/dto/nodes.d.ts +5 -26
  12. package/dist/api/dto/objects.d.ts +167 -0
  13. package/dist/api/dto/objects.js +1 -0
  14. package/dist/api/dto/profiles.d.ts +14 -8
  15. package/dist/api/dto/reports.d.ts +9 -7
  16. package/dist/api/dto/reviews.d.ts +9 -3
  17. package/dist/api/dto/worktree.d.ts +1 -1
  18. package/dist/api/index.d.ts +0 -1
  19. package/dist/api/index.js +1 -1
  20. package/dist/api/routes.d.ts +14 -12
  21. package/dist/api/routes.js +1 -1
  22. package/dist/build-root.js +1 -1
  23. package/dist/builtin-memory/00-runtime-base/00-authoring.md +10 -5
  24. package/dist/builtin-memory/04-orchestration-kernel.md +7 -7
  25. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +1 -1
  26. package/dist/builtin-memory/05-kinds/explore/00-base.md +2 -2
  27. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +2 -2
  28. package/dist/builtin-memory/crouter-concepts/INDEX.md +2 -2
  29. package/dist/builtin-memory/crouter-concepts/lifecycle-and-wakes.md +1 -1
  30. package/dist/builtin-memory/crouter-concepts/memory.md +15 -15
  31. package/dist/builtin-memory/crouter-concepts/nodes-and-the-canvas.md +1 -1
  32. package/dist/builtin-memory/crouter-concepts/profiles-kinds-and-modes.md +5 -5
  33. package/dist/builtin-memory/crouter-concepts/scopes-and-trust.md +1 -1
  34. package/dist/builtin-memory/crouter-concepts/why-a-daemon.md +1 -1
  35. package/dist/builtin-memory/crouter-sdk/INDEX.md +2 -2
  36. package/dist/builtin-memory/crouter-sdk/README.md +5 -6
  37. package/dist/builtin-memory/crouter-sdk/errors.md +0 -13
  38. package/dist/builtin-memory/crouter-sdk/guides/README.md +0 -1
  39. package/dist/builtin-memory/crouter-sdk/guides/event-driven-assistant.md +2 -2
  40. package/dist/builtin-memory/crouter-sdk/nodes.md +0 -2
  41. package/dist/builtin-memory/crouter-sdk/resources.md +0 -1
  42. package/dist/builtin-memory/explore/exploration-doc.md +4 -4
  43. package/dist/builtin-memory/insights/capture.md +6 -6
  44. package/dist/builtin-memory/insights/init.md +14 -14
  45. package/dist/builtin-memory/internal/INDEX.md +4 -4
  46. package/dist/builtin-memory/internal/agent-shaping.md +20 -20
  47. package/dist/builtin-memory/internal/examples/imessage-assistant.md +2 -2
  48. package/dist/builtin-memory/internal/marketplaces.md +2 -2
  49. package/dist/builtin-memory/internal/memory-loading.md +31 -30
  50. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  51. package/dist/builtin-memory/internal/plugins.md +16 -14
  52. package/dist/builtin-memory/internal/storage-tiers.md +4 -4
  53. package/dist/builtin-memory/memory-read-orientation.md +1 -1
  54. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +32 -40
  55. package/dist/clients/attach/input/controller.js +1 -1
  56. package/dist/clients/attach/input/ref-autocomplete.js +1 -1
  57. package/dist/clients/attach/input/titled-editor.js +1 -1
  58. package/dist/clients/attach/render/chat-view.js +1 -1
  59. package/dist/clients/attach/render/crtr-output.d.ts +1 -2
  60. package/dist/clients/attach/render/crtr-output.js +17 -17
  61. package/dist/clients/attach/render/group-activity.d.ts +8 -8
  62. package/dist/clients/attach/render/group-activity.js +2 -2
  63. package/dist/clients/attach/render/group-recap.js +1 -1
  64. package/dist/clients/attach/render/tool-calls.d.ts +1 -1
  65. package/dist/clients/attach/session/profile-files.js +1 -1
  66. package/dist/clients/attach/slash/dispatch.js +1 -1
  67. package/dist/clients/attach/viewer.js +806 -1553
  68. package/dist/commands/api-client.d.ts +2 -0
  69. package/dist/commands/api-client.js +3 -3
  70. package/dist/commands/canvas/edges.d.ts +2 -0
  71. package/dist/commands/canvas/edges.js +2 -0
  72. package/dist/commands/canvas/list.d.ts +4 -0
  73. package/dist/commands/canvas/list.js +3 -0
  74. package/dist/commands/canvas/read.d.ts +8 -0
  75. package/dist/commands/canvas/read.js +5 -0
  76. package/dist/commands/canvas/search.d.ts +2 -0
  77. package/dist/commands/canvas/search.js +3 -0
  78. package/dist/commands/canvas/unwatch.d.ts +2 -0
  79. package/dist/commands/canvas/unwatch.js +1 -0
  80. package/dist/commands/canvas/watch.d.ts +3 -0
  81. package/dist/commands/canvas/watch.js +1 -0
  82. package/dist/commands/canvas-analytics.js +1 -1
  83. package/dist/commands/canvas-history/grep.js +4 -4
  84. package/dist/commands/canvas-history/read.js +2 -2
  85. package/dist/commands/canvas-history/search.js +7 -7
  86. package/dist/commands/canvas-history/shared.d.ts +0 -1
  87. package/dist/commands/canvas-history/shared.js +1 -1
  88. package/dist/commands/canvas-history/stats.js +2 -2
  89. package/dist/commands/canvas-history.js +1 -1
  90. package/dist/commands/canvas.js +1 -1
  91. package/dist/commands/doc/delete.d.ts +2 -0
  92. package/dist/commands/doc/delete.js +1 -0
  93. package/dist/commands/doc/edit.d.ts +2 -0
  94. package/dist/commands/doc/edit.js +1 -0
  95. package/dist/commands/doc/history.d.ts +2 -0
  96. package/dist/commands/doc/history.js +2 -0
  97. package/dist/commands/doc/lint.d.ts +2 -0
  98. package/dist/commands/doc/lint.js +2 -0
  99. package/dist/commands/doc/list.d.ts +2 -0
  100. package/dist/commands/doc/list.js +1 -0
  101. package/dist/commands/doc/move.d.ts +2 -0
  102. package/dist/commands/doc/move.js +1 -0
  103. package/dist/commands/doc/read.d.ts +2 -0
  104. package/dist/commands/doc/read.js +1 -0
  105. package/dist/commands/doc/shared.d.ts +25 -0
  106. package/dist/commands/doc/shared.js +2 -0
  107. package/dist/commands/doc/write.d.ts +2 -0
  108. package/dist/commands/doc/write.js +1 -0
  109. package/dist/commands/{memory.d.ts → doc.d.ts} +1 -1
  110. package/dist/commands/doc.js +1 -0
  111. package/dist/commands/human/review.js +1 -1
  112. package/dist/commands/node/bash.js +2 -2
  113. package/dist/commands/node/create.js +1 -1
  114. package/dist/commands/node/inspect.js +10 -10
  115. package/dist/commands/node/lifecycle.js +2 -2
  116. package/dist/commands/node/outcome.js +1 -1
  117. package/dist/commands/node/subscription.js +1 -1
  118. package/dist/commands/node-context.js +2 -2
  119. package/dist/commands/pkg/browse/catalog.js +1 -1
  120. package/dist/commands/pkg/browse/doc-view.js +1 -1
  121. package/dist/commands/pkg/browse/model.d.ts +9 -17
  122. package/dist/commands/pkg/plugin-inspect.js +1 -1
  123. package/dist/commands/pkg/plugin-manage.d.ts +4 -8
  124. package/dist/commands/pkg/plugin-manage.js +15 -17
  125. package/dist/commands/profile/list.js +1 -1
  126. package/dist/commands/profile/new.js +1 -1
  127. package/dist/commands/profile/project.js +1 -1
  128. package/dist/commands/profile/show.js +1 -1
  129. package/dist/commands/push.js +3 -3
  130. package/dist/commands/sys/config.js +1 -1
  131. package/dist/commands/sys/context/admin/actions.d.ts +18 -43
  132. package/dist/commands/sys/context/admin/actions.js +1 -2
  133. package/dist/commands/sys/context/admin/detail-panel.d.ts +17 -25
  134. package/dist/commands/sys/context/admin/detail-panel.js +2 -1
  135. package/dist/commands/sys/context/admin/docs-panel.d.ts +7 -6
  136. package/dist/commands/sys/context/admin/docs-panel.js +1 -1
  137. package/dist/commands/sys/context/admin/list-view.d.ts +12 -12
  138. package/dist/commands/sys/context/admin/list-view.js +1 -1
  139. package/dist/commands/sys/context/admin/model.d.ts +96 -69
  140. package/dist/commands/sys/context/admin/model.js +1 -1
  141. package/dist/commands/sys/context/admin/rail-panel.d.ts +7 -5
  142. package/dist/commands/sys/context/admin/rail-panel.js +1 -1
  143. package/dist/commands/sys/context/admin/read-view.d.ts +10 -14
  144. package/dist/commands/sys/context/admin/read-view.js +1 -2
  145. package/dist/commands/sys/context/admin/shell.d.ts +26 -31
  146. package/dist/commands/sys/context/admin/shell.js +1 -1
  147. package/dist/commands/sys/context/admin.js +2 -2
  148. package/dist/commands/sys/context/doc.js +2 -3
  149. package/dist/commands/sys/context/expose.js +2 -2
  150. package/dist/commands/sys/context/prompt-review.js +4 -4
  151. package/dist/commands/sys/context/resolve.d.ts +92 -65
  152. package/dist/commands/sys/context/resolve.js +7 -9
  153. package/dist/commands/sys/context.js +1 -1
  154. package/dist/commands/sys/doctor.js +1 -1
  155. package/dist/commands/sys/migrate.js +1 -1
  156. package/dist/commands/sys/panels/profiles-panel.d.ts +3 -1
  157. package/dist/commands/sys/panels/profiles-panel.js +1 -1
  158. package/dist/commands/sys/sync-deps.d.ts +6 -11
  159. package/dist/commands/sys/sync-deps.js +7 -8
  160. package/dist/commands/sys/sync-project-guidance.js +5 -4
  161. package/dist/commands/sys/sync-shared.d.ts +41 -4
  162. package/dist/commands/sys/sync-shared.js +1 -1
  163. package/dist/commands/sys/sync-skills.js +2 -2
  164. package/dist/commands/sys/sync.js +1 -1
  165. package/dist/core/bash-job-supervisor.d.ts +2 -3
  166. package/dist/core/bash-job-supervisor.js +3 -3
  167. package/dist/core/bash-jobs.d.ts +0 -5
  168. package/dist/core/bash-jobs.js +7 -7
  169. package/dist/core/bootstrap.js +2 -2
  170. package/dist/core/canvas/canvas.d.ts +6 -50
  171. package/dist/core/canvas/canvas.js +16 -21
  172. package/dist/core/canvas/db.d.ts +4 -1
  173. package/dist/core/canvas/db.js +2 -2
  174. package/dist/core/canvas/history.d.ts +11 -39
  175. package/dist/core/canvas/history.js +9 -20
  176. package/dist/core/canvas/install-id.d.ts +2 -2
  177. package/dist/core/canvas/install-id.js +1 -1
  178. package/dist/core/canvas/memory-reads.d.ts +5 -0
  179. package/dist/core/canvas/memory-reads.js +1 -1
  180. package/dist/core/canvas/migrations.js +215 -41
  181. package/dist/core/canvas/node-agent-paths.js +1 -1
  182. package/dist/core/canvas/node-tokens.js +1 -1
  183. package/dist/core/canvas/paths.d.ts +0 -4
  184. package/dist/core/canvas/paths.js +1 -1
  185. package/dist/core/canvas/remote-canvas-source.d.ts +0 -1
  186. package/dist/core/canvas/remote-canvas-source.js +1 -1
  187. package/dist/core/canvas/render-source.d.ts +9 -6
  188. package/dist/core/canvas/render-source.js +6 -6
  189. package/dist/core/canvas/sessions.js +2 -2
  190. package/dist/core/canvas/source.d.ts +6 -0
  191. package/dist/core/canvas/tree.d.ts +29 -0
  192. package/dist/core/canvas/tree.js +12 -0
  193. package/dist/core/canvas/types.d.ts +0 -20
  194. package/dist/core/command-plugins/bundle.js +1 -1
  195. package/dist/core/config.d.ts +1 -1
  196. package/dist/core/conversation-store/listener.js +4 -2
  197. package/dist/core/feed/feed.d.ts +9 -7
  198. package/dist/core/feed/feed.js +3 -7
  199. package/dist/core/feed/inbox.d.ts +3 -5
  200. package/dist/core/feed/inbox.js +1 -10
  201. package/dist/core/feed/messages.d.ts +33 -6
  202. package/dist/core/feed/messages.js +10 -7
  203. package/dist/core/feed/reports.d.ts +10 -0
  204. package/dist/core/feed/reports.js +2 -0
  205. package/dist/core/grants/remove.js +1 -1
  206. package/dist/core/graph/access.d.ts +24 -0
  207. package/dist/core/graph/access.js +8 -0
  208. package/dist/core/graph/bodies.d.ts +6 -0
  209. package/dist/core/graph/bodies.js +1 -0
  210. package/dist/core/graph/deletion.d.ts +9 -0
  211. package/dist/core/graph/deletion.js +5 -0
  212. package/dist/core/graph/diff.d.ts +4 -0
  213. package/dist/core/graph/diff.js +4 -0
  214. package/dist/core/graph/documents.d.ts +160 -0
  215. package/dist/core/graph/documents.js +7 -0
  216. package/dist/core/graph/edges.d.ts +24 -0
  217. package/dist/core/graph/edges.js +1 -0
  218. package/dist/core/graph/events.d.ts +26 -0
  219. package/dist/core/graph/events.js +6 -0
  220. package/dist/core/graph/exposures.d.ts +53 -0
  221. package/dist/core/graph/exposures.js +4 -0
  222. package/dist/core/graph/jobs.d.ts +31 -0
  223. package/dist/core/graph/jobs.js +2 -0
  224. package/dist/core/graph/names.d.ts +28 -0
  225. package/dist/core/graph/names.js +3 -0
  226. package/dist/core/graph/objects.d.ts +55 -0
  227. package/dist/core/graph/objects.js +9 -0
  228. package/dist/core/graph/package-docs.d.ts +31 -0
  229. package/dist/core/graph/package-docs.js +5 -0
  230. package/dist/core/graph/package-files.d.ts +20 -0
  231. package/dist/core/graph/package-files.js +2 -0
  232. package/dist/core/graph/reader.d.ts +21 -0
  233. package/dist/core/graph/reader.js +3 -0
  234. package/dist/core/graph/repo-sync/exchange.d.ts +34 -0
  235. package/dist/core/graph/repo-sync/exchange.js +2 -0
  236. package/dist/core/graph/repo-sync/identity.d.ts +30 -0
  237. package/dist/core/graph/repo-sync/identity.js +1 -0
  238. package/dist/core/graph/repo-sync/index.d.ts +4 -0
  239. package/dist/core/graph/repo-sync/index.js +1 -0
  240. package/dist/core/graph/repo-sync/mirror.d.ts +30 -0
  241. package/dist/core/graph/repo-sync/mirror.js +6 -0
  242. package/dist/core/graph/repo-sync/ref-format.d.ts +76 -0
  243. package/dist/core/graph/repo-sync/ref-format.js +2 -0
  244. package/dist/core/graph/repo-sync/repos.d.ts +17 -0
  245. package/dist/core/graph/repo-sync/repos.js +3 -0
  246. package/dist/core/graph/repo-sync/sync.d.ts +42 -0
  247. package/dist/core/graph/repo-sync/sync.js +2 -0
  248. package/dist/core/graph/rules.d.ts +26 -0
  249. package/dist/core/graph/rules.js +3 -0
  250. package/dist/core/graph/spaces/app.d.ts +3 -0
  251. package/dist/core/graph/spaces/app.js +1 -0
  252. package/dist/core/graph/spaces/index.d.ts +19 -0
  253. package/dist/core/graph/spaces/index.js +1 -0
  254. package/dist/core/graph/spaces/person.d.ts +5 -0
  255. package/dist/core/graph/spaces/person.js +2 -0
  256. package/dist/core/graph/spaces/repo.d.ts +4 -0
  257. package/dist/core/graph/spaces/repo.js +1 -0
  258. package/dist/core/graph/types.d.ts +75 -0
  259. package/dist/core/graph/types.js +1 -0
  260. package/dist/core/graph/watches.d.ts +62 -0
  261. package/dist/core/graph/watches.js +18 -0
  262. package/dist/core/human/feedback-companion.js +1 -1
  263. package/dist/core/human/requests.d.ts +3 -1
  264. package/dist/core/human/requests.js +6 -6
  265. package/dist/core/inspector/model.js +2 -2
  266. package/dist/core/io.js +5 -5
  267. package/dist/core/layout-migrate/index.d.ts +24 -1
  268. package/dist/core/layout-migrate/index.js +4 -4
  269. package/dist/core/layout-migrate/paths.d.ts +4 -0
  270. package/dist/core/layout-migrate/paths.js +1 -1
  271. package/dist/core/layout-migrate/stored-paths.d.ts +7 -0
  272. package/dist/core/layout-migrate/stored-paths.js +11 -11
  273. package/dist/core/layout-migrate/stores.d.ts +19 -6
  274. package/dist/core/layout-migrate/stores.js +3 -4
  275. package/dist/core/manifest.d.ts +0 -2
  276. package/dist/core/manifest.js +1 -1
  277. package/dist/core/{memory/extensions.d.ts → plugin-extensions.d.ts} +9 -10
  278. package/dist/core/plugin-extensions.js +1 -0
  279. package/dist/core/preview-registry.d.ts +1 -1
  280. package/dist/core/preview-registry.js +3 -2
  281. package/dist/core/profiles/manifest.d.ts +7 -7
  282. package/dist/core/profiles/manifest.js +1 -1
  283. package/dist/core/profiles/select.js +3 -3
  284. package/dist/core/review/birth.js +1 -1
  285. package/dist/core/review/companion.js +1 -1
  286. package/dist/core/review/stage.d.ts +12 -1
  287. package/dist/core/review/stage.js +1 -1
  288. package/dist/core/review/store.d.ts +2 -0
  289. package/dist/core/review/store.js +1 -1
  290. package/dist/core/review/types.d.ts +7 -1
  291. package/dist/core/runs/events.js +1 -1
  292. package/dist/core/runs/operations.js +5 -5
  293. package/dist/core/runs/questions.js +2 -2
  294. package/dist/core/runtime/bearings-render.d.ts +13 -7
  295. package/dist/core/runtime/bearings-render.js +12 -12
  296. package/dist/core/runtime/bearings.d.ts +8 -18
  297. package/dist/core/runtime/bearings.js +7 -7
  298. package/dist/core/runtime/broker/daemon-ops.d.ts +7 -12
  299. package/dist/core/runtime/broker/daemon-ops.js +1 -1
  300. package/dist/core/runtime/broker/fault-retry.d.ts +2 -0
  301. package/dist/core/runtime/broker/fault-retry.js +1 -1
  302. package/dist/core/runtime/broker/frame-dispatch.d.ts +1 -1
  303. package/dist/core/runtime/broker/frame-memory-refs.d.ts +7 -2
  304. package/dist/core/runtime/broker/frame-memory-refs.js +1 -1
  305. package/dist/core/runtime/broker/inbox.d.ts +1 -4
  306. package/dist/core/runtime/broker/inbox.js +1 -10
  307. package/dist/core/runtime/broker/rebind.js +1 -1
  308. package/dist/core/runtime/broker/retry-card-elision.d.ts +7 -0
  309. package/dist/core/runtime/broker/retry-card-elision.js +1 -0
  310. package/dist/core/runtime/broker-extension-render.d.ts +0 -13
  311. package/dist/core/runtime/broker-extension-render.js +2 -4
  312. package/dist/core/runtime/broker-persona-guidance.js +3 -3
  313. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  314. package/dist/core/runtime/broker.js +1 -1
  315. package/dist/core/runtime/close.d.ts +9 -4
  316. package/dist/core/runtime/close.js +1 -1
  317. package/dist/core/runtime/deliver-live.js +1 -1
  318. package/dist/core/runtime/kickoff.js +17 -19
  319. package/dist/core/runtime/launch-target.d.ts +7 -0
  320. package/dist/core/runtime/launch-target.js +1 -1
  321. package/dist/core/runtime/ledger.d.ts +10 -0
  322. package/dist/core/runtime/ledger.js +3 -0
  323. package/dist/core/runtime/lifecycle.js +2 -2
  324. package/dist/core/runtime/nodes.d.ts +10 -2
  325. package/dist/core/runtime/nodes.js +1 -1
  326. package/dist/core/runtime/outcome-document.d.ts +2 -2
  327. package/dist/core/runtime/outcome-document.js +1 -1
  328. package/dist/core/runtime/persona.js +2 -2
  329. package/dist/core/runtime/placement.js +1 -1
  330. package/dist/core/runtime/promote.d.ts +2 -2
  331. package/dist/core/runtime/promote.js +1 -1
  332. package/dist/core/runtime/prospective-inventory-cli.js +2 -2
  333. package/dist/core/runtime/recycle.js +1 -1
  334. package/dist/core/runtime/reopen.js +1 -1
  335. package/dist/core/runtime/revive.js +2 -2
  336. package/dist/core/runtime/roadmap.d.ts +17 -9
  337. package/dist/core/runtime/roadmap.js +4 -4
  338. package/dist/core/runtime/spawn-env.js +1 -1
  339. package/dist/core/runtime/spawn.d.ts +5 -3
  340. package/dist/core/runtime/spawn.js +2 -2
  341. package/dist/core/runtime/structured-output.d.ts +3 -1
  342. package/dist/core/runtime/structured-output.js +4 -4
  343. package/dist/core/scope.d.ts +1 -32
  344. package/dist/core/scope.js +1 -1
  345. package/dist/core/scoped-state/db.js +2 -1
  346. package/dist/core/scoped-state/migrate.js +2 -2
  347. package/dist/core/scoped-state/profiles.d.ts +11 -0
  348. package/dist/core/scoped-state/profiles.js +1 -1
  349. package/dist/core/scoped-state/schema.d.ts +1 -1
  350. package/dist/core/scoped-state/schema.js +7 -5
  351. package/dist/core/spaces/permissions.d.ts +0 -14
  352. package/dist/core/spaces/permissions.js +1 -1
  353. package/dist/core/spaces/stop.d.ts +13 -0
  354. package/dist/core/spaces/stop.js +2 -2
  355. package/dist/core/storage/tables.d.ts +1 -1
  356. package/dist/core/substrate/delivery/corpus.d.ts +21 -0
  357. package/dist/core/substrate/delivery/corpus.js +3 -0
  358. package/dist/core/substrate/delivery/deliver.d.ts +76 -0
  359. package/dist/core/substrate/delivery/deliver.js +6 -0
  360. package/dist/core/substrate/delivery/listings.d.ts +27 -0
  361. package/dist/core/substrate/delivery/listings.js +4 -0
  362. package/dist/core/substrate/delivery/match.d.ts +28 -0
  363. package/dist/core/substrate/delivery/match.js +1 -0
  364. package/dist/core/substrate/delivery/plan.d.ts +67 -0
  365. package/dist/core/substrate/delivery/plan.js +3 -0
  366. package/dist/core/substrate/delivery/render-boot.d.ts +20 -0
  367. package/dist/core/substrate/delivery/render-boot.js +54 -0
  368. package/dist/core/substrate/delivery/render-event.d.ts +47 -0
  369. package/dist/core/substrate/delivery/render-event.js +6 -0
  370. package/dist/core/substrate/delivery/sub-persona-menu.d.ts +2 -0
  371. package/dist/core/substrate/delivery/sub-persona-menu.js +6 -0
  372. package/dist/core/substrate/delivery/types.d.ts +30 -0
  373. package/dist/core/substrate/delivery/types.js +0 -0
  374. package/dist/core/substrate/gate-explain.d.ts +0 -13
  375. package/dist/core/substrate/gate-explain.js +1 -1
  376. package/dist/core/substrate/schema.d.ts +11 -139
  377. package/dist/core/substrate/schema.js +1 -1
  378. package/dist/core/substrate/subject-fields.d.ts +3 -0
  379. package/dist/core/substrate/subject.d.ts +2 -1
  380. package/dist/core/substrate/subject.js +1 -1
  381. package/dist/daemon/api/app-listener.js +11 -11
  382. package/dist/daemon/api/handlers/app-profiles.js +1 -1
  383. package/dist/daemon/api/handlers/bash-jobs.js +1 -2
  384. package/dist/daemon/api/handlers/broker-ops.js +1 -1
  385. package/dist/daemon/api/handlers/canvas.js +5 -5
  386. package/dist/daemon/api/handlers/daemon.js +1 -1
  387. package/dist/daemon/api/handlers/delivery.d.ts +2 -0
  388. package/dist/daemon/api/handlers/delivery.js +1 -0
  389. package/dist/daemon/api/handlers/{memory.d.ts → docs.d.ts} +1 -1
  390. package/dist/daemon/api/handlers/docs.js +1 -0
  391. package/dist/daemon/api/handlers/hook-exec.js +1 -1
  392. package/dist/daemon/api/handlers/messages.js +2 -2
  393. package/dist/daemon/api/handlers/modelauth.d.ts +3 -0
  394. package/dist/daemon/api/handlers/modelauth.js +1 -1
  395. package/dist/daemon/api/handlers/node-records.js +2 -2
  396. package/dist/daemon/api/handlers/nodes.js +1 -1
  397. package/dist/daemon/api/handlers/objects.d.ts +2 -0
  398. package/dist/daemon/api/handlers/objects.js +5 -0
  399. package/dist/daemon/api/handlers/package-docs.d.ts +2 -0
  400. package/dist/daemon/api/handlers/package-docs.js +1 -0
  401. package/dist/daemon/api/handlers/profiles.js +1 -1
  402. package/dist/daemon/api/handlers/reports.d.ts +2 -2
  403. package/dist/daemon/api/handlers/reports.js +4 -4
  404. package/dist/daemon/api/handlers/reviews.js +1 -1
  405. package/dist/daemon/api/handlers/vendor-status.d.ts +8 -0
  406. package/dist/daemon/api/handlers/vendor-status.js +1 -0
  407. package/dist/daemon/api/map.d.ts +2 -2
  408. package/dist/daemon/api/map.js +2 -2
  409. package/dist/daemon/api/operations.d.ts +1 -1
  410. package/dist/daemon/api/operations.js +1 -1
  411. package/dist/daemon/api/principal.d.ts +5 -0
  412. package/dist/daemon/api/principal.js +1 -1
  413. package/dist/daemon/api/reader.d.ts +17 -0
  414. package/dist/daemon/api/reader.js +1 -0
  415. package/dist/daemon/api/server.js +1 -1
  416. package/dist/daemon/control.d.ts +2 -3
  417. package/dist/daemon/crtrd.js +8 -6
  418. package/dist/daemon/fleet.js +4 -4
  419. package/dist/daemon/reconcilers/bash-deadline.d.ts +11 -1
  420. package/dist/daemon/reconcilers/bash-deadline.js +2 -1
  421. package/dist/daemon/reconcilers/broker-supervision.js +4 -4
  422. package/dist/daemon/reconcilers/live-obligation.js +1 -1
  423. package/dist/daemon/reconcilers/node-deadline.js +1 -1
  424. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -1
  425. package/dist/daemon/reconcilers/storage-maintenance.d.ts +1 -0
  426. package/dist/daemon/reconcilers/storage-maintenance.js +1 -1
  427. package/dist/daemon/review/deliver.js +2 -2
  428. package/dist/daemon/review/finish.js +1 -1
  429. package/dist/hook-authoring.d.ts +0 -1
  430. package/dist/hook-authoring.js +3 -3
  431. package/dist/migrations/004-canvas-documents/apply.d.ts +10 -0
  432. package/dist/migrations/004-canvas-documents/apply.js +1 -0
  433. package/dist/migrations/004-canvas-documents/fields.d.ts +24 -0
  434. package/dist/migrations/004-canvas-documents/fields.js +2 -0
  435. package/dist/migrations/004-canvas-documents/index.d.ts +16 -0
  436. package/dist/migrations/004-canvas-documents/index.js +2 -0
  437. package/dist/migrations/004-canvas-documents/legacy/discover.d.ts +16 -0
  438. package/dist/migrations/004-canvas-documents/legacy/discover.js +1 -0
  439. package/dist/migrations/004-canvas-documents/legacy/history.d.ts +5 -0
  440. package/dist/migrations/004-canvas-documents/legacy/history.js +2 -0
  441. package/dist/migrations/004-canvas-documents/legacy/nested.d.ts +7 -0
  442. package/dist/migrations/004-canvas-documents/legacy/nested.js +1 -0
  443. package/dist/migrations/004-canvas-documents/legacy/parse.d.ts +14 -0
  444. package/dist/migrations/004-canvas-documents/legacy/parse.js +1 -0
  445. package/dist/migrations/004-canvas-documents/legacy/types.d.ts +91 -0
  446. package/dist/migrations/004-canvas-documents/legacy/types.js +0 -0
  447. package/dist/migrations/004-canvas-documents/legacy-edges.d.ts +6 -0
  448. package/dist/migrations/004-canvas-documents/legacy-edges.js +18 -0
  449. package/dist/migrations/004-canvas-documents/plan.d.ts +102 -0
  450. package/dist/migrations/004-canvas-documents/plan.js +3 -0
  451. package/dist/migrations/004-canvas-documents/pointers.d.ts +23 -0
  452. package/dist/migrations/004-canvas-documents/pointers.js +4 -0
  453. package/dist/migrations/activation.d.ts +9 -18
  454. package/dist/migrations/activation.js +2 -2
  455. package/dist/pi-extensions/broker-local.d.ts +2 -2
  456. package/dist/pi-extensions/broker-local.js +2 -2
  457. package/dist/pi-extensions/canvas-bash-valve.js +5 -4
  458. package/dist/pi-extensions/canvas-context-intro.js +2 -2
  459. package/dist/pi-extensions/canvas-doc-substrate.d.ts +0 -1
  460. package/dist/pi-extensions/canvas-doc-substrate.js +6 -6
  461. package/dist/pi-extensions/canvas-inbox-watcher.js +2 -2
  462. package/dist/pi-extensions/canvas-passive-context.js +1 -1
  463. package/dist/pi-extensions/canvas-recap.js +2 -2
  464. package/dist/pi-extensions/canvas-stophook.d.ts +1 -1
  465. package/dist/pi-extensions/canvas-stophook.js +1 -1
  466. package/dist/prompts/review.js +3 -3
  467. package/dist/shared/env.d.ts +5 -0
  468. package/dist/shared/env.js +1 -1
  469. package/dist/shared/generated-context.js +2 -10
  470. package/dist/shared/inbox-entry-body.d.ts +22 -0
  471. package/dist/shared/inbox-entry-body.js +10 -0
  472. package/dist/{core/memory → shared}/inline-ref-guidance.d.ts +2 -2
  473. package/dist/shared/inline-ref-guidance.js +2 -0
  474. package/dist/types.d.ts +3 -1
  475. package/docs/cli/memory-and-preferences.md +12 -14
  476. package/docs/concepts/README.md +1 -1
  477. package/docs/concepts/lifecycle-and-wakes.md +1 -1
  478. package/docs/concepts/memory.md +15 -15
  479. package/docs/concepts/nodes-and-the-canvas.md +1 -1
  480. package/docs/concepts/profiles-kinds-and-modes.md +5 -5
  481. package/docs/concepts/scopes-and-trust.md +1 -1
  482. package/docs/concepts/why-a-daemon.md +1 -1
  483. package/docs/sdk/README.md +5 -6
  484. package/docs/sdk/errors.md +0 -13
  485. package/docs/sdk/guides/README.md +0 -1
  486. package/docs/sdk/nodes.md +0 -2
  487. package/docs/sdk/resources.md +0 -1
  488. package/package.json +2 -2
  489. package/packages/crouter-identity/package.json +1 -1
  490. package/runtime.lock.json +11 -11
  491. package/dist/api/dto/memory.d.ts +0 -171
  492. package/dist/api/dto/memory.js +0 -1
  493. package/dist/builtin-memory/crouter-sdk/guides/app-memory.md +0 -73
  494. package/dist/builtin-memory/crouter-sdk/memory.md +0 -87
  495. package/dist/commands/broker-permissions.d.ts +0 -2
  496. package/dist/commands/broker-permissions.js +0 -1
  497. package/dist/commands/memory/client.d.ts +0 -11
  498. package/dist/commands/memory/client.js +0 -1
  499. package/dist/commands/memory/delete.d.ts +0 -1
  500. package/dist/commands/memory/delete.js +0 -1
  501. package/dist/commands/memory/edit.d.ts +0 -1
  502. package/dist/commands/memory/edit.js +0 -21
  503. package/dist/commands/memory/find.d.ts +0 -1
  504. package/dist/commands/memory/find.js +0 -1
  505. package/dist/commands/memory/history.d.ts +0 -1
  506. package/dist/commands/memory/history.js +0 -5
  507. package/dist/commands/memory/lint.d.ts +0 -1
  508. package/dist/commands/memory/lint.js +0 -1
  509. package/dist/commands/memory/list.d.ts +0 -1
  510. package/dist/commands/memory/list.js +0 -1
  511. package/dist/commands/memory/move.d.ts +0 -1
  512. package/dist/commands/memory/move.js +0 -1
  513. package/dist/commands/memory/origin.d.ts +0 -1
  514. package/dist/commands/memory/origin.js +0 -1
  515. package/dist/commands/memory/read.d.ts +0 -1
  516. package/dist/commands/memory/read.js +0 -6
  517. package/dist/commands/memory/shared.d.ts +0 -22
  518. package/dist/commands/memory/shared.js +0 -1
  519. package/dist/commands/memory/write.d.ts +0 -1
  520. package/dist/commands/memory/write.js +0 -13
  521. package/dist/commands/memory.js +0 -1
  522. package/dist/commands/node-inspect-artifacts.d.ts +0 -1
  523. package/dist/commands/node-inspect-artifacts.js +0 -8
  524. package/dist/core/help/memory-extensions.d.ts +0 -3
  525. package/dist/core/help/memory-extensions.js +0 -2
  526. package/dist/core/memory/cli-selector.d.ts +0 -13
  527. package/dist/core/memory/cli-selector.js +0 -1
  528. package/dist/core/memory/doc-link-grammar.d.ts +0 -20
  529. package/dist/core/memory/doc-link-grammar.js +0 -2
  530. package/dist/core/memory/extensions.js +0 -1
  531. package/dist/core/memory/history.d.ts +0 -87
  532. package/dist/core/memory/history.js +0 -6
  533. package/dist/core/memory/identity.d.ts +0 -65
  534. package/dist/core/memory/identity.js +0 -1
  535. package/dist/core/memory/inline-ref-guidance.js +0 -2
  536. package/dist/core/memory/inline-ref-inventory.d.ts +0 -9
  537. package/dist/core/memory/inline-ref-inventory.js +0 -1
  538. package/dist/core/memory/lint.d.ts +0 -163
  539. package/dist/core/memory/lint.js +0 -2
  540. package/dist/core/memory/mutation-domain.d.ts +0 -113
  541. package/dist/core/memory/mutation-domain.js +0 -12
  542. package/dist/core/memory/mutations.d.ts +0 -74
  543. package/dist/core/memory/mutations.js +0 -1
  544. package/dist/core/memory/project-namespace.d.ts +0 -31
  545. package/dist/core/memory/project-namespace.js +0 -2
  546. package/dist/core/memory/repository-association.d.ts +0 -31
  547. package/dist/core/memory/repository-association.js +0 -1
  548. package/dist/core/memory/service.d.ts +0 -145
  549. package/dist/core/memory/service.js +0 -2
  550. package/dist/core/memory/tree.d.ts +0 -39
  551. package/dist/core/memory/tree.js +0 -1
  552. package/dist/core/memory-resolver.d.ts +0 -280
  553. package/dist/core/memory-resolver.js +0 -2
  554. package/dist/core/nested-stores.d.ts +0 -18
  555. package/dist/core/nested-stores.js +0 -1
  556. package/dist/core/runtime/memory.d.ts +0 -3
  557. package/dist/core/runtime/memory.js +0 -1
  558. package/dist/core/substrate/frontmatter-validation.d.ts +0 -11
  559. package/dist/core/substrate/frontmatter-validation.js +0 -1
  560. package/dist/core/substrate/gate.d.ts +0 -16
  561. package/dist/core/substrate/gate.js +0 -1
  562. package/dist/core/substrate/index.d.ts +0 -18
  563. package/dist/core/substrate/index.js +0 -1
  564. package/dist/core/substrate/injected-store.d.ts +0 -75
  565. package/dist/core/substrate/injected-store.js +0 -2
  566. package/dist/core/substrate/listings.d.ts +0 -28
  567. package/dist/core/substrate/listings.js +0 -1
  568. package/dist/core/substrate/memory-events.d.ts +0 -6
  569. package/dist/core/substrate/memory-events.js +0 -1
  570. package/dist/core/substrate/on-read-node.d.ts +0 -6
  571. package/dist/core/substrate/on-read-node.js +0 -1
  572. package/dist/core/substrate/on-read.d.ts +0 -101
  573. package/dist/core/substrate/on-read.js +0 -9
  574. package/dist/core/substrate/plan.d.ts +0 -94
  575. package/dist/core/substrate/plan.js +0 -1
  576. package/dist/core/substrate/render-node.d.ts +0 -12
  577. package/dist/core/substrate/render-node.js +0 -1
  578. package/dist/core/substrate/render.d.ts +0 -41
  579. package/dist/core/substrate/render.js +0 -65
  580. package/dist/core/substrate/session-cache.d.ts +0 -27
  581. package/dist/core/substrate/session-cache.js +0 -1
  582. package/dist/core/substrate/surface-match.d.ts +0 -73
  583. package/dist/core/substrate/surface-match.js +0 -1
  584. package/dist/daemon/api/handlers/memory.js +0 -5
  585. package/dist/migrations/001-surfaces-frontmatter.d.ts +0 -2
  586. package/dist/migrations/001-surfaces-frontmatter.js +0 -1
  587. package/dist/migrations/002-profile-project-memory.d.ts +0 -2
  588. package/dist/migrations/002-profile-project-memory.js +0 -1
  589. package/dist/migrations/003-repository-root-memory-identity/front-door.d.ts +0 -26
  590. package/dist/migrations/003-repository-root-memory-identity/front-door.js +0 -11
  591. package/dist/migrations/003-repository-root-memory-identity/index.d.ts +0 -2
  592. package/dist/migrations/003-repository-root-memory-identity/index.js +0 -5
  593. package/dist/migrations/003-repository-root-memory-identity/references.d.ts +0 -95
  594. package/dist/migrations/003-repository-root-memory-identity/references.js +0 -5
  595. package/dist/migrations/003-repository-root-memory-identity/repository-facts.d.ts +0 -39
  596. package/dist/migrations/003-repository-root-memory-identity/repository-facts.js +0 -3
  597. package/dist/migrations/convergent.d.ts +0 -43
  598. package/dist/migrations/convergent.js +0 -2
  599. package/dist/migrations/corpus.d.ts +0 -75
  600. package/dist/migrations/corpus.js +0 -3
  601. package/dist/migrations/frontmatter-splice.d.ts +0 -15
  602. package/dist/migrations/frontmatter-splice.js +0 -8
  603. package/dist/migrations/profile-manifests.d.ts +0 -30
  604. package/dist/migrations/profile-manifests.js +0 -2
  605. package/dist/migrations/registry.d.ts +0 -7
  606. package/dist/migrations/registry.js +0 -1
  607. package/dist/migrations/runner.d.ts +0 -43
  608. package/dist/migrations/runner.js +0 -1
  609. package/dist/migrations/types.d.ts +0 -211
  610. package/dist/shared/birth-announcement.d.ts +0 -12
  611. package/dist/shared/birth-announcement.js +0 -1
  612. package/docs/sdk/guides/app-memory.md +0 -22
  613. package/docs/sdk/memory.md +0 -85
  614. /package/dist/{migrations/types.js → api/dto/delivery.js} +0 -0
  615. /package/dist/{core/memory → shared}/inline-ref-grammar.d.ts +0 -0
  616. /package/dist/{core/memory → shared}/inline-ref-grammar.js +0 -0
@@ -1,6 +1,7 @@
1
- import { envNodeId, envProfileId } from '../../../shared/env.js';
1
+ import { envNodeId } from '../../../shared/env.js';
2
2
  import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';
3
- import { localClient } from '../../../api/node-transport.js';
3
+ import type { DeliveryCommandDTO } from '../../../api/dto/delivery.js';
4
+ import { brokerDelivery } from '../../../core/runtime/broker/daemon-ops.js';
4
5
  import {
5
6
  expandDeterministicCommand,
6
7
  type DeterministicCommandExpansion,
@@ -9,26 +10,17 @@ import { expandShellBlocks, hasShellBlocks, DEFAULT_SHELL_TIMEOUT_MS } from '../
9
10
  import type { ChatCommandMetadata } from '../../../core/runtime/command-surface.js';
10
11
  import { piShellRunner } from './pi-shell-runner.js';
11
12
 
12
- // memory-slash-commands: any memory doc frontmatter-flagged `slash: true`
13
- // becomes an invocable slash command (`/<name>`). This mirrors Hermes Agent's
13
+ // memory-slash-commands: any document with a `slash-command` delivery rule in
14
+ // the node's view becomes an invocable slash command (`/<name>`). This mirrors Hermes Agent's
14
15
  // "every skill is automatically a slash command" — /research-alpha injects
15
16
  // the doc body (plus the user's free-text args) as a normal turn instead of
16
17
  // requiring a separate skill-invocation mechanism.
17
18
  //
18
- // The daemon resolves the target snapshot and returns command bodies. The
19
- // broker never opens memory stores; shell blocks run only when invoked here.
20
-
21
- interface MemoryListItem {
22
- name: string;
23
- short_form: string;
24
- path: string;
25
- canonical_body: string;
26
- execution_body?: string;
27
- error?: string;
28
- }
19
+ // The node's delivery route lists and resolves the commands (the broker is the
20
+ // only host, so there is always a node); shell blocks run only when invoked here.
29
21
 
30
22
  export interface SlashDoc {
31
- /** Canonical name resolved by `crtr memory read`. */
23
+ /** Canonical name resolved by `crtr canvas read`. */
32
24
  name: string;
33
25
  /** Canonical `/` segments rendered as ordinary `:` command segments. */
34
26
  commandName: string;
@@ -36,32 +28,32 @@ export interface SlashDoc {
36
28
  description: string;
37
29
  }
38
30
 
39
- // Keep each canonical winner's body for registration-time disclosure classification.
40
- const resolvedMemoryDocs = new Map<string, MemoryListItem>();
31
+ // Keep each listed command's body for registration-time disclosure classification.
32
+ const resolvedCommands = new Map<string, DeliveryCommandDTO>();
41
33
 
42
- async function defaultListMemoryDocs(): Promise<MemoryListItem[]> {
34
+ function nodeIdOrThrow(): string {
43
35
  const node = envNodeId();
44
- const query = new URLSearchParams(node ? { node } : { cwd: process.cwd(), ...(envProfileId() ? { profile: envProfileId() } : {}) });
45
- const docs = await localClient({ autostart: false }).request<MemoryListItem[]>('GET', `/v1/memory/slash?${query}`);
46
- resolvedMemoryDocs.clear();
47
- for (const doc of docs) resolvedMemoryDocs.set(doc.name, doc);
48
- return docs;
36
+ if (!node) throw new Error('slash commands require a canvas node');
37
+ return node;
49
38
  }
50
39
 
51
- function defaultReadMemoryDoc(name: string): { canonicalBody: string; executionBody: string } {
52
- const resolved = resolvedMemoryDocs.get(name);
53
- if (resolved === undefined) throw new Error(`memory slash document was not resolved: ${name}`);
54
- if (resolved.error !== undefined) throw new Error(resolved.error);
55
- if (resolved.execution_body === undefined) throw new Error(`memory slash document has no execution body: ${name}`);
40
+ async function listSlashCommands(): Promise<DeliveryCommandDTO[]> {
41
+ const commands = (await brokerDelivery(nodeIdOrThrow(), { activity: 'slash-command' })).commands ?? [];
42
+ resolvedCommands.clear();
43
+ for (const command of commands) resolvedCommands.set(command.name, command);
44
+ return commands;
45
+ }
46
+
47
+ function readSlashCommand(name: string): { canonicalBody: string; executionBody: string } {
48
+ const resolved = resolvedCommands.get(name);
49
+ if (resolved === undefined) throw new Error(`slash command document was not resolved: ${name}`);
56
50
  return { canonicalBody: resolved.canonical_body, executionBody: resolved.execution_body };
57
51
  }
58
52
 
59
53
  async function slashReadAttachments(name: string): Promise<{ blocks: string[]; execution_body: string }> {
60
- const node = envNodeId();
61
- if (!node) throw new Error('memory slash attachments require a node');
62
- return localClient({ autostart: false }).request<{ blocks: string[]; execution_body: string }>(
63
- 'POST', '/v1/memory/slash/attachments', { node, name },
64
- );
54
+ const res = await brokerDelivery(nodeIdOrThrow(), { activity: 'slash-command', subject: name });
55
+ if (res.execution_body === undefined) throw new Error(`slash command document has no execution body: ${name}`);
56
+ return { blocks: (res.blocks ?? []).filter((block) => block !== ''), execution_body: res.execution_body };
65
57
  }
66
58
 
67
59
  function hasNodeRelativeExpansion(body: string): boolean {
@@ -73,16 +65,16 @@ export function slashCommandName(docName: string): string {
73
65
  return docName.split("/").join(":");
74
66
  }
75
67
 
76
- /** Every `slash: true` canonical winner, scope-precedence-deduped by name. A
77
- * doc without `slash` (or `slash: false`) is silently excluded. */
68
+ /** Every document with a `slash-command` rule in the node's view, deduped by name. */
78
69
  export async function discoverSlashDocs(): Promise<SlashDoc[]> {
79
- const items = await defaultListMemoryDocs();
70
+ if (!envNodeId()) return [];
71
+ const items = await listSlashCommands();
80
72
  const seen = new Set<string>();
81
73
  const out: SlashDoc[] = [];
82
74
  for (const item of items) {
83
75
  if (seen.has(item.name)) continue;
84
76
  seen.add(item.name);
85
- out.push({ name: item.name, commandName: slashCommandName(item.name), description: item.short_form });
77
+ out.push({ name: item.name, commandName: slashCommandName(item.name), description: item.description });
86
78
  }
87
79
  return out;
88
80
  }
@@ -93,7 +85,7 @@ export default async function (pi: ExtensionAPI) {
93
85
  let expansion: DeterministicCommandExpansion | undefined;
94
86
  let discloseExpansion = false;
95
87
  try {
96
- const body = defaultReadMemoryDoc(doc.name);
88
+ const body = readSlashCommand(doc.name);
97
89
  expansion = {
98
90
  kind: "memory-slash",
99
91
  commandName: doc.commandName,
@@ -142,7 +134,7 @@ export default async function (pi: ExtensionAPI) {
142
134
  content:
143
135
  blocks.length === 0
144
136
  ? content
145
- : `<auto-loaded-context>\n${blocks.join("\n")}\n</auto-loaded-context>\n\n${content}`,
137
+ : `${blocks.join("\n")}\n\n${content}`,
146
138
  display: true,
147
139
  },
148
140
  { triggerTurn: true },
@@ -1,4 +1,4 @@
1
- var p=Object.defineProperty;var r=(d,e)=>p(d,"name",{value:e,configurable:!0});import{spawn as l}from"node:child_process";import{readFileSync as u,unlinkSync as f,writeFileSync as k}from"node:fs";import{tmpdir as g}from"node:os";import{join as y}from"node:path";import{BROKER_READ_CAPS as P,encodeFrame as v}from"../../../core/runtime/broker-protocol.js";import{classifySubmit as x}from"../../conversation/submit.js";import{findRefTokens as w}from"../../../core/memory/inline-ref-grammar.js";import{dispatchSlashCommand as T,isSlashCommand as c}from"../slash/dispatch.js";import{viewerOperationForFrame as C}from"./capabilities.js";import{readClipboardImage as S,writeClipboardImageToFile as b}from"./clipboard-image.js";import{InputOverlayOwner as I}from"./overlay-owner.js";const A=500,E=P.maxLineBytes-4*1024*1024;class H{static{r(this,"InputController")}tui;editor;keybindings;hooks;capabilities;overlays;state;lastEscapeAt=0;pastedImages=new Map;pasteSeq=0;constructor(e,t,o,i,s){this.tui=e,this.editor=t,this.keybindings=o,this.hooks=i,this.capabilities=s,this.overlays=new I(e,t,o,{send:r(n=>this.emitCommand(n),"send"),notify:r(n=>this.notify(n),"notify"),onDialogResponse:i.onDialogResponse,onRequest:i.onRequest,onMountPicker:i.onMountPicker,onUnmountPicker:i.onUnmountPicker,state:r(()=>this.state,"state")}),this.wire()}cycleLadder(e){this.emitCommand({type:"cycle_ladder",direction:e})}sendInterrupting(e){return this.emitDrive({type:"prompt",text:e,interrupt:!0})}abortTurn(){return this.state?.isStreaming!==!0?!1:this.emitCommand({type:"abort"})}attachDialog(e){this.overlays.attachDialog(e)}dismissDialog(e){this.overlays.dismissDialog(e)}setState(e){this.state=e}openFileReviewPicker(e,t,o){this.overlays.openFileReviewPicker(e,t,o)}openAuthPicker(e){return this.overlays.openAuthPicker(e)}send=r(e=>{this.emitCommand(e)},"send");emitCommand(e){const t=C(e),o=t===void 0?void 0:this.capabilities.refusal(t);return o===void 0?(this.hooks.onCommand(e),!0):(this.notify(o),!1)}openBrokerPicker(e){const t=this.capabilities.refusal("engine-drive");if(t!==void 0){this.notify(t);return}e()}wire(){this.editor.onSubmit=t=>this.handleSubmit(t),this.editor.onEscape=()=>{if(this.state?.isStreaming){this.emitCommand({type:"abort"});return}if(this.editor.getText().trim())return;const t=Date.now();t-this.lastEscapeAt<A?(this.lastEscapeAt=0,this.openBrokerPicker(()=>{this.overlays.openTreePicker()})):this.lastEscapeAt=t},this.editor.onPasteImage=()=>{this.handlePaste()};const e=this.editor;e.onPasteImagePath=t=>(this.attachImage(t),!0),this.editor.onAction("app.session.new",()=>this.emitCommand({type:"new_session"})),this.editor.onAction("app.model.cycleForward",()=>this.emitCommand({type:"cycle_model",direction:"forward"})),this.editor.onAction("app.model.cycleBackward",()=>this.emitCommand({type:"cycle_model",direction:"backward"})),this.editor.onAction("app.thinking.cycle",()=>this.emitCommand({type:"cycle_thinking"})),this.editor.onAction("app.message.followUp",()=>this.handleFollowUp()),this.editor.onAction("app.message.dequeue",()=>{this.handleDequeue()}),this.editor.onAction("app.tools.expand",()=>this.hooks.onToggleToolsExpand?.()),this.editor.onAction("app.thinking.toggle",()=>this.hooks.onToggleThinking?.()),this.editor.onAction("app.editor.external",()=>{this.openExternalEditor()}),this.editor.onAction("app.model.select",()=>this.openBrokerPicker(()=>{this.overlays.openModelPicker()})),this.editor.onAction("app.session.tree",()=>this.openBrokerPicker(()=>{this.overlays.openTreePicker()})),this.editor.onAction("app.session.fork",()=>this.openBrokerPicker(()=>{this.overlays.openForkPicker()})),this.editor.onAction("app.session.resume",()=>this.openBrokerPicker(()=>{this.overlays.openSessionPicker()}))}slashContext(){return{send:this.send,notify:r(e=>this.notify(e),"notify"),capabilities:this.capabilities,state:this.state,cwd:process.cwd(),onGraph:this.hooks.onGraph,onInbox:this.hooks.onInbox,onHelp:this.hooks.onHelp,onQuit:this.hooks.onQuit,onCopy:this.hooks.onCopy,onCopyTarget:this.hooks.onCopyTarget,onToggleMouse:this.hooks.onToggleMouse,onColor:this.hooks.onColor,onNodeMetadata:this.hooks.onNodeMetadata,onFoldTools:this.hooks.onFoldTools,openModelPicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openModelPicker()}),"openModelPicker"),openSessionPicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openSessionPicker()}),"openSessionPicker"),openForkPicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openForkPicker()}),"openForkPicker"),openTreePicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openTreePicker()}),"openTreePicker"),openSettingsPicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openSettingsPicker()}),"openSettingsPicker"),openScopedModelsPicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openScopedModelsPicker()}),"openScopedModelsPicker"),openMcpPicker:r(e=>this.overlays.openMcpPicker(e),"openMcpPicker"),openLoginPicker:this.hooks.openLoginPicker,openLogoutPicker:this.hooks.openLogoutPicker}}recordCommandUse(e){const t=this.hooks.frecency;if(!t)return;const o=e.slice(1).split(/\s/,1)[0];o&&t.record(`command:${o}`)}recordCompletionUse(e){const t=this.hooks.frecency;if(!t)return;const o=e.trim();if(c(o)){this.recordCommandUse(o);return}const i=this.hooks.knownRefNames?.();if(!i||i.size===0)return;const s=new Set;for(const n of w(e))i.has(n.candidate)&&!s.has(n.candidate)&&(s.add(n.candidate),t.record(`ref:${n.candidate}`))}handleSubmit(e){const t=e.trim();if(!t)return;if(c(t)&&T(t,this.slashContext())){this.recordCommandUse(t),this.editor.setText("");return}const o=this.hooks.isDormant?.()===!0;if(o&&(t.startsWith("/")||t.startsWith("!"))){this.notify("This node is parked \u2014 submit a message to wake it; broker commands need a live engine");return}const i=x(e,{isDormant:o,canWakeDormant:o&&this.capabilities.permits("wake-dormant")&&this.hooks.onDormantSubmit!==void 0,isStreaming:this.state?.isStreaming===!0});if(i.kind==="empty")return;if(i.kind==="dormant"){const a=this.hooks.onDormantSubmit;if(a===void 0)return;a(this.expandImagePlaceholders(i.text)),this.recordCompletionUse(e),this.editor.addToHistory(i.trimmed),this.editor.setText(""),this.clearPastedImages(),this.hooks.onPromptSent?.();return}if(i.kind==="bash"){if(!this.emitDrive({type:"bash",command:i.command,excludeFromContext:i.excludeFromContext}))return;this.editor.addToHistory(i.trimmed),this.editor.setText("");return}const s=i.kind==="slash"?this.state?.isStreaming===!0?"steer":"prompt":i.kind;if(s!=="steer"&&s!=="prompt")return;const n=this.expandImagePlaceholders(i.kind==="slash"?e:i.text);this.emitDrive(s==="steer"?{type:"steer",text:n}:{type:"prompt",text:n})&&(this.recordCompletionUse(e),this.editor.addToHistory(i.trimmed),this.editor.setText(""),this.clearPastedImages(),this.hooks.onPromptSent?.())}handleFollowUp(){const e=this.editor.getText(),t=e.trim();t&&this.emitDrive({type:"follow_up",text:this.expandImagePlaceholders(e)})&&(this.editor.addToHistory(t),this.editor.setText(""),this.clearPastedImages())}async handleDequeue(){const e=this.capabilities.refusal("dequeue");if(e!==void 0){this.notify(e);return}const t=this.hooks.onRequest;if(t===void 0){this.notify("Restoring queued messages isn't available in this viewer");return}let o;try{o=await t({type:"dequeue"})}catch(s){this.notify(`Could not restore queued messages: ${s instanceof Error?s.message:String(s)}`);return}if(o.kind!=="dequeue"){this.notify("Unexpected reply restoring queued messages");return}const i=[...o.steering,...o.followUp];if(i.length===0){this.notify("No queued messages to restore");return}this.editor.setText([i.join(`
1
+ var p=Object.defineProperty;var r=(d,e)=>p(d,"name",{value:e,configurable:!0});import{spawn as l}from"node:child_process";import{readFileSync as u,unlinkSync as f,writeFileSync as k}from"node:fs";import{tmpdir as g}from"node:os";import{join as y}from"node:path";import{BROKER_READ_CAPS as P,encodeFrame as v}from"../../../core/runtime/broker-protocol.js";import{classifySubmit as x}from"../../conversation/submit.js";import{findRefTokens as w}from"../../../shared/inline-ref-grammar.js";import{dispatchSlashCommand as T,isSlashCommand as c}from"../slash/dispatch.js";import{viewerOperationForFrame as C}from"./capabilities.js";import{readClipboardImage as S,writeClipboardImageToFile as b}from"./clipboard-image.js";import{InputOverlayOwner as I}from"./overlay-owner.js";const A=500,E=P.maxLineBytes-4*1024*1024;class H{static{r(this,"InputController")}tui;editor;keybindings;hooks;capabilities;overlays;state;lastEscapeAt=0;pastedImages=new Map;pasteSeq=0;constructor(e,t,o,i,s){this.tui=e,this.editor=t,this.keybindings=o,this.hooks=i,this.capabilities=s,this.overlays=new I(e,t,o,{send:r(n=>this.emitCommand(n),"send"),notify:r(n=>this.notify(n),"notify"),onDialogResponse:i.onDialogResponse,onRequest:i.onRequest,onMountPicker:i.onMountPicker,onUnmountPicker:i.onUnmountPicker,state:r(()=>this.state,"state")}),this.wire()}cycleLadder(e){this.emitCommand({type:"cycle_ladder",direction:e})}sendInterrupting(e){return this.emitDrive({type:"prompt",text:e,interrupt:!0})}abortTurn(){return this.state?.isStreaming!==!0?!1:this.emitCommand({type:"abort"})}attachDialog(e){this.overlays.attachDialog(e)}dismissDialog(e){this.overlays.dismissDialog(e)}setState(e){this.state=e}openFileReviewPicker(e,t,o){this.overlays.openFileReviewPicker(e,t,o)}openAuthPicker(e){return this.overlays.openAuthPicker(e)}send=r(e=>{this.emitCommand(e)},"send");emitCommand(e){const t=C(e),o=t===void 0?void 0:this.capabilities.refusal(t);return o===void 0?(this.hooks.onCommand(e),!0):(this.notify(o),!1)}openBrokerPicker(e){const t=this.capabilities.refusal("engine-drive");if(t!==void 0){this.notify(t);return}e()}wire(){this.editor.onSubmit=t=>this.handleSubmit(t),this.editor.onEscape=()=>{if(this.state?.isStreaming){this.emitCommand({type:"abort"});return}if(this.editor.getText().trim())return;const t=Date.now();t-this.lastEscapeAt<A?(this.lastEscapeAt=0,this.openBrokerPicker(()=>{this.overlays.openTreePicker()})):this.lastEscapeAt=t},this.editor.onPasteImage=()=>{this.handlePaste()};const e=this.editor;e.onPasteImagePath=t=>(this.attachImage(t),!0),this.editor.onAction("app.session.new",()=>this.emitCommand({type:"new_session"})),this.editor.onAction("app.model.cycleForward",()=>this.emitCommand({type:"cycle_model",direction:"forward"})),this.editor.onAction("app.model.cycleBackward",()=>this.emitCommand({type:"cycle_model",direction:"backward"})),this.editor.onAction("app.thinking.cycle",()=>this.emitCommand({type:"cycle_thinking"})),this.editor.onAction("app.message.followUp",()=>this.handleFollowUp()),this.editor.onAction("app.message.dequeue",()=>{this.handleDequeue()}),this.editor.onAction("app.tools.expand",()=>this.hooks.onToggleToolsExpand?.()),this.editor.onAction("app.thinking.toggle",()=>this.hooks.onToggleThinking?.()),this.editor.onAction("app.editor.external",()=>{this.openExternalEditor()}),this.editor.onAction("app.model.select",()=>this.openBrokerPicker(()=>{this.overlays.openModelPicker()})),this.editor.onAction("app.session.tree",()=>this.openBrokerPicker(()=>{this.overlays.openTreePicker()})),this.editor.onAction("app.session.fork",()=>this.openBrokerPicker(()=>{this.overlays.openForkPicker()})),this.editor.onAction("app.session.resume",()=>this.openBrokerPicker(()=>{this.overlays.openSessionPicker()}))}slashContext(){return{send:this.send,notify:r(e=>this.notify(e),"notify"),capabilities:this.capabilities,state:this.state,cwd:process.cwd(),onGraph:this.hooks.onGraph,onInbox:this.hooks.onInbox,onHelp:this.hooks.onHelp,onQuit:this.hooks.onQuit,onCopy:this.hooks.onCopy,onCopyTarget:this.hooks.onCopyTarget,onToggleMouse:this.hooks.onToggleMouse,onColor:this.hooks.onColor,onNodeMetadata:this.hooks.onNodeMetadata,onFoldTools:this.hooks.onFoldTools,openModelPicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openModelPicker()}),"openModelPicker"),openSessionPicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openSessionPicker()}),"openSessionPicker"),openForkPicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openForkPicker()}),"openForkPicker"),openTreePicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openTreePicker()}),"openTreePicker"),openSettingsPicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openSettingsPicker()}),"openSettingsPicker"),openScopedModelsPicker:r(()=>this.openBrokerPicker(()=>{this.overlays.openScopedModelsPicker()}),"openScopedModelsPicker"),openMcpPicker:r(e=>this.overlays.openMcpPicker(e),"openMcpPicker"),openLoginPicker:this.hooks.openLoginPicker,openLogoutPicker:this.hooks.openLogoutPicker}}recordCommandUse(e){const t=this.hooks.frecency;if(!t)return;const o=e.slice(1).split(/\s/,1)[0];o&&t.record(`command:${o}`)}recordCompletionUse(e){const t=this.hooks.frecency;if(!t)return;const o=e.trim();if(c(o)){this.recordCommandUse(o);return}const i=this.hooks.knownRefNames?.();if(!i||i.size===0)return;const s=new Set;for(const n of w(e))i.has(n.candidate)&&!s.has(n.candidate)&&(s.add(n.candidate),t.record(`ref:${n.candidate}`))}handleSubmit(e){const t=e.trim();if(!t)return;if(c(t)&&T(t,this.slashContext())){this.recordCommandUse(t),this.editor.setText("");return}const o=this.hooks.isDormant?.()===!0;if(o&&(t.startsWith("/")||t.startsWith("!"))){this.notify("This node is parked \u2014 submit a message to wake it; broker commands need a live engine");return}const i=x(e,{isDormant:o,canWakeDormant:o&&this.capabilities.permits("wake-dormant")&&this.hooks.onDormantSubmit!==void 0,isStreaming:this.state?.isStreaming===!0});if(i.kind==="empty")return;if(i.kind==="dormant"){const a=this.hooks.onDormantSubmit;if(a===void 0)return;a(this.expandImagePlaceholders(i.text)),this.recordCompletionUse(e),this.editor.addToHistory(i.trimmed),this.editor.setText(""),this.clearPastedImages(),this.hooks.onPromptSent?.();return}if(i.kind==="bash"){if(!this.emitDrive({type:"bash",command:i.command,excludeFromContext:i.excludeFromContext}))return;this.editor.addToHistory(i.trimmed),this.editor.setText("");return}const s=i.kind==="slash"?this.state?.isStreaming===!0?"steer":"prompt":i.kind;if(s!=="steer"&&s!=="prompt")return;const n=this.expandImagePlaceholders(i.kind==="slash"?e:i.text);this.emitDrive(s==="steer"?{type:"steer",text:n}:{type:"prompt",text:n})&&(this.recordCompletionUse(e),this.editor.addToHistory(i.trimmed),this.editor.setText(""),this.clearPastedImages(),this.hooks.onPromptSent?.())}handleFollowUp(){const e=this.editor.getText(),t=e.trim();t&&this.emitDrive({type:"follow_up",text:this.expandImagePlaceholders(e)})&&(this.editor.addToHistory(t),this.editor.setText(""),this.clearPastedImages())}async handleDequeue(){const e=this.capabilities.refusal("dequeue");if(e!==void 0){this.notify(e);return}const t=this.hooks.onRequest;if(t===void 0){this.notify("Restoring queued messages isn't available in this viewer");return}let o;try{o=await t({type:"dequeue"})}catch(s){this.notify(`Could not restore queued messages: ${s instanceof Error?s.message:String(s)}`);return}if(o.kind!=="dequeue"){this.notify("Unexpected reply restoring queued messages");return}const i=[...o.steering,...o.followUp];if(i.length===0){this.notify("No queued messages to restore");return}this.editor.setText([i.join(`
2
2
 
3
3
  `),this.editor.getText()].filter(s=>s.trim()).join(`
4
4
 
@@ -1,2 +1,2 @@
1
- var x=Object.defineProperty;var o=(f,e)=>x(f,"name",{value:e,configurable:!0});import{findRefTokenAtCaret as C,formatRefToken as m}from"../../../core/memory/inline-ref-grammar.js";import{leafFirstSearchable as u,normalizeRefQuery as y,rankByFuzzyFrecency as p}from"./completion-frecency.js";function h(f,e,n){const i=f.join(`
1
+ var x=Object.defineProperty;var o=(f,e)=>x(f,"name",{value:e,configurable:!0});import{findRefTokenAtCaret as C,formatRefToken as m}from"../../../shared/inline-ref-grammar.js";import{leafFirstSearchable as u,normalizeRefQuery as y,rankByFuzzyFrecency as p}from"./completion-frecency.js";function h(f,e,n){const i=f.join(`
2
2
  `);let t=0;for(let s=0;s<e&&s<f.length;s++)t+=f[s].length+1;const l=t+n,a=C(i,l);if(!a)return null;const c=a.start-t,r=a.end-t;return{kind:a.start===0?"leading":"ref",startCol:c,endCol:r,prefix:a.surfacePrefix}}o(h,"findRefCompletionContext");class v{static{o(this,"RefAwareAutocompleteProvider")}refs;refNames;delegate;frecency;constructor(e,n,i){this.refs=e,this.refNames=new Set(e.map(t=>t.name)),this.delegate=n,this.frecency=i}get triggerCharacters(){return this.delegate.triggerCharacters}async getSuggestions(e,n,i,t){const l=h(e,n,i);if(!l)return this.delegate.getSuggestions(e,n,i,t);if(l.kind==="leading"){if(t.force)return this.delegate.getSuggestions(e,n,i,t);const r=(e[n]??"").slice(0,i),g=await this.delegate.getSuggestions(["/"],0,1,t);if(!g)return null;const s=p(g.items,r.slice(1),{searchableOf:o(d=>u(d.value),"searchableOf"),idOf:o(d=>`command:${d.value}`,"idOf"),store:this.frecency});return s.length===0?null:{items:s,prefix:r}}const a=p(this.refs,y(l.prefix.slice(1)),{searchableOf:o(r=>u(r.name),"searchableOf"),idOf:o(r=>`ref:${r.name}`,"idOf"),store:this.frecency});return a.length===0?null:{items:a.map(r=>({value:r.name,label:m(r.name),description:r.shortForm||void 0})),prefix:l.prefix.slice(1)}}applyCompletion(e,n,i,t,l){const a=h(e,n,i);if(a&&a.kind==="ref"&&this.refNames.has(t.value)){const c=m(t.value),r=e[n]??"",g=r.slice(0,a.startCol)+c+r.slice(a.endCol),s=e.slice();return s[n]=g,{lines:s,cursorLine:n,cursorCol:a.startCol+c.length}}return this.delegate.applyCompletion(e,n,i,t,l)}shouldTriggerFileCompletion(e,n,i){const t=h(e,n,i);return t&&t.kind==="ref"?!0:this.delegate.shouldTriggerFileCompletion?this.delegate.shouldTriggerFileCompletion(e,n,i):!1}}export{v as RefAwareAutocompleteProvider,h as findRefCompletionContext};
@@ -1,4 +1,4 @@
1
- var w=Object.defineProperty;var d=(s,e)=>w(s,"name",{value:e,configurable:!0});import{statSync as D}from"node:fs";import{CustomEditor as B}from"@earendil-works/pi-coding-agent";import{CURSOR_MARKER as E,truncateToWidth as C,visibleWidth as b,wrapTextWithAnsi as v}from"@earendil-works/pi-tui";import{wordWrapLine as H}from"@earendil-works/pi-tui/dist/components/editor.js";import{findRefTokens as F}from"../../../core/memory/inline-ref-grammar.js";import{findRefCompletionContext as G}from"./ref-autocomplete.js";const M=8,U=24,V=8192;function K(s,e){const t=s.slice(0,e),n=s.length>e;return{text:t.replace(/\x1b\](?:[^\x07\x1b]*)(?:\x07|\x1b\\)?/g,"").replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,"").replace(/[\x00-\x09\x0b-\x1f\x7f-\x9f]/g,""),truncated:n}}d(K,"sanitizeLoadedCommandPreview");function j(s,e){if(e<U)return[];const t=Math.min(V,Math.max(256,e*M*4)),n=K(s,t),r=v(n.text,e);if(!n.truncated&&r.length<=M)return r;const c=r.slice(0,M-1);return c.push(C("\u2026 truncated \xB7 inspect for full prompt",e)),c}d(j,"compactLoadedCommandPreview");const S=[46,92,190],R=[166,98,24],z=[0,145,170];function L(s,e,t){return[Math.round(s[0]+(e[0]-s[0])*t),Math.round(s[1]+(e[1]-s[1])*t),Math.round(s[2]+(e[2]-s[2])*t)]}d(L,"interpolateRgb");const P={off:void 0,minimal:L(S,R,0/4),low:L(S,R,1/4),medium:L(S,R,2/4),high:L(S,R,3/4),xhigh:L(S,R,4/4),max:z},X={black:[0,0,0],red:[205,49,49],green:[13,188,121],yellow:[229,229,16],blue:[36,114,200],magenta:[188,63,188],cyan:[17,168,205],white:[229,229,229],orange:[228,152,68],grey:[128,128,128],gray:[128,128,128],brightred:[241,76,76],brightgreen:[35,209,139],brightyellow:[245,245,67],brightblue:[59,142,234],brightmagenta:[214,112,214],brightcyan:[41,184,219]};function xe(s){const e=s.trim().toLowerCase(),t=/^colour(\d{1,3})$/.exec(e);if(t!==null)return a=>`\x1B[48;5;${t[1]}m\x1B[97m\x1B[1m ${a} \x1B[0m`;let n;const r=/^#([0-9a-f]{6})$/.exec(e);if(r!==null){const a=r[1];n=[parseInt(a.slice(0,2),16),parseInt(a.slice(2,4),16),parseInt(a.slice(4,6),16)]}else n=X[e];if(n===void 0)return;const[c,i,o]=n,u=.299*c+.587*i+.114*o>160?"\x1B[30m":"\x1B[97m";return a=>`\x1B[48;2;${c};${i};${o}m${u}\x1B[1m ${a} \x1B[0m`}d(xe,"colorChipStyle");const k=d(s=>`\x1B[7m ${s} \x1B[27m`,"defaultTitleStyle");function pe(s,e){const t=s===void 0?void 0:P[s];if(t===void 0)return e;const[n,r,c]=t;return i=>`\x1B[38;2;${n};${r};${c}m${i}\x1B[39m`}d(pe,"thinkingBorderColor");function be(s,e){const t=s===void 0?void 0:P[s];if(t===void 0)return e;const[n,r,c]=t;return i=>`\x1B[48;2;${n};${r};${c}m\x1B[97m\x1B[1m ${i} \x1B[0m`}d(be,"thinkingTitleStyle");function Y(s,e,t,n,r){const c=e?n(C(e,Math.max(1,s-4),"\u2026")):"",i=b(c),o=s-i;let l="";t&&o>4&&(l=b(t)<=o?t:C(t,o,"\u2026"));const u=Math.max(0,s-i-b(l));return c+r("\u2500".repeat(u))+l}d(Y,"composeTopBorder");const N="\x1B[7m",A="\x1B[0m",_="\x1B[48;5;240m";function q(s){const e=s.indexOf(E);if(e===-1)return;const t=e+E.length;if(!s.startsWith(N,t))return;const n=t+N.length,r=s.indexOf(A,n);if(r===-1)return;const c=s.slice(n,r),i=`${_}${c}\x1B[0m`;return s.slice(0,t)+i+s.slice(r+A.length)}d(q,"outlineCursorLine");const Z=/\.(png|jpe?g|gif|webp|bmp)$/i;function J(s){const e=s.match(/\x1b\[200~([\s\S]*?)\x1b\[201~/);let t=(e?e[1]:s).trim();if(t.length<2||/[\u0000-\u0008\u000e-\u001f]/.test(t))return null;(t.startsWith("'")&&t.endsWith("'")||t.startsWith('"')&&t.endsWith('"'))&&(t=t.slice(1,-1));const n=t.replace(/\\(.)/g,"$1");if(/\n/.test(n)||!Z.test(n))return null;try{if(!D(n).isFile())return null}catch{return null}return n}d(J,"detectDroppedImagePath");function Q(s,e,t,n){const r=[];if(s.length===0||s.length===1&&s[0]==="")return r.push({logicalLine:0,startIndex:0,endIndex:0,text:"",hasCursor:!0,cursorPos:0}),r;for(let c=0;c<s.length;c++){const i=s[c]??"",o=c===t;if(b(i)<=e){r.push({logicalLine:c,startIndex:0,endIndex:i.length,text:i,hasCursor:o,cursorPos:o?n:0});continue}const l=H(i,e);for(let u=0;u<l.length;u++){const a=l[u];if(!a)continue;const h=u===l.length-1;let m=!1,f=0;o&&(h?(m=n>=a.startIndex,f=n-a.startIndex):(m=n>=a.startIndex&&n<a.endIndex,m&&(f=n-a.startIndex,f>a.text.length&&(f=a.text.length)))),r.push({logicalLine:c,startIndex:a.startIndex,endIndex:a.endIndex,text:a.text,hasCursor:m,cursorPos:f})}}return r}d(Q,"buildRefLayoutChunks");function ee(s,e){return F(s).filter(t=>e.has(t.candidate)).map(t=>({start:t.start,end:t.end}))}d(ee,"resolvedSpansForLine");const te="\x1B[4m\x1B[2m",ne="\x1B[24m\x1B[22m",se=new Intl.Segmenter(void 0,{granularity:"grapheme"});function re(s){for(const e of se.segment(s))return e.segment.length;return 0}d(re,"firstGraphemeLength");function ie(s){const e=s.indexOf(E),t=e===-1?0:e+E.length;let n=s.indexOf(N,t),r=N.length;if(n===-1&&(n=s.indexOf(_,t),r=_.length),n===-1)return null;const c=s.indexOf(A,n+r);return c===-1?null:{start:e!==-1?e:n,end:c+A.length}}d(ie,"locateCursorCell");function oe(s,e,t,n,r){const c=[];if(e.hasCursor){const o=ie(s);if(o===null)return s;const l=e.text.slice(e.cursorPos),u=l.length===0?0:re(l),a=e.cursorPos+u;for(const h of t){const m=h.start-e.startIndex,f=h.end-e.startIndex;if(f<=e.cursorPos){const g=r+m,x=r+f;x<=o.start&&s.slice(g,x)===n.slice(h.start,h.end)&&c.push({absStart:g,absEnd:x})}else if(m>=a){const g=o.end+(m-a),x=o.end+(f-a);g>=o.end&&s.slice(g,x)===n.slice(h.start,h.end)&&c.push({absStart:g,absEnd:x})}}}else for(const o of t){const l=r+(o.start-e.startIndex),u=r+(o.end-e.startIndex);s.slice(l,u)===n.slice(o.start,o.end)&&c.push({absStart:l,absEnd:u})}if(c.length===0)return s;c.sort((o,l)=>l.absStart-o.absStart);let i=s;for(const o of c)i=i.slice(0,o.absStart)+te+i.slice(o.absStart,o.absEnd)+ne+i.slice(o.absEnd);return i}d(oe,"decorateRow");function ce(s){const e=/^\/(\S+)\s*([\s\S]*)$/.exec(s.trim());return e?e[1]:null}d(ce,"extractLeadingCommandName");function ae(s,e){if(!s.startsWith("/"))return!1;const t=s.indexOf(" "),n=t===-1?s.slice(1):s.slice(1,t);if(e.has(n))return!0;if(s.startsWith("/skill:")){const r=t===-1?s.slice(7):s.slice(7,t);if(e.has(`skill:${r}`))return!0}return!1}d(ae,"matchesEngineLeadingCommand");class W extends B{static{d(this,"TitledEditor")}km;pendingRawSubmitText;realOnSubmit;pendingReturn;static PASTE_BURST_MS=10;constructor(e,t,n,r){super(e,t,n,r),this.km=n;const c=this.submitValue.bind(this);this.submitValue=()=>{const i=this;this.pendingRawSubmitText=i.getExpandedText(),c()},Object.defineProperty(this,"onSubmit",{configurable:!0,get:d(()=>i=>{const o=this.pendingRawSubmitText??i;this.pendingRawSubmitText=void 0,this.realOnSubmit?.(o)},"get"),set:d(i=>{this.realOnSubmit=i},"set")})}onPasteImagePath;settleHeldReturn(e){const t=this.pendingReturn;if(t!==void 0){if(clearTimeout(t.timer),this.pendingReturn=void 0,e==="newline"){this.insertTextAtCursor(`
1
+ var w=Object.defineProperty;var d=(s,e)=>w(s,"name",{value:e,configurable:!0});import{statSync as D}from"node:fs";import{CustomEditor as B}from"@earendil-works/pi-coding-agent";import{CURSOR_MARKER as E,truncateToWidth as C,visibleWidth as b,wrapTextWithAnsi as v}from"@earendil-works/pi-tui";import{wordWrapLine as H}from"@earendil-works/pi-tui/dist/components/editor.js";import{findRefTokens as F}from"../../../shared/inline-ref-grammar.js";import{findRefCompletionContext as G}from"./ref-autocomplete.js";const M=8,U=24,V=8192;function K(s,e){const t=s.slice(0,e),n=s.length>e;return{text:t.replace(/\x1b\](?:[^\x07\x1b]*)(?:\x07|\x1b\\)?/g,"").replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,"").replace(/[\x00-\x09\x0b-\x1f\x7f-\x9f]/g,""),truncated:n}}d(K,"sanitizeLoadedCommandPreview");function j(s,e){if(e<U)return[];const t=Math.min(V,Math.max(256,e*M*4)),n=K(s,t),r=v(n.text,e);if(!n.truncated&&r.length<=M)return r;const c=r.slice(0,M-1);return c.push(C("\u2026 truncated \xB7 inspect for full prompt",e)),c}d(j,"compactLoadedCommandPreview");const S=[46,92,190],R=[166,98,24],z=[0,145,170];function L(s,e,t){return[Math.round(s[0]+(e[0]-s[0])*t),Math.round(s[1]+(e[1]-s[1])*t),Math.round(s[2]+(e[2]-s[2])*t)]}d(L,"interpolateRgb");const P={off:void 0,minimal:L(S,R,0/4),low:L(S,R,1/4),medium:L(S,R,2/4),high:L(S,R,3/4),xhigh:L(S,R,4/4),max:z},X={black:[0,0,0],red:[205,49,49],green:[13,188,121],yellow:[229,229,16],blue:[36,114,200],magenta:[188,63,188],cyan:[17,168,205],white:[229,229,229],orange:[228,152,68],grey:[128,128,128],gray:[128,128,128],brightred:[241,76,76],brightgreen:[35,209,139],brightyellow:[245,245,67],brightblue:[59,142,234],brightmagenta:[214,112,214],brightcyan:[41,184,219]};function xe(s){const e=s.trim().toLowerCase(),t=/^colour(\d{1,3})$/.exec(e);if(t!==null)return a=>`\x1B[48;5;${t[1]}m\x1B[97m\x1B[1m ${a} \x1B[0m`;let n;const r=/^#([0-9a-f]{6})$/.exec(e);if(r!==null){const a=r[1];n=[parseInt(a.slice(0,2),16),parseInt(a.slice(2,4),16),parseInt(a.slice(4,6),16)]}else n=X[e];if(n===void 0)return;const[c,i,o]=n,u=.299*c+.587*i+.114*o>160?"\x1B[30m":"\x1B[97m";return a=>`\x1B[48;2;${c};${i};${o}m${u}\x1B[1m ${a} \x1B[0m`}d(xe,"colorChipStyle");const k=d(s=>`\x1B[7m ${s} \x1B[27m`,"defaultTitleStyle");function pe(s,e){const t=s===void 0?void 0:P[s];if(t===void 0)return e;const[n,r,c]=t;return i=>`\x1B[38;2;${n};${r};${c}m${i}\x1B[39m`}d(pe,"thinkingBorderColor");function be(s,e){const t=s===void 0?void 0:P[s];if(t===void 0)return e;const[n,r,c]=t;return i=>`\x1B[48;2;${n};${r};${c}m\x1B[97m\x1B[1m ${i} \x1B[0m`}d(be,"thinkingTitleStyle");function Y(s,e,t,n,r){const c=e?n(C(e,Math.max(1,s-4),"\u2026")):"",i=b(c),o=s-i;let l="";t&&o>4&&(l=b(t)<=o?t:C(t,o,"\u2026"));const u=Math.max(0,s-i-b(l));return c+r("\u2500".repeat(u))+l}d(Y,"composeTopBorder");const N="\x1B[7m",A="\x1B[0m",_="\x1B[48;5;240m";function q(s){const e=s.indexOf(E);if(e===-1)return;const t=e+E.length;if(!s.startsWith(N,t))return;const n=t+N.length,r=s.indexOf(A,n);if(r===-1)return;const c=s.slice(n,r),i=`${_}${c}\x1B[0m`;return s.slice(0,t)+i+s.slice(r+A.length)}d(q,"outlineCursorLine");const Z=/\.(png|jpe?g|gif|webp|bmp)$/i;function J(s){const e=s.match(/\x1b\[200~([\s\S]*?)\x1b\[201~/);let t=(e?e[1]:s).trim();if(t.length<2||/[\u0000-\u0008\u000e-\u001f]/.test(t))return null;(t.startsWith("'")&&t.endsWith("'")||t.startsWith('"')&&t.endsWith('"'))&&(t=t.slice(1,-1));const n=t.replace(/\\(.)/g,"$1");if(/\n/.test(n)||!Z.test(n))return null;try{if(!D(n).isFile())return null}catch{return null}return n}d(J,"detectDroppedImagePath");function Q(s,e,t,n){const r=[];if(s.length===0||s.length===1&&s[0]==="")return r.push({logicalLine:0,startIndex:0,endIndex:0,text:"",hasCursor:!0,cursorPos:0}),r;for(let c=0;c<s.length;c++){const i=s[c]??"",o=c===t;if(b(i)<=e){r.push({logicalLine:c,startIndex:0,endIndex:i.length,text:i,hasCursor:o,cursorPos:o?n:0});continue}const l=H(i,e);for(let u=0;u<l.length;u++){const a=l[u];if(!a)continue;const h=u===l.length-1;let m=!1,f=0;o&&(h?(m=n>=a.startIndex,f=n-a.startIndex):(m=n>=a.startIndex&&n<a.endIndex,m&&(f=n-a.startIndex,f>a.text.length&&(f=a.text.length)))),r.push({logicalLine:c,startIndex:a.startIndex,endIndex:a.endIndex,text:a.text,hasCursor:m,cursorPos:f})}}return r}d(Q,"buildRefLayoutChunks");function ee(s,e){return F(s).filter(t=>e.has(t.candidate)).map(t=>({start:t.start,end:t.end}))}d(ee,"resolvedSpansForLine");const te="\x1B[4m\x1B[2m",ne="\x1B[24m\x1B[22m",se=new Intl.Segmenter(void 0,{granularity:"grapheme"});function re(s){for(const e of se.segment(s))return e.segment.length;return 0}d(re,"firstGraphemeLength");function ie(s){const e=s.indexOf(E),t=e===-1?0:e+E.length;let n=s.indexOf(N,t),r=N.length;if(n===-1&&(n=s.indexOf(_,t),r=_.length),n===-1)return null;const c=s.indexOf(A,n+r);return c===-1?null:{start:e!==-1?e:n,end:c+A.length}}d(ie,"locateCursorCell");function oe(s,e,t,n,r){const c=[];if(e.hasCursor){const o=ie(s);if(o===null)return s;const l=e.text.slice(e.cursorPos),u=l.length===0?0:re(l),a=e.cursorPos+u;for(const h of t){const m=h.start-e.startIndex,f=h.end-e.startIndex;if(f<=e.cursorPos){const g=r+m,x=r+f;x<=o.start&&s.slice(g,x)===n.slice(h.start,h.end)&&c.push({absStart:g,absEnd:x})}else if(m>=a){const g=o.end+(m-a),x=o.end+(f-a);g>=o.end&&s.slice(g,x)===n.slice(h.start,h.end)&&c.push({absStart:g,absEnd:x})}}}else for(const o of t){const l=r+(o.start-e.startIndex),u=r+(o.end-e.startIndex);s.slice(l,u)===n.slice(o.start,o.end)&&c.push({absStart:l,absEnd:u})}if(c.length===0)return s;c.sort((o,l)=>l.absStart-o.absStart);let i=s;for(const o of c)i=i.slice(0,o.absStart)+te+i.slice(o.absStart,o.absEnd)+ne+i.slice(o.absEnd);return i}d(oe,"decorateRow");function ce(s){const e=/^\/(\S+)\s*([\s\S]*)$/.exec(s.trim());return e?e[1]:null}d(ce,"extractLeadingCommandName");function ae(s,e){if(!s.startsWith("/"))return!1;const t=s.indexOf(" "),n=t===-1?s.slice(1):s.slice(1,t);if(e.has(n))return!0;if(s.startsWith("/skill:")){const r=t===-1?s.slice(7):s.slice(7,t);if(e.has(`skill:${r}`))return!0}return!1}d(ae,"matchesEngineLeadingCommand");class W extends B{static{d(this,"TitledEditor")}km;pendingRawSubmitText;realOnSubmit;pendingReturn;static PASTE_BURST_MS=10;constructor(e,t,n,r){super(e,t,n,r),this.km=n;const c=this.submitValue.bind(this);this.submitValue=()=>{const i=this;this.pendingRawSubmitText=i.getExpandedText(),c()},Object.defineProperty(this,"onSubmit",{configurable:!0,get:d(()=>i=>{const o=this.pendingRawSubmitText??i;this.pendingRawSubmitText=void 0,this.realOnSubmit?.(o)},"get"),set:d(i=>{this.realOnSubmit=i},"set")})}onPasteImagePath;settleHeldReturn(e){const t=this.pendingReturn;if(t!==void 0){if(clearTimeout(t.timer),this.pendingReturn=void 0,e==="newline"){this.insertTextAtCursor(`
2
2
  `);return}super.handleInput(t.data),this.tui.requestRender()}}imageTokenWidthBeforeCursor(){const{line:e,col:t}=this.getCursor(),n=this.getLines()[e];if(n===void 0)return 0;const r=n.slice(0,t).match(/\[Image #\d+\]$/);return r?r[0].length:0}imageTokenWidthAfterCursor(){const{line:e,col:t}=this.getCursor(),n=this.getLines()[e];if(n===void 0)return 0;const r=n.slice(t).match(/^\[Image #\d+\]/);return r?r[0].length:0}handleInput(e){if(this.settleHeldReturn("newline"),!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.cursorDown")){const i=this,o=this.getCursor(),l=i.historyIndex;super.handleInput(e);const u=this.getCursor();i.historyIndex===l&&u.line===o.line&&u.col===o.col&&this.onCursorDownAtBottom?.();return}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.input.newLine")){this.insertTextAtCursor(`
3
3
  `);return}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.deleteCharBackward")){const i=this.imageTokenWidthBeforeCursor();if(i>1){for(let o=0;o<i;o++)super.handleInput(e);return}}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.cursorLeft")){const i=this.imageTokenWidthBeforeCursor();if(i>1){for(let o=0;o<i;o++)super.handleInput(e);return}}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.cursorRight")){const i=this.imageTokenWidthAfterCursor();if(i>1){for(let o=0;o<i;o++)super.handleInput(e);return}}const t=J(e);if(t&&this.onPasteImagePath?.(t))return;if((e==="\r"||e===`
4
4
  `)&&!this.isShowingAutocomplete()){this.pendingReturn={data:e,timer:setTimeout(()=>this.settleHeldReturn("submit"),W.PASTE_BURST_MS)};return}const{line:n,col:r}=this.getCursor(),c=this.getLines()[n]??"";super.handleInput(e),this.maybeTriggerNonLeadingRefAutocomplete(n,r,c)}maybeTriggerNonLeadingRefAutocomplete(e,t,n){if(this.isShowingAutocomplete())return;const r=this.getCursor();if(r.line!==e||r.col!==t+1)return;const c=this.getLines()[r.line]??"";if(c.length!==n.length+1)return;const i=c[t];if(i===void 0||i!=="/"&&!/[A-Za-z0-9_:-]/.test(i))return;const o=G(this.getLines(),r.line,r.col);!o||o.kind!=="ref"||this.tryTriggerAutocomplete()}onCursorDownAtBottom;loadedCommand;title="";info="";contextBadge="";titleStyle=k;contextBadgeStyle=k;paneFocused=!0;resolvedRefNames=new Set;localCommandNames=new Set;engineCommandNames=new Set;setResolvedRefNames(e){this.resolvedRefNames=new Set(e)}getResolvedRefNames(){return this.resolvedRefNames}setLocalCommandNames(e){this.localCommandNames=new Set(e)}setEngineCommandNames(e){this.engineCommandNames=new Set(e)}decorateResolvedRefs(e,t){if(this.resolvedRefNames.size===0)return;const n=this.getText(),r=ce(n);if(r!==null&&this.localCommandNames.has(r)||ae(n,this.engineCommandNames))return;const c=Math.max(0,Math.floor((t-1)/2)),i=Math.min(this.getPaddingX(),c),o=Math.max(1,t-i*2),l=Math.max(1,o-(i?0:1)),u=this.getLines(),a=this.getCursor(),h=Q(u,l,a.line,a.col),m=this.scrollOffset,f=Math.max(5,Math.floor(this.tui.terminal.rows*.3)),g=Math.min(Math.max(0,h.length-m),f);if(g<=0||e.length<1+g)return;const x=new Map;for(let I=0;I<g;I++){const p=h[m+I];if(!p)continue;let T=x.get(p.logicalLine);T===void 0&&(T=ee(u[p.logicalLine]??"",this.resolvedRefNames),x.set(p.logicalLine,T));const $=T.filter(y=>y.start>=p.startIndex&&y.end<=p.endIndex);if($.length===0)continue;const O=e[1+I];O!==void 0&&(e[1+I]=oe(O,p,$,u[p.logicalLine]??"",i))}}render(e){const t=super.render(e);if(!this.paneFocused)for(let n=0;n<t.length;n++){const r=q(t[n]);if(r!==void 0){t[n]=r;break}}if(this.decorateResolvedRefs(t,e),this.loadedCommand!==void 0&&t.length>=2&&e>=8){const n=e-4,r=j(this.loadedCommand.content,n);if(r.length===0)return t;const c=` ${this.loadedCommand.inspectHint} \xB7 /${this.loadedCommand.name} loaded `,i=r.map(a=>{const h=C(a,n);return`${this.borderColor("\u2502")} ${h}${" ".repeat(Math.max(0,n-b(h)))} ${this.borderColor("\u2502")}`}),o=C(c,e-2),l=Math.max(0,e-2-b(o)),u=this.borderColor(`\u251C${o}${"\u2500".repeat(l)}\u2524`);t.splice(1,0,u,...i,this.borderColor(`\u251C${"\u2500".repeat(e-2)}\u2524`))}if((this.title||this.info)&&t.length>0&&(t[0]=Y(e,this.title,this.info,this.titleStyle,n=>this.borderColor(n))),this.contextBadge&&t.length>0){const n=this.contextBadgeStyle(this.contextBadge),r=b(n);if(r+2<e){const c=t.length-1;t[c]=C(t[c],e-r,"")+n}}return t}}export{W as TitledEditor,Q as buildRefLayoutChunks,xe as colorChipStyle,j as compactLoadedCommandPreview,Y as composeTopBorder,oe as decorateRow,k as defaultTitleStyle,J as detectDroppedImagePath,q as outlineCursorLine,pe as thinkingBorderColor,be as thinkingTitleStyle};
@@ -1,4 +1,4 @@
1
- var v=Object.defineProperty;var p=(h,t)=>v(h,"name",{value:t,configurable:!0});import{Container as j,Loader as F,Spacer as d,Text as x}from"@earendil-works/pi-tui";import{AssistantMessageComponent as L,BashExecutionComponent as E,BranchSummaryMessageComponent as H,CompactionSummaryMessageComponent as W,CustomMessageComponent as $,parseSkillBlock as q,SkillInvocationMessageComponent as V,ToolExecutionComponent as N,UserMessageComponent as S}from"@earendil-works/pi-coding-agent";import{attachMarkdownTheme as u}from"../config.js";import{ContextMessageComponent as U}from"./context-message.js";import{presentationFor as z}from"./card-presentation.js";import{detectInlinePageResult as Y,PageBlockComponent as J}from"./page-block.js";import{CRTR_OUTPUT_CUSTOM_TYPE as K,CrtrOutputMessageComponent as X,createCrtrBashToolDefinition as Q}from"./crtr-output.js";import{CRTR_CYCLE_DIVIDER_CUSTOM_TYPE as Z,endedByAbort as w}from"../../../core/runtime/session-cycles.js";import{parseCard as tt}from"../../../shared/generated-context.js";import{assistantVisibleText as c,isGroupBoundaryKind as et,isTrueUserMessage as C}from"../../../shared/tool-groups.js";import{transformDiagramFences as st}from"./diagram.js";import{styleAttachAgentMarkdown as it,styleAttachMarkdownSource as M,styleAttachMessageMarkdown as ot,styleAttachSummaryMarkdown as O}from"./markdown-source.js";import{createCrtrEditToolDefinition as nt}from"./edit-diff.js";import{GroupActivityRecorder as rt}from"./group-activity.js";import{GroupRecapComponent as at}from"./group-recap.js";import{FoldedToolCallController as ht,bashCallBackgroundHintLines as pt,createCrtrPlainBashToolDefinition as lt,createCrtrReadToolDefinition as dt,createCrtrWriteToolDefinition as ct}from"./tool-calls.js";import{ringCompletionBell as ut}from"../chrome/completion-bell.js";import{extractFilePaths as mt}from"#core/human/visible-paths";import{keepWhenCondensed as ft,liveRegionStart as gt}from"./condensed-history.js";import{ViewerAssistantMessageComponent as B}from"./assistant-message.js";import{CompositeViewportSource as yt,MeasuredContainer as A}from"./measured-container.js";import{readConfig as T,updateRawConfigAtomically as Ct}from"../../../core/config.js";import{DEFAULT_CONDENSED_HISTORY as Tt,DEFAULT_LIVE_CYCLES as kt}from"../../../types.js";import{applySnapshot as bt,applyToolGroupSummary as xt,applyWorkingActivity as St,bashEnd as wt,bashOutput as Bt,bashStart as At,initialConvState as Rt,reduce as Gt}from"../../conversation/projection.js";const I=p(h=>`\x1B[2m${h}\x1B[22m`,"defaultDimStyle"),_=50;function Et(){try{return T("user").live_cycles}catch{return kt}}p(Et,"readLiveCycles");function Mt(){try{return T("user").condensed_history}catch{return Tt}}p(Mt,"readCondensedHistory");function Ot(){try{return T("user").fold_finished_tools}catch{return!1}}p(Ot,"readFoldFinishedTools");function It(){try{return T("user").summarize_tool_calls}catch{return!1}}p(It,"readSummarizeToolCalls");function _t(){try{return T("user").detailed_tool_recaps}catch{return!0}}p(_t,"readDetailedToolRecaps");function Pt(h){try{Ct("user",t=>({...t,fold_finished_tools:h}))}catch{}}p(Pt,"persistFoldFinishedTools");function Dt(h){return typeof h=="object"&&h!==null&&"setExpanded"in h&&typeof h.setExpanded=="function"}p(Dt,"isExpandable");const vt=/\x1b\[[0-9;]*m/g,jt=/\x1b\[([0-9;]*)m/g;function Ft(h){return h.replace(jt,(t,e)=>{const s=e.split(";"),i=[];for(let o=0;o<s.length;o++){const n=Number(s[o]===""?0:s[o]);if(n===38||n===48||n===58){const r=Number(s[o+1]),a=o+(r===5?2:r===2?4:1);n!==48&&i.push(...s.slice(o,a+1)),o=a;continue}n>=40&&n<=47||n>=100&&n<=107||i.push(String(n))}return i.length>0?`\x1B[${i.join(";")}m`:""})}p(Ft,"stripBackground");const Lt=/<from\b[^>]*>[\s\S]*?<\/from>/g;class R extends d{static{p(this,"FoldedToolSeparator")}folded=!1;separatesToolGroup=!1;setFolded(t){this.folded=t,this.refresh()}setSeparatesToolGroup(t){this.separatesToolGroup=t,this.refresh()}refresh(){this.setLines(this.folded&&this.separatesToolGroup?1:0)}}class G extends N{static{p(this,"MinimizableToolComponent")}activityCallId;minimized=!1;expandedState=!1;foldController;resultObserver;setToolView(t,e){this.foldController=t,this.resultObserver=e}updateResult(...t){this.resultObserver?.(t[0],t[1]??!1),super.updateResult(...t)}setExpanded(t){this.expandedState=t,super.setExpanded(t)}setMinimized(t){!this.foldController||this.minimized===t||(this.minimized=t,this.foldController.setFolded(t),super.setExpanded(this.expandedState))}render(t){if(!this.minimized)return[...super.render(t),...pt(this.foldController?.callComponent(),t)];const e=this.foldController?.callComponent();return e?e.render(t).filter(s=>s.replace(vt,"").trim().length>0).map(s=>Ft(s).trimEnd()):super.render(t)}}const Ht=p(h=>`\x1B[31m${h}\x1B[39m`,"defaultErrorStyle"),Wt={accent:p(h=>`\x1B[33m${h}\x1B[39m`,"accent"),active:p(h=>`\x1B[36m${h}\x1B[39m`,"active"),info:p(h=>`\x1B[34m${h}\x1B[39m`,"info"),muted:I,faint:I,border:p(h=>h,"border"),surface:p(h=>h,"surface"),bold:p(h=>`\x1B[1m${h}\x1B[22m`,"bold"),error:Ht,warning:p(h=>`\x1B[33m${h}\x1B[39m`,"warning"),diffAdded:p(h=>`\x1B[32m${h}\x1B[39m`,"diffAdded"),diffRemoved:p(h=>`\x1B[91m${h}\x1B[39m`,"diffRemoved"),bashMode:p(h=>`\x1B[32m${h}\x1B[39m`,"bashMode"),bashModeAlt:p(h=>`\x1B[92m${h}\x1B[39m`,"bashModeAlt")};class ue{static{p(this,"ChatView")}tui;container;historyContainer=new A;statusContainer=new A;bannerContainer;transcript;appendTarget=this.historyContainer;pageBlocks=new Map;inlinePageBlocks;pageOpenHint;backgroundBashHint;liveCycles;condensedHistory;cwd;showImages;imageWidthCells;hideThinking;hiddenThinkingLabel;toolOutputExpanded;foldSettledTools=Ot();summarizeToolCalls=It();detailedToolRecaps=_t();showGroupSummaries=this.summarizeToolCalls&&this.foldSettledTools;groups=[];openGroup;groupSummaries=new Map;nodeRoster=new Map;streamingWasGroupMember=!1;onFooterEvent;onActivityChange;spinnerStyle;dimStyle;errorStyle;recapPalette;labelStyle=p(t=>`\x1B[1m${t}\x1B[22m`,"labelStyle");markdownTransformers=[(t,{messageType:e,availableWidth:s})=>e==="assistant"?st(t,s):t,(t,{messageType:e})=>e==="user"?M(t):it(t)];streamingComponent;streamingToolSeparator;foldedToolSeparatorContents=new Map;pendingTools=new Map;bashComponent;activityLoader;projection=Rt();workingActivity=this.projection.workingActivity;runActive=!1;applyingSnapshot=!1;snapshotGeneration=0;deferredFrames=[];lastAssistantText;transcriptFilePaths=[];copyBlockRecords=[];copyIndex=new Map;condensedCopyBlocks=new WeakMap;constructor(t,e,s={}){if(this.tui=t,this.container=e,this.cwd=s.cwd??process.cwd(),this.showImages=s.showImages??!0,this.imageWidthCells=s.imageWidthCells??60,this.hideThinking=s.hideThinking??!1,this.hiddenThinkingLabel=s.hiddenThinkingLabel??"Thinking...",this.toolOutputExpanded=s.toolOutputExpanded??!1,this.liveCycles=s.liveCycles??Et(),this.condensedHistory=s.condensedHistory??Mt(),this.onFooterEvent=s.onFooterEvent,this.onActivityChange=s.onActivityChange,this.inlinePageBlocks=s.inlinePageBlocks??!1,this.pageOpenHint=s.pageOpenHint??(()=>"crtr human list"),this.backgroundBashHint=s.backgroundBashHint??(()=>null),this.recapPalette=s.palette??Wt,this.spinnerStyle=this.recapPalette.active,this.dimStyle=this.recapPalette.muted,this.errorStyle=this.recapPalette.error,s.banner&&s.banner.length>0){const i=new A;i.addChild(new d(1));for(const o of s.banner)i.addChild(new x(o,1,0));i.addChild(new d(1)),this.bannerContainer=i,this.container.addChild(i)}this.container.addChild(this.historyContainer),this.onActivityChange||this.container.addChild(this.statusContainer),this.transcript=new yt([...this.bannerContainer?[this.bannerContainer]:[],this.historyContainer,...this.onActivityChange?[]:[this.statusContainer]])}transcriptSource(){return this.transcript}async applySnapshot(t){const e=++this.snapshotGeneration;this.applyingSnapshot=!0,this.deferredFrames.length=0,this.resetChat(),this.projection=bt(t,this.projection),this.workingActivity=this.projection.workingActivity,this.runActive=this.projection.isStreaming,this.seedToolGroupSummaries(this.projection.toolGroupSummaryDetails);const s=new Map,i=this.projection.messages,o=i.length-1,n=gt(i,this.liveCycles);if(n>0){const r=await this.buildCondensedBlock(i.slice(0,n),e);if(e!==this.snapshotGeneration)return;r&&this.appendCondensedBlock(r)}for(let r=n;r<i.length;r++){if(!this.projection.isStreaming&&r>n&&(r-n)%_===0&&(await new Promise(l=>setImmediate(l)),e!==this.snapshotGeneration))return;const a=i[r];if(a.role==="assistant"){const l=c(a);l.trim()&&(this.lastAssistantText=l,this.pushTranscriptText(l));const P=r===o&&this.projection.isStreaming&&a.stopReason!=="aborted"&&a.stopReason!=="error",g=c(a).trim()!=="",D=this.assistantToolCalls(a),k=a.stopReason==="aborted"||a.stopReason==="error",y=w(a)?"Interrupted":a.errorMessage??"Error";if(k){for(const m of s.values()){const f={content:[{type:"text",text:y}],isError:!0};m.updateResult(f),this.registerCopyBlock(m,"tool",y),this.settleGroupTool(m,f,!0)}s.clear()}(g||k)&&this.closeOpenGroup();let b;P?(this.streamingComponent=new B(void 0,this.hideThinking,u(),this.hiddenThinkingLabel,this.markdownTransformers),this.appendAssistantPart(this.streamingComponent,!g),this.registerCopyBlock(this.streamingComponent,"assistant",""),this.streamingWasGroupMember=!g,this.streamingComponent.updateContent(a),this.registerCopyBlock(this.streamingComponent,"assistant",c(a)),b=this.streamingToolSeparator=this.appendAssistantSeparator(!g)):b=this.appendAssistantMessage(a,!g&&!k),b&&this.setAssistantSeparatorContent(b,a);for(const m of D){this.pushTranscriptValue(m.arguments);const f=this.appendToolComponent(m.name,m.id,m.arguments);a.stopReason==="aborted"||a.stopReason==="error"?(f.updateResult({content:[{type:"text",text:y}],isError:!0}),this.registerCopyBlock(f,"tool",y),this.settleGroupTool(f,{content:[{type:"text",text:y}],isError:!0},!0)):s.set(m.id,f)}k&&this.closeOpenGroup()}else if(a.role==="toolResult"){this.pushTranscriptText(this.userMessageText(a));const l=s.get(a.toolCallId);l&&(l.updateResult(a),this.registerCopyBlock(l,"tool",this.toolResultText(a)),this.historyContainer.markDirty(l),this.settleGroupTool(l,a,a.isError===!0),s.delete(a.toolCallId),this.maybeAppendPageBlock(a))}else this.addMessageToChat(a)}for(const[r,a]of s)this.pendingTools.set(r,a);this.applyToolDisplay(),this.projection.isStreaming&&this.setActivity(this.makeLoader(this.workingActivity)),this.tui.requestRender(),this.applyingSnapshot=!1,this.replayDeferredFrames()}async buildCondensedBlock(t,e){const s=new j,i=this.appendTarget,o=[];this.appendTarget=s,this.condensedCopyBlocks.set(s,o);try{let n=0;for(const r of t)if(ft(r,this.condensedHistory)){if(n>0&&n%_===0&&(await new Promise(a=>setImmediate(a)),e!==this.snapshotGeneration))return;n++,this.pushTranscriptText(this.userMessageText(r)),this.addMessageToChat(r)}}finally{this.appendTarget=i,this.condensedCopyBlocks.delete(s)}return s.children.length>0?{component:s,copyBlocks:o}:void 0}deferIfBuilding(t){return this.applyingSnapshot?(this.deferredFrames.push(t),!0):!1}replayDeferredFrames(){const t=this.deferredFrames.splice(0);for(const e of t)e()}setWorkingActivity(t){if(this.deferIfBuilding(()=>this.setWorkingActivity(t)))return;const e=this.projection.activity===this.workingActivity;this.projection=St(this.projection,t),this.workingActivity=this.projection.workingActivity,this.runActive&&e&&this.setActivity(this.makeLoader(this.workingActivity))}settleRun(){this.runActive=!1;for(const t of this.pendingTools.values())this.settleGroupTool(t);this.streamingComponent&&(this.historyContainer.removeChild(this.streamingComponent),this.unregisterCopyBlock(this.streamingComponent),this.streamingComponent=void 0),this.streamingToolSeparator=void 0,this.pendingTools.clear(),this.applyToolDisplay(),this.setActivity(void 0),this.settleBashComponent()}dispose(){this.settleRun()}toggleToolsExpanded(){let t;return this.summarizeToolCalls&&this.foldSettledTools?(this.showGroupSummaries=!this.showGroupSummaries,this.toolOutputExpanded=!this.showGroupSummaries,t={kind:"summaries",shown:this.showGroupSummaries}):(this.toolOutputExpanded=!this.toolOutputExpanded,t={kind:"output",expanded:this.toolOutputExpanded}),this.applyToolDisplay(),t}toggleFoldSettledTools(){return this.foldSettledTools=!this.foldSettledTools,Pt(this.foldSettledTools),this.summarizeToolCalls&&this.foldSettledTools&&(this.showGroupSummaries=!0),this.applyToolDisplay(),this.foldSettledTools}applyToolDisplay(){const t=new Set(this.pendingTools.values());for(const e of this.groups)for(const s of e.inFlight)t.add(s);for(const e of this.historyContainer.children)e instanceof G&&e.setMinimized(this.foldSettledTools&&!t.has(e)),Dt(e)&&e.setExpanded(this.toolOutputExpanded);for(const e of this.groups)this.applyGroupDisplay(e);this.updateFoldedToolSeparators(t),this.historyContainer.markDirty(),this.tui.requestRender()}toggleThinking(){this.hideThinking=!this.hideThinking;for(const t of this.historyContainer.children)t instanceof L&&t.setHideThinkingBlock(this.hideThinking);for(const[t,e]of this.foldedToolSeparatorContents)t.setSeparatesToolGroup(e.hasText||!this.hideThinking&&e.hasThinking);return this.historyContainer.markDirty(),this.tui.requestRender(),this.hideThinking}handleEvent(t){if(!this.deferIfBuilding(()=>this.handleEvent(t))){switch(this.projection=Gt(this.projection,t),t.type){case"agent_start":{this.runActive=this.projection.isStreaming;for(const e of this.pendingTools.values())this.settleGroupTool(e);this.pendingTools.clear(),this.setActivity(this.makeLoader(this.workingActivity));break}case"agent_end":{this.settleRun(),ut();break}case"agent_settled":{this.settleRun();break}case"message_start":{if(t.message.role==="custom"||t.message.role==="user")this.addMessageToChat(t.message);else if(t.message.role==="assistant"){const e=c(t.message).trim()!=="";e&&this.closeOpenGroup(),this.streamingComponent=new B(void 0,this.hideThinking,u(),this.hiddenThinkingLabel,this.markdownTransformers),this.streamingWasGroupMember=!e,this.appendAssistantPart(this.streamingComponent,!e),this.registerCopyBlock(this.streamingComponent,"assistant",""),this.streamingComponent.updateContent(t.message),this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),this.streamingToolSeparator=this.appendAssistantSeparator(!e),this.setAssistantSeparatorContent(this.streamingToolSeparator,t.message)}break}case"message_update":{if(this.streamingComponent&&t.message.role==="assistant"){this.promoteStreamingAssistantToBoundary(t.message),this.streamingComponent.updateContent(t.message),this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),this.historyContainer.markDirty(this.streamingComponent);const e=this.assistantToolCalls(t.message);this.streamingToolSeparator&&this.setAssistantSeparatorContent(this.streamingToolSeparator,t.message);for(const s of e){this.pushTranscriptValue(s.arguments);const i=this.pendingTools.get(s.id);if(i)i.updateArgs(s.arguments),this.noteGroupTool(i,s.name,s.arguments),this.historyContainer.markDirty(i);else{const o=this.appendToolComponent(s.name,s.id,s.arguments);this.pendingTools.set(s.id,o)}}}break}case"message_end":{if(t.message.role!=="assistant")break;const e=t.message.stopReason==="aborted"||t.message.stopReason==="error";if(this.promoteStreamingAssistantToBoundary(t.message,e),this.streamingComponent&&this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),t.message.stopReason!=="aborted"&&t.message.stopReason!=="error"){const s=c(t.message);s.trim()&&(this.lastAssistantText=s,this.pushTranscriptText(s))}if(this.streamingComponent){const s=t.message.stopReason;let i=t.message.errorMessage;if(w(t.message)&&(i="Interrupted",t.message.errorMessage=i,t.message.stopReason="aborted"),this.streamingComponent.updateContent(t.message),s==="aborted"||s==="error"){const o=i??"Error";for(const n of this.pendingTools.values())n.updateResult({content:[{type:"text",text:o}],isError:!0}),this.registerCopyBlock(n,"tool",o),this.settleGroupTool(n,{content:[{type:"text",text:o}],isError:!0},!0),this.historyContainer.markDirty(n);this.pendingTools.clear()}else for(const o of this.pendingTools.values())o.setArgsComplete(),this.historyContainer.markDirty(o);this.historyContainer.markDirty(this.streamingComponent),this.streamingComponent=void 0,this.streamingToolSeparator=void 0}e&&(this.closeOpenGroup(),this.applyToolDisplay());break}case"tool_execution_start":{this.pushTranscriptValue(t.args);let e=this.pendingTools.get(t.toolCallId);e?this.noteGroupTool(e,t.toolName,t.args):(e=this.appendToolComponent(t.toolName,t.toolCallId,t.args),this.pendingTools.set(t.toolCallId,e)),e.markExecutionStarted(),this.historyContainer.markDirty(e);break}case"tool_execution_update":{const e=this.projection.partialToolResults.get(t.toolCallId)??t.partialResult;this.pushTranscriptValue(e);const s=this.pendingTools.get(t.toolCallId);s&&(s.updateResult(e,!0),this.registerCopyBlock(s,"tool",this.toolResultText(e)),this.historyContainer.markDirty(s));break}case"tool_execution_end":{const e=this.projection.partialToolResults.get(t.toolCallId)??t.result;this.pushTranscriptValue(e);const s=this.pendingTools.get(t.toolCallId);s&&(s.updateResult(e),this.registerCopyBlock(s,"tool",this.toolResultText(e)),this.pendingTools.delete(t.toolCallId),this.settleGroupTool(s,e,t.isError),this.applyToolDisplay(),this.historyContainer.markDirty(s),this.maybeAppendPageBlock(e));break}case"compaction_start":{const e=t.reason==="manual"?"Compacting context...":"Auto-compacting...";this.setActivity(this.makeLoader(e));break}case"compaction_end":{this.setActivity(this.runActive?this.makeLoader(this.workingActivity):void 0),t.aborted?this.showStatus(t.reason==="manual"?"Compaction cancelled":"Auto-compaction cancelled"):t.result?this.addMessageToChat({role:"compactionSummary",summary:t.result.summary,tokensBefore:t.result.tokensBefore,timestamp:Date.now()}):t.errorMessage&&this.showError(t.errorMessage);break}case"auto_retry_start":{const e=Math.ceil(t.delayMs/1e3);this.setActivity(this.makeLoader(`Retrying (${t.attempt}/${t.maxAttempts}) in ${e}s...`));break}case"auto_retry_end":{this.setActivity(this.runActive?this.makeLoader(this.workingActivity):void 0),t.success||this.showError(`Retry failed after ${t.attempt} attempts: ${t.finalError??"Unknown error"}`);break}case"queue_update":case"session_info_changed":case"thinking_level_changed":this.onFooterEvent?.(t);break;default:break}this.tui.requestRender()}}bashStart(t,e){if(this.deferIfBuilding(()=>this.bashStart(t,e)))return;this.projection=At(this.projection,t,e),this.closeOpenGroup(),this.settleBashComponent();let s;s=new E(t,this.componentTui(()=>s),e),this.bashComponent=s,this.append(s),this.tui.requestRender()}bashOutput(t){this.deferIfBuilding(()=>this.bashOutput(t))||(this.projection=Bt(this.projection,t),this.pushTranscriptText(t),this.bashComponent&&(this.bashComponent.appendOutput(t),this.historyContainer.markDirty(this.bashComponent)),this.tui.requestRender())}bashEnd(t){this.deferIfBuilding(()=>this.bashEnd(t))||(this.projection=wt(this.projection,t),this.settleBashComponent(t),this.tui.requestRender())}addMessageToChat(t){const e=tt(t);if(e!==null&&(t.role!=="custom"||t.display===!0)){this.pushTranscriptText(e.body);const s=e.senders.flatMap(o=>o.entries).filter(o=>o.disposition==="human-answer").map(o=>o.body.trim()).filter(o=>o!=="");if(!(s.length>0&&e.body.replace(Lt,"").trim()===""&&e.senders.every(o=>o.entries.every(n=>n.disposition==="human-answer")))){const o=z(e.kind),n=new U(e,o,this.toolOutputExpanded,this.dimStyle,r=>this.spinnerStyle(this.labelStyle(r)));et(e.kind)?(this.closeOpenGroup(),this.append(n)):this.appendGroupMember(n)?.activity.noteCard(e,o)}for(const o of s)this.appendHumanAnswer(o);return}switch(t.role){case"bashExecution":{this.closeOpenGroup(),this.pushTranscriptText(t.output??"");const s=new E(t.command,this.tui,t.excludeFromContext);t.output&&s.appendOutput(t.output),s.setComplete(t.exitCode,t.cancelled,t.truncated?{truncated:!0}:void 0,t.fullOutputPath),this.append(s);break}case"custom":{if(t.display){if(this.pushTranscriptText(this.userMessageText(t)),t.customType===K){this.appendGroupMember(new X(this.userMessageText(t),this.toolOutputExpanded,this.crtrOutputTheme()));break}if(t.customType===Z){this.closeOpenGroup(),this.append(new d(1)),this.append(new x(this.dimStyle(`\u2500\u2500 ${this.userMessageText(t)} \u2500\u2500`),1,0)),this.append(new d(1));break}const s=new $(ot(t),void 0,u());s.setExpanded(this.toolOutputExpanded),this.appendGroupMember(s)}break}case"compactionSummary":{this.closeOpenGroup(),this.append(new d(1));const s=new W(O(t),u());s.setExpanded(this.toolOutputExpanded),this.append(s);break}case"branchSummary":{this.closeOpenGroup(),this.append(new d(1));const s=new H(O(t),u());s.setExpanded(this.toolOutputExpanded),this.append(s),this.registerCopyBlock(s,"assistant",t.summary);break}case"user":{C(t)&&this.closeOpenGroup();const s=this.userMessageText(t);if(!s)break;this.pushTranscriptText(s),this.chatChildCount()>0&&this.appendUserPart(new d(1),!C(t));const i=q(s);if(i){const o=new V({...i,content:M(i.content)},u());if(o.setExpanded(this.toolOutputExpanded),this.appendUserPart(o,!C(t)),this.registerCopyBlock(o,"user",s),i.userMessage){const n=new S(i.userMessage,u(),void 0,this.markdownTransformers);this.appendUserPart(n,!C(t)),this.registerCopyBlock(n,"user",i.userMessage)}}else{const o=new S(s,u(),void 0,this.markdownTransformers);this.appendUserPart(o,!C(t)),this.registerCopyBlock(o,"user",s)}break}case"assistant":{const s=c(t).trim()!=="";s&&this.closeOpenGroup(),this.appendAssistantMessage(t,!s);break}default:break}}appendAssistantMessage(t,e=!1){const s=new B(void 0,this.hideThinking,u(),this.hiddenThinkingLabel,this.markdownTransformers),i=w(t)?{...t,stopReason:"aborted",errorMessage:"Interrupted"}:t;s.updateContent(i),this.appendAssistantPart(s,e),this.registerCopyBlock(s,"assistant",c(t));const o=this.appendAssistantSeparator(e);return this.setAssistantSeparatorContent(o,t),o}appendAssistantSeparator(t=!1){const e=new R;return t?this.appendGroupMember(e):this.append(e),e}appendAssistantPart(t,e){e?this.appendGroupMember(t):this.append(t)}appendUserPart(t,e){e?this.appendGroupMember(t):this.append(t)}appendHumanAnswer(t){this.closeOpenGroup(),this.chatChildCount()>0&&this.append(new d(1));const e=new S(t,u(),void 0,this.markdownTransformers);this.append(e),this.registerCopyBlock(e,"user",t)}isLiveGroupRegion(){return this.appendTarget===this.historyContainer}ensureGroup(){if(!this.isLiveGroupRegion())return;if(this.openGroup)return this.openGroup;const t=new at,e={members:[],recap:t,activity:new rt(this.cwd,this.nodeRoster),toolCount:0,inFlight:new Set};return this.append(t),this.historyContainer.setHidden(t,!0),this.groups.push(e),this.openGroup=e,e}closeOpenGroup(){this.openGroup=void 0}appendGroupMember(t){const e=this.ensureGroup();return this.append(t),e&&e.members.push(t),e}removeGroupMember(t){for(const e of this.groups){const s=e.members.indexOf(t);s!==-1&&e.members.splice(s,1)}this.historyContainer.setHidden(t,!1)}appendToolComponent(t,e,s){const i=this.isLiveGroupRegion()&&!this.openGroup&&this.historyContainer.children.at(-1)instanceof R?this.historyContainer.children.at(-1):void 0;i&&this.historyContainer.removeChild(i);const o=this.ensureGroup();i&&(this.append(i),o?.members.push(i));const n=this.makeToolComponent(t,e,s);return n.activityCallId=e,this.appendGroupMember(n),this.registerCopyBlock(n,"tool",""),o&&(o.key??=e,o.toolCount++,o.inFlight.add(n),o.activity.noteCall(e,t,s)),n}noteGroupTool(t,e,s){if(t.activityCallId)for(const i of this.groups)i.members.includes(t)&&i.activity.noteCall(t.activityCallId,e,s)}settleGroupTool(t,e,s=!1){for(const i of this.groups)i.inFlight.delete(t),!(!t.activityCallId||!i.members.includes(t))&&(e===void 0?i.activity.resolveWithoutResult(t.activityCallId):i.activity.settle(t.activityCallId,e,s))}promoteStreamingAssistantToBoundary(t,e=!1){!this.streamingWasGroupMember||!e&&c(t).trim()===""||(this.streamingComponent&&this.removeGroupMember(this.streamingComponent),this.streamingToolSeparator&&this.removeGroupMember(this.streamingToolSeparator),this.streamingWasGroupMember=!1,this.closeOpenGroup())}seedToolGroupSummaries(t){this.groupSummaries.clear();for(const[e,s]of Object.entries(t))this.groupSummaries.set(e,s)}applyToolGroupSummary(t,e){if(this.deferIfBuilding(()=>this.applyToolGroupSummary(t,e)))return;this.projection=xt(this.projection,t,e);const s=this.projection.toolGroupSummaryDetails[t];s!==void 0&&(this.groupSummaries.set(t,s),this.applyToolDisplay())}applyGroupDisplay(t){const e=t.key===void 0?void 0:this.groupSummaries.get(t.key),s=this.foldSettledTools&&this.showGroupSummaries&&t.toolCount>0&&t.inFlight.size===0&&e!==void 0;t.recap.setRecap(s?e:void 0,t.toolCount,t.activity.activity(),this.detailedToolRecaps,this.recapPalette),this.historyContainer.setHidden(t.recap,!s);for(const i of t.members)this.historyContainer.setHidden(i,s)}updateFoldedToolSeparators(t=new Set(this.pendingTools.values())){const e=this.historyContainer.children;for(let s=0;s<e.length;s++){const i=e[s];if(!(i instanceof R))continue;const o=e[s+1];i.setFolded(this.foldSettledTools&&!this.historyContainer.hiddenChildren.has(i)&&o instanceof G&&!this.historyContainer.hiddenChildren.has(o)&&!t.has(o)),this.historyContainer.markDirty(i)}}setAssistantSeparatorContent(t,e){const s=e.content,i=Array.isArray(s)?s:[],o=i.some(r=>typeof r=="object"&&r!==null&&r.type==="text"&&typeof r.text=="string"&&r.text.trim()!==""),n=i.some(r=>typeof r=="object"&&r!==null&&r.type==="thinking"&&typeof r.thinking=="string"&&r.thinking.trim()!=="");this.foldedToolSeparatorContents.set(t,{hasText:o,hasThinking:n}),t.setSeparatesToolGroup(o||!this.hideThinking&&n)}makeToolComponent(t,e,s){const i=new ht;let o,n;if(t==="bash"){const a=Q(s,i);a===void 0?n=lt(this.cwd,i,this.backgroundBashHint):(n=a.definition,o=a.observeResult)}else if(t==="edit"){const a=nt(this.cwd,i);n=a.definition,o=a.observeResult}else t==="read"?n=dt(this.cwd,i):t==="write"&&(n=ct(this.cwd,i));let r;return r=new G(t,e,s,{showImages:this.showImages,imageWidthCells:this.imageWidthCells},n,this.componentTui(()=>r),this.cwd),r.setToolView(n===void 0?void 0:i,o),r.setExpanded(this.toolOutputExpanded),r}append(t){this.appendTarget.addChild(t)}chatChildCount(){return this.appendTarget.children.length}resetChat(){this.setActivity(void 0),this.settleBashComponent(),this.streamingComponent=void 0,this.streamingToolSeparator=void 0,this.streamingWasGroupMember=!1,this.foldedToolSeparatorContents.clear(),this.groups.length=0,this.openGroup=void 0,this.groupSummaries.clear(),this.nodeRoster.clear(),this.pendingTools.clear(),this.lastAssistantText=void 0,this.copyBlockRecords.length=0,this.copyIndex.clear(),this.transcriptFilePaths.length=0,this.pageBlocks.clear(),this.historyContainer.clear()}maybeAppendPageBlock(t){if(!this.inlinePageBlocks||this.appendTarget!==this.historyContainer)return;const e=Y(t);if(e===void 0||this.pageBlocks.has(e.pageId))return;const s=new J(e.pageId,this.pageOpenHint);this.pageBlocks.set(e.pageId,s),this.append(s),this.loadPageBlock(s)}async loadPageBlock(t){await t.refresh()&&(this.historyContainer.markDirty(t),this.tui.requestRender())}refreshInFlightTools(){if(this.pendingTools.size!==0){for(const t of this.pendingTools.values())this.historyContainer.markDirty(t);this.tui.requestRender()}}async refreshPageBlocks(){const t=[...this.pageBlocks.values()];(await Promise.all(t.map(async s=>{const i=await s.refresh();return i&&this.historyContainer.markDirty(s),i}))).some(Boolean)&&this.tui.requestRender()}makeLoader(t){let e;const s={requestRender:p(i=>{e&&!this.onActivityChange&&this.statusContainer.markDirty(e),this.tui.requestRender(i)},"requestRender"),terminal:this.tui.terminal};return e=new F(s,this.spinnerStyle,this.dimStyle,t),e}componentTui(t){return{requestRender:p(e=>{this.historyContainer.markDirty(t()),this.tui.requestRender(e)},"requestRender"),terminal:this.tui.terminal}}settleBashComponent(t){if(!this.bashComponent)return;const e=this.bashComponent;e.setComplete(t?.exitCode,t?.cancelled??!0,t?.truncated?{truncated:!0}:void 0,t?.fullOutputPath),this.historyContainer.markDirty(e),this.bashComponent=void 0}setActivity(t){if(this.activityLoader?.stop(),this.activityLoader=t,this.onActivityChange){this.onActivityChange(t);return}this.statusContainer.clear(),t&&this.statusContainer.addChild(t)}showStatus(t){this.closeOpenGroup(),this.append(new d(1)),this.append(new x(this.dimStyle(t),1,0))}showError(t){this.deferIfBuilding(()=>this.showError(t))||(this.closeOpenGroup(),this.append(new d(1)),this.append(new x(this.errorStyle(t),1,0)),this.tui.requestRender())}crtrOutputTheme(){return{fg:p((t,e)=>t==="error"?this.errorStyle(e):t==="warning"||t==="accent"||t==="toolTitle"||t==="success"?this.spinnerStyle(e):t==="muted"?this.dimStyle(e):e,"fg"),bg:p((t,e)=>e,"bg"),bold:p(t=>this.labelStyle(t),"bold")}}assistantToolCalls(t){const e=t.content;return Array.isArray(e)?e.filter(s=>typeof s=="object"&&s!==null&&s.type==="toolCall"):[]}getTranscriptFilePathsNewestFirst(){return[...this.transcriptFilePaths]}getLastAssistantText(){const t=this.lastAssistantText?.trim();return t||void 0}blockText(t){const e=this.copyIndex.get(t);return e===void 0?void 0:this.copyBlockRecords[e]?.text}copyBlocks(){return this.copyBlockRecords}getLastToolOutputText(){for(let t=this.copyBlockRecords.length-1;t>=0;t--){const e=this.copyBlockRecords[t];if(e.kind==="tool")return e.text.trim()===""?void 0:e.text}}getTranscriptPlainText(){return this.copyBlockRecords.map(t=>t.text).filter(t=>t.trim()!=="").join(`
1
+ var j=Object.defineProperty;var p=(a,t)=>j(a,"name",{value:t,configurable:!0});import{Container as v,Loader as F,Spacer as d,Text as x}from"@earendil-works/pi-tui";import{AssistantMessageComponent as L,BashExecutionComponent as E,BranchSummaryMessageComponent as H,CompactionSummaryMessageComponent as W,CustomMessageComponent as $,parseSkillBlock as q,SkillInvocationMessageComponent as V,ToolExecutionComponent as N,UserMessageComponent as S}from"@earendil-works/pi-coding-agent";import{attachMarkdownTheme as u}from"../config.js";import{ContextMessageComponent as U}from"./context-message.js";import{presentationFor as z}from"./card-presentation.js";import{detectInlinePageResult as Y,PageBlockComponent as J}from"./page-block.js";import{CRTR_OUTPUT_CUSTOM_TYPE as K,CrtrOutputMessageComponent as X,createCrtrBashToolDefinition as Q}from"./crtr-output.js";import{CRTR_CYCLE_DIVIDER_CUSTOM_TYPE as Z,endedByAbort as w}from"../../../core/runtime/session-cycles.js";import{parseCard as tt}from"../../../shared/generated-context.js";import{assistantVisibleText as c,isGroupBoundaryKind as et,isTrueUserMessage as C}from"../../../shared/tool-groups.js";import{transformDiagramFences as st}from"./diagram.js";import{styleAttachAgentMarkdown as it,styleAttachMarkdownSource as M,styleAttachMessageMarkdown as ot,styleAttachSummaryMarkdown as O}from"./markdown-source.js";import{createCrtrEditToolDefinition as nt}from"./edit-diff.js";import{GroupActivityRecorder as rt}from"./group-activity.js";import{GroupRecapComponent as at}from"./group-recap.js";import{FoldedToolCallController as ht,bashCallBackgroundHintLines as pt,createCrtrPlainBashToolDefinition as lt,createCrtrReadToolDefinition as dt,createCrtrWriteToolDefinition as ct}from"./tool-calls.js";import{ringCompletionBell as ut}from"../chrome/completion-bell.js";import{extractFilePaths as mt}from"#core/human/visible-paths";import{keepWhenCondensed as ft,liveRegionStart as gt}from"./condensed-history.js";import{ViewerAssistantMessageComponent as B}from"./assistant-message.js";import{CompositeViewportSource as yt,MeasuredContainer as A}from"./measured-container.js";import{readConfig as T,updateRawConfigAtomically as Ct}from"../../../core/config.js";import{DEFAULT_CONDENSED_HISTORY as Tt,DEFAULT_LIVE_CYCLES as kt}from"../../../types.js";import{applySnapshot as bt,applyToolGroupSummary as xt,applyWorkingActivity as St,bashEnd as wt,bashOutput as Bt,bashStart as At,initialConvState as Rt,reduce as Gt}from"../../conversation/projection.js";const I=p(a=>`\x1B[2m${a}\x1B[22m`,"defaultDimStyle"),_=50;function Et(){try{return T("user").live_cycles}catch{return kt}}p(Et,"readLiveCycles");function Mt(){try{return T("user").condensed_history}catch{return Tt}}p(Mt,"readCondensedHistory");function Ot(){try{return T("user").fold_finished_tools}catch{return!1}}p(Ot,"readFoldFinishedTools");function It(){try{return T("user").summarize_tool_calls}catch{return!1}}p(It,"readSummarizeToolCalls");function _t(){try{return T("user").detailed_tool_recaps}catch{return!0}}p(_t,"readDetailedToolRecaps");function Pt(a){try{Ct("user",t=>({...t,fold_finished_tools:a}))}catch{}}p(Pt,"persistFoldFinishedTools");function Dt(a){return typeof a=="object"&&a!==null&&"setExpanded"in a&&typeof a.setExpanded=="function"}p(Dt,"isExpandable");const jt=/\x1b\[[0-9;]*m/g,vt=/\x1b\[([0-9;]*)m/g;function Ft(a){return a.replace(vt,(t,e)=>{const s=e.split(";"),i=[];for(let o=0;o<s.length;o++){const n=Number(s[o]===""?0:s[o]);if(n===38||n===48||n===58){const r=Number(s[o+1]),h=o+(r===5?2:r===2?4:1);n!==48&&i.push(...s.slice(o,h+1)),o=h;continue}n>=40&&n<=47||n>=100&&n<=107||i.push(String(n))}return i.length>0?`\x1B[${i.join(";")}m`:""})}p(Ft,"stripBackground");const Lt=/<from\b[^>]*>[\s\S]*?<\/from>/g;class R extends d{static{p(this,"FoldedToolSeparator")}folded=!1;separatesToolGroup=!1;setFolded(t){this.folded=t,this.refresh()}setSeparatesToolGroup(t){this.separatesToolGroup=t,this.refresh()}refresh(){this.setLines(this.folded&&this.separatesToolGroup?1:0)}}class G extends N{static{p(this,"MinimizableToolComponent")}activityCallId;minimized=!1;expandedState=!1;foldController;resultObserver;setToolView(t,e){this.foldController=t,this.resultObserver=e}updateResult(...t){this.resultObserver?.(t[0],t[1]??!1),super.updateResult(...t)}setExpanded(t){this.expandedState=t,super.setExpanded(t)}setMinimized(t){!this.foldController||this.minimized===t||(this.minimized=t,this.foldController.setFolded(t),super.setExpanded(this.expandedState))}render(t){if(!this.minimized)return[...super.render(t),...pt(this.foldController?.callComponent(),t)];const e=this.foldController?.callComponent();return e?e.render(t).filter(s=>s.replace(jt,"").trim().length>0).map(s=>Ft(s).trimEnd()):super.render(t)}}const Ht=p(a=>`\x1B[31m${a}\x1B[39m`,"defaultErrorStyle"),Wt={accent:p(a=>`\x1B[33m${a}\x1B[39m`,"accent"),active:p(a=>`\x1B[36m${a}\x1B[39m`,"active"),info:p(a=>`\x1B[34m${a}\x1B[39m`,"info"),muted:I,faint:I,border:p(a=>a,"border"),surface:p(a=>a,"surface"),bold:p(a=>`\x1B[1m${a}\x1B[22m`,"bold"),error:Ht,warning:p(a=>`\x1B[33m${a}\x1B[39m`,"warning"),diffAdded:p(a=>`\x1B[32m${a}\x1B[39m`,"diffAdded"),diffRemoved:p(a=>`\x1B[91m${a}\x1B[39m`,"diffRemoved"),bashMode:p(a=>`\x1B[32m${a}\x1B[39m`,"bashMode"),bashModeAlt:p(a=>`\x1B[92m${a}\x1B[39m`,"bashModeAlt")};class ue{static{p(this,"ChatView")}tui;container;historyContainer=new A;statusContainer=new A;bannerContainer;transcript;appendTarget=this.historyContainer;pageBlocks=new Map;inlinePageBlocks;pageOpenHint;backgroundBashHint;liveCycles;condensedHistory;cwd;showImages;imageWidthCells;hideThinking;hiddenThinkingLabel;toolOutputExpanded;foldSettledTools=Ot();summarizeToolCalls=It();detailedToolRecaps=_t();showGroupSummaries=this.summarizeToolCalls&&this.foldSettledTools;groups=[];openGroup;groupSummaries=new Map;nodeRoster=new Map;streamingWasGroupMember=!1;onFooterEvent;onActivityChange;spinnerStyle;dimStyle;errorStyle;recapPalette;labelStyle=p(t=>`\x1B[1m${t}\x1B[22m`,"labelStyle");markdownTransformers=[(t,{messageType:e,availableWidth:s})=>e==="assistant"?st(t,s):t,(t,{messageType:e})=>e==="user"?M(t):it(t)];streamingComponent;streamingToolSeparator;foldedToolSeparatorContents=new Map;pendingTools=new Map;bashComponent;activityLoader;projection=Rt();workingActivity=this.projection.workingActivity;runActive=!1;applyingSnapshot=!1;snapshotGeneration=0;deferredFrames=[];lastAssistantText;transcriptFilePaths=[];copyBlockRecords=[];copyIndex=new Map;condensedCopyBlocks=new WeakMap;constructor(t,e,s={}){if(this.tui=t,this.container=e,this.cwd=s.cwd??process.cwd(),this.showImages=s.showImages??!0,this.imageWidthCells=s.imageWidthCells??60,this.hideThinking=s.hideThinking??!1,this.hiddenThinkingLabel=s.hiddenThinkingLabel??"Thinking...",this.toolOutputExpanded=s.toolOutputExpanded??!1,this.liveCycles=s.liveCycles??Et(),this.condensedHistory=s.condensedHistory??Mt(),this.onFooterEvent=s.onFooterEvent,this.onActivityChange=s.onActivityChange,this.inlinePageBlocks=s.inlinePageBlocks??!1,this.pageOpenHint=s.pageOpenHint??(()=>"crtr human list"),this.backgroundBashHint=s.backgroundBashHint??(()=>null),this.recapPalette=s.palette??Wt,this.spinnerStyle=this.recapPalette.active,this.dimStyle=this.recapPalette.muted,this.errorStyle=this.recapPalette.error,s.banner&&s.banner.length>0){const i=new A;i.addChild(new d(1));for(const o of s.banner)i.addChild(new x(o,1,0));i.addChild(new d(1)),this.bannerContainer=i,this.container.addChild(i)}this.container.addChild(this.historyContainer),this.onActivityChange||this.container.addChild(this.statusContainer),this.transcript=new yt([...this.bannerContainer?[this.bannerContainer]:[],this.historyContainer,...this.onActivityChange?[]:[this.statusContainer]])}transcriptSource(){return this.transcript}async applySnapshot(t){const e=++this.snapshotGeneration;this.applyingSnapshot=!0,this.deferredFrames.length=0,this.resetChat(),this.projection=bt(t,this.projection),this.workingActivity=this.projection.workingActivity,this.runActive=this.projection.isStreaming,this.seedToolGroupSummaries(this.projection.toolGroupSummaryDetails);const s=new Map,i=this.projection.messages,o=i.length-1,n=gt(i,this.liveCycles);if(n>0){const r=await this.buildCondensedBlock(i.slice(0,n),e);if(e!==this.snapshotGeneration)return;r&&this.appendCondensedBlock(r)}for(let r=n;r<i.length;r++){if(!this.projection.isStreaming&&r>n&&(r-n)%_===0&&(await new Promise(l=>setImmediate(l)),e!==this.snapshotGeneration))return;const h=i[r];if(h.role==="assistant"){const l=c(h);l.trim()&&(this.lastAssistantText=l,this.pushTranscriptText(l));const P=r===o&&this.projection.isStreaming&&h.stopReason!=="aborted"&&h.stopReason!=="error",g=c(h).trim()!=="",D=this.assistantToolCalls(h),k=h.stopReason==="aborted"||h.stopReason==="error",y=w(h)?"Interrupted":h.errorMessage??"Error";if(k){for(const m of s.values()){const f={content:[{type:"text",text:y}],isError:!0};m.updateResult(f),this.registerCopyBlock(m,"tool",y),this.settleGroupTool(m,f,!0)}s.clear()}(g||k)&&this.closeOpenGroup();let b;P?(this.streamingComponent=new B(void 0,this.hideThinking,u(),this.hiddenThinkingLabel,this.markdownTransformers),this.appendAssistantPart(this.streamingComponent,!g),this.registerCopyBlock(this.streamingComponent,"assistant",""),this.streamingWasGroupMember=!g,this.streamingComponent.updateContent(h),this.registerCopyBlock(this.streamingComponent,"assistant",c(h)),b=this.streamingToolSeparator=this.appendAssistantSeparator(!g)):b=this.appendAssistantMessage(h,!g&&!k),b&&this.setAssistantSeparatorContent(b,h);for(const m of D){this.pushTranscriptValue(m.arguments);const f=this.appendToolComponent(m.name,m.id,m.arguments);h.stopReason==="aborted"||h.stopReason==="error"?(f.updateResult({content:[{type:"text",text:y}],isError:!0}),this.registerCopyBlock(f,"tool",y),this.settleGroupTool(f,{content:[{type:"text",text:y}],isError:!0},!0)):s.set(m.id,f)}k&&this.closeOpenGroup()}else if(h.role==="toolResult"){this.pushTranscriptText(this.userMessageText(h));const l=s.get(h.toolCallId);l&&(l.updateResult(h),this.registerCopyBlock(l,"tool",this.toolResultText(h)),this.historyContainer.markDirty(l),this.settleGroupTool(l,h,h.isError===!0),s.delete(h.toolCallId),this.maybeAppendPageBlock(h))}else this.addMessageToChat(h)}for(const[r,h]of s)this.pendingTools.set(r,h);this.applyToolDisplay(),this.projection.isStreaming&&this.setActivity(this.makeLoader(this.workingActivity)),this.tui.requestRender(),this.applyingSnapshot=!1,this.replayDeferredFrames()}async buildCondensedBlock(t,e){const s=new v,i=this.appendTarget,o=[];this.appendTarget=s,this.condensedCopyBlocks.set(s,o);try{let n=0;for(const r of t)if(ft(r,this.condensedHistory)){if(n>0&&n%_===0&&(await new Promise(h=>setImmediate(h)),e!==this.snapshotGeneration))return;n++,this.pushTranscriptText(this.userMessageText(r)),this.addMessageToChat(r)}}finally{this.appendTarget=i,this.condensedCopyBlocks.delete(s)}return s.children.length>0?{component:s,copyBlocks:o}:void 0}deferIfBuilding(t){return this.applyingSnapshot?(this.deferredFrames.push(t),!0):!1}replayDeferredFrames(){const t=this.deferredFrames.splice(0);for(const e of t)e()}setWorkingActivity(t){if(this.deferIfBuilding(()=>this.setWorkingActivity(t)))return;const e=this.projection.activity===this.workingActivity;this.projection=St(this.projection,t),this.workingActivity=this.projection.workingActivity,this.runActive&&e&&this.setActivity(this.makeLoader(this.workingActivity))}settleRun(){this.runActive=!1;for(const t of this.pendingTools.values())this.settleGroupTool(t);this.streamingComponent&&(this.historyContainer.removeChild(this.streamingComponent),this.unregisterCopyBlock(this.streamingComponent),this.streamingComponent=void 0),this.streamingToolSeparator=void 0,this.pendingTools.clear(),this.applyToolDisplay(),this.setActivity(void 0),this.settleBashComponent()}dispose(){this.settleRun()}toggleToolsExpanded(){let t;return this.summarizeToolCalls&&this.foldSettledTools?(this.showGroupSummaries=!this.showGroupSummaries,this.toolOutputExpanded=!this.showGroupSummaries,t={kind:"summaries",shown:this.showGroupSummaries}):(this.toolOutputExpanded=!this.toolOutputExpanded,t={kind:"output",expanded:this.toolOutputExpanded}),this.applyToolDisplay(),t}toggleFoldSettledTools(){return this.foldSettledTools=!this.foldSettledTools,Pt(this.foldSettledTools),this.summarizeToolCalls&&this.foldSettledTools&&(this.showGroupSummaries=!0),this.applyToolDisplay(),this.foldSettledTools}applyToolDisplay(){const t=new Set(this.pendingTools.values());for(const e of this.groups)for(const s of e.inFlight)t.add(s);for(const e of this.historyContainer.children)e instanceof G&&e.setMinimized(this.foldSettledTools&&!t.has(e)),Dt(e)&&e.setExpanded(this.toolOutputExpanded);for(const e of this.groups)this.applyGroupDisplay(e);this.updateFoldedToolSeparators(t),this.historyContainer.markDirty(),this.tui.requestRender()}toggleThinking(){this.hideThinking=!this.hideThinking;for(const t of this.historyContainer.children)t instanceof L&&t.setHideThinkingBlock(this.hideThinking);for(const[t,e]of this.foldedToolSeparatorContents)t.setSeparatesToolGroup(e.hasText||!this.hideThinking&&e.hasThinking);return this.historyContainer.markDirty(),this.tui.requestRender(),this.hideThinking}handleEvent(t){if(!this.deferIfBuilding(()=>this.handleEvent(t))){switch(this.projection=Gt(this.projection,t),t.type){case"agent_start":{this.runActive=this.projection.isStreaming;for(const e of this.pendingTools.values())this.settleGroupTool(e);this.pendingTools.clear(),this.setActivity(this.makeLoader(this.workingActivity));break}case"agent_end":{this.settleRun(),ut();break}case"agent_settled":{this.settleRun();break}case"message_start":{if(t.message.role==="custom"||t.message.role==="user")this.addMessageToChat(t.message);else if(t.message.role==="assistant"){const e=c(t.message).trim()!=="";e&&this.closeOpenGroup(),this.streamingComponent=new B(void 0,this.hideThinking,u(),this.hiddenThinkingLabel,this.markdownTransformers),this.streamingWasGroupMember=!e,this.appendAssistantPart(this.streamingComponent,!e),this.registerCopyBlock(this.streamingComponent,"assistant",""),this.streamingComponent.updateContent(t.message),this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),this.streamingToolSeparator=this.appendAssistantSeparator(!e),this.setAssistantSeparatorContent(this.streamingToolSeparator,t.message)}break}case"message_update":{if(this.streamingComponent&&t.message.role==="assistant"){this.promoteStreamingAssistantToBoundary(t.message),this.streamingComponent.updateContent(t.message),this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),this.historyContainer.markDirty(this.streamingComponent);const e=this.assistantToolCalls(t.message);this.streamingToolSeparator&&this.setAssistantSeparatorContent(this.streamingToolSeparator,t.message);for(const s of e){this.pushTranscriptValue(s.arguments);const i=this.pendingTools.get(s.id);if(i)i.updateArgs(s.arguments),this.noteGroupTool(i,s.name,s.arguments),this.historyContainer.markDirty(i);else{const o=this.appendToolComponent(s.name,s.id,s.arguments);this.pendingTools.set(s.id,o)}}}break}case"message_end":{if(t.message.role!=="assistant")break;const e=t.message.stopReason==="aborted"||t.message.stopReason==="error";if(this.promoteStreamingAssistantToBoundary(t.message,e),this.streamingComponent&&this.registerCopyBlock(this.streamingComponent,"assistant",c(t.message)),t.message.stopReason!=="aborted"&&t.message.stopReason!=="error"){const s=c(t.message);s.trim()&&(this.lastAssistantText=s,this.pushTranscriptText(s))}if(this.streamingComponent){const s=t.message.stopReason;let i=t.message.errorMessage;if(w(t.message)&&(i="Interrupted",t.message.errorMessage=i,t.message.stopReason="aborted"),this.streamingComponent.updateContent(t.message),s==="aborted"||s==="error"){const o=i??"Error";for(const n of this.pendingTools.values())n.updateResult({content:[{type:"text",text:o}],isError:!0}),this.registerCopyBlock(n,"tool",o),this.settleGroupTool(n,{content:[{type:"text",text:o}],isError:!0},!0),this.historyContainer.markDirty(n);this.pendingTools.clear()}else for(const o of this.pendingTools.values())o.setArgsComplete(),this.historyContainer.markDirty(o);this.historyContainer.markDirty(this.streamingComponent),this.streamingComponent=void 0,this.streamingToolSeparator=void 0}e&&(this.closeOpenGroup(),this.applyToolDisplay());break}case"tool_execution_start":{this.pushTranscriptValue(t.args);let e=this.pendingTools.get(t.toolCallId);e?this.noteGroupTool(e,t.toolName,t.args):(e=this.appendToolComponent(t.toolName,t.toolCallId,t.args),this.pendingTools.set(t.toolCallId,e)),e.markExecutionStarted(),this.historyContainer.markDirty(e);break}case"tool_execution_update":{const e=this.projection.partialToolResults.get(t.toolCallId)??t.partialResult;this.pushTranscriptValue(e);const s=this.pendingTools.get(t.toolCallId);s&&(s.updateResult(e,!0),this.registerCopyBlock(s,"tool",this.toolResultText(e)),this.historyContainer.markDirty(s));break}case"tool_execution_end":{const e=this.projection.partialToolResults.get(t.toolCallId)??t.result;this.pushTranscriptValue(e);const s=this.pendingTools.get(t.toolCallId);s&&(s.updateResult(e),this.registerCopyBlock(s,"tool",this.toolResultText(e)),this.pendingTools.delete(t.toolCallId),this.settleGroupTool(s,e,t.isError),this.applyToolDisplay(),this.historyContainer.markDirty(s),this.maybeAppendPageBlock(e));break}case"compaction_start":{const e=t.reason==="manual"?"Compacting context...":"Auto-compacting...";this.setActivity(this.makeLoader(e));break}case"compaction_end":{this.setActivity(this.runActive?this.makeLoader(this.workingActivity):void 0),t.aborted?this.showStatus(t.reason==="manual"?"Compaction cancelled":"Auto-compaction cancelled"):t.result?this.addMessageToChat({role:"compactionSummary",summary:t.result.summary,tokensBefore:t.result.tokensBefore,timestamp:Date.now()}):t.errorMessage&&this.showError(t.errorMessage);break}case"auto_retry_start":{const e=Math.ceil(t.delayMs/1e3);this.setActivity(this.makeLoader(`Retrying (${t.attempt}/${t.maxAttempts}) in ${e}s...`));break}case"auto_retry_end":{this.setActivity(this.runActive?this.makeLoader(this.workingActivity):void 0),t.success||this.showError(`Retry failed after ${t.attempt} attempts: ${t.finalError??"Unknown error"}`);break}case"queue_update":case"session_info_changed":case"thinking_level_changed":this.onFooterEvent?.(t);break;default:break}this.tui.requestRender()}}bashStart(t,e){if(this.deferIfBuilding(()=>this.bashStart(t,e)))return;this.projection=At(this.projection,t,e),this.closeOpenGroup(),this.settleBashComponent();let s;s=new E(t,this.componentTui(()=>s),e),this.bashComponent=s,this.append(s),this.tui.requestRender()}bashOutput(t){this.deferIfBuilding(()=>this.bashOutput(t))||(this.projection=Bt(this.projection,t),this.pushTranscriptText(t),this.bashComponent&&(this.bashComponent.appendOutput(t),this.historyContainer.markDirty(this.bashComponent)),this.tui.requestRender())}bashEnd(t){this.deferIfBuilding(()=>this.bashEnd(t))||(this.projection=wt(this.projection,t),this.settleBashComponent(t),this.tui.requestRender())}addMessageToChat(t){const e=tt(t);if(e!==null&&(t.role!=="custom"||t.display===!0)){this.pushTranscriptText(e.body);const s=e.senders.flatMap(o=>o.entries).filter(o=>o.disposition==="human-answer").map(o=>o.body.trim()).filter(o=>o!=="");if(!(s.length>0&&e.body.replace(Lt,"").trim()===""&&e.senders.every(o=>o.entries.every(n=>n.disposition==="human-answer")))){const o=z(e.kind),n=new U(e,o,this.toolOutputExpanded,this.dimStyle,r=>this.spinnerStyle(this.labelStyle(r)));et(e.kind)?(this.closeOpenGroup(),this.append(n)):this.appendGroupMember(n)?.activity.noteCard(e,o)}for(const o of s)this.appendHumanAnswer(o);return}switch(t.role){case"bashExecution":{this.closeOpenGroup(),this.pushTranscriptText(t.output??"");const s=new E(t.command,this.tui,t.excludeFromContext);t.output&&s.appendOutput(t.output),s.setComplete(t.exitCode,t.cancelled,t.truncated?{truncated:!0}:void 0,t.fullOutputPath),this.append(s);break}case"custom":{if(t.display){if(this.pushTranscriptText(this.userMessageText(t)),t.customType===K){this.appendGroupMember(new X(this.userMessageText(t),this.toolOutputExpanded,this.crtrOutputTheme()));break}if(t.customType===Z){this.closeOpenGroup(),this.append(new d(1)),this.append(new x(this.dimStyle(`\u2500\u2500 ${this.userMessageText(t)} \u2500\u2500`),1,0)),this.append(new d(1));break}const s=new $(ot(t),void 0,u());s.setExpanded(this.toolOutputExpanded),this.appendGroupMember(s)}break}case"compactionSummary":{this.closeOpenGroup(),this.append(new d(1));const s=new W(O(t),u());s.setExpanded(this.toolOutputExpanded),this.append(s);break}case"branchSummary":{this.closeOpenGroup(),this.append(new d(1));const s=new H(O(t),u());s.setExpanded(this.toolOutputExpanded),this.append(s),this.registerCopyBlock(s,"assistant",t.summary);break}case"user":{C(t)&&this.closeOpenGroup();const s=this.userMessageText(t);if(!s)break;this.pushTranscriptText(s),this.chatChildCount()>0&&this.appendUserPart(new d(1),!C(t));const i=q(s);if(i){const o=new V({...i,content:M(i.content)},u());if(o.setExpanded(this.toolOutputExpanded),this.appendUserPart(o,!C(t)),this.registerCopyBlock(o,"user",s),i.userMessage){const n=new S(i.userMessage,u(),void 0,this.markdownTransformers);this.appendUserPart(n,!C(t)),this.registerCopyBlock(n,"user",i.userMessage)}}else{const o=new S(s,u(),void 0,this.markdownTransformers);this.appendUserPart(o,!C(t)),this.registerCopyBlock(o,"user",s)}break}case"assistant":{const s=c(t).trim()!=="";s&&this.closeOpenGroup(),this.appendAssistantMessage(t,!s);break}default:break}}appendAssistantMessage(t,e=!1){const s=new B(void 0,this.hideThinking,u(),this.hiddenThinkingLabel,this.markdownTransformers),i=w(t)?{...t,stopReason:"aborted",errorMessage:"Interrupted"}:t;s.updateContent(i),this.appendAssistantPart(s,e),this.registerCopyBlock(s,"assistant",c(t));const o=this.appendAssistantSeparator(e);return this.setAssistantSeparatorContent(o,t),o}appendAssistantSeparator(t=!1){const e=new R;return t?this.appendGroupMember(e):this.append(e),e}appendAssistantPart(t,e){e?this.appendGroupMember(t):this.append(t)}appendUserPart(t,e){e?this.appendGroupMember(t):this.append(t)}appendHumanAnswer(t){this.closeOpenGroup(),this.chatChildCount()>0&&this.append(new d(1));const e=new S(t,u(),void 0,this.markdownTransformers);this.append(e),this.registerCopyBlock(e,"user",t)}isLiveGroupRegion(){return this.appendTarget===this.historyContainer}ensureGroup(){if(!this.isLiveGroupRegion())return;if(this.openGroup)return this.openGroup;const t=new at,e={members:[],recap:t,activity:new rt(this.cwd,this.nodeRoster),toolCount:0,inFlight:new Set};return this.append(t),this.historyContainer.setHidden(t,!0),this.groups.push(e),this.openGroup=e,e}closeOpenGroup(){this.openGroup=void 0}appendGroupMember(t){const e=this.ensureGroup();return this.append(t),e&&e.members.push(t),e}removeGroupMember(t){for(const e of this.groups){const s=e.members.indexOf(t);s!==-1&&e.members.splice(s,1)}this.historyContainer.setHidden(t,!1)}appendToolComponent(t,e,s){const i=this.isLiveGroupRegion()&&!this.openGroup&&this.historyContainer.children.at(-1)instanceof R?this.historyContainer.children.at(-1):void 0;i&&this.historyContainer.removeChild(i);const o=this.ensureGroup();i&&(this.append(i),o?.members.push(i));const n=this.makeToolComponent(t,e,s);return n.activityCallId=e,this.appendGroupMember(n),this.registerCopyBlock(n,"tool",""),o&&(o.key??=e,o.toolCount++,o.inFlight.add(n),o.activity.noteCall(e,t,s)),n}noteGroupTool(t,e,s){if(t.activityCallId)for(const i of this.groups)i.members.includes(t)&&i.activity.noteCall(t.activityCallId,e,s)}settleGroupTool(t,e,s=!1){for(const i of this.groups)i.inFlight.delete(t),!(!t.activityCallId||!i.members.includes(t))&&(e===void 0?i.activity.resolveWithoutResult(t.activityCallId):i.activity.settle(t.activityCallId,e,s))}promoteStreamingAssistantToBoundary(t,e=!1){!this.streamingWasGroupMember||!e&&c(t).trim()===""||(this.streamingComponent&&this.removeGroupMember(this.streamingComponent),this.streamingToolSeparator&&this.removeGroupMember(this.streamingToolSeparator),this.streamingWasGroupMember=!1,this.closeOpenGroup())}seedToolGroupSummaries(t){this.groupSummaries.clear();for(const[e,s]of Object.entries(t))this.groupSummaries.set(e,s)}applyToolGroupSummary(t,e){if(this.deferIfBuilding(()=>this.applyToolGroupSummary(t,e)))return;this.projection=xt(this.projection,t,e);const s=this.projection.toolGroupSummaryDetails[t];s!==void 0&&(this.groupSummaries.set(t,s),this.applyToolDisplay())}applyGroupDisplay(t){const e=t.key===void 0?void 0:this.groupSummaries.get(t.key),s=this.foldSettledTools&&this.showGroupSummaries&&t.toolCount>0&&t.inFlight.size===0&&e!==void 0;t.recap.setRecap(s?e:void 0,t.toolCount,t.activity.activity(),this.detailedToolRecaps,this.recapPalette),this.historyContainer.setHidden(t.recap,!s);for(const i of t.members)this.historyContainer.setHidden(i,s)}updateFoldedToolSeparators(t=new Set(this.pendingTools.values())){const e=this.historyContainer.children;for(let s=0;s<e.length;s++){const i=e[s];if(!(i instanceof R))continue;const o=e[s+1];i.setFolded(this.foldSettledTools&&!this.historyContainer.hiddenChildren.has(i)&&o instanceof G&&!this.historyContainer.hiddenChildren.has(o)&&!t.has(o)),this.historyContainer.markDirty(i)}}setAssistantSeparatorContent(t,e){const s=e.content,i=Array.isArray(s)?s:[],o=i.some(r=>typeof r=="object"&&r!==null&&r.type==="text"&&typeof r.text=="string"&&r.text.trim()!==""),n=i.some(r=>typeof r=="object"&&r!==null&&r.type==="thinking"&&typeof r.thinking=="string"&&r.thinking.trim()!=="");this.foldedToolSeparatorContents.set(t,{hasText:o,hasThinking:n}),t.setSeparatesToolGroup(o||!this.hideThinking&&n)}makeToolComponent(t,e,s){const i=new ht;let o,n;if(t==="bash"){const h=Q(s,i);h===void 0?n=lt(this.cwd,i,this.backgroundBashHint):n=h.definition}else if(t==="edit"){const h=nt(this.cwd,i);n=h.definition,o=h.observeResult}else t==="read"?n=dt(this.cwd,i):t==="write"&&(n=ct(this.cwd,i));let r;return r=new G(t,e,s,{showImages:this.showImages,imageWidthCells:this.imageWidthCells},n,this.componentTui(()=>r),this.cwd),r.setToolView(n===void 0?void 0:i,o),r.setExpanded(this.toolOutputExpanded),r}append(t){this.appendTarget.addChild(t)}chatChildCount(){return this.appendTarget.children.length}resetChat(){this.setActivity(void 0),this.settleBashComponent(),this.streamingComponent=void 0,this.streamingToolSeparator=void 0,this.streamingWasGroupMember=!1,this.foldedToolSeparatorContents.clear(),this.groups.length=0,this.openGroup=void 0,this.groupSummaries.clear(),this.nodeRoster.clear(),this.pendingTools.clear(),this.lastAssistantText=void 0,this.copyBlockRecords.length=0,this.copyIndex.clear(),this.transcriptFilePaths.length=0,this.pageBlocks.clear(),this.historyContainer.clear()}maybeAppendPageBlock(t){if(!this.inlinePageBlocks||this.appendTarget!==this.historyContainer)return;const e=Y(t);if(e===void 0||this.pageBlocks.has(e.pageId))return;const s=new J(e.pageId,this.pageOpenHint);this.pageBlocks.set(e.pageId,s),this.append(s),this.loadPageBlock(s)}async loadPageBlock(t){await t.refresh()&&(this.historyContainer.markDirty(t),this.tui.requestRender())}refreshInFlightTools(){if(this.pendingTools.size!==0){for(const t of this.pendingTools.values())this.historyContainer.markDirty(t);this.tui.requestRender()}}async refreshPageBlocks(){const t=[...this.pageBlocks.values()];(await Promise.all(t.map(async s=>{const i=await s.refresh();return i&&this.historyContainer.markDirty(s),i}))).some(Boolean)&&this.tui.requestRender()}makeLoader(t){let e;const s={requestRender:p(i=>{e&&!this.onActivityChange&&this.statusContainer.markDirty(e),this.tui.requestRender(i)},"requestRender"),terminal:this.tui.terminal};return e=new F(s,this.spinnerStyle,this.dimStyle,t),e}componentTui(t){return{requestRender:p(e=>{this.historyContainer.markDirty(t()),this.tui.requestRender(e)},"requestRender"),terminal:this.tui.terminal}}settleBashComponent(t){if(!this.bashComponent)return;const e=this.bashComponent;e.setComplete(t?.exitCode,t?.cancelled??!0,t?.truncated?{truncated:!0}:void 0,t?.fullOutputPath),this.historyContainer.markDirty(e),this.bashComponent=void 0}setActivity(t){if(this.activityLoader?.stop(),this.activityLoader=t,this.onActivityChange){this.onActivityChange(t);return}this.statusContainer.clear(),t&&this.statusContainer.addChild(t)}showStatus(t){this.closeOpenGroup(),this.append(new d(1)),this.append(new x(this.dimStyle(t),1,0))}showError(t){this.deferIfBuilding(()=>this.showError(t))||(this.closeOpenGroup(),this.append(new d(1)),this.append(new x(this.errorStyle(t),1,0)),this.tui.requestRender())}crtrOutputTheme(){return{fg:p((t,e)=>t==="error"?this.errorStyle(e):t==="warning"||t==="accent"||t==="toolTitle"||t==="success"?this.spinnerStyle(e):t==="muted"?this.dimStyle(e):e,"fg"),bg:p((t,e)=>e,"bg"),bold:p(t=>this.labelStyle(t),"bold")}}assistantToolCalls(t){const e=t.content;return Array.isArray(e)?e.filter(s=>typeof s=="object"&&s!==null&&s.type==="toolCall"):[]}getTranscriptFilePathsNewestFirst(){return[...this.transcriptFilePaths]}getLastAssistantText(){const t=this.lastAssistantText?.trim();return t||void 0}blockText(t){const e=this.copyIndex.get(t);return e===void 0?void 0:this.copyBlockRecords[e]?.text}copyBlocks(){return this.copyBlockRecords}getLastToolOutputText(){for(let t=this.copyBlockRecords.length-1;t>=0;t--){const e=this.copyBlockRecords[t];if(e.kind==="tool")return e.text.trim()===""?void 0:e.text}}getTranscriptPlainText(){return this.copyBlockRecords.map(t=>t.text).filter(t=>t.trim()!=="").join(`
2
2
 
3
3
  `)}registerCopyBlock(t,e,s){const i=this.condensedCopyBlocks.get(this.appendTarget);if(i){const n=i.findIndex(r=>r.block===t);n===-1?i.push({block:t,kind:e,text:s}):i[n].text=s;return}const o=this.copyIndex.get(t);o===void 0?(this.copyIndex.set(t,this.copyBlockRecords.length),this.copyBlockRecords.push({block:t,kind:e,text:s})):this.copyBlockRecords[o].text=s}unregisterCopyBlock(t){const e=this.condensedCopyBlocks.get(this.appendTarget);if(e){const i=e.findIndex(o=>o.block===t);i!==-1&&e.splice(i,1);return}const s=this.copyIndex.get(t);if(s!==void 0){this.copyBlockRecords.splice(s,1),this.copyIndex.delete(t);for(let i=s;i<this.copyBlockRecords.length;i++)this.copyIndex.set(this.copyBlockRecords[i].block,i)}}appendCondensedBlock({component:t,copyBlocks:e}){this.append(t),this.registerCopyBlock(t,"condensed",e.map(s=>s.text).filter(s=>s.trim()!=="").join(`
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { Box } from '@earendil-works/pi-tui';
2
- import { FoldedToolCallController, type ToolResultObserver } from './tool-calls.js';
2
+ import { FoldedToolCallController } from './tool-calls.js';
3
3
  type Theme = {
4
4
  fg: (name: string, text: string) => string;
5
5
  bg: (name: string, text: string) => string;
@@ -47,7 +47,6 @@ export declare class CrtrOutputMessageComponent extends Box {
47
47
  }
48
48
  export type CrtrBashToolView = {
49
49
  definition: unknown;
50
- observeResult: ToolResultObserver;
51
50
  };
52
51
  export declare function createCrtrBashToolDefinition(args: unknown, fold?: FoldedToolCallController): CrtrBashToolView | undefined;
53
52
  export {};
@@ -1,17 +1,17 @@
1
- var X=Object.defineProperty;var c=(e,t)=>X(e,"name",{value:t,configurable:!0});import{truncateToVisualLines as O}from"@earendil-works/pi-coding-agent";import{Box as J,Text as Q,truncateToWidth as R,visibleWidth as T,wrapTextWithAnsi as v}from"@earendil-works/pi-tui";import{parse as tt,stringify as _}from"yaml";import{crtrPreviewRecords as A,HELP_ICON as et,iconForPath as nt,suppressOutputForPath as rt,summarizePath as st}from"../../../core/preview-registry.js";import{parseSurfaces as it}from"../../../core/substrate/schema.js";import{FoldedToolCallController as ot}from"./tool-calls.js";const ct=20,P=ct-3,L=/<<-?\s*(["']?)([A-Za-z_][A-Za-z0-9_]*)\1/g,W=/(?:^|[\n;&|()]\s*)(?:[A-Za-z_][A-Za-z0-9_]*=\S+\s+)*(?:[^\s;&|()]+\/)?(?:crtr|crouter)(?=\s|$)/,Xt="crtr-output";function F(e){const t=e.split(`
2
- `),n=[];let r=0;for(;r<t.length;){const s=t[r];n.push(s),r++;const i=[];L.lastIndex=0;let o;for(;(o=L.exec(s))!==null;)i.push(o[2]);for(const u of i)for(;r<t.length;){const a=t[r].replace(/^\t+/,"");if(r++,a===u)break}}return n.join(`
3
- `)}c(F,"stripHeredocBodies");function ut(e){return typeof e=="string"&&W.test(F(e))}c(ut,"isCrtrBashCommand");function y(e){const t=F(e),n=W.exec(t);if(n===null)return;const r=t.slice(n.index+n[0].length),s=r.search(/[\n;&|)]/),i=(s===-1?r:r.slice(0,s)).trim();return i===""?[]:lt(dt(i))}c(y,"extractCrtrInvocationTokens");const at=/^(?:\d*|&)(?:>>|<<|>|<)/;function lt(e){const t=e.findIndex(n=>at.test(n));return t===-1?e:e.slice(0,t)}c(lt,"dropRedirectTail");function dt(e){const t=[];let n="",r=!1,s=null;for(const i of e){if(s!==null){i===s?s=null:n+=i,r=!0;continue}if(i==='"'||i==="'"){s=i,r=!0;continue}if(/\s/.test(i)){r&&(t.push(n),n="",r=!1);continue}n+=i,r=!0}return r&&t.push(n),t}c(dt,"tokenizeShellSegment");function ft(e){if(typeof e!="string")return!1;const t=y(e);return t!==void 0&&t.some(n=>n==="-h"||n==="--help")}c(ft,"isCrtrHelpInvocation");function pt(e){const t=y(e);return{isHelp:t!==void 0&&t.some(r=>r==="-h"||r==="--help"),suppressOutput:t!==void 0&&t.length>0&&rt(t)}}c(pt,"commandPreviewMeta");function M(e){if(!e||typeof e!="object")return"";const t=e.command;return typeof t=="string"?t:""}c(M,"commandFromArgs");const C=/^-{1,2}[A-Za-z0-9]/,mt=/^(--?[A-Za-z0-9][^=]*)(=)(.*)$/,N=/^-?(?:\d+(?:\.\d+)?|\.\d+)$/,ht=new Set(["memory write","memory edit"]);function S(e,t){const n=`--${t}=`,r=[];return e.forEach((s,i)=>{if(s===`--${t}`){const o=e[i+1];o!==void 0&&!C.test(o)&&r.push(o);return}s.startsWith(n)&&r.push(s.slice(n.length))}),r}c(S,"crtrFlagValues");function E(e,t){return S(e,t)[0]}c(E,"crtrFlagValue");function j(e){try{return tt(e)}catch{return}}c(j,"parsedYaml");function gt(e){const t=j(e);return t===null||typeof t!="object"||Array.isArray(t)?e.trim():_(t,{collectionStyle:"flow",flowCollectionPadding:!1,lineWidth:0}).trim()}c(gt,"predicateText");function H(e){return _(e,{collectionStyle:"flow",flowCollectionPadding:!1,lineWidth:0}).trim()}c(H,"predicateValueText");function V(e,t){const n=e?.[t];return typeof n=="string"&&n!==""?n:void 0}c(V,"stringField");function xt(e,t){const n=e.slice(0,2).join(" ");if(!ht.has(n))return;const r=e[2]!==void 0&&!C.test(e[2])?e[2]:void 0,s=t.find(o=>o.path===n)?.result,i=E(e,"gate");return{leaf:n,name:V(s,"name")??r??"",scope:V(s,"scope")??E(e,"scope"),gate:i===void 0?void 0:gt(i),surfaces:it(S(e,"surface").map(j)),whenAndWhyToRead:E(e,"when-and-why-to-read")}}c(xt,"memoryRouting");function $t(e){return e==="content"?"warning":e==="preview"?"accent":"muted"}c($t,"rungTone");function bt(e,t){const n=[e.on];return e.match!==void 0&&n.push(e.match.join(" ")),e.matchFrontmatter!==void 0&&n.push(`match-frontmatter ${H(e.matchFrontmatter)}`),e.gate!==void 0&&n.push(`gate ${H(e.gate)}`),`${t.fg("text",n.join(" "))} ${t.fg("dim","at")} ${t.fg($t(e.at),e.at)}`}c(bt,"surfaceEntryText");const wt=" ";function Tt(e,t){const n=c(s=>t.fg("dim",s),"label"),r=[];return e.scope!==void 0&&r.push({label:n("scope"),values:[t.fg("text",e.scope)]}),e.gate!==void 0&&r.push({label:n("gate"),values:[t.fg("text",e.gate)]}),r.push({label:n("surface"),values:e.surfaces.length===0?[t.fg("muted","none")]:e.surfaces.map(s=>bt(s,t))}),e.whenAndWhyToRead!==void 0&&r.push({label:n("when-and-why-to-read"),values:[t.fg("text",e.whenAndWhyToRead)]}),r}c(Tt,"memoryRoutingFields");function yt(e,t){const n=`${wt}${e.label} `,r=T(n),s=" ".repeat(r),i=e.values.length>1?`${s} `:s,o=[];for(const u of e.values)v(u,Math.max(1,t-T(i))).forEach((l,d)=>{const f=d>0?i:o.length===0?n:s;o.push(`${f}${l}`)});return o}c(yt,"routingFieldLines");class Ct{static{c(this,"FoldedCrtrCallComponent")}header;fields;constructor(t,n){this.header=t,this.fields=n}invalidate(){}render(t){const n=v(this.header,Math.max(1,t));for(const r of this.fields)n.push(...yt(r,t));return n.map(r=>R(r,t,""))}}function Rt(e,t){let n=!1;return e.map(r=>{const s=mt.exec(r);if(s!==null){n=!1;const i=N.test(s[3])?"syntaxNumber":"syntaxString";return`${t.fg("syntaxKeyword",s[1])}${t.fg("syntaxOperator",s[2])}${t.fg(i,s[3])}`}return n&&!C.test(r)?(n=!1,t.fg(N.test(r)?"syntaxNumber":"syntaxString",r)):C.test(r)?(n=!0,t.fg("syntaxKeyword",r)):(n=!1,t.fg("toolTitle",t.bold(r)))}).join(" ")}c(Rt,"styleFoldedCrtrTokens");function vt(e){return(e.content??[]).filter(t=>t?.type==="text"||typeof t?.text=="string").map(t=>t.text??"").join(`
4
- `).trimEnd()}c(vt,"resultText");function U(e,t,n,r,s,i){const o=t===""?"":i.fg("accent",t);return`${e}${o}${i.fg("dim",n)}${i.fg("dim",r)}${i.fg("text",s)}`}c(U,"styledLabelValue");function z(e,t,n=!1){const r=e.trim();if(r==="")return"";if(/^<\/?(?:command|subcommand|runtime-state|crtr-[^>\s]+|error)(?:\s|>|$)/.test(r)){const l=r.startsWith("<error")?"error":"accent";return t.fg(l,t.bold(e))}if(/^(Input|Output|Effects|Branches|Globals|Output \(|Effects$)/.test(r))return t.fg("toolTitle",t.bold(e));if(/^(Spawned|Created|Updated|Wrote|Deleted|Promoted|Demoted|Closed|Revived|Recycled|Configured|Registered|Removed|Subscribed|Unsubscribed|Canceled)\b/i.test(r))return t.fg("success",e);if(/^(crtr:|Command exited|Command timed out|Command aborted|unknown subcommand|error\b)/i.test(r))return t.fg("error",e);if(/^(warning|warn|blocked|attention)\b/i.test(r)||r.includes("\u26A0"))return t.fg("warning",e);if(/^[●✓]/.test(r))return t.fg("success",e);if(/^[○◌]/.test(r))return t.fg("muted",e);if(/^[✗⊘]/.test(r))return t.fg("error",e);const s=/^(\s*)-\s+([^:]+)(:\s*)(.*)$/.exec(e);if(s!==null)return U(s[1],n?"- ":"\u2022 ",s[2],s[3],s[4],t);const i=/^(\s*)\*\*([^*]+):\*\*(\s*)(.*)$/.exec(e);if(i!==null)return n?`${i[1]}${t.fg("dim","**")}${t.fg("dim",i[2])}${t.fg("dim",":**")}${i[3]}${t.fg("text",i[4])}`:U(i[1],"",i[2],`:${i[3]}`,i[4],t);if(/^\s*-\s+/.test(e)){const l=/^(\s*)-\s+(.*)$/.exec(e),d=n?"-":"\u2022";return`${l[1]}${t.fg("accent",d)} ${t.fg("text",l[2])}`}const o=/^(\s*)(\d+\s+[^:]+:)$/.exec(e);if(o!==null)return`${o[1]}${t.fg("toolTitle",t.bold(o[2]))}`;const u=/^(\s*)(Next:)(\s*)(.*)$/.exec(e);if(u!==null)return`${u[1]}${t.fg("accent",t.bold(u[2]))}${u[3]}${t.fg("text",u[4])}`;const a=/^(\s*)([├└│─┬┼┌┐┘└]+\s*)(.*)$/.exec(e);return a!==null?`${a[1]}${t.fg("border",a[2])}${t.fg("text",a[3])}`:t.fg("text",e)}c(z,"lineStyle");function B(e,t,n=!1){return(e||"(no output)").split(`
5
- `).map(s=>z(s,t,n)).join(`
6
- `)}c(B,"renderCrtrOutputText");function Pt(e){if(!e.startsWith("$ "))return e;const t=e.indexOf(`
7
- `);if(t===-1)return"";const n=e.slice(t+1);return n.startsWith(`
8
- `)?n.slice(1):n}c(Pt,"stripCrtrEchoPrefix");function Et(e){const t=/<command name="[^"]*"([^>]*)>/.exec(e);return t===null?"leaf":/\bdescription="/.test(t[1])?"branch":"root"}c(Et,"classifyHelpText");function It(e){const t=e.indexOf('<command name="'),n=(t===-1?e:e.slice(0,t)).trim(),r=[],s=/<command name="([^"]*)">\n([^\n]*)/g;let i;for(;(i=s.exec(e))!==null;)r.push(`${i[1]} \u2014 ${i[2]}`);return[n,...r.length>0?["",...r]:[]].join(`
9
- `)}c(It,"synthesizeRootPreview");function Ot(e){const t=/^<command name="([^"]*)" description="([^"]*)">/.exec(e),n=t?.[1]??"",r=t?.[2]??"",s=[],i=/<subcommand name="([^"]*)" description="([^"]*)"[^>]*\/>/g;let o;for(;(o=i.exec(e))!==null;)s.push(`${o[1]} \u2014 ${o[2]}`);return[`${n} \u2014 ${r}`,...s.length>0?["",...s]:[]].join(`
10
- `)}c(Ot,"synthesizeBranchPreview");function _t(e){const t=e.split(`
11
- `),n=[t[0]??""],r=t.indexOf("Input");if(r===-1)return n.join(`
12
- `);const s=t.findIndex(a=>a.startsWith("Output (")),i=s===-1?t.length:s,o=t.slice(r+1,i).filter(a=>a.trim()!==""),u=o.map(a=>/^\s{2}(\S+)/.exec(a)?.[1]);return o.length>0&&u.every(a=>a!==void 0)?n.push("",`Params: ${u.join(", ")}`):o.length>0&&n.push("",o[0]),n.join(`
13
- `)}c(_t,"synthesizeLeafPreview");function At(e){const t=Pt(e),n=Et(t);return n==="root"?It(t):n==="branch"?Ot(t):_t(t)}c(At,"synthesizeHelpPreviewText");function D(e,t,n=!1){if(e.text==="")return"";const r=/^(.*?)(\s*:\s{2})(.*)$/.exec(e.text);if(r!==null&&(e.tone===void 0||e.tone==="plain"))return`${t.fg("dim",r[1])}${t.fg("dim",r[2])}${t.fg("text",r[3])}`;const s=e.tone??"plain";if(s==="muted")return t.fg("muted",e.text);const i=s==="plain"?"text":s,o=t.fg(i,e.text);return n&&s==="plain"?t.bold(o):o}c(D,"renderSummaryLine");function Lt(e,t){return e.isPartial?t.fg("warning","\u27F3 crtr running"):t.fg("error","\u2717 crtr failed")}c(Lt,"statusLine");const G={isHelp:!1,suppressOutput:!1};function $(e,t){return t<=0?e.map(()=>""):e.map(n=>R(n,t,"\u2026"))}c($,"clampRenderedLines");function k(e,t){return t<=0?e.map(()=>""):e.flatMap(n=>n===""?[""]:v(n,t))}c(k,"wrapRenderedLines");const Wt=/^\[Showing lines \d+-\d+ of \d+ \([^)]+ limit\)\. Full output: .+\]$/;function Ft(e){return Wt.test(e.trim())}c(Ft,"isPiTruncationMarker");function Y(e){const t=e.trim();if(!t.includes("|"))return null;const n=t.replace(/^\|/,"").replace(/\|$/,""),r=[];let s="",i=0;for(;i<n.length;){const o=n[i];if(o==="\\"&&n[i+1]==="|"){s+="|",i+=2;continue}if(o==="|"){r.push(s.trim()),s="",i++;continue}s+=o,i++}return r.push(s.trim()),r.length>=2?r:null}c(Y,"splitGenericTableRow");function Mt(e){return e.every(t=>/^:?-{3,}:?$/.test(t))}c(Mt,"isTableSeparator");function Nt(e){const t=e.trim();return t.startsWith("|")||t.endsWith("|")}c(Nt,"hasEdgePipe");function St(e,t){const n=Y(e[t]);if(n===null)return null;const r=[n];let s=t+1;for(;s<e.length;){const o=Y(e[s]);if(o===null||o.length!==n.length)break;r.push(o),s++}if(r.length===1&&!Nt(e[t]))return null;const i=r.findIndex(Mt);return i===1?{next:s,rows:[r[0],...r.slice(2)],headerRows:1}:i!==-1?{next:s,rows:r.filter((o,u)=>u!==i),headerRows:0}:{next:s,rows:r,headerRows:0}}c(St,"readGenericTableBlock");function jt(e){return e.reduce((t,n)=>t+n,0)}c(jt,"sum");function Ht(e,t){const n=e[0]?.length??0;if(n===0)return[];const r=Math.max(0,n-1)*2,s=Math.max(n,t-r),i=s>=n*3?3:1,o=Array.from({length:n},(u,a)=>Math.max(1,...e.map(l=>T(l[a]??""))));for(;jt(o)>s;){let u=-1;for(let a=0;a<o.length;a++)o[a]>i&&(u===-1||o[a]>o[u])&&(u=a);if(u===-1)break;o[u]=o[u]-1}return o}c(Ht,"tableColumnWidths");function Vt(e,t){const n=t-T(e);return n>0?`${e}${" ".repeat(n)}`:e}c(Vt,"padToVisibleWidth");function Ut(e,t){return e.map((n,r)=>Vt(R(n,t[r]??1,"\u2026"),t[r]??1)).join(" ").trimEnd()}c(Ut,"formatGenericTableRow");function zt(e,t){const n=(e||"(no output)").split(`
14
- `),r=[],s=c(o=>{r.push(o)},"push");let i=0;for(;i<n.length;){const o=St(n,i);if(o!==null){const a=Ht(o.rows,t);for(let l=0;l<o.rows.length;l++)s({text:Ut(o.rows[l],a),tone:l<o.headerRows?"accent":void 0});i=o.next;continue}const u=n[i];s({text:u,tone:Ft(u)?"muted":void 0}),i++}return r}c(zt,"collectGenericPreviewLines");function Bt(e,t,n,r){const s=zt(e,n).map(o=>o.tone!==void 0?D(o,r,o.tone==="accent"):z(o.text,r)),i=k(s,n);return i.length<=t?{lines:i,skippedCount:0}:{lines:i.slice(0,t),skippedCount:i.length-t}}c(Bt,"renderGenericPreview");class I{static{c(this,"CrtrResultComponent")}text;options;context;theme;command;staticPreview;structuredPreview;constructor(t,n,r,s,i,o=G,u){this.text=t,this.options=n,this.context=r,this.theme=s,this.command=i,this.staticPreview=o,this.structuredPreview=u}currentPreview(){return this.command===void 0?this.staticPreview:pt(this.command)}render(t){const n=this.currentPreview(),r=!!this.options.isPartial,s=!!this.context.isError,o=r||s?[Lt(this.options,this.theme)]:[];if(this.options.expanded){const a=B(this.text,this.theme,!0),l=this.command!==void 0?[this.theme.fg("muted",`$ ${this.command}`),""]:[];return k(["",...o,...l,...a.split(`
15
- `)],t)}if(!r){if(n.isHelp){const d=B(At(this.text),this.theme),p=O(d,P,t).visualLines??[],h=this.theme.fg("dim","(schema \u2014 ctrl+o to expand)");return $(["",...o,...p,h],t)}const a=this.command!==void 0?y(this.command):void 0,l=a!==void 0&&this.structuredPreview!==void 0?st(this.structuredPreview,a):null;if(l!==null){const d=l.findIndex(g=>g.text!==""),f=l.map((g,w)=>D(g,this.theme,w===d)),h=O(f.join(`
16
- `),P,t).visualLines??[],b=this.theme.fg("dim","(ctrl+o to expand)");return $(["",...o,...h,b],t)}if(!s&&n.suppressOutput){const d=this.theme.fg("dim","(suppressed \u2014 ctrl+o to expand)");return $(["",...o,d],t)}}const u=Bt(this.text,P,t,this.theme);if(u.skippedCount>0){const a=this.theme.fg("dim",`\u2026 (${u.skippedCount} more lines, ctrl+o to expand)`);return $(["",...o,...u.lines,a],t)}return $(["",...o,...u.lines],t)}invalidate(){}}function Z(e){const t=e.split(`
17
- `,1)[0];return t.startsWith("$ ")&&ft(t.slice(2))}c(Z,"isHelpFromCrtrOutputContent");class Jt extends J{static{c(this,"CrtrOutputMessageComponent")}content;theme;body;expanded;constructor(t,n,r){super(1,1,i=>r.bg("customMessageBg",i)),this.content=t,this.theme=r,this.expanded=n;const s={isHelp:Z(t),suppressOutput:!1};this.body=new I(t,{expanded:n},{},r,void 0,s),this.addChild(this.body)}setExpanded(t){if(this.expanded===t)return;this.expanded=t;const n={isHelp:Z(this.content),suppressOutput:!1};this.body=new I(this.content,{expanded:t},{},this.theme,void 0,n),this.clear(),this.addChild(this.body)}}function Qt(e,t=new ot){const n=M(e);if(!ut(n))return;let r=[];return{definition:{name:"bash",label:"bash",description:"Render crtr bash output with crtr-specific chrome in the attach viewer.",parameters:{},renderCall(o,u,a){const l=M(o)||n,d=y(l),f=d!==void 0&&d.some(m=>m==="-h"||m==="--help"),p=(d??[]).filter(m=>m!=="-h"&&m!=="--help"),h=p.join(" "),b=f?et:nt(p),g=f?`${b} crtr help`:`${b} crtr`,w=u.fg("accent",u.bold(g)),x=t.folded&&!f?xt(p,r):void 0;if(x!==void 0){const m=x.name===""?"":` ${u.fg("toolTitle",u.bold(x.name))}`,q=`${w} ${u.fg("toolTitle",u.bold(x.leaf))}${m}`;return t.capture(new Ct(q,Tt(x,u)))}const K=h?` ${t.folded?Rt(p,u):u.fg("toolTitle",u.bold(h))}`:"";return t.capture(new Q(`${w}${K}`,0,0))},renderResult(o,u,a,l){return new I(vt(o),u,l,a,n,G,A(o).at(-1))}},observeResult:c((o,u)=>{u||(r=A(o))},"observeResult")}}c(Qt,"createCrtrBashToolDefinition");export{Xt as CRTR_OUTPUT_CUSTOM_TYPE,Jt as CrtrOutputMessageComponent,pt as commandPreviewMeta,Qt as createCrtrBashToolDefinition,ut as isCrtrBashCommand,ft as isCrtrHelpInvocation,B as renderCrtrOutputText,F as stripHeredocBodies};
1
+ var S=Object.defineProperty;var c=(n,t)=>S(n,"name",{value:t,configurable:!0});import{truncateToVisualLines as T}from"@earendil-works/pi-coding-agent";import{Box as j,Text as z,truncateToWidth as y,visibleWidth as R,wrapTextWithAnsi as B}from"@earendil-works/pi-tui";import{crtrPreviewRecords as U,HELP_ICON as D,iconForPath as V,suppressOutputForPath as G,summarizePath as Z}from"../../../core/preview-registry.js";import{FoldedToolCallController as K}from"./tool-calls.js";const Y=20,w=Y-3,P=/<<-?\s*(["']?)([A-Za-z_][A-Za-z0-9_]*)\1/g,v=/(?:^|[\n;&|()]\s*)(?:[A-Za-z_][A-Za-z0-9_]*=\S+\s+)*(?:[^\s;&|()]+\/)?(?:crtr|crouter)(?=\s|$)/,Ot="crtr-output";function E(n){const t=n.split(`
2
+ `),e=[];let r=0;for(;r<t.length;){const i=t[r];e.push(i),r++;const s=[];P.lastIndex=0;let o;for(;(o=P.exec(i))!==null;)s.push(o[2]);for(const l of s)for(;r<t.length;){const u=t[r].replace(/^\t+/,"");if(r++,u===l)break}}return e.join(`
3
+ `)}c(E,"stripHeredocBodies");function q(n){return typeof n=="string"&&v.test(E(n))}c(q,"isCrtrBashCommand");function $(n){const t=E(n),e=v.exec(t);if(e===null)return;const r=t.slice(e.index+e[0].length),i=r.search(/[\n;&|)]/),s=(i===-1?r:r.slice(0,i)).trim();return s===""?[]:J(Q(s))}c($,"extractCrtrInvocationTokens");const X=/^(?:\d*|&)(?:>>|<<|>|<)/;function J(n){const t=n.findIndex(e=>X.test(e));return t===-1?n:n.slice(0,t)}c(J,"dropRedirectTail");function Q(n){const t=[];let e="",r=!1,i=null;for(const s of n){if(i!==null){s===i?i=null:e+=s,r=!0;continue}if(s==='"'||s==="'"){i=s,r=!0;continue}if(/\s/.test(s)){r&&(t.push(e),e="",r=!1);continue}e+=s,r=!0}return r&&t.push(e),t}c(Q,"tokenizeShellSegment");function tt(n){if(typeof n!="string")return!1;const t=$(n);return t!==void 0&&t.some(e=>e==="-h"||e==="--help")}c(tt,"isCrtrHelpInvocation");function nt(n){const t=$(n);return{isHelp:t!==void 0&&t.some(r=>r==="-h"||r==="--help"),suppressOutput:t!==void 0&&t.length>0&&G(t)}}c(nt,"commandPreviewMeta");function O(n){if(!n||typeof n!="object")return"";const t=n.command;return typeof t=="string"?t:""}c(O,"commandFromArgs");const _=/^-{1,2}[A-Za-z0-9]/,et=/^(--?[A-Za-z0-9][^=]*)(=)(.*)$/,I=/^-?(?:\d+(?:\.\d+)?|\.\d+)$/;function rt(n,t){let e=!1;return n.map(r=>{const i=et.exec(r);if(i!==null){e=!1;const s=I.test(i[3])?"syntaxNumber":"syntaxString";return`${t.fg("syntaxKeyword",i[1])}${t.fg("syntaxOperator",i[2])}${t.fg(s,i[3])}`}return e&&!_.test(r)?(e=!1,t.fg(I.test(r)?"syntaxNumber":"syntaxString",r)):_.test(r)?(e=!0,t.fg("syntaxKeyword",r)):(e=!1,t.fg("toolTitle",t.bold(r)))}).join(" ")}c(rt,"styleFoldedCrtrTokens");function st(n){return(n.content??[]).filter(t=>t?.type==="text"||typeof t?.text=="string").map(t=>t.text??"").join(`
4
+ `).trimEnd()}c(st,"resultText");function L(n,t,e,r,i,s){const o=t===""?"":s.fg("accent",t);return`${n}${o}${s.fg("dim",e)}${s.fg("dim",r)}${s.fg("text",i)}`}c(L,"styledLabelValue");function A(n,t,e=!1){const r=n.trim();if(r==="")return"";if(/^<\/?(?:command|subcommand|runtime-state|crtr-[^>\s]+|error)(?:\s|>|$)/.test(r)){const a=r.startsWith("<error")?"error":"accent";return t.fg(a,t.bold(n))}if(/^(Input|Output|Effects|Branches|Globals|Output \(|Effects$)/.test(r))return t.fg("toolTitle",t.bold(n));if(/^(Spawned|Created|Updated|Wrote|Deleted|Promoted|Demoted|Closed|Revived|Recycled|Configured|Registered|Removed|Subscribed|Unsubscribed|Canceled)\b/i.test(r))return t.fg("success",n);if(/^(crtr:|Command exited|Command timed out|Command aborted|unknown subcommand|error\b)/i.test(r))return t.fg("error",n);if(/^(warning|warn|blocked|attention)\b/i.test(r)||r.includes("\u26A0"))return t.fg("warning",n);if(/^[●✓]/.test(r))return t.fg("success",n);if(/^[○◌]/.test(r))return t.fg("muted",n);if(/^[✗⊘]/.test(r))return t.fg("error",n);const i=/^(\s*)-\s+([^:]+)(:\s*)(.*)$/.exec(n);if(i!==null)return L(i[1],e?"- ":"\u2022 ",i[2],i[3],i[4],t);const s=/^(\s*)\*\*([^*]+):\*\*(\s*)(.*)$/.exec(n);if(s!==null)return e?`${s[1]}${t.fg("dim","**")}${t.fg("dim",s[2])}${t.fg("dim",":**")}${s[3]}${t.fg("text",s[4])}`:L(s[1],"",s[2],`:${s[3]}`,s[4],t);if(/^\s*-\s+/.test(n)){const a=/^(\s*)-\s+(.*)$/.exec(n),d=e?"-":"\u2022";return`${a[1]}${t.fg("accent",d)} ${t.fg("text",a[2])}`}const o=/^(\s*)(\d+\s+[^:]+:)$/.exec(n);if(o!==null)return`${o[1]}${t.fg("toolTitle",t.bold(o[2]))}`;const l=/^(\s*)(Next:)(\s*)(.*)$/.exec(n);if(l!==null)return`${l[1]}${t.fg("accent",t.bold(l[2]))}${l[3]}${t.fg("text",l[4])}`;const u=/^(\s*)([├└│─┬┼┌┐┘└]+\s*)(.*)$/.exec(n);return u!==null?`${u[1]}${t.fg("border",u[2])}${t.fg("text",u[3])}`:t.fg("text",n)}c(A,"lineStyle");function W(n,t,e=!1){return(n||"(no output)").split(`
5
+ `).map(i=>A(i,t,e)).join(`
6
+ `)}c(W,"renderCrtrOutputText");function it(n){if(!n.startsWith("$ "))return n;const t=n.indexOf(`
7
+ `);if(t===-1)return"";const e=n.slice(t+1);return e.startsWith(`
8
+ `)?e.slice(1):e}c(it,"stripCrtrEchoPrefix");function ot(n){const t=/<command name="[^"]*"([^>]*)>/.exec(n);return t===null?"leaf":/\bdescription="/.test(t[1])?"branch":"root"}c(ot,"classifyHelpText");function ct(n){const t=n.indexOf('<command name="'),e=(t===-1?n:n.slice(0,t)).trim(),r=[],i=/<command name="([^"]*)">\n([^\n]*)/g;let s;for(;(s=i.exec(n))!==null;)r.push(`${s[1]} \u2014 ${s[2]}`);return[e,...r.length>0?["",...r]:[]].join(`
9
+ `)}c(ct,"synthesizeRootPreview");function ut(n){const t=/^<command name="([^"]*)" description="([^"]*)">/.exec(n),e=t?.[1]??"",r=t?.[2]??"",i=[],s=/<subcommand name="([^"]*)" description="([^"]*)"[^>]*\/>/g;let o;for(;(o=s.exec(n))!==null;)i.push(`${o[1]} \u2014 ${o[2]}`);return[`${e} \u2014 ${r}`,...i.length>0?["",...i]:[]].join(`
10
+ `)}c(ut,"synthesizeBranchPreview");function lt(n){const t=n.split(`
11
+ `),e=[t[0]??""],r=t.indexOf("Input");if(r===-1)return e.join(`
12
+ `);const i=t.findIndex(u=>u.startsWith("Output (")),s=i===-1?t.length:i,o=t.slice(r+1,s).filter(u=>u.trim()!==""),l=o.map(u=>/^\s{2}(\S+)/.exec(u)?.[1]);return o.length>0&&l.every(u=>u!==void 0)?e.push("",`Params: ${l.join(", ")}`):o.length>0&&e.push("",o[0]),e.join(`
13
+ `)}c(lt,"synthesizeLeafPreview");function at(n){const t=it(n),e=ot(t);return e==="root"?ct(t):e==="branch"?ut(t):lt(t)}c(at,"synthesizeHelpPreviewText");function k(n,t,e=!1){if(n.text==="")return"";const r=/^(.*?)(\s*:\s{2})(.*)$/.exec(n.text);if(r!==null&&(n.tone===void 0||n.tone==="plain"))return`${t.fg("dim",r[1])}${t.fg("dim",r[2])}${t.fg("text",r[3])}`;const i=n.tone??"plain";if(i==="muted")return t.fg("muted",n.text);const s=i==="plain"?"text":i,o=t.fg(s,n.text);return e&&i==="plain"?t.bold(o):o}c(k,"renderSummaryLine");function dt(n,t){return n.isPartial?t.fg("warning","\u27F3 crtr running"):t.fg("error","\u2717 crtr failed")}c(dt,"statusLine");const H={isHelp:!1,suppressOutput:!1};function x(n,t){return t<=0?n.map(()=>""):n.map(e=>y(e,t,"\u2026"))}c(x,"clampRenderedLines");function M(n,t){return t<=0?n.map(()=>""):n.flatMap(e=>e===""?[""]:B(e,t))}c(M,"wrapRenderedLines");const ft=/^\[Showing lines \d+-\d+ of \d+ \([^)]+ limit\)\. Full output: .+\]$/;function pt(n){return ft.test(n.trim())}c(pt,"isPiTruncationMarker");function N(n){const t=n.trim();if(!t.includes("|"))return null;const e=t.replace(/^\|/,"").replace(/\|$/,""),r=[];let i="",s=0;for(;s<e.length;){const o=e[s];if(o==="\\"&&e[s+1]==="|"){i+="|",s+=2;continue}if(o==="|"){r.push(i.trim()),i="",s++;continue}i+=o,s++}return r.push(i.trim()),r.length>=2?r:null}c(N,"splitGenericTableRow");function mt(n){return n.every(t=>/^:?-{3,}:?$/.test(t))}c(mt,"isTableSeparator");function ht(n){const t=n.trim();return t.startsWith("|")||t.endsWith("|")}c(ht,"hasEdgePipe");function gt(n,t){const e=N(n[t]);if(e===null)return null;const r=[e];let i=t+1;for(;i<n.length;){const o=N(n[i]);if(o===null||o.length!==e.length)break;r.push(o),i++}if(r.length===1&&!ht(n[t]))return null;const s=r.findIndex(mt);return s===1?{next:i,rows:[r[0],...r.slice(2)],headerRows:1}:s!==-1?{next:i,rows:r.filter((o,l)=>l!==s),headerRows:0}:{next:i,rows:r,headerRows:0}}c(gt,"readGenericTableBlock");function xt(n){return n.reduce((t,e)=>t+e,0)}c(xt,"sum");function $t(n,t){const e=n[0]?.length??0;if(e===0)return[];const r=Math.max(0,e-1)*2,i=Math.max(e,t-r),s=i>=e*3?3:1,o=Array.from({length:e},(l,u)=>Math.max(1,...n.map(a=>R(a[u]??""))));for(;xt(o)>i;){let l=-1;for(let u=0;u<o.length;u++)o[u]>s&&(l===-1||o[u]>o[l])&&(l=u);if(l===-1)break;o[l]=o[l]-1}return o}c($t,"tableColumnWidths");function bt(n,t){const e=t-R(n);return e>0?`${n}${" ".repeat(e)}`:n}c(bt,"padToVisibleWidth");function wt(n,t){return n.map((e,r)=>bt(y(e,t[r]??1,"\u2026"),t[r]??1)).join(" ").trimEnd()}c(wt,"formatGenericTableRow");function Ct(n,t){const e=(n||"(no output)").split(`
14
+ `),r=[],i=c(o=>{r.push(o)},"push");let s=0;for(;s<e.length;){const o=gt(e,s);if(o!==null){const u=$t(o.rows,t);for(let a=0;a<o.rows.length;a++)i({text:wt(o.rows[a],u),tone:a<o.headerRows?"accent":void 0});s=o.next;continue}const l=e[s];i({text:l,tone:pt(l)?"muted":void 0}),s++}return r}c(Ct,"collectGenericPreviewLines");function Tt(n,t,e,r){const i=Ct(n,e).map(o=>o.tone!==void 0?k(o,r,o.tone==="accent"):A(o.text,r)),s=M(i,e);return s.length<=t?{lines:s,skippedCount:0}:{lines:s.slice(0,t),skippedCount:s.length-t}}c(Tt,"renderGenericPreview");class C{static{c(this,"CrtrResultComponent")}text;options;context;theme;command;staticPreview;structuredPreview;constructor(t,e,r,i,s,o=H,l){this.text=t,this.options=e,this.context=r,this.theme=i,this.command=s,this.staticPreview=o,this.structuredPreview=l}currentPreview(){return this.command===void 0?this.staticPreview:nt(this.command)}render(t){const e=this.currentPreview(),r=!!this.options.isPartial,i=!!this.context.isError,o=r||i?[dt(this.options,this.theme)]:[];if(this.options.expanded){const u=W(this.text,this.theme,!0),a=this.command!==void 0?[this.theme.fg("muted",`$ ${this.command}`),""]:[];return M(["",...o,...a,...u.split(`
15
+ `)],t)}if(!r){if(e.isHelp){const d=W(at(this.text),this.theme),m=T(d,w,t).visualLines??[],h=this.theme.fg("dim","(schema \u2014 ctrl+o to expand)");return x(["",...o,...m,h],t)}const u=this.command!==void 0?$(this.command):void 0,a=u!==void 0&&this.structuredPreview!==void 0?Z(this.structuredPreview,u):null;if(a!==null){const d=a.findIndex(g=>g.text!==""),p=a.map((g,f)=>k(g,this.theme,f===d)),h=T(p.join(`
16
+ `),w,t).visualLines??[],b=this.theme.fg("dim","(ctrl+o to expand)");return x(["",...o,...h,b],t)}if(!i&&e.suppressOutput){const d=this.theme.fg("dim","(suppressed \u2014 ctrl+o to expand)");return x(["",...o,d],t)}}const l=Tt(this.text,w,t,this.theme);if(l.skippedCount>0){const u=this.theme.fg("dim",`\u2026 (${l.skippedCount} more lines, ctrl+o to expand)`);return x(["",...o,...l.lines,u],t)}return x(["",...o,...l.lines],t)}invalidate(){}}function F(n){const t=n.split(`
17
+ `,1)[0];return t.startsWith("$ ")&&tt(t.slice(2))}c(F,"isHelpFromCrtrOutputContent");class _t extends j{static{c(this,"CrtrOutputMessageComponent")}content;theme;body;expanded;constructor(t,e,r){super(1,1,s=>r.bg("customMessageBg",s)),this.content=t,this.theme=r,this.expanded=e;const i={isHelp:F(t),suppressOutput:!1};this.body=new C(t,{expanded:e},{},r,void 0,i),this.addChild(this.body)}setExpanded(t){if(this.expanded===t)return;this.expanded=t;const e={isHelp:F(this.content),suppressOutput:!1};this.body=new C(this.content,{expanded:t},{},this.theme,void 0,e),this.clear(),this.addChild(this.body)}}function It(n,t=new K){const e=O(n);return q(e)?{definition:{name:"bash",label:"bash",description:"Render crtr bash output with crtr-specific chrome in the attach viewer.",parameters:{},renderCall(i,s,o){const l=O(i)||e,u=$(l),a=u!==void 0&&u.some(f=>f==="-h"||f==="--help"),d=(u??[]).filter(f=>f!=="-h"&&f!=="--help"),p=d.join(" "),m=a?D:V(d),h=a?`${m} crtr help`:`${m} crtr`,b=s.fg("accent",s.bold(h)),g=p?` ${t.folded?rt(d,s):s.fg("toolTitle",s.bold(p))}`:"";return t.capture(new z(`${b}${g}`,0,0))},renderResult(i,s,o,l){return new C(st(i),s,l,o,e,H,U(i).at(-1))}}}:void 0}c(It,"createCrtrBashToolDefinition");export{Ot as CRTR_OUTPUT_CUSTOM_TYPE,_t as CrtrOutputMessageComponent,nt as commandPreviewMeta,It as createCrtrBashToolDefinition,q as isCrtrBashCommand,tt as isCrtrHelpInvocation,W as renderCrtrOutputText,E as stripHeredocBodies};
@@ -9,12 +9,12 @@ export type FileActivity = {
9
9
  hasKnownCounts: boolean;
10
10
  countsIncomplete: boolean;
11
11
  };
12
- /** `path` is the doc on disk, carried so the chip can hyperlink to it. A
13
- * delete has no path: the file is gone, and a link to it would be dead. */
14
- export type MemoryActivity = {
12
+ /** One canvas document this group read, wrote, edited or deleted, by its full
13
+ * name (`<owner-handle>/<name>`). Documents are canvas rows, not files, so the
14
+ * chip carries no path to hyperlink. */
15
+ export type DocumentActivity = {
15
16
  action: 'read' | 'write' | 'edit' | 'delete';
16
17
  name: string;
17
- path?: string;
18
18
  };
19
19
  /** One node this group started or saw finish. `name` is the spawn's display
20
20
  * name, or the node id when the finish has no matching spawn in this session. */
@@ -35,7 +35,7 @@ export type EventActivity = {
35
35
  };
36
36
  export type GroupActivity = {
37
37
  files: readonly FileActivity[];
38
- memories: readonly MemoryActivity[];
38
+ documents: readonly DocumentActivity[];
39
39
  nodes: readonly NodeActivity[];
40
40
  cards: readonly CardActivity[];
41
41
  events: readonly EventActivity[];
@@ -49,8 +49,8 @@ export declare class GroupActivityRecorder {
49
49
  private readonly roster;
50
50
  private readonly calls;
51
51
  private readonly files;
52
- private readonly memories;
53
- private readonly memorySet;
52
+ private readonly documents;
53
+ private readonly documentSet;
54
54
  private readonly nodes;
55
55
  private readonly nodeSet;
56
56
  private readonly cards;
@@ -79,6 +79,6 @@ export declare class GroupActivityRecorder {
79
79
  * an inserted output field can never break a chip. A record carrying an
80
80
  * `error` is a failed call, which is not activity. */
81
81
  private noteCrtrInvocation;
82
- private addMemory;
82
+ private addDocument;
83
83
  private extract;
84
84
  }