@agimon-ai/doompi-ui 0.0.1-alpha.80 → 0.0.1-alpha.82

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 (422) hide show
  1. package/README.md +3 -3
  2. package/dist/{src/schemas/apiContracts.cjs → apiContracts.cjs} +5 -1
  3. package/dist/apiContracts.cjs.map +1 -0
  4. package/dist/{src/schemas/apiContracts.d.mts.map → apiContracts.d.mts.map} +1 -1
  5. package/dist/{src/schemas/apiContracts.mjs → apiContracts.mjs} +1 -1
  6. package/dist/apiContracts.mjs.map +1 -0
  7. package/dist/{src/tui/configOverlay.cjs → configOverlay-Bov-Zcdz.cjs} +0 -0
  8. package/dist/configOverlay-Bov-Zcdz.cjs.map +1 -0
  9. package/dist/{src/tui/configOverlay.mjs → configOverlay-CCbWicvH.mjs} +0 -0
  10. package/dist/configOverlay-CCbWicvH.mjs.map +1 -0
  11. package/dist/{config-overlay.cjs → configOverlay.cjs} +1 -1
  12. package/dist/{src/tui/configOverlay.d.mts → configOverlay.d.mts} +4 -3
  13. package/dist/configOverlay.d.mts.map +1 -0
  14. package/dist/configOverlay.mjs +2 -0
  15. package/dist/{src/tui/diffRender.mjs → diffRender-D7zqA45E.mjs} +17 -4
  16. package/dist/diffRender-D7zqA45E.mjs.map +1 -0
  17. package/dist/{src/tui/diffRender.cjs → diffRender-D8yINsb1.cjs} +35 -5
  18. package/dist/diffRender-D8yINsb1.cjs.map +1 -0
  19. package/dist/{src/tui/doomEditor.d.cts → doomEditor-Dvzxbz3r.d.mts} +8 -7
  20. package/dist/doomEditor-Dvzxbz3r.d.mts.map +1 -0
  21. package/dist/{src/tui/doomEditor.mjs → doomEditor-KbMpb-b3.mjs} +6 -6
  22. package/dist/doomEditor-KbMpb-b3.mjs.map +1 -0
  23. package/dist/{src/tui/doomEditor.cjs → doomEditor-woICKPEH.cjs} +12 -7
  24. package/dist/doomEditor-woICKPEH.cjs.map +1 -0
  25. package/dist/{doom-editor.cjs → doomEditor.cjs} +1 -1
  26. package/dist/doomEditor.d.mts +2 -0
  27. package/dist/doomEditor.mjs +2 -0
  28. package/dist/{src/tui/doomFooter.mjs → doomFooter-D7cSjz9I.mjs} +3 -3
  29. package/dist/doomFooter-D7cSjz9I.mjs.map +1 -0
  30. package/dist/{src/tui/doomFooter.d.cts → doomFooter-SkOvq3Pf.d.mts} +7 -6
  31. package/dist/doomFooter-SkOvq3Pf.d.mts.map +1 -0
  32. package/dist/{src/tui/doomFooter.cjs → doomFooter-qNPW5h37.cjs} +10 -5
  33. package/dist/doomFooter-qNPW5h37.cjs.map +1 -0
  34. package/dist/{doom-footer.cjs → doomFooter.cjs} +1 -1
  35. package/dist/doomFooter.d.mts +2 -0
  36. package/dist/doomFooter.mjs +2 -0
  37. package/dist/{src/tui/doomHeader.cjs → doomHeader-D0N0VUF9.cjs} +15 -8
  38. package/dist/{src/tui/doomHeader.cjs.map → doomHeader-D0N0VUF9.cjs.map} +1 -1
  39. package/dist/{src/tui/doomHeader.d.mts → doomHeader-DimAnEv5.d.mts} +5 -4
  40. package/dist/doomHeader-DimAnEv5.d.mts.map +1 -0
  41. package/dist/{src/tui/doomHeader.mjs → doomHeader-mG3_M_7C.mjs} +7 -5
  42. package/dist/doomHeader-mG3_M_7C.mjs.map +1 -0
  43. package/dist/{doom-header.cjs → doomHeader.cjs} +1 -1
  44. package/dist/doomHeader.d.mts +2 -0
  45. package/dist/doomHeader.mjs +2 -0
  46. package/dist/{src/tui/doomOverlay.d.cts → doomOverlay-BXVz35qt.d.mts} +9 -8
  47. package/dist/doomOverlay-BXVz35qt.d.mts.map +1 -0
  48. package/dist/{src/tui/doomOverlay.cjs → doomOverlay-DYucstPB.cjs} +26 -6
  49. package/dist/doomOverlay-DYucstPB.cjs.map +1 -0
  50. package/dist/{src/tui/doomOverlay.mjs → doomOverlay-Onfi701y.mjs} +3 -3
  51. package/dist/doomOverlay-Onfi701y.mjs.map +1 -0
  52. package/dist/{doom-overlay.cjs → doomOverlay.cjs} +1 -1
  53. package/dist/doomOverlay.d.mts +2 -0
  54. package/dist/doomOverlay.mjs +2 -0
  55. package/dist/extensionName.cjs +5 -5
  56. package/dist/extensionName.d.mts +25 -2
  57. package/dist/extensionName.d.mts.map +1 -0
  58. package/dist/extensionName.mjs +1 -1
  59. package/dist/{src/services/extensionSource/index.mjs → extensionSource-B87Grvo1.mjs} +2 -2
  60. package/dist/extensionSource-B87Grvo1.mjs.map +1 -0
  61. package/dist/{src/services/extensionSource/index.cjs → extensionSource-DtiJSajb.cjs} +28 -8
  62. package/dist/extensionSource-DtiJSajb.cjs.map +1 -0
  63. package/dist/extensions/mcp.cjs +5 -5
  64. package/dist/extensions/mcp.cjs.map +1 -1
  65. package/dist/extensions/mcp.d.mts +1 -1
  66. package/dist/extensions/mcp.d.mts.map +1 -1
  67. package/dist/extensions/mcp.mjs +1 -1
  68. package/dist/extensions/mcp.mjs.map +1 -1
  69. package/dist/extensions/pi.cjs +746 -27
  70. package/dist/extensions/pi.cjs.map +1 -1
  71. package/dist/extensions/pi.d.mts +2 -2
  72. package/dist/extensions/pi.d.mts.map +1 -1
  73. package/dist/extensions/pi.mjs +730 -13
  74. package/dist/extensions/pi.mjs.map +1 -1
  75. package/dist/extensions/server.cjs +49 -4
  76. package/dist/extensions/server.cjs.map +1 -1
  77. package/dist/extensions/server.d.mts +1 -1
  78. package/dist/extensions/server.d.mts.map +1 -1
  79. package/dist/extensions/server.mjs +47 -2
  80. package/dist/extensions/server.mjs.map +1 -1
  81. package/dist/{src/types/harnessMetadata.mjs → harnessMetadata-ClCqMmsE.mjs} +2 -2
  82. package/dist/harnessMetadata-ClCqMmsE.mjs.map +1 -0
  83. package/dist/{src/types/harnessMetadata.d.mts → harnessMetadata-CzsdGAxL.d.mts} +4 -3
  84. package/dist/harnessMetadata-CzsdGAxL.d.mts.map +1 -0
  85. package/dist/{src/types/harnessMetadata.cjs → harnessMetadata-il7ns7Vq.cjs} +7 -2
  86. package/dist/harnessMetadata-il7ns7Vq.cjs.map +1 -0
  87. package/dist/harnessMetadata.cjs +1 -1
  88. package/dist/harnessMetadata.d.mts +1 -1
  89. package/dist/harnessMetadata.mjs +1 -1
  90. package/dist/hashlineRendering.cjs +122 -6
  91. package/dist/hashlineRendering.cjs.map +1 -0
  92. package/dist/hashlineRendering.d.mts +20 -2
  93. package/dist/hashlineRendering.d.mts.map +1 -0
  94. package/dist/hashlineRendering.mjs +117 -1
  95. package/dist/hashlineRendering.mjs.map +1 -0
  96. package/dist/{src/services/leaderRegistry/index.d.cts → index-BvkZav1G.d.mts} +8 -7
  97. package/dist/index-BvkZav1G.d.mts.map +1 -0
  98. package/dist/{src/services/telemetry/index.d.mts → index-DoRvCo76.d.mts} +8 -7
  99. package/dist/index-DoRvCo76.d.mts.map +1 -0
  100. package/dist/index.cjs +16 -16
  101. package/dist/index.d.mts +12 -12
  102. package/dist/index.mjs +11 -11
  103. package/dist/{src/tui/leaderHints.d.cts → leaderHints-BwZHg3Zt.d.mts} +6 -5
  104. package/dist/leaderHints-BwZHg3Zt.d.mts.map +1 -0
  105. package/dist/{src/tui/leaderHints.cjs → leaderHints-CYJqHmaj.cjs} +14 -4
  106. package/dist/leaderHints-CYJqHmaj.cjs.map +1 -0
  107. package/dist/{src/tui/leaderHints.mjs → leaderHints-sCok2wGh.mjs} +3 -3
  108. package/dist/{src/tui/leaderHints.cjs.map → leaderHints-sCok2wGh.mjs.map} +1 -1
  109. package/dist/{leader-hints.cjs → leaderHints.cjs} +1 -1
  110. package/dist/leaderHints.d.mts +2 -0
  111. package/dist/leaderHints.mjs +2 -0
  112. package/dist/{src/services/leaderRegistry/index.mjs → leaderRegistry-DKTjYB4q.cjs} +7 -2
  113. package/dist/leaderRegistry-DKTjYB4q.cjs.map +1 -0
  114. package/dist/{src/services/leaderRegistry/index.cjs → leaderRegistry-DXYQNR_c.mjs} +2 -2
  115. package/dist/leaderRegistry-DXYQNR_c.mjs.map +1 -0
  116. package/dist/leaderRegistry.cjs +2 -2
  117. package/dist/leaderRegistry.d.mts +1 -1
  118. package/dist/leaderRegistry.mjs +1 -1
  119. package/dist/logSinkTelemetry.cjs +3 -3
  120. package/dist/logSinkTelemetry.d.mts +1 -1
  121. package/dist/logSinkTelemetry.mjs +1 -1
  122. package/dist/{src/tui/matrixPicker.cjs → matrixPicker.cjs} +1 -0
  123. package/dist/matrixPicker.cjs.map +1 -0
  124. package/dist/{src/tui/matrixPicker.d.mts → matrixPicker.d.mts} +4 -3
  125. package/dist/matrixPicker.d.mts.map +1 -0
  126. package/dist/matrixPicker.mjs.map +1 -0
  127. package/dist/{src/tui/rendering.mjs → rendering-AfmSPYnd.mjs} +2 -2
  128. package/dist/rendering-AfmSPYnd.mjs.map +1 -0
  129. package/dist/{src/tui/rendering.cjs → rendering-D_d6wdrK.cjs} +43 -8
  130. package/dist/rendering-D_d6wdrK.cjs.map +1 -0
  131. package/dist/rendering.cjs +4 -5
  132. package/dist/rendering.d.mts +28 -4
  133. package/dist/rendering.d.mts.map +1 -0
  134. package/dist/rendering.mjs +2 -3
  135. package/dist/{_virtual/_rolldown/runtime.cjs → rolldown-runtime-VH7oDXx4.cjs} +6 -1
  136. package/dist/{src/services/telemetry/index.cjs → telemetry-CjLBjfN8.cjs} +13 -3
  137. package/dist/telemetry-CjLBjfN8.cjs.map +1 -0
  138. package/dist/{src/services/telemetry/index.mjs → telemetry-ioWp8s-g.mjs} +2 -2
  139. package/dist/telemetry-ioWp8s-g.mjs.map +1 -0
  140. package/dist/{src/tui/theme.d.mts → theme-CRP66cUO.d.mts} +7 -6
  141. package/dist/theme-CRP66cUO.d.mts.map +1 -0
  142. package/dist/{src/tui/theme.mjs → theme-DOBo1P0E.mjs} +2 -2
  143. package/dist/theme-DOBo1P0E.mjs.map +1 -0
  144. package/dist/{src/tui/theme.cjs → theme-YHJrFjof.cjs} +34 -9
  145. package/dist/theme-YHJrFjof.cjs.map +1 -0
  146. package/dist/theme.cjs +1 -1
  147. package/dist/theme.d.mts +1 -1
  148. package/dist/theme.mjs +1 -1
  149. package/dist/{src/tui/toolChrome.mjs → toolChrome-BJUD8oJY.mjs} +2 -2
  150. package/dist/toolChrome-BJUD8oJY.mjs.map +1 -0
  151. package/dist/{src/tui/toolChrome.d.mts → toolChrome-Dktxk1id.d.mts} +11 -10
  152. package/dist/toolChrome-Dktxk1id.d.mts.map +1 -0
  153. package/dist/{src/tui/toolChrome.cjs → toolChrome-f6IcTk57.cjs} +43 -8
  154. package/dist/toolChrome-f6IcTk57.cjs.map +1 -0
  155. package/dist/toolChrome.cjs +1 -1
  156. package/dist/toolChrome.d.mts +1 -1
  157. package/dist/toolChrome.mjs +1 -1
  158. package/dist/toolInventory.cjs +4 -4
  159. package/dist/toolInventory.d.mts +1 -1
  160. package/dist/toolInventory.mjs +1 -1
  161. package/dist/{src/tui/toolsOverlay.cjs → toolsOverlay-BiiEtX5a.cjs} +15 -5
  162. package/dist/{src/tui/toolsOverlay.mjs.map → toolsOverlay-BiiEtX5a.cjs.map} +1 -1
  163. package/dist/{src/tui/toolsOverlay.mjs → toolsOverlay-DQ8eXvL0.mjs} +4 -4
  164. package/dist/toolsOverlay-DQ8eXvL0.mjs.map +1 -0
  165. package/dist/{tools-overlay.cjs → toolsOverlay.cjs} +1 -1
  166. package/dist/{src/tui/toolsOverlay.d.mts → toolsOverlay.d.mts} +2 -2
  167. package/dist/toolsOverlay.d.mts.map +1 -0
  168. package/dist/toolsOverlay.mjs +2 -0
  169. package/dist/{src/constants/ui.mjs → ui-ByJgBTSD.mjs} +2 -2
  170. package/dist/ui-ByJgBTSD.mjs.map +1 -0
  171. package/dist/ui-DqBCupXE.cjs +89 -0
  172. package/dist/ui-DqBCupXE.cjs.map +1 -0
  173. package/dist/{src/models/uiState.d.cts → uiState-CQoAIdwc.d.mts} +8 -7
  174. package/dist/uiState-CQoAIdwc.d.mts.map +1 -0
  175. package/dist/{src/models/uiState.mjs → uiState-G_Pso-5i.mjs} +2 -2
  176. package/dist/uiState-G_Pso-5i.mjs.map +1 -0
  177. package/dist/{src/models/uiState.cjs → uiState-rUwgKslb.cjs} +13 -3
  178. package/dist/uiState-rUwgKslb.cjs.map +1 -0
  179. package/dist/uiState.cjs +1 -1
  180. package/dist/uiState.d.mts +1 -1
  181. package/dist/uiState.mjs +1 -1
  182. package/package.json +47 -47
  183. package/dist/api-contracts.cjs +0 -7
  184. package/dist/api-contracts.d.cts +0 -2
  185. package/dist/api-contracts.d.mts +0 -2
  186. package/dist/api-contracts.mjs +0 -2
  187. package/dist/config-overlay.d.cts +0 -2
  188. package/dist/config-overlay.d.mts +0 -2
  189. package/dist/config-overlay.mjs +0 -2
  190. package/dist/config.d.cts +0 -2
  191. package/dist/doom-editor.d.cts +0 -2
  192. package/dist/doom-editor.d.mts +0 -2
  193. package/dist/doom-editor.mjs +0 -2
  194. package/dist/doom-footer.d.cts +0 -2
  195. package/dist/doom-footer.d.mts +0 -2
  196. package/dist/doom-footer.mjs +0 -2
  197. package/dist/doom-header.d.cts +0 -2
  198. package/dist/doom-header.d.mts +0 -2
  199. package/dist/doom-header.mjs +0 -2
  200. package/dist/doom-overlay.d.cts +0 -2
  201. package/dist/doom-overlay.d.mts +0 -2
  202. package/dist/doom-overlay.mjs +0 -2
  203. package/dist/extensionName.d.cts +0 -2
  204. package/dist/extensions/mcp.d.cts +0 -5
  205. package/dist/extensions/mcp.d.cts.map +0 -1
  206. package/dist/extensions/pi.d.cts +0 -7
  207. package/dist/extensions/pi.d.cts.map +0 -1
  208. package/dist/extensions/server.d.cts +0 -5
  209. package/dist/extensions/server.d.cts.map +0 -1
  210. package/dist/footer.d.cts +0 -2
  211. package/dist/harnessMetadata.d.cts +0 -2
  212. package/dist/hashlineRendering.d.cts +0 -2
  213. package/dist/index.d.cts +0 -15
  214. package/dist/leader-hints.d.cts +0 -2
  215. package/dist/leader-hints.d.mts +0 -2
  216. package/dist/leader-hints.mjs +0 -2
  217. package/dist/leader.d.cts +0 -2
  218. package/dist/leaderRegistry.d.cts +0 -2
  219. package/dist/logSinkTelemetry.d.cts +0 -2
  220. package/dist/matrix-picker.cjs +0 -6
  221. package/dist/matrix-picker.d.cts +0 -2
  222. package/dist/matrix-picker.d.mts +0 -2
  223. package/dist/matrix-picker.mjs +0 -2
  224. package/dist/rendering.d.cts +0 -4
  225. package/dist/skills.d.cts +0 -2
  226. package/dist/src/constants/header.cjs +0 -6
  227. package/dist/src/constants/header.cjs.map +0 -1
  228. package/dist/src/constants/header.mjs +0 -6
  229. package/dist/src/constants/header.mjs.map +0 -1
  230. package/dist/src/constants/ui.cjs +0 -30
  231. package/dist/src/constants/ui.cjs.map +0 -1
  232. package/dist/src/constants/ui.mjs.map +0 -1
  233. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/sessionInventory.cjs +0 -29
  234. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/sessionInventory.cjs.map +0 -1
  235. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/sessionInventory.mjs +0 -29
  236. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/sessionInventory.mjs.map +0 -1
  237. package/dist/src/extensions/workspaces/sessions/(backend)/command/config.cli.cjs +0 -6
  238. package/dist/src/extensions/workspaces/sessions/(backend)/command/config.cli.cjs.map +0 -1
  239. package/dist/src/extensions/workspaces/sessions/(backend)/command/config.cli.mjs +0 -7
  240. package/dist/src/extensions/workspaces/sessions/(backend)/command/config.cli.mjs.map +0 -1
  241. package/dist/src/extensions/workspaces/sessions/(backend)/command/tools.cli.cjs +0 -6
  242. package/dist/src/extensions/workspaces/sessions/(backend)/command/tools.cli.cjs.map +0 -1
  243. package/dist/src/extensions/workspaces/sessions/(backend)/command/tools.cli.mjs +0 -7
  244. package/dist/src/extensions/workspaces/sessions/(backend)/command/tools.cli.mjs.map +0 -1
  245. package/dist/src/extensions/workspaces/sessions/(backend)/command/tools.server.cjs +0 -7
  246. package/dist/src/extensions/workspaces/sessions/(backend)/command/tools.server.cjs.map +0 -1
  247. package/dist/src/extensions/workspaces/sessions/(backend)/command/tools.server.mjs +0 -8
  248. package/dist/src/extensions/workspaces/sessions/(backend)/command/tools.server.mjs.map +0 -1
  249. package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.cjs +0 -6
  250. package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.cjs.map +0 -1
  251. package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.mjs +0 -7
  252. package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.mjs.map +0 -1
  253. package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.cjs +0 -6
  254. package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.cjs.map +0 -1
  255. package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.mjs +0 -7
  256. package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.mjs.map +0 -1
  257. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +0 -43
  258. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +0 -1
  259. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +0 -43
  260. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +0 -1
  261. package/dist/src/extensions/workspaces/sessions/(backend)/tool/edit.cli.cjs +0 -13
  262. package/dist/src/extensions/workspaces/sessions/(backend)/tool/edit.cli.cjs.map +0 -1
  263. package/dist/src/extensions/workspaces/sessions/(backend)/tool/edit.cli.mjs +0 -14
  264. package/dist/src/extensions/workspaces/sessions/(backend)/tool/edit.cli.mjs.map +0 -1
  265. package/dist/src/extensions/workspaces/sessions/(backend)/tool/find.cli.cjs +0 -13
  266. package/dist/src/extensions/workspaces/sessions/(backend)/tool/find.cli.cjs.map +0 -1
  267. package/dist/src/extensions/workspaces/sessions/(backend)/tool/find.cli.mjs +0 -14
  268. package/dist/src/extensions/workspaces/sessions/(backend)/tool/find.cli.mjs.map +0 -1
  269. package/dist/src/extensions/workspaces/sessions/(backend)/tool/grep.cli.cjs +0 -13
  270. package/dist/src/extensions/workspaces/sessions/(backend)/tool/grep.cli.cjs.map +0 -1
  271. package/dist/src/extensions/workspaces/sessions/(backend)/tool/grep.cli.mjs +0 -14
  272. package/dist/src/extensions/workspaces/sessions/(backend)/tool/grep.cli.mjs.map +0 -1
  273. package/dist/src/extensions/workspaces/sessions/(backend)/tool/ls.cli.cjs +0 -13
  274. package/dist/src/extensions/workspaces/sessions/(backend)/tool/ls.cli.cjs.map +0 -1
  275. package/dist/src/extensions/workspaces/sessions/(backend)/tool/ls.cli.mjs +0 -14
  276. package/dist/src/extensions/workspaces/sessions/(backend)/tool/ls.cli.mjs.map +0 -1
  277. package/dist/src/extensions/workspaces/sessions/(backend)/tool/read.cli.cjs +0 -13
  278. package/dist/src/extensions/workspaces/sessions/(backend)/tool/read.cli.cjs.map +0 -1
  279. package/dist/src/extensions/workspaces/sessions/(backend)/tool/read.cli.mjs +0 -14
  280. package/dist/src/extensions/workspaces/sessions/(backend)/tool/read.cli.mjs.map +0 -1
  281. package/dist/src/extensions/workspaces/sessions/(backend)/tool/write.cli.cjs +0 -13
  282. package/dist/src/extensions/workspaces/sessions/(backend)/tool/write.cli.cjs.map +0 -1
  283. package/dist/src/extensions/workspaces/sessions/(backend)/tool/write.cli.mjs +0 -14
  284. package/dist/src/extensions/workspaces/sessions/(backend)/tool/write.cli.mjs.map +0 -1
  285. package/dist/src/models/uiState.cjs.map +0 -1
  286. package/dist/src/models/uiState.d.cts.map +0 -1
  287. package/dist/src/models/uiState.d.mts +0 -39
  288. package/dist/src/models/uiState.d.mts.map +0 -1
  289. package/dist/src/models/uiState.mjs.map +0 -1
  290. package/dist/src/schemas/apiContracts.cjs.map +0 -1
  291. package/dist/src/schemas/apiContracts.d.cts +0 -53
  292. package/dist/src/schemas/apiContracts.d.cts.map +0 -1
  293. package/dist/src/schemas/apiContracts.mjs.map +0 -1
  294. package/dist/src/services/eventLoopLag/index.cjs +0 -33
  295. package/dist/src/services/eventLoopLag/index.cjs.map +0 -1
  296. package/dist/src/services/eventLoopLag/index.mjs +0 -33
  297. package/dist/src/services/eventLoopLag/index.mjs.map +0 -1
  298. package/dist/src/services/extensionSource/index.cjs.map +0 -1
  299. package/dist/src/services/extensionSource/index.d.cts +0 -25
  300. package/dist/src/services/extensionSource/index.d.cts.map +0 -1
  301. package/dist/src/services/extensionSource/index.d.mts +0 -25
  302. package/dist/src/services/extensionSource/index.d.mts.map +0 -1
  303. package/dist/src/services/extensionSource/index.mjs.map +0 -1
  304. package/dist/src/services/leaderRegistry/index.cjs.map +0 -1
  305. package/dist/src/services/leaderRegistry/index.d.cts.map +0 -1
  306. package/dist/src/services/leaderRegistry/index.d.mts +0 -58
  307. package/dist/src/services/leaderRegistry/index.d.mts.map +0 -1
  308. package/dist/src/services/leaderRegistry/index.mjs.map +0 -1
  309. package/dist/src/services/sessionToolInventory/index.cjs +0 -20
  310. package/dist/src/services/sessionToolInventory/index.cjs.map +0 -1
  311. package/dist/src/services/sessionToolInventory/index.mjs +0 -20
  312. package/dist/src/services/sessionToolInventory/index.mjs.map +0 -1
  313. package/dist/src/services/telemetry/index.cjs.map +0 -1
  314. package/dist/src/services/telemetry/index.d.cts +0 -29
  315. package/dist/src/services/telemetry/index.d.cts.map +0 -1
  316. package/dist/src/services/telemetry/index.d.mts.map +0 -1
  317. package/dist/src/services/telemetry/index.mjs.map +0 -1
  318. package/dist/src/services/uiHub/index.cjs +0 -217
  319. package/dist/src/services/uiHub/index.cjs.map +0 -1
  320. package/dist/src/services/uiHub/index.mjs +0 -215
  321. package/dist/src/services/uiHub/index.mjs.map +0 -1
  322. package/dist/src/tui/builtinToolRender.cjs +0 -129
  323. package/dist/src/tui/builtinToolRender.cjs.map +0 -1
  324. package/dist/src/tui/builtinToolRender.mjs +0 -120
  325. package/dist/src/tui/builtinToolRender.mjs.map +0 -1
  326. package/dist/src/tui/builtinTools.cjs +0 -101
  327. package/dist/src/tui/builtinTools.cjs.map +0 -1
  328. package/dist/src/tui/builtinTools.mjs +0 -101
  329. package/dist/src/tui/builtinTools.mjs.map +0 -1
  330. package/dist/src/tui/codeGutter.cjs +0 -18
  331. package/dist/src/tui/codeGutter.cjs.map +0 -1
  332. package/dist/src/tui/codeGutter.d.cts +0 -8
  333. package/dist/src/tui/codeGutter.d.cts.map +0 -1
  334. package/dist/src/tui/codeGutter.d.mts +0 -8
  335. package/dist/src/tui/codeGutter.d.mts.map +0 -1
  336. package/dist/src/tui/codeGutter.mjs +0 -17
  337. package/dist/src/tui/codeGutter.mjs.map +0 -1
  338. package/dist/src/tui/configOverlay.cjs.map +0 -1
  339. package/dist/src/tui/configOverlay.d.cts +0 -78
  340. package/dist/src/tui/configOverlay.d.cts.map +0 -1
  341. package/dist/src/tui/configOverlay.d.mts.map +0 -1
  342. package/dist/src/tui/configOverlay.mjs.map +0 -1
  343. package/dist/src/tui/diffRender.cjs.map +0 -1
  344. package/dist/src/tui/diffRender.d.cts +0 -8
  345. package/dist/src/tui/diffRender.d.cts.map +0 -1
  346. package/dist/src/tui/diffRender.d.mts +0 -8
  347. package/dist/src/tui/diffRender.d.mts.map +0 -1
  348. package/dist/src/tui/diffRender.mjs.map +0 -1
  349. package/dist/src/tui/doomEditor.cjs.map +0 -1
  350. package/dist/src/tui/doomEditor.d.cts.map +0 -1
  351. package/dist/src/tui/doomEditor.d.mts +0 -62
  352. package/dist/src/tui/doomEditor.d.mts.map +0 -1
  353. package/dist/src/tui/doomEditor.mjs.map +0 -1
  354. package/dist/src/tui/doomFooter.cjs.map +0 -1
  355. package/dist/src/tui/doomFooter.d.cts.map +0 -1
  356. package/dist/src/tui/doomFooter.d.mts +0 -44
  357. package/dist/src/tui/doomFooter.d.mts.map +0 -1
  358. package/dist/src/tui/doomFooter.mjs.map +0 -1
  359. package/dist/src/tui/doomHeader.d.cts +0 -33
  360. package/dist/src/tui/doomHeader.d.cts.map +0 -1
  361. package/dist/src/tui/doomHeader.d.mts.map +0 -1
  362. package/dist/src/tui/doomHeader.mjs.map +0 -1
  363. package/dist/src/tui/doomOverlay.cjs.map +0 -1
  364. package/dist/src/tui/doomOverlay.d.cts.map +0 -1
  365. package/dist/src/tui/doomOverlay.d.mts +0 -83
  366. package/dist/src/tui/doomOverlay.d.mts.map +0 -1
  367. package/dist/src/tui/doomOverlay.mjs.map +0 -1
  368. package/dist/src/tui/hashlineRendering.cjs +0 -123
  369. package/dist/src/tui/hashlineRendering.cjs.map +0 -1
  370. package/dist/src/tui/hashlineRendering.d.cts +0 -20
  371. package/dist/src/tui/hashlineRendering.d.cts.map +0 -1
  372. package/dist/src/tui/hashlineRendering.d.mts +0 -20
  373. package/dist/src/tui/hashlineRendering.d.mts.map +0 -1
  374. package/dist/src/tui/hashlineRendering.mjs +0 -119
  375. package/dist/src/tui/hashlineRendering.mjs.map +0 -1
  376. package/dist/src/tui/leaderHints.d.cts.map +0 -1
  377. package/dist/src/tui/leaderHints.d.mts +0 -49
  378. package/dist/src/tui/leaderHints.d.mts.map +0 -1
  379. package/dist/src/tui/leaderHints.mjs.map +0 -1
  380. package/dist/src/tui/matrixPicker.cjs.map +0 -1
  381. package/dist/src/tui/matrixPicker.d.cts +0 -53
  382. package/dist/src/tui/matrixPicker.d.cts.map +0 -1
  383. package/dist/src/tui/matrixPicker.d.mts.map +0 -1
  384. package/dist/src/tui/matrixPicker.mjs.map +0 -1
  385. package/dist/src/tui/rendering.cjs.map +0 -1
  386. package/dist/src/tui/rendering.d.cts +0 -15
  387. package/dist/src/tui/rendering.d.cts.map +0 -1
  388. package/dist/src/tui/rendering.d.mts +0 -15
  389. package/dist/src/tui/rendering.d.mts.map +0 -1
  390. package/dist/src/tui/rendering.mjs.map +0 -1
  391. package/dist/src/tui/theme.cjs.map +0 -1
  392. package/dist/src/tui/theme.d.cts +0 -102
  393. package/dist/src/tui/theme.d.cts.map +0 -1
  394. package/dist/src/tui/theme.d.mts.map +0 -1
  395. package/dist/src/tui/theme.mjs.map +0 -1
  396. package/dist/src/tui/toolChrome.cjs.map +0 -1
  397. package/dist/src/tui/toolChrome.d.cts +0 -43
  398. package/dist/src/tui/toolChrome.d.cts.map +0 -1
  399. package/dist/src/tui/toolChrome.d.mts.map +0 -1
  400. package/dist/src/tui/toolChrome.mjs.map +0 -1
  401. package/dist/src/tui/toolsOverlay.cjs.map +0 -1
  402. package/dist/src/tui/toolsOverlay.d.cts +0 -28
  403. package/dist/src/tui/toolsOverlay.d.cts.map +0 -1
  404. package/dist/src/tui/toolsOverlay.d.mts.map +0 -1
  405. package/dist/src/tui/uiRuntime.cjs +0 -181
  406. package/dist/src/tui/uiRuntime.cjs.map +0 -1
  407. package/dist/src/tui/uiRuntime.mjs +0 -179
  408. package/dist/src/tui/uiRuntime.mjs.map +0 -1
  409. package/dist/src/types/harnessMetadata.cjs.map +0 -1
  410. package/dist/src/types/harnessMetadata.d.cts +0 -20
  411. package/dist/src/types/harnessMetadata.d.cts.map +0 -1
  412. package/dist/src/types/harnessMetadata.d.mts.map +0 -1
  413. package/dist/src/types/harnessMetadata.mjs.map +0 -1
  414. package/dist/theme.d.cts +0 -2
  415. package/dist/toolChrome.d.cts +0 -2
  416. package/dist/toolInventory.d.cts +0 -2
  417. package/dist/tools-overlay.d.cts +0 -2
  418. package/dist/tools-overlay.d.mts +0 -2
  419. package/dist/tools-overlay.mjs +0 -2
  420. package/dist/uiState.d.cts +0 -2
  421. /package/dist/{src/schemas/apiContracts.d.mts → apiContracts.d.mts} +0 -0
  422. /package/dist/{src/tui/matrixPicker.mjs → matrixPicker.mjs} +0 -0
package/README.md CHANGED
@@ -39,7 +39,7 @@ UI is attached.
39
39
  ## Contribute to Leader Space
40
40
 
41
41
  ```ts
42
- import { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';
42
+ import { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/uiHub';
43
43
  import type { Context } from '@deepseek-ai/cordis';
44
44
 
45
45
  export function reviewPlugin(ctx: Context): void {
@@ -71,7 +71,7 @@ capability must also work headlessly.
71
71
 
72
72
  ## Extension lifecycle
73
73
 
74
- `src/extensions/pi.ts` declares the Pi plugin, and `src/extensions/server.ts` declares the session inventory plugin. The browser entry is `src/extensions/web.ts`. Public modules stay flat under `src/exports`; Component exports use flat kebab-case subpaths such as `@agimon-ai/doompi-ui/doom-overlay` and `@agimon-ai/doompi-ui/matrix-picker`.
74
+ `src/extensions/pi.ts` declares the Pi plugin, and `src/extensions/server.ts` declares the session inventory plugin. The browser entry is `src/extensions/web.ts`. Public modules stay flat under `src/exports`; Component exports use flat kebab-case subpaths such as `@agimon-ai/doompi-ui/doomOverlay` and `@agimon-ai/doompi-ui/matrixPicker`.
75
75
 
76
76
  The Pi helper installs the UI hub service before commands, native event handlers, and tool declarations. Optional minor-mode catalog bindings follow their provider lifetime. `onStop` clears the shell and shuts down telemetry; idempotent `onDispose` also handles registration failure. The TUI runtime owns presentation callbacks, `models/uiState.ts` owns state, and each service has its own `services/<name>/index.ts` entry.
77
77
 
@@ -91,7 +91,7 @@ and the direct UI hub service live in extension contracts. Use these exports rat
91
91
  generated `dist` paths.
92
92
 
93
93
  ```ts
94
- import { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-core/ui-hub';
94
+ import { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-core/uiHub';
95
95
  import { DEFAULT_THEME_NAME } from '@agimon-ai/doompi-ui/theme';
96
96
  ```
97
97
 
@@ -1,6 +1,10 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
1
5
  //#region src/schemas/apiContracts.ts
2
6
  /** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
3
- const apiContracts = (0, require("@agimon-ai/doompi-core/api-contracts").defineApiContract)({
7
+ const apiContracts = (0, require("@agimon-ai/doompi-core/apiContracts").defineApiContract)({
4
8
  version: 1,
5
9
  http: [],
6
10
  sockets: [],
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/apiContracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":";;;;;;AAGA,MAAa,gBAAA,gDAAeA,CAAAA,CAAAA,kBAAAA,CAAkB;CAAE,SAAS;CAAG,MAAM,CAAC;CAAG,SAAS,CAAC;CAAG,SAAS,CAAC;AAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../../../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
1
+ {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
@@ -1,4 +1,4 @@
1
- import { defineApiContract } from "@agimon-ai/doompi-core/api-contracts";
1
+ import { defineApiContract } from "@agimon-ai/doompi-core/apiContracts";
2
2
  //#region src/schemas/apiContracts.ts
3
3
  /** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
4
4
  const apiContracts = defineApiContract({
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/apiContracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":";;;AAGA,MAAa,eAAe,kBAAkB;CAAE,SAAS;CAAG,MAAM,CAAC;CAAG,SAAS,CAAC;CAAG,SAAS,CAAC;AAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configOverlay-Bov-Zcdz.cjs","names":["fitStyledLine","visibleWidth","DoomOverlay","matchesKey","DOOM_OVERLAY_ACCENT","truncateToWidth","DOOM_FULLSCREEN_UI_OPTIONS"],"sources":["../src/tui/configOverlay.ts"],"sourcesContent":["/**\n * Configuration panel: the `SPC e c` overlay.\n *\n * Sections on the left, one per contributing extension, and that section's\n * fields on the right. The panel owns navigation and text entry; every value it\n * shows was published by an extension, and every change it makes is a request\n * back to whichever extension owns the field. Nothing here knows what a voice\n * model or an editor command is.\n *\n * It subscribes to the registry rather than snapshotting at open time, unlike\n * the tools browser next door, because a contributor can be doing long work\n * (fetching a model, running an installer) and the panel is where that progress\n * is meant to appear.\n *\n * There is no local echo of an edit. A typed value is sent and the field stays\n * pending until its owner republishes, so a rejected value comes back with the\n * reason attached instead of the panel showing a value that was never written.\n */\n\nimport type { ConfigChoice, ConfigField } from '@agimon-ai/doompi-core/config';\nimport type { DoomConfigSectionView } from '@agimon-ai/doompi-core/config';\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';\n\nimport {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from './doomOverlay';\nimport { fitStyledLine } from './rendering';\n\ntype Pane = 'sections' | 'fields';\ntype Mode = 'browse' | 'edit' | 'choices';\n\nconst TITLE = 'CONFIG';\nconst BREADCRUMB = 'SPC › e / c · config';\nconst ACTION_SET = 'set';\nconst ACTION_CLEAR = 'clear';\nconst ACTION_ABORT = 'abort';\nconst DEFAULT_CHOICE_ACTION = 'select';\n\nconst KEY_BACKSPACE = '\\x7f';\nconst KEY_ENTER = '\\r';\nconst KEY_NEWLINE = '\\n';\nconst KEY_TAB = '\\t';\nconst FIRST_PRINTABLE_CODE_POINT = 0x20;\nconst DELETE_CODE_POINT = 0x7f;\n\nconst MIN_WIDTH = 48;\nconst SECTION_PANE_RATIO = 1 / 3;\nconst PANE_GUTTER = 1;\nconst MIN_PANE_WIDTH = 18;\nconst ELLIPSIS = '…';\nconst LABEL_COLUMN = 18;\nconst INDENT = ' ';\nconst EMPTY_MESSAGE = 'No extension has contributed settings to this session.';\nconst NO_FIELDS_MESSAGE = 'This section has no fields.';\nconst UNSET_PLACEHOLDER = 'not set';\nconst SECTION_HEADING = 'SECTIONS';\nconst HELP_BADGE = ' HELP ';\n/**\n * Every field here is published by a package, so the panel cannot explain what\n * any one of them means. Help mode can: it loads the owning package's docs into\n * the session, and the agent reads them and answers from there.\n */\nconst HELP_HINT = 'Not sure what a setting does? SPC h e loads package Help, then ask the agent about it.';\n/** Body rows below which the banner is dropped: a field outranks a pointer to the docs. */\nconst HELP_BANNER_MIN_ROWS = 10;\nconst PROGRESS_WIDTH = 24;\nconst ACTION_INPUT = 'input';\ntype ThemeColor = Parameters<Theme['fg']>[0];\nconst STEP_MARKERS: Readonly<Record<string, readonly [string, ThemeColor]>> = {\n pending: ['·', 'dim'],\n satisfied: ['✓', 'dim'],\n running: ['▸', 'accent'],\n done: ['✓', 'success'],\n failed: ['✗', 'error'],\n};\nconst PROGRESS_FULL = '█';\nconst PROGRESS_EMPTY = '░';\n\n/**\n * Keystrokes that carry no text: escape sequences, control keys, delete.\n * Indexed rather than iterated so surrogate pairs stay intact; both halves sit\n * far above the control range, so no emoji is ever mistaken for one.\n */\nfunction isControlInput(data: string): boolean {\n for (let index = 0; index < data.length; index++) {\n const code = data.charCodeAt(index);\n if (code < FIRST_PRINTABLE_CODE_POINT || code === DELETE_CODE_POINT) return true;\n }\n return false;\n}\n\nfunction fitRow(text: string, width: number): string {\n return fitStyledLine(text, width, ELLIPSIS);\n}\n\nfunction rightAligned(left: string, right: string, width: number): string {\n const rightWidth = visibleWidth(right);\n const leftWidth = Math.max(0, width - rightWidth - 1);\n return fitRow(left, leftWidth) + ' '.repeat(Math.max(1, width - leftWidth - rightWidth)) + fitRow(right, rightWidth);\n}\n\nfunction wrap(text: string, width: number): string[] {\n if (width <= 0) return [];\n const lines: string[] = [];\n let current = '';\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n if (current.length === 0) current = word;\n else if (current.length + 1 + word.length <= width) current += ` ${word}`;\n else {\n lines.push(current);\n current = word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\nfunction isSelectable(field: ConfigField): boolean {\n return field.kind !== 'info';\n}\n\nexport class ConfigOverlayComponent extends DoomOverlay {\n private readonly registry: DoomConfigStoreView;\n private readonly done: (result: undefined) => void;\n private readonly unsubscribe: () => void;\n private sections: readonly DoomConfigSectionView[];\n private pane: Pane = 'sections';\n private mode: Mode = 'browse';\n private sectionIndex = 0;\n private fieldIndex = 0;\n private choiceIndex = 0;\n private draft = '';\n /** Fields awaiting a reply, keyed by source, section, and field. */\n private readonly pending = new Set<string>();\n private bodyHeight = 1;\n\n constructor(tui: DoomOverlayTui, theme: Theme, registry: DoomConfigStoreView, done: (result: undefined) => void) {\n super(tui, theme);\n this.registry = registry;\n this.done = done;\n this.sections = registry.getSections();\n this.fieldIndex = this.firstSelectableField();\n this.unsubscribe = registry.subscribe(() => this.onSectionsChanged());\n }\n\n /** Info fields are labels, so the cursor never starts on one. */\n private firstSelectableField(): number {\n const index = this.currentFields().findIndex(isSelectable);\n return index < 0 ? 0 : index;\n }\n\n dispose(): void {\n this.unsubscribe();\n }\n\n private onSectionsChanged(): void {\n this.sections = this.registry.getSections();\n // Any republish from an owner is its answer, so nothing stays pending past it.\n this.pending.clear();\n this.sectionIndex = Math.min(this.sectionIndex, Math.max(0, this.sections.length - 1));\n const fields = this.currentFields();\n this.fieldIndex = Math.min(this.fieldIndex, Math.max(0, fields.length - 1));\n if (!isSelectable(fields[this.fieldIndex] ?? { kind: 'info' })) this.fieldIndex = this.firstSelectableField();\n const field = this.currentField();\n // A field that grew an error keeps the draft so the typed value is not lost,\n // and an answer being typed survives the republish each output chunk causes.\n if (this.mode === 'edit' && !field?.statusText && !field?.awaitingInput) this.mode = 'browse';\n this.tui.requestRender();\n }\n\n private currentSection(): DoomConfigSectionView | undefined {\n return this.sections[this.sectionIndex];\n }\n\n private currentFields(): readonly ConfigField[] {\n return this.currentSection()?.fields ?? [];\n }\n\n private currentField(): ConfigField | undefined {\n return this.currentFields()[this.fieldIndex];\n }\n\n private currentChoices(): readonly ConfigChoice[] {\n return this.currentField()?.choices ?? [];\n }\n\n private pendingKey(field: ConfigField): string {\n return `${this.currentSection()?.source ?? ''}\u0000${this.currentSection()?.id ?? ''}\u0000${field.id}`;\n }\n\n private invoke(action: string, value?: string): void {\n const section = this.currentSection();\n const field = this.currentField();\n if (!section || !field) return;\n this.pending.add(this.pendingKey(field));\n this.registry.invoke({\n source: section.source,\n sectionId: section.id,\n fieldId: field.id,\n action,\n ...(value === undefined ? {} : { value }),\n });\n this.tui.requestRender();\n }\n\n private moveSection(delta: number): void {\n if (this.sections.length === 0) return;\n const next = Math.max(0, Math.min(this.sectionIndex + delta, this.sections.length - 1));\n if (next === this.sectionIndex) return;\n this.sectionIndex = next;\n this.fieldIndex = this.firstSelectableField();\n this.tui.requestRender();\n }\n\n /** Info fields are labels, so the cursor steps over them to the next control. */\n private moveField(delta: number): void {\n const fields = this.currentFields();\n const step = delta < 0 ? -1 : 1;\n let next = this.fieldIndex + step;\n while (next >= 0 && next < fields.length && !isSelectable(fields[next] as ConfigField)) next += step;\n if (next < 0 || next >= fields.length) return;\n this.fieldIndex = next;\n this.tui.requestRender();\n }\n\n private moveChoice(delta: number): void {\n const choices = this.currentChoices();\n if (choices.length === 0) return;\n const next = Math.max(0, Math.min(this.choiceIndex + delta, choices.length - 1));\n if (next === this.choiceIndex) return;\n this.choiceIndex = next;\n this.tui.requestRender();\n }\n\n handleInput(data: string): void {\n if (this.mode === 'edit') {\n this.handleEditInput(data);\n return;\n }\n if (this.mode === 'choices') {\n this.handleChoiceInput(data);\n return;\n }\n this.handleBrowseInput(data);\n }\n\n private handleBrowseInput(data: string): void {\n const field = this.currentField();\n if (matchesKey(data, 'ctrl+c')) {\n if (field?.busy) this.invoke(ACTION_ABORT);\n else this.done(undefined);\n return;\n }\n if (matchesKey(data, 'escape') || data === 'q') {\n // Escape backs out of the fields pane before it closes the panel.\n if (this.pane === 'fields') {\n this.pane = 'sections';\n this.tui.requestRender();\n return;\n }\n this.done(undefined);\n return;\n }\n if (data === KEY_TAB) {\n this.pane = this.pane === 'sections' ? 'fields' : 'sections';\n this.tui.requestRender();\n return;\n }\n if (matchesKey(data, 'up') || data === 'k') {\n if (this.pane === 'sections') this.moveSection(-1);\n else this.moveField(-1);\n return;\n }\n if (matchesKey(data, 'down') || data === 'j') {\n if (this.pane === 'sections') this.moveSection(1);\n else this.moveField(1);\n return;\n }\n // While a field offers its own keys, those win: a pending confirmation is\n // answered before anything else can be typed.\n const offered = field?.actions?.find((action) => action.key === data);\n if (this.pane === 'fields' && offered) {\n this.invoke(offered.action);\n return;\n }\n // Answering a waiting command beats every other reading of `i`, and it is\n // the only thing that will make progress while one is blocked on a prompt.\n if (this.pane === 'fields' && field?.awaitingInput && data === 'i') {\n this.draft = '';\n this.mode = 'edit';\n this.tui.requestRender();\n return;\n }\n if (matchesKey(data, 'enter') || data === KEY_ENTER || data === KEY_NEWLINE) {\n this.activate();\n return;\n }\n if (this.pane === 'fields' && data === 'd' && field && isSelectable(field)) this.invoke(ACTION_CLEAR);\n }\n\n private activate(): void {\n if (this.pane === 'sections') {\n this.pane = 'fields';\n this.tui.requestRender();\n return;\n }\n const field = this.currentField();\n if (!field || field.busy || !isSelectable(field)) return;\n // `enum` and `choice` differ only in how many entries they carry, so both\n // open the same list with the cursor on whatever is currently set.\n if (field.kind === 'choice' || field.kind === 'enum') {\n this.choiceIndex = Math.max(\n 0,\n this.currentChoices().findIndex((choice) => choice.id === field.value),\n );\n this.mode = 'choices';\n this.tui.requestRender();\n return;\n }\n this.draft = field.value ?? '';\n this.mode = 'edit';\n this.tui.requestRender();\n }\n\n private handleEditInput(data: string): void {\n if (matchesKey(data, 'escape')) {\n this.mode = 'browse';\n this.draft = '';\n this.tui.requestRender();\n return;\n }\n if (data === KEY_ENTER || data === KEY_NEWLINE) {\n const value = this.draft.trim();\n // Answering a prompt is a different write from setting a field, and an\n // empty answer is meaningful there: it accepts the command's default.\n if (this.currentField()?.awaitingInput) {\n this.mode = 'browse';\n this.invoke(ACTION_INPUT, value.length === 0 ? undefined : value);\n this.draft = '';\n return;\n }\n // The parser rejects blank values, so clearing a key means removing it.\n this.invoke(value.length === 0 ? ACTION_CLEAR : ACTION_SET, value.length === 0 ? undefined : value);\n return;\n }\n if (data === KEY_BACKSPACE) this.draft = this.draft.slice(0, -1);\n else if (!isControlInput(data)) this.draft += data;\n this.tui.requestRender();\n }\n\n private handleChoiceInput(data: string): void {\n if (matchesKey(data, 'escape')) {\n this.mode = 'browse';\n this.tui.requestRender();\n return;\n }\n if (matchesKey(data, 'up') || data === 'k') {\n this.moveChoice(-1);\n return;\n }\n if (matchesKey(data, 'down') || data === 'j') {\n this.moveChoice(1);\n return;\n }\n if (matchesKey(data, 'enter') || data === KEY_ENTER || data === KEY_NEWLINE) {\n const choice = this.currentChoices()[this.choiceIndex];\n if (!choice) return;\n this.mode = 'browse';\n // The entry names what enter does to it, which is what lets one list hold\n // both an installed thing to select and an absent one to fetch.\n this.invoke(choice.action ?? DEFAULT_CHOICE_ACTION, choice.id);\n }\n }\n\n private sectionLines(width: number): string[] {\n const lines = [this.theme.bold(SECTION_HEADING), ''];\n if (this.sections.length === 0) {\n lines.push(...wrap(EMPTY_MESSAGE, width).map((line) => this.theme.fg('dim', line)));\n return lines;\n }\n for (const [index, section] of this.sections.entries()) {\n const active = index === this.sectionIndex;\n const title = rightAligned(\n active ? this.theme.bold(section.title) : this.theme.fg('text', section.title),\n this.theme.fg(section.noticeLevel === 'error' ? 'error' : 'dim', section.detail ?? ''),\n width,\n );\n lines.push(active && this.pane === 'sections' ? this.theme.bg('selectedBg', fitRow(title, width)) : title);\n lines.push(this.theme.fg('dim', fitRow(`${INDENT}${section.source}`, width)));\n }\n return lines;\n }\n\n /**\n * The whole plan, not just the running step.\n *\n * Seeing that a package manager already finished and a download is now\n * underway is what makes a long install legible; a lone \"step 3 of 6\" is not.\n */\n private stepLines(field: ConfigField, width: number): string[] {\n const inner = Math.max(1, width - INDENT.length);\n return (field.steps ?? []).map((step) => {\n const [glyph, color] = STEP_MARKERS[step.state];\n const label = step.state === 'pending' ? this.theme.fg('dim', step.label) : step.label;\n const row = rightAligned(\n `${this.theme.fg(color, glyph)} ${label}`,\n this.theme.fg('dim', step.detail ?? ''),\n inner,\n );\n return `${INDENT}${row}`;\n });\n }\n\n /** The tail of the running command, so a prompt it printed is visible. */\n private outputLines(field: ConfigField, width: number): string[] {\n const inner = Math.max(1, width - INDENT.length);\n return (field.output ?? []).map((line) => `${INDENT}${this.theme.fg('dim', fitRow(line, inner))}`);\n }\n\n private progressBar(ratio: number | undefined, width: number): string {\n if (ratio === undefined) return '';\n const filled = Math.max(0, Math.min(PROGRESS_WIDTH, Math.round(ratio * PROGRESS_WIDTH)));\n const bar = PROGRESS_FULL.repeat(filled) + PROGRESS_EMPTY.repeat(PROGRESS_WIDTH - filled);\n return fitRow(`${bar} ${Math.round(ratio * 100)}%`, width);\n }\n\n private fieldLines(width: number): string[] {\n const section = this.currentSection();\n if (!section) return [this.theme.fg('dim', EMPTY_MESSAGE)];\n const lines = [this.theme.bold(section.title), ''];\n if (section.notice) {\n lines.push(\n ...wrap(section.notice, width).map((line) =>\n this.theme.fg(section.noticeLevel === 'error' ? 'error' : 'dim', line),\n ),\n );\n lines.push('');\n }\n if (section.fields.length === 0) {\n lines.push(this.theme.fg('dim', NO_FIELDS_MESSAGE));\n return lines;\n }\n\n const valueWidth = Math.max(1, width - LABEL_COLUMN);\n for (const [index, field] of section.fields.entries()) {\n const active = index === this.fieldIndex && this.pane === 'fields';\n const editing = active && this.mode === 'edit';\n const isPending = this.pending.has(this.pendingKey(field));\n const shown = editing ? `${this.draft}█` : (field.value ?? field.placeholder ?? UNSET_PLACEHOLDER);\n const tone = editing || field.value ? 'text' : 'dim';\n const value = this.theme.fg(isPending || field.busy ? 'dim' : tone, shown);\n const status = field.statusText ?? (isPending ? '' : '');\n const row = `${this.theme.fg('dim', fitRow(field.label, LABEL_COLUMN))}${\n status\n ? rightAligned(value, this.theme.fg(field.status === 'blocked' ? 'error' : 'dim', status), valueWidth)\n : fitRow(value, valueWidth)\n }`;\n lines.push(active ? this.theme.bg('selectedBg', fitRow(row, width)) : row);\n lines.push(...this.stepLines(field, width));\n if (field.busy && field.progress) {\n lines.push(this.theme.fg('dim', fitRow(`${INDENT}${field.progress.label}`, width)));\n const bar = this.progressBar(field.progress.ratio, valueWidth);\n if (bar) lines.push(`${INDENT}${this.theme.fg('accent', bar)}`);\n }\n lines.push(...this.outputLines(field, width));\n if (active && field.awaitingInput) {\n // The command is asking something. Answering is the only useful action,\n // so the line is offered without having to enter a mode first.\n const prompt = this.mode === 'edit' ? `${this.draft}█` : 'press i to answer';\n lines.push(\n `${INDENT}${this.theme.fg('warning', fitRow(`waiting for input ${prompt}`, width - INDENT.length))}`,\n );\n }\n if (!active) continue;\n if (field.detail) {\n lines.push(\n ...wrap(field.detail, Math.max(1, width - LABEL_COLUMN)).map(\n (line) => `${' '.repeat(LABEL_COLUMN)}${this.theme.fg('dim', line)}`,\n ),\n );\n }\n if (field.keyPath) lines.push(`${' '.repeat(LABEL_COLUMN)}${this.theme.fg('accent', field.keyPath)}`);\n if (field.actions && field.actions.length > 0) lines.push(`${' '.repeat(LABEL_COLUMN)}${this.hintLine()}`);\n }\n return lines;\n }\n\n private choiceLines(width: number): string[] {\n const field = this.currentField();\n const choices = this.currentChoices();\n const lines = [this.theme.bold(field?.label ?? ''), ''];\n if (choices.length === 0) {\n lines.push(this.theme.fg('dim', NO_FIELDS_MESSAGE));\n return lines;\n }\n const budget = Math.max(1, this.bodyHeight - lines.length);\n const selected = Math.max(0, Math.min(this.choiceIndex, choices.length - 1));\n const start = Math.max(0, Math.min(selected - budget + 1, Math.max(0, choices.length - budget)));\n let lastGroup: string | undefined;\n for (const [offset, choice] of choices.slice(start, start + budget).entries()) {\n if (choice.group && choice.group !== lastGroup) {\n lastGroup = choice.group;\n lines.push(this.theme.fg('accent', fitRow(choice.group, width)));\n }\n const status = choice.statusText ?? choice.status ?? '';\n const row = rightAligned(\n `${INDENT}${choice.label}${choice.detail ? this.theme.fg('dim', ` ${choice.detail}`) : ''}`,\n this.theme.fg(choice.status === 'blocked' ? 'error' : 'dim', status),\n width,\n );\n lines.push(start + offset === selected ? this.theme.bg('selectedBg', fitRow(row, width)) : row);\n }\n return lines;\n }\n\n private hints(): readonly (readonly [string, string])[] {\n if (this.mode === 'edit') {\n return [\n ['⌫', 'delete'],\n ['enter', this.currentField()?.awaitingInput ? 'send' : 'save'],\n ['esc', 'cancel'],\n ];\n }\n if (this.mode === 'choices') {\n const choice = this.currentChoices()[this.choiceIndex];\n // The hint names what enter does to the entry under the cursor, because on\n // this list that differs row by row.\n return [\n ['↑↓', 'move'],\n ['enter', choice?.action ?? DEFAULT_CHOICE_ACTION],\n ['esc', 'back'],\n ];\n }\n const field = this.currentField();\n if (field?.awaitingInput) {\n return [\n ['i', 'answer'],\n ['ctrl+c', 'abort'],\n ['esc', 'close, keeps running'],\n ];\n }\n if (field?.busy) {\n return [\n ['ctrl+c', 'abort'],\n ['esc', 'close, keeps running'],\n ];\n }\n const offered = (field?.actions ?? []).map((action) => [action.key, action.label] as const);\n return [\n ['↑↓', 'move'],\n ['tab', 'pane'],\n ['enter', this.pane === 'sections' ? 'fields' : 'edit'],\n ...offered,\n ...(this.pane === 'fields' && offered.length === 0 ? ([['d', 'clear']] as const) : []),\n ['esc', this.pane === 'fields' ? 'back' : 'close'],\n ];\n }\n\n private hintLine(): string {\n return this.hints()\n .map(\n ([key, label]) =>\n `${this.theme.bg('selectedBg', this.theme.fg('text', ` ${key} `))}${this.theme.fg('dim', ` ${label}`)}`,\n )\n .join(this.theme.fg('dim', ' '));\n }\n\n protected getChrome(): DoomOverlayChrome {\n const section = this.currentSection();\n const field = this.currentField();\n const breadcrumb =\n this.mode === 'choices' && section && field ? `${BREADCRUMB} › ${section.title} / ${field.label}` : BREADCRUMB;\n return {\n title: TITLE,\n accent: DOOM_OVERLAY_ACCENT,\n breadcrumb,\n headerRight: `${this.sections.length} sections · ${this.sections.length === 0 ? 'none' : (section?.source ?? '')}`,\n footer: this.hintLine(),\n };\n }\n\n /**\n * The one line the panel says in its own voice, kept at the bottom where it\n * does not push a section's fields around. Dropped entirely when the body is\n * too short to spare the rows: a field the user came here to change outranks\n * a pointer to the docs.\n */\n private helpBanner(width: number): string[] {\n const badge = this.theme.inverse(this.theme.bold(this.theme.fg('accent', HELP_BADGE)));\n return ['', fitRow(`${badge} ${this.theme.fg('dim', HELP_HINT)}`, width)];\n }\n\n protected renderBody(width: number, height: number): string[] {\n const banner = height >= HELP_BANNER_MIN_ROWS ? this.helpBanner(width) : [];\n const bodyHeight = Math.max(0, height - banner.length);\n this.bodyHeight = bodyHeight;\n const right = this.mode === 'choices' ? this.choiceLines.bind(this) : this.fieldLines.bind(this);\n if (width < MIN_WIDTH) return [...this.renderStacked(width, bodyHeight, right), ...banner];\n\n const leftWidth = Math.max(MIN_PANE_WIDTH, Math.floor((width - 1) * SECTION_PANE_RATIO));\n const rightWidth = Math.max(1, width - leftWidth - 1);\n const leftContent = Math.max(1, leftWidth - PANE_GUTTER);\n const rightContent = Math.max(1, rightWidth - PANE_GUTTER);\n const left = this.sectionLines(leftContent);\n const rightLines = right(rightContent);\n\n const divider = this.theme.fg('borderMuted', '│');\n const rows = Array.from({ length: bodyHeight }, (_, index) => {\n const row = `${fitRow(left[index] ?? '', leftContent)} ${divider} ${fitRow(rightLines[index] ?? '', rightContent)}`;\n return truncateToWidth(row, width, ELLIPSIS);\n });\n return [...rows, ...banner];\n }\n\n private renderStacked(width: number, height: number, right: (width: number) => string[]): string[] {\n const topHeight = Math.max(1, Math.floor((height - 1) / 2));\n const bottomHeight = Math.max(0, height - topHeight - 1);\n this.bodyHeight = topHeight;\n const top = this.sectionLines(width);\n const bottom = right(width);\n return [\n ...top.slice(0, topHeight),\n ...Array.from({ length: Math.max(0, topHeight - top.length) }, () => ''),\n this.theme.fg('borderMuted', '─'.repeat(width)),\n ...bottom.slice(0, bottomHeight),\n ];\n }\n}\n\nexport interface DoomConfigStoreView {\n getSections(): DoomConfigSectionView[];\n invoke(invocation: { source: string; sectionId: string; fieldId: string; action: string; value?: string }): void;\n subscribe(listener: () => void): () => void;\n}\n\nexport async function openConfigOverlay(ctx: ExtensionContext, registry: DoomConfigStoreView): Promise<void> {\n await ctx.ui.custom<undefined>(\n (tui, theme, _keybindings, done) => new ConfigOverlayComponent(tui, theme, registry, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configOverlay-CCbWicvH.mjs","names":[],"sources":["../src/tui/configOverlay.ts"],"sourcesContent":["/**\n * Configuration panel: the `SPC e c` overlay.\n *\n * Sections on the left, one per contributing extension, and that section's\n * fields on the right. The panel owns navigation and text entry; every value it\n * shows was published by an extension, and every change it makes is a request\n * back to whichever extension owns the field. Nothing here knows what a voice\n * model or an editor command is.\n *\n * It subscribes to the registry rather than snapshotting at open time, unlike\n * the tools browser next door, because a contributor can be doing long work\n * (fetching a model, running an installer) and the panel is where that progress\n * is meant to appear.\n *\n * There is no local echo of an edit. A typed value is sent and the field stays\n * pending until its owner republishes, so a rejected value comes back with the\n * reason attached instead of the panel showing a value that was never written.\n */\n\nimport type { ConfigChoice, ConfigField } from '@agimon-ai/doompi-core/config';\nimport type { DoomConfigSectionView } from '@agimon-ai/doompi-core/config';\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';\n\nimport {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from './doomOverlay';\nimport { fitStyledLine } from './rendering';\n\ntype Pane = 'sections' | 'fields';\ntype Mode = 'browse' | 'edit' | 'choices';\n\nconst TITLE = 'CONFIG';\nconst BREADCRUMB = 'SPC › e / c · config';\nconst ACTION_SET = 'set';\nconst ACTION_CLEAR = 'clear';\nconst ACTION_ABORT = 'abort';\nconst DEFAULT_CHOICE_ACTION = 'select';\n\nconst KEY_BACKSPACE = '\\x7f';\nconst KEY_ENTER = '\\r';\nconst KEY_NEWLINE = '\\n';\nconst KEY_TAB = '\\t';\nconst FIRST_PRINTABLE_CODE_POINT = 0x20;\nconst DELETE_CODE_POINT = 0x7f;\n\nconst MIN_WIDTH = 48;\nconst SECTION_PANE_RATIO = 1 / 3;\nconst PANE_GUTTER = 1;\nconst MIN_PANE_WIDTH = 18;\nconst ELLIPSIS = '…';\nconst LABEL_COLUMN = 18;\nconst INDENT = ' ';\nconst EMPTY_MESSAGE = 'No extension has contributed settings to this session.';\nconst NO_FIELDS_MESSAGE = 'This section has no fields.';\nconst UNSET_PLACEHOLDER = 'not set';\nconst SECTION_HEADING = 'SECTIONS';\nconst HELP_BADGE = ' HELP ';\n/**\n * Every field here is published by a package, so the panel cannot explain what\n * any one of them means. Help mode can: it loads the owning package's docs into\n * the session, and the agent reads them and answers from there.\n */\nconst HELP_HINT = 'Not sure what a setting does? SPC h e loads package Help, then ask the agent about it.';\n/** Body rows below which the banner is dropped: a field outranks a pointer to the docs. */\nconst HELP_BANNER_MIN_ROWS = 10;\nconst PROGRESS_WIDTH = 24;\nconst ACTION_INPUT = 'input';\ntype ThemeColor = Parameters<Theme['fg']>[0];\nconst STEP_MARKERS: Readonly<Record<string, readonly [string, ThemeColor]>> = {\n pending: ['·', 'dim'],\n satisfied: ['✓', 'dim'],\n running: ['▸', 'accent'],\n done: ['✓', 'success'],\n failed: ['✗', 'error'],\n};\nconst PROGRESS_FULL = '█';\nconst PROGRESS_EMPTY = '░';\n\n/**\n * Keystrokes that carry no text: escape sequences, control keys, delete.\n * Indexed rather than iterated so surrogate pairs stay intact; both halves sit\n * far above the control range, so no emoji is ever mistaken for one.\n */\nfunction isControlInput(data: string): boolean {\n for (let index = 0; index < data.length; index++) {\n const code = data.charCodeAt(index);\n if (code < FIRST_PRINTABLE_CODE_POINT || code === DELETE_CODE_POINT) return true;\n }\n return false;\n}\n\nfunction fitRow(text: string, width: number): string {\n return fitStyledLine(text, width, ELLIPSIS);\n}\n\nfunction rightAligned(left: string, right: string, width: number): string {\n const rightWidth = visibleWidth(right);\n const leftWidth = Math.max(0, width - rightWidth - 1);\n return fitRow(left, leftWidth) + ' '.repeat(Math.max(1, width - leftWidth - rightWidth)) + fitRow(right, rightWidth);\n}\n\nfunction wrap(text: string, width: number): string[] {\n if (width <= 0) return [];\n const lines: string[] = [];\n let current = '';\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n if (current.length === 0) current = word;\n else if (current.length + 1 + word.length <= width) current += ` ${word}`;\n else {\n lines.push(current);\n current = word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\nfunction isSelectable(field: ConfigField): boolean {\n return field.kind !== 'info';\n}\n\nexport class ConfigOverlayComponent extends DoomOverlay {\n private readonly registry: DoomConfigStoreView;\n private readonly done: (result: undefined) => void;\n private readonly unsubscribe: () => void;\n private sections: readonly DoomConfigSectionView[];\n private pane: Pane = 'sections';\n private mode: Mode = 'browse';\n private sectionIndex = 0;\n private fieldIndex = 0;\n private choiceIndex = 0;\n private draft = '';\n /** Fields awaiting a reply, keyed by source, section, and field. */\n private readonly pending = new Set<string>();\n private bodyHeight = 1;\n\n constructor(tui: DoomOverlayTui, theme: Theme, registry: DoomConfigStoreView, done: (result: undefined) => void) {\n super(tui, theme);\n this.registry = registry;\n this.done = done;\n this.sections = registry.getSections();\n this.fieldIndex = this.firstSelectableField();\n this.unsubscribe = registry.subscribe(() => this.onSectionsChanged());\n }\n\n /** Info fields are labels, so the cursor never starts on one. */\n private firstSelectableField(): number {\n const index = this.currentFields().findIndex(isSelectable);\n return index < 0 ? 0 : index;\n }\n\n dispose(): void {\n this.unsubscribe();\n }\n\n private onSectionsChanged(): void {\n this.sections = this.registry.getSections();\n // Any republish from an owner is its answer, so nothing stays pending past it.\n this.pending.clear();\n this.sectionIndex = Math.min(this.sectionIndex, Math.max(0, this.sections.length - 1));\n const fields = this.currentFields();\n this.fieldIndex = Math.min(this.fieldIndex, Math.max(0, fields.length - 1));\n if (!isSelectable(fields[this.fieldIndex] ?? { kind: 'info' })) this.fieldIndex = this.firstSelectableField();\n const field = this.currentField();\n // A field that grew an error keeps the draft so the typed value is not lost,\n // and an answer being typed survives the republish each output chunk causes.\n if (this.mode === 'edit' && !field?.statusText && !field?.awaitingInput) this.mode = 'browse';\n this.tui.requestRender();\n }\n\n private currentSection(): DoomConfigSectionView | undefined {\n return this.sections[this.sectionIndex];\n }\n\n private currentFields(): readonly ConfigField[] {\n return this.currentSection()?.fields ?? [];\n }\n\n private currentField(): ConfigField | undefined {\n return this.currentFields()[this.fieldIndex];\n }\n\n private currentChoices(): readonly ConfigChoice[] {\n return this.currentField()?.choices ?? [];\n }\n\n private pendingKey(field: ConfigField): string {\n return `${this.currentSection()?.source ?? ''}\u0000${this.currentSection()?.id ?? ''}\u0000${field.id}`;\n }\n\n private invoke(action: string, value?: string): void {\n const section = this.currentSection();\n const field = this.currentField();\n if (!section || !field) return;\n this.pending.add(this.pendingKey(field));\n this.registry.invoke({\n source: section.source,\n sectionId: section.id,\n fieldId: field.id,\n action,\n ...(value === undefined ? {} : { value }),\n });\n this.tui.requestRender();\n }\n\n private moveSection(delta: number): void {\n if (this.sections.length === 0) return;\n const next = Math.max(0, Math.min(this.sectionIndex + delta, this.sections.length - 1));\n if (next === this.sectionIndex) return;\n this.sectionIndex = next;\n this.fieldIndex = this.firstSelectableField();\n this.tui.requestRender();\n }\n\n /** Info fields are labels, so the cursor steps over them to the next control. */\n private moveField(delta: number): void {\n const fields = this.currentFields();\n const step = delta < 0 ? -1 : 1;\n let next = this.fieldIndex + step;\n while (next >= 0 && next < fields.length && !isSelectable(fields[next] as ConfigField)) next += step;\n if (next < 0 || next >= fields.length) return;\n this.fieldIndex = next;\n this.tui.requestRender();\n }\n\n private moveChoice(delta: number): void {\n const choices = this.currentChoices();\n if (choices.length === 0) return;\n const next = Math.max(0, Math.min(this.choiceIndex + delta, choices.length - 1));\n if (next === this.choiceIndex) return;\n this.choiceIndex = next;\n this.tui.requestRender();\n }\n\n handleInput(data: string): void {\n if (this.mode === 'edit') {\n this.handleEditInput(data);\n return;\n }\n if (this.mode === 'choices') {\n this.handleChoiceInput(data);\n return;\n }\n this.handleBrowseInput(data);\n }\n\n private handleBrowseInput(data: string): void {\n const field = this.currentField();\n if (matchesKey(data, 'ctrl+c')) {\n if (field?.busy) this.invoke(ACTION_ABORT);\n else this.done(undefined);\n return;\n }\n if (matchesKey(data, 'escape') || data === 'q') {\n // Escape backs out of the fields pane before it closes the panel.\n if (this.pane === 'fields') {\n this.pane = 'sections';\n this.tui.requestRender();\n return;\n }\n this.done(undefined);\n return;\n }\n if (data === KEY_TAB) {\n this.pane = this.pane === 'sections' ? 'fields' : 'sections';\n this.tui.requestRender();\n return;\n }\n if (matchesKey(data, 'up') || data === 'k') {\n if (this.pane === 'sections') this.moveSection(-1);\n else this.moveField(-1);\n return;\n }\n if (matchesKey(data, 'down') || data === 'j') {\n if (this.pane === 'sections') this.moveSection(1);\n else this.moveField(1);\n return;\n }\n // While a field offers its own keys, those win: a pending confirmation is\n // answered before anything else can be typed.\n const offered = field?.actions?.find((action) => action.key === data);\n if (this.pane === 'fields' && offered) {\n this.invoke(offered.action);\n return;\n }\n // Answering a waiting command beats every other reading of `i`, and it is\n // the only thing that will make progress while one is blocked on a prompt.\n if (this.pane === 'fields' && field?.awaitingInput && data === 'i') {\n this.draft = '';\n this.mode = 'edit';\n this.tui.requestRender();\n return;\n }\n if (matchesKey(data, 'enter') || data === KEY_ENTER || data === KEY_NEWLINE) {\n this.activate();\n return;\n }\n if (this.pane === 'fields' && data === 'd' && field && isSelectable(field)) this.invoke(ACTION_CLEAR);\n }\n\n private activate(): void {\n if (this.pane === 'sections') {\n this.pane = 'fields';\n this.tui.requestRender();\n return;\n }\n const field = this.currentField();\n if (!field || field.busy || !isSelectable(field)) return;\n // `enum` and `choice` differ only in how many entries they carry, so both\n // open the same list with the cursor on whatever is currently set.\n if (field.kind === 'choice' || field.kind === 'enum') {\n this.choiceIndex = Math.max(\n 0,\n this.currentChoices().findIndex((choice) => choice.id === field.value),\n );\n this.mode = 'choices';\n this.tui.requestRender();\n return;\n }\n this.draft = field.value ?? '';\n this.mode = 'edit';\n this.tui.requestRender();\n }\n\n private handleEditInput(data: string): void {\n if (matchesKey(data, 'escape')) {\n this.mode = 'browse';\n this.draft = '';\n this.tui.requestRender();\n return;\n }\n if (data === KEY_ENTER || data === KEY_NEWLINE) {\n const value = this.draft.trim();\n // Answering a prompt is a different write from setting a field, and an\n // empty answer is meaningful there: it accepts the command's default.\n if (this.currentField()?.awaitingInput) {\n this.mode = 'browse';\n this.invoke(ACTION_INPUT, value.length === 0 ? undefined : value);\n this.draft = '';\n return;\n }\n // The parser rejects blank values, so clearing a key means removing it.\n this.invoke(value.length === 0 ? ACTION_CLEAR : ACTION_SET, value.length === 0 ? undefined : value);\n return;\n }\n if (data === KEY_BACKSPACE) this.draft = this.draft.slice(0, -1);\n else if (!isControlInput(data)) this.draft += data;\n this.tui.requestRender();\n }\n\n private handleChoiceInput(data: string): void {\n if (matchesKey(data, 'escape')) {\n this.mode = 'browse';\n this.tui.requestRender();\n return;\n }\n if (matchesKey(data, 'up') || data === 'k') {\n this.moveChoice(-1);\n return;\n }\n if (matchesKey(data, 'down') || data === 'j') {\n this.moveChoice(1);\n return;\n }\n if (matchesKey(data, 'enter') || data === KEY_ENTER || data === KEY_NEWLINE) {\n const choice = this.currentChoices()[this.choiceIndex];\n if (!choice) return;\n this.mode = 'browse';\n // The entry names what enter does to it, which is what lets one list hold\n // both an installed thing to select and an absent one to fetch.\n this.invoke(choice.action ?? DEFAULT_CHOICE_ACTION, choice.id);\n }\n }\n\n private sectionLines(width: number): string[] {\n const lines = [this.theme.bold(SECTION_HEADING), ''];\n if (this.sections.length === 0) {\n lines.push(...wrap(EMPTY_MESSAGE, width).map((line) => this.theme.fg('dim', line)));\n return lines;\n }\n for (const [index, section] of this.sections.entries()) {\n const active = index === this.sectionIndex;\n const title = rightAligned(\n active ? this.theme.bold(section.title) : this.theme.fg('text', section.title),\n this.theme.fg(section.noticeLevel === 'error' ? 'error' : 'dim', section.detail ?? ''),\n width,\n );\n lines.push(active && this.pane === 'sections' ? this.theme.bg('selectedBg', fitRow(title, width)) : title);\n lines.push(this.theme.fg('dim', fitRow(`${INDENT}${section.source}`, width)));\n }\n return lines;\n }\n\n /**\n * The whole plan, not just the running step.\n *\n * Seeing that a package manager already finished and a download is now\n * underway is what makes a long install legible; a lone \"step 3 of 6\" is not.\n */\n private stepLines(field: ConfigField, width: number): string[] {\n const inner = Math.max(1, width - INDENT.length);\n return (field.steps ?? []).map((step) => {\n const [glyph, color] = STEP_MARKERS[step.state];\n const label = step.state === 'pending' ? this.theme.fg('dim', step.label) : step.label;\n const row = rightAligned(\n `${this.theme.fg(color, glyph)} ${label}`,\n this.theme.fg('dim', step.detail ?? ''),\n inner,\n );\n return `${INDENT}${row}`;\n });\n }\n\n /** The tail of the running command, so a prompt it printed is visible. */\n private outputLines(field: ConfigField, width: number): string[] {\n const inner = Math.max(1, width - INDENT.length);\n return (field.output ?? []).map((line) => `${INDENT}${this.theme.fg('dim', fitRow(line, inner))}`);\n }\n\n private progressBar(ratio: number | undefined, width: number): string {\n if (ratio === undefined) return '';\n const filled = Math.max(0, Math.min(PROGRESS_WIDTH, Math.round(ratio * PROGRESS_WIDTH)));\n const bar = PROGRESS_FULL.repeat(filled) + PROGRESS_EMPTY.repeat(PROGRESS_WIDTH - filled);\n return fitRow(`${bar} ${Math.round(ratio * 100)}%`, width);\n }\n\n private fieldLines(width: number): string[] {\n const section = this.currentSection();\n if (!section) return [this.theme.fg('dim', EMPTY_MESSAGE)];\n const lines = [this.theme.bold(section.title), ''];\n if (section.notice) {\n lines.push(\n ...wrap(section.notice, width).map((line) =>\n this.theme.fg(section.noticeLevel === 'error' ? 'error' : 'dim', line),\n ),\n );\n lines.push('');\n }\n if (section.fields.length === 0) {\n lines.push(this.theme.fg('dim', NO_FIELDS_MESSAGE));\n return lines;\n }\n\n const valueWidth = Math.max(1, width - LABEL_COLUMN);\n for (const [index, field] of section.fields.entries()) {\n const active = index === this.fieldIndex && this.pane === 'fields';\n const editing = active && this.mode === 'edit';\n const isPending = this.pending.has(this.pendingKey(field));\n const shown = editing ? `${this.draft}█` : (field.value ?? field.placeholder ?? UNSET_PLACEHOLDER);\n const tone = editing || field.value ? 'text' : 'dim';\n const value = this.theme.fg(isPending || field.busy ? 'dim' : tone, shown);\n const status = field.statusText ?? (isPending ? '' : '');\n const row = `${this.theme.fg('dim', fitRow(field.label, LABEL_COLUMN))}${\n status\n ? rightAligned(value, this.theme.fg(field.status === 'blocked' ? 'error' : 'dim', status), valueWidth)\n : fitRow(value, valueWidth)\n }`;\n lines.push(active ? this.theme.bg('selectedBg', fitRow(row, width)) : row);\n lines.push(...this.stepLines(field, width));\n if (field.busy && field.progress) {\n lines.push(this.theme.fg('dim', fitRow(`${INDENT}${field.progress.label}`, width)));\n const bar = this.progressBar(field.progress.ratio, valueWidth);\n if (bar) lines.push(`${INDENT}${this.theme.fg('accent', bar)}`);\n }\n lines.push(...this.outputLines(field, width));\n if (active && field.awaitingInput) {\n // The command is asking something. Answering is the only useful action,\n // so the line is offered without having to enter a mode first.\n const prompt = this.mode === 'edit' ? `${this.draft}█` : 'press i to answer';\n lines.push(\n `${INDENT}${this.theme.fg('warning', fitRow(`waiting for input ${prompt}`, width - INDENT.length))}`,\n );\n }\n if (!active) continue;\n if (field.detail) {\n lines.push(\n ...wrap(field.detail, Math.max(1, width - LABEL_COLUMN)).map(\n (line) => `${' '.repeat(LABEL_COLUMN)}${this.theme.fg('dim', line)}`,\n ),\n );\n }\n if (field.keyPath) lines.push(`${' '.repeat(LABEL_COLUMN)}${this.theme.fg('accent', field.keyPath)}`);\n if (field.actions && field.actions.length > 0) lines.push(`${' '.repeat(LABEL_COLUMN)}${this.hintLine()}`);\n }\n return lines;\n }\n\n private choiceLines(width: number): string[] {\n const field = this.currentField();\n const choices = this.currentChoices();\n const lines = [this.theme.bold(field?.label ?? ''), ''];\n if (choices.length === 0) {\n lines.push(this.theme.fg('dim', NO_FIELDS_MESSAGE));\n return lines;\n }\n const budget = Math.max(1, this.bodyHeight - lines.length);\n const selected = Math.max(0, Math.min(this.choiceIndex, choices.length - 1));\n const start = Math.max(0, Math.min(selected - budget + 1, Math.max(0, choices.length - budget)));\n let lastGroup: string | undefined;\n for (const [offset, choice] of choices.slice(start, start + budget).entries()) {\n if (choice.group && choice.group !== lastGroup) {\n lastGroup = choice.group;\n lines.push(this.theme.fg('accent', fitRow(choice.group, width)));\n }\n const status = choice.statusText ?? choice.status ?? '';\n const row = rightAligned(\n `${INDENT}${choice.label}${choice.detail ? this.theme.fg('dim', ` ${choice.detail}`) : ''}`,\n this.theme.fg(choice.status === 'blocked' ? 'error' : 'dim', status),\n width,\n );\n lines.push(start + offset === selected ? this.theme.bg('selectedBg', fitRow(row, width)) : row);\n }\n return lines;\n }\n\n private hints(): readonly (readonly [string, string])[] {\n if (this.mode === 'edit') {\n return [\n ['⌫', 'delete'],\n ['enter', this.currentField()?.awaitingInput ? 'send' : 'save'],\n ['esc', 'cancel'],\n ];\n }\n if (this.mode === 'choices') {\n const choice = this.currentChoices()[this.choiceIndex];\n // The hint names what enter does to the entry under the cursor, because on\n // this list that differs row by row.\n return [\n ['↑↓', 'move'],\n ['enter', choice?.action ?? DEFAULT_CHOICE_ACTION],\n ['esc', 'back'],\n ];\n }\n const field = this.currentField();\n if (field?.awaitingInput) {\n return [\n ['i', 'answer'],\n ['ctrl+c', 'abort'],\n ['esc', 'close, keeps running'],\n ];\n }\n if (field?.busy) {\n return [\n ['ctrl+c', 'abort'],\n ['esc', 'close, keeps running'],\n ];\n }\n const offered = (field?.actions ?? []).map((action) => [action.key, action.label] as const);\n return [\n ['↑↓', 'move'],\n ['tab', 'pane'],\n ['enter', this.pane === 'sections' ? 'fields' : 'edit'],\n ...offered,\n ...(this.pane === 'fields' && offered.length === 0 ? ([['d', 'clear']] as const) : []),\n ['esc', this.pane === 'fields' ? 'back' : 'close'],\n ];\n }\n\n private hintLine(): string {\n return this.hints()\n .map(\n ([key, label]) =>\n `${this.theme.bg('selectedBg', this.theme.fg('text', ` ${key} `))}${this.theme.fg('dim', ` ${label}`)}`,\n )\n .join(this.theme.fg('dim', ' '));\n }\n\n protected getChrome(): DoomOverlayChrome {\n const section = this.currentSection();\n const field = this.currentField();\n const breadcrumb =\n this.mode === 'choices' && section && field ? `${BREADCRUMB} › ${section.title} / ${field.label}` : BREADCRUMB;\n return {\n title: TITLE,\n accent: DOOM_OVERLAY_ACCENT,\n breadcrumb,\n headerRight: `${this.sections.length} sections · ${this.sections.length === 0 ? 'none' : (section?.source ?? '')}`,\n footer: this.hintLine(),\n };\n }\n\n /**\n * The one line the panel says in its own voice, kept at the bottom where it\n * does not push a section's fields around. Dropped entirely when the body is\n * too short to spare the rows: a field the user came here to change outranks\n * a pointer to the docs.\n */\n private helpBanner(width: number): string[] {\n const badge = this.theme.inverse(this.theme.bold(this.theme.fg('accent', HELP_BADGE)));\n return ['', fitRow(`${badge} ${this.theme.fg('dim', HELP_HINT)}`, width)];\n }\n\n protected renderBody(width: number, height: number): string[] {\n const banner = height >= HELP_BANNER_MIN_ROWS ? this.helpBanner(width) : [];\n const bodyHeight = Math.max(0, height - banner.length);\n this.bodyHeight = bodyHeight;\n const right = this.mode === 'choices' ? this.choiceLines.bind(this) : this.fieldLines.bind(this);\n if (width < MIN_WIDTH) return [...this.renderStacked(width, bodyHeight, right), ...banner];\n\n const leftWidth = Math.max(MIN_PANE_WIDTH, Math.floor((width - 1) * SECTION_PANE_RATIO));\n const rightWidth = Math.max(1, width - leftWidth - 1);\n const leftContent = Math.max(1, leftWidth - PANE_GUTTER);\n const rightContent = Math.max(1, rightWidth - PANE_GUTTER);\n const left = this.sectionLines(leftContent);\n const rightLines = right(rightContent);\n\n const divider = this.theme.fg('borderMuted', '│');\n const rows = Array.from({ length: bodyHeight }, (_, index) => {\n const row = `${fitRow(left[index] ?? '', leftContent)} ${divider} ${fitRow(rightLines[index] ?? '', rightContent)}`;\n return truncateToWidth(row, width, ELLIPSIS);\n });\n return [...rows, ...banner];\n }\n\n private renderStacked(width: number, height: number, right: (width: number) => string[]): string[] {\n const topHeight = Math.max(1, Math.floor((height - 1) / 2));\n const bottomHeight = Math.max(0, height - topHeight - 1);\n this.bodyHeight = topHeight;\n const top = this.sectionLines(width);\n const bottom = right(width);\n return [\n ...top.slice(0, topHeight),\n ...Array.from({ length: Math.max(0, topHeight - top.length) }, () => ''),\n this.theme.fg('borderMuted', '─'.repeat(width)),\n ...bottom.slice(0, bottomHeight),\n ];\n }\n}\n\nexport interface DoomConfigStoreView {\n getSections(): DoomConfigSectionView[];\n invoke(invocation: { source: string; sectionId: string; fieldId: string; action: string; value?: string }): void;\n subscribe(listener: () => void): () => void;\n}\n\nexport async function openConfigOverlay(ctx: ExtensionContext, registry: DoomConfigStoreView): Promise<void> {\n await ctx.ui.custom<undefined>(\n (tui, theme, _keybindings, done) => new ConfigOverlayComponent(tui, theme, registry, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_configOverlay = require("./src/tui/configOverlay.cjs");
2
+ const require_configOverlay = require("./configOverlay-Bov-Zcdz.cjs");
3
3
  exports.ConfigOverlayComponent = require_configOverlay.ConfigOverlayComponent;
4
4
  exports.openConfigOverlay = require_configOverlay.openConfigOverlay;
@@ -1,6 +1,6 @@
1
- import { DoomOverlay, DoomOverlayChrome, DoomOverlayTui } from "./doomOverlay.mjs";
2
- import { ExtensionContext, Theme } from "@earendil-works/pi-coding-agent";
1
+ import { a as DoomOverlayChrome, i as DoomOverlay, o as DoomOverlayTui } from "./doomOverlay-BXVz35qt.mjs";
3
2
  import { DoomConfigSectionView } from "@agimon-ai/doompi-core/config";
3
+ import { ExtensionContext, Theme } from "@earendil-works/pi-coding-agent";
4
4
  //#region src/tui/configOverlay.d.ts
5
5
  export declare class ConfigOverlayComponent extends DoomOverlay {
6
6
  private readonly registry;
@@ -62,7 +62,7 @@ export declare class ConfigOverlayComponent extends DoomOverlay {
62
62
  protected renderBody(width: number, height: number): string[];
63
63
  private renderStacked;
64
64
  }
65
- export interface DoomConfigStoreView {
65
+ interface DoomConfigStoreView {
66
66
  getSections(): DoomConfigSectionView[];
67
67
  invoke(invocation: {
68
68
  source: string;
@@ -75,4 +75,5 @@ export interface DoomConfigStoreView {
75
75
  }
76
76
  export declare function openConfigOverlay(ctx: ExtensionContext, registry: DoomConfigStoreView): Promise<void>;
77
77
  //#endregion
78
+ export type { DoomConfigStoreView };
78
79
  //# sourceMappingURL=configOverlay.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configOverlay.d.mts","names":[],"sources":["../src/tui/configOverlay.ts"],"mappings":";;;;qBA8Ha,+BAA+B;mBACzB;mBACA;mBACA;UACT;UACA;UACA;UACA;UACA;UACA;UACA;;mBAES;UACT;EAER,YAAY,KAAK,gBAAgB,OAAO,OAAO,UAAU,qBAAqB,OAAO;;UAU7E;EAKR;UAIQ;UAeA;UAIA;UAIA;UAIA;UAIA;UAIA;UAeA;;UAUA;UAUA;EASR,YAAY;UAYJ;UAsDA;UAwBA;UA0BA;UAwBA;;;;;;;UAyBA;;UAeA;UAKA;UAOA;UA6DA;UA4BA;UA2CA;YASE,aAAa;;;;;;;UAoBf;YAKE,WAAW,eAAe;UAsB5B;;UAeO;EACf,eAAe;EACf,OAAO;IAAc;IAAgB;IAAmB;IAAiB;IAAgB;;EACzF,UAAU;;wBAGU,kBAAkB,KAAK,kBAAkB,UAAU,sBAAsB"}
@@ -0,0 +1,2 @@
1
+ import { n as openConfigOverlay, t as ConfigOverlayComponent } from "./configOverlay-CCbWicvH.mjs";
2
+ export { ConfigOverlayComponent, openConfigOverlay };
@@ -1,6 +1,19 @@
1
- import { renderLineNumber } from "./codeGutter.mjs";
2
- import { fitStyledLine } from "./rendering.mjs";
1
+ import { r as fitStyledLine } from "./rendering-AfmSPYnd.mjs";
3
2
  import { highlightCode } from "@earendil-works/pi-coding-agent";
3
+ //#region src/tui/codeGutter.ts
4
+ /** Doom Emacs recesses `line-number` and brightens `line-number-current-line`. */
5
+ const CONTEXT_LINE_NUMBER_COLOR = "dim";
6
+ const CHANGED_LINE_NUMBER_COLOR = "muted";
7
+ /** Right-align every number in a block so the code column never goes ragged. */
8
+ function gutterWidth(highestLineNumber) {
9
+ return String(Math.max(1, highestLineNumber)).length;
10
+ }
11
+ /** Recessive right-aligned line number; blank numbers keep the column reserved. */
12
+ function renderLineNumber(value, width, theme, changed = false) {
13
+ const color = changed ? CHANGED_LINE_NUMBER_COLOR : CONTEXT_LINE_NUMBER_COLOR;
14
+ return theme.fg(color, String(value).padStart(width, " "));
15
+ }
16
+ //#endregion
4
17
  //#region src/tui/diffRender.ts
5
18
  /** Pi emits `+12 text`, `-12 text`, ` 12 text`, and a blank-numbered ` ... ` elision between hunks. */
6
19
  const DIFF_ROW_PATTERN = /^([+\- ])( *\d*) (.*)$/u;
@@ -84,6 +97,6 @@ function renderDoomDiff(diff, theme, language, highlight = highlightCode) {
84
97
  return new DoomDiff(rows, decorateRows(rows, language, theme, highlight), theme);
85
98
  }
86
99
  //#endregion
87
- export { renderDoomDiff };
100
+ export { gutterWidth as n, renderLineNumber as r, renderDoomDiff as t };
88
101
 
89
- //# sourceMappingURL=diffRender.mjs.map
102
+ //# sourceMappingURL=diffRender-D7zqA45E.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diffRender-D7zqA45E.mjs","names":[],"sources":["../src/tui/codeGutter.ts","../src/tui/diffRender.ts"],"sourcesContent":["import type { Theme, ThemeColor } from '@earendil-works/pi-coding-agent';\n\n/** Doom Emacs recesses `line-number` and brightens `line-number-current-line`. */\nconst CONTEXT_LINE_NUMBER_COLOR: ThemeColor = 'dim';\nconst CHANGED_LINE_NUMBER_COLOR: ThemeColor = 'muted';\n\n/** Right-align every number in a block so the code column never goes ragged. */\nexport function gutterWidth(highestLineNumber: number): number {\n return String(Math.max(1, highestLineNumber)).length;\n}\n\n/** Recessive right-aligned line number; blank numbers keep the column reserved. */\nexport function renderLineNumber(value: number | string, width: number, theme: Theme, changed = false): string {\n const color = changed ? CHANGED_LINE_NUMBER_COLOR : CONTEXT_LINE_NUMBER_COLOR;\n return theme.fg(color, String(value).padStart(width, ' '));\n}\n","import { highlightCode, type Theme, type ThemeColor } from '@earendil-works/pi-coding-agent';\nimport type { Component } from '@earendil-works/pi-tui';\n\nimport { renderLineNumber } from './codeGutter';\nimport { fitStyledLine } from './rendering';\n\n/** The background palette is not exported by name, so take it from the method. */\ntype ThemeBg = Parameters<Theme['bg']>[0];\n\n/** Pi emits `+12 text`, `-12 text`, ` 12 text`, and a blank-numbered ` ... ` elision between hunks. */\nconst DIFF_ROW_PATTERN = /^([+\\- ])( *\\d*) (.*)$/u;\nconst TAB_REPLACEMENT = ' ';\nconst CONTEXT_MARKER = ' ';\n\ntype ChangedMarker = '+' | '-';\ntype DiffMarker = ChangedMarker | typeof CONTEXT_MARKER;\n\ninterface DiffRow {\n marker: DiffMarker;\n lineNumber: string;\n content: string;\n}\n\n/**\n * Doom Emacs carries a diff on the background and leaves the foreground to\n * syntax highlighting, the way Magit's `magit-diff-added`/`-removed` faces do.\n * The theme's success and error backgrounds are its green- and red-tinted\n * washes, so any theme yields a readable added/removed pair.\n */\nconst ROW_BACKGROUND: Readonly<Record<ChangedMarker, ThemeBg>> = {\n '+': 'toolSuccessBg',\n '-': 'toolErrorBg',\n};\n\nconst MARKER_COLOR: Readonly<Record<ChangedMarker, ThemeColor>> = {\n '+': 'toolDiffAdded',\n '-': 'toolDiffRemoved',\n};\n\ntype Highlighter = (code: string, language?: string) => string[];\n\nfunction isChangedMarker(marker: DiffMarker): marker is ChangedMarker {\n return marker !== CONTEXT_MARKER;\n}\n\nfunction toDiffMarker(value: string): DiffMarker {\n return value === '+' || value === '-' ? value : CONTEXT_MARKER;\n}\n\nfunction parseDiffRows(diff: string): DiffRow[] {\n return diff.split('\\n').map((line) => {\n const expanded = line.replaceAll('\\t', TAB_REPLACEMENT);\n const match = DIFF_ROW_PATTERN.exec(expanded);\n if (!match) return { marker: CONTEXT_MARKER, lineNumber: '', content: expanded };\n return { marker: toDiffMarker(match[1]!), lineNumber: match[2]!.trim(), content: match[3]! };\n });\n}\n\n/**\n * Highlight the diff as one block so multi-line constructs keep their context.\n * Interleaved removals make the block imperfect source, which the highlighter\n * tolerates; a line count mismatch falls back to flat diff coloring.\n */\nfunction decorateRows(\n rows: readonly DiffRow[],\n language: string | undefined,\n theme: Theme,\n highlight: Highlighter,\n): string[] {\n if (language !== undefined) {\n const highlighted = highlight(rows.map((row) => row.content).join('\\n'), language);\n if (highlighted.length === rows.length) return highlighted;\n }\n return rows.map((row) => theme.fg(isChangedMarker(row.marker) ? 'toolOutput' : 'toolDiffContext', row.content));\n}\n\n/** A width-aware diff whose added and removed rows carry a full-width color band. */\nclass DoomDiff implements Component {\n private readonly gutter: number;\n\n constructor(\n private readonly rows: readonly DiffRow[],\n private readonly contents: readonly string[],\n private readonly theme: Theme,\n ) {\n // Pi already pads its numbers, so the widest one sizes the column.\n this.gutter = rows.reduce((widest, row) => Math.max(widest, row.lineNumber.length), 1);\n }\n\n render(width: number): string[] {\n if (width <= 0) return [];\n return this.rows.map((row, index) => this.renderRow(row, this.contents[index] ?? row.content, width));\n }\n\n invalidate(): void {\n // Rows are immutable; only the color band width follows the terminal.\n }\n\n private renderRow({ marker, lineNumber }: DiffRow, content: string, width: number): string {\n const number = renderLineNumber(lineNumber, this.gutter, this.theme, isChangedMarker(marker));\n if (!isChangedMarker(marker)) return fitStyledLine(`${number} ${CONTEXT_MARKER}${content}`, width);\n\n const band = fitStyledLine(`${number} ${this.theme.fg(MARKER_COLOR[marker], marker)}${content}`, width);\n return this.theme.bg(ROW_BACKGROUND[marker], band);\n }\n}\n\n/** Render Pi's display diff with Doom's background-banded added and removed rows. */\nexport function renderDoomDiff(\n diff: string,\n theme: Theme,\n language: string | undefined,\n highlight: Highlighter = highlightCode,\n): Component {\n const rows = parseDiffRows(diff);\n return new DoomDiff(rows, decorateRows(rows, language, theme, highlight), theme);\n}\n"],"mappings":";;;;AAGA,MAAM,4BAAwC;AAC9C,MAAM,4BAAwC;;AAG9C,SAAgB,YAAY,mBAAmC;CAC7D,OAAO,OAAO,KAAK,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC;AAChD;;AAGA,SAAgB,iBAAiB,OAAwB,OAAe,OAAc,UAAU,OAAe;CAC7G,MAAM,QAAQ,UAAU,4BAA4B;CACpD,OAAO,MAAM,GAAG,OAAO,OAAO,KAAK,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC;AAC3D;;;;ACLA,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;;;;;;;AAiBvB,MAAM,iBAA2D;CAC/D,KAAK;CACL,KAAK;AACP;AAEA,MAAM,eAA4D;CAChE,KAAK;CACL,KAAK;AACP;AAIA,SAAS,gBAAgB,QAA6C;CACpE,OAAO,WAAW;AACpB;AAEA,SAAS,aAAa,OAA2B;CAC/C,OAAO,UAAU,OAAO,UAAU,MAAM,QAAQ;AAClD;AAEA,SAAS,cAAc,MAAyB;CAC9C,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,SAAS;EACpC,MAAM,WAAW,KAAK,WAAW,KAAM,eAAe;EACtD,MAAM,QAAQ,iBAAiB,KAAK,QAAQ;EAC5C,IAAI,CAAC,OAAO,OAAO;GAAE,QAAQ;GAAgB,YAAY;GAAI,SAAS;EAAS;EAC/E,OAAO;GAAE,QAAQ,aAAa,MAAM,EAAG;GAAG,YAAY,MAAM,EAAE,CAAE,KAAK;GAAG,SAAS,MAAM;EAAI;CAC7F,CAAC;AACH;;;;;;AAOA,SAAS,aACP,MACA,UACA,OACA,WACU;CACV,IAAI,aAAa,KAAA,GAAW;EAC1B,MAAM,cAAc,UAAU,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,IAAI,GAAG,QAAQ;EACjF,IAAI,YAAY,WAAW,KAAK,QAAQ,OAAO;CACjD;CACA,OAAO,KAAK,KAAK,QAAQ,MAAM,GAAG,gBAAgB,IAAI,MAAM,IAAI,eAAe,mBAAmB,IAAI,OAAO,CAAC;AAChH;;AAGA,IAAM,WAAN,MAAoC;CAIf;CACA;CACA;CALnB;CAEA,YACE,MACA,UACA,OACA;EAHiB,KAAA,OAAA;EACA,KAAA,WAAA;EACA,KAAA,QAAA;EAGjB,KAAK,SAAS,KAAK,QAAQ,QAAQ,QAAQ,KAAK,IAAI,QAAQ,IAAI,WAAW,MAAM,GAAG,CAAC;CACvF;CAEA,OAAO,OAAyB;EAC9B,IAAI,SAAS,GAAG,OAAO,CAAC;EACxB,OAAO,KAAK,KAAK,KAAK,KAAK,UAAU,KAAK,UAAU,KAAK,KAAK,SAAS,UAAU,IAAI,SAAS,KAAK,CAAC;CACtG;CAEA,aAAmB,CAEnB;CAEA,UAAkB,EAAE,QAAQ,cAAuB,SAAiB,OAAuB;EACzF,MAAM,SAAS,iBAAiB,YAAY,KAAK,QAAQ,KAAK,OAAO,gBAAgB,MAAM,CAAC;EAC5F,IAAI,CAAC,gBAAgB,MAAM,GAAG,OAAO,cAAc,GAAG,OAAO,GAAG,iBAAiB,WAAW,KAAK;EAEjG,MAAM,OAAO,cAAc,GAAG,OAAO,GAAG,KAAK,MAAM,GAAG,aAAa,SAAS,MAAM,IAAI,WAAW,KAAK;EACtG,OAAO,KAAK,MAAM,GAAG,eAAe,SAAS,IAAI;CACnD;AACF;;AAGA,SAAgB,eACd,MACA,OACA,UACA,YAAyB,eACd;CACX,MAAM,OAAO,cAAc,IAAI;CAC/B,OAAO,IAAI,SAAS,MAAM,aAAa,MAAM,UAAU,OAAO,SAAS,GAAG,KAAK;AACjF"}
@@ -1,6 +1,19 @@
1
- const require_codeGutter = require("./codeGutter.cjs");
2
- const require_rendering = require("./rendering.cjs");
1
+ const require_rendering = require("./rendering-D_d6wdrK.cjs");
3
2
  let _earendil_works_pi_coding_agent = require("@earendil-works/pi-coding-agent");
3
+ //#region src/tui/codeGutter.ts
4
+ /** Doom Emacs recesses `line-number` and brightens `line-number-current-line`. */
5
+ const CONTEXT_LINE_NUMBER_COLOR = "dim";
6
+ const CHANGED_LINE_NUMBER_COLOR = "muted";
7
+ /** Right-align every number in a block so the code column never goes ragged. */
8
+ function gutterWidth(highestLineNumber) {
9
+ return String(Math.max(1, highestLineNumber)).length;
10
+ }
11
+ /** Recessive right-aligned line number; blank numbers keep the column reserved. */
12
+ function renderLineNumber(value, width, theme, changed = false) {
13
+ const color = changed ? CHANGED_LINE_NUMBER_COLOR : CONTEXT_LINE_NUMBER_COLOR;
14
+ return theme.fg(color, String(value).padStart(width, " "));
15
+ }
16
+ //#endregion
4
17
  //#region src/tui/diffRender.ts
5
18
  /** Pi emits `+12 text`, `-12 text`, ` 12 text`, and a blank-numbered ` ... ` elision between hunks. */
6
19
  const DIFF_ROW_PATTERN = /^([+\- ])( *\d*) (.*)$/u;
@@ -72,7 +85,7 @@ var DoomDiff = class {
72
85
  }
73
86
  invalidate() {}
74
87
  renderRow({ marker, lineNumber }, content, width) {
75
- const number = require_codeGutter.renderLineNumber(lineNumber, this.gutter, this.theme, isChangedMarker(marker));
88
+ const number = renderLineNumber(lineNumber, this.gutter, this.theme, isChangedMarker(marker));
76
89
  if (!isChangedMarker(marker)) return require_rendering.fitStyledLine(`${number} ${CONTEXT_MARKER}${content}`, width);
77
90
  const band = require_rendering.fitStyledLine(`${number} ${this.theme.fg(MARKER_COLOR[marker], marker)}${content}`, width);
78
91
  return this.theme.bg(ROW_BACKGROUND[marker], band);
@@ -84,6 +97,23 @@ function renderDoomDiff(diff, theme, language, highlight = _earendil_works_pi_co
84
97
  return new DoomDiff(rows, decorateRows(rows, language, theme, highlight), theme);
85
98
  }
86
99
  //#endregion
87
- exports.renderDoomDiff = renderDoomDiff;
100
+ Object.defineProperty(exports, "gutterWidth", {
101
+ enumerable: true,
102
+ get: function() {
103
+ return gutterWidth;
104
+ }
105
+ });
106
+ Object.defineProperty(exports, "renderDoomDiff", {
107
+ enumerable: true,
108
+ get: function() {
109
+ return renderDoomDiff;
110
+ }
111
+ });
112
+ Object.defineProperty(exports, "renderLineNumber", {
113
+ enumerable: true,
114
+ get: function() {
115
+ return renderLineNumber;
116
+ }
117
+ });
88
118
 
89
- //# sourceMappingURL=diffRender.cjs.map
119
+ //# sourceMappingURL=diffRender-D8yINsb1.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diffRender-D8yINsb1.cjs","names":["fitStyledLine","highlightCode"],"sources":["../src/tui/codeGutter.ts","../src/tui/diffRender.ts"],"sourcesContent":["import type { Theme, ThemeColor } from '@earendil-works/pi-coding-agent';\n\n/** Doom Emacs recesses `line-number` and brightens `line-number-current-line`. */\nconst CONTEXT_LINE_NUMBER_COLOR: ThemeColor = 'dim';\nconst CHANGED_LINE_NUMBER_COLOR: ThemeColor = 'muted';\n\n/** Right-align every number in a block so the code column never goes ragged. */\nexport function gutterWidth(highestLineNumber: number): number {\n return String(Math.max(1, highestLineNumber)).length;\n}\n\n/** Recessive right-aligned line number; blank numbers keep the column reserved. */\nexport function renderLineNumber(value: number | string, width: number, theme: Theme, changed = false): string {\n const color = changed ? CHANGED_LINE_NUMBER_COLOR : CONTEXT_LINE_NUMBER_COLOR;\n return theme.fg(color, String(value).padStart(width, ' '));\n}\n","import { highlightCode, type Theme, type ThemeColor } from '@earendil-works/pi-coding-agent';\nimport type { Component } from '@earendil-works/pi-tui';\n\nimport { renderLineNumber } from './codeGutter';\nimport { fitStyledLine } from './rendering';\n\n/** The background palette is not exported by name, so take it from the method. */\ntype ThemeBg = Parameters<Theme['bg']>[0];\n\n/** Pi emits `+12 text`, `-12 text`, ` 12 text`, and a blank-numbered ` ... ` elision between hunks. */\nconst DIFF_ROW_PATTERN = /^([+\\- ])( *\\d*) (.*)$/u;\nconst TAB_REPLACEMENT = ' ';\nconst CONTEXT_MARKER = ' ';\n\ntype ChangedMarker = '+' | '-';\ntype DiffMarker = ChangedMarker | typeof CONTEXT_MARKER;\n\ninterface DiffRow {\n marker: DiffMarker;\n lineNumber: string;\n content: string;\n}\n\n/**\n * Doom Emacs carries a diff on the background and leaves the foreground to\n * syntax highlighting, the way Magit's `magit-diff-added`/`-removed` faces do.\n * The theme's success and error backgrounds are its green- and red-tinted\n * washes, so any theme yields a readable added/removed pair.\n */\nconst ROW_BACKGROUND: Readonly<Record<ChangedMarker, ThemeBg>> = {\n '+': 'toolSuccessBg',\n '-': 'toolErrorBg',\n};\n\nconst MARKER_COLOR: Readonly<Record<ChangedMarker, ThemeColor>> = {\n '+': 'toolDiffAdded',\n '-': 'toolDiffRemoved',\n};\n\ntype Highlighter = (code: string, language?: string) => string[];\n\nfunction isChangedMarker(marker: DiffMarker): marker is ChangedMarker {\n return marker !== CONTEXT_MARKER;\n}\n\nfunction toDiffMarker(value: string): DiffMarker {\n return value === '+' || value === '-' ? value : CONTEXT_MARKER;\n}\n\nfunction parseDiffRows(diff: string): DiffRow[] {\n return diff.split('\\n').map((line) => {\n const expanded = line.replaceAll('\\t', TAB_REPLACEMENT);\n const match = DIFF_ROW_PATTERN.exec(expanded);\n if (!match) return { marker: CONTEXT_MARKER, lineNumber: '', content: expanded };\n return { marker: toDiffMarker(match[1]!), lineNumber: match[2]!.trim(), content: match[3]! };\n });\n}\n\n/**\n * Highlight the diff as one block so multi-line constructs keep their context.\n * Interleaved removals make the block imperfect source, which the highlighter\n * tolerates; a line count mismatch falls back to flat diff coloring.\n */\nfunction decorateRows(\n rows: readonly DiffRow[],\n language: string | undefined,\n theme: Theme,\n highlight: Highlighter,\n): string[] {\n if (language !== undefined) {\n const highlighted = highlight(rows.map((row) => row.content).join('\\n'), language);\n if (highlighted.length === rows.length) return highlighted;\n }\n return rows.map((row) => theme.fg(isChangedMarker(row.marker) ? 'toolOutput' : 'toolDiffContext', row.content));\n}\n\n/** A width-aware diff whose added and removed rows carry a full-width color band. */\nclass DoomDiff implements Component {\n private readonly gutter: number;\n\n constructor(\n private readonly rows: readonly DiffRow[],\n private readonly contents: readonly string[],\n private readonly theme: Theme,\n ) {\n // Pi already pads its numbers, so the widest one sizes the column.\n this.gutter = rows.reduce((widest, row) => Math.max(widest, row.lineNumber.length), 1);\n }\n\n render(width: number): string[] {\n if (width <= 0) return [];\n return this.rows.map((row, index) => this.renderRow(row, this.contents[index] ?? row.content, width));\n }\n\n invalidate(): void {\n // Rows are immutable; only the color band width follows the terminal.\n }\n\n private renderRow({ marker, lineNumber }: DiffRow, content: string, width: number): string {\n const number = renderLineNumber(lineNumber, this.gutter, this.theme, isChangedMarker(marker));\n if (!isChangedMarker(marker)) return fitStyledLine(`${number} ${CONTEXT_MARKER}${content}`, width);\n\n const band = fitStyledLine(`${number} ${this.theme.fg(MARKER_COLOR[marker], marker)}${content}`, width);\n return this.theme.bg(ROW_BACKGROUND[marker], band);\n }\n}\n\n/** Render Pi's display diff with Doom's background-banded added and removed rows. */\nexport function renderDoomDiff(\n diff: string,\n theme: Theme,\n language: string | undefined,\n highlight: Highlighter = highlightCode,\n): Component {\n const rows = parseDiffRows(diff);\n return new DoomDiff(rows, decorateRows(rows, language, theme, highlight), theme);\n}\n"],"mappings":";;;;AAGA,MAAM,4BAAwC;AAC9C,MAAM,4BAAwC;;AAG9C,SAAgB,YAAY,mBAAmC;CAC7D,OAAO,OAAO,KAAK,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC;AAChD;;AAGA,SAAgB,iBAAiB,OAAwB,OAAe,OAAc,UAAU,OAAe;CAC7G,MAAM,QAAQ,UAAU,4BAA4B;CACpD,OAAO,MAAM,GAAG,OAAO,OAAO,KAAK,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC;AAC3D;;;;ACLA,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;;;;;;;AAiBvB,MAAM,iBAA2D;CAC/D,KAAK;CACL,KAAK;AACP;AAEA,MAAM,eAA4D;CAChE,KAAK;CACL,KAAK;AACP;AAIA,SAAS,gBAAgB,QAA6C;CACpE,OAAO,WAAW;AACpB;AAEA,SAAS,aAAa,OAA2B;CAC/C,OAAO,UAAU,OAAO,UAAU,MAAM,QAAQ;AAClD;AAEA,SAAS,cAAc,MAAyB;CAC9C,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,SAAS;EACpC,MAAM,WAAW,KAAK,WAAW,KAAM,eAAe;EACtD,MAAM,QAAQ,iBAAiB,KAAK,QAAQ;EAC5C,IAAI,CAAC,OAAO,OAAO;GAAE,QAAQ;GAAgB,YAAY;GAAI,SAAS;EAAS;EAC/E,OAAO;GAAE,QAAQ,aAAa,MAAM,EAAG;GAAG,YAAY,MAAM,EAAE,CAAE,KAAK;GAAG,SAAS,MAAM;EAAI;CAC7F,CAAC;AACH;;;;;;AAOA,SAAS,aACP,MACA,UACA,OACA,WACU;CACV,IAAI,aAAa,KAAA,GAAW;EAC1B,MAAM,cAAc,UAAU,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,IAAI,GAAG,QAAQ;EACjF,IAAI,YAAY,WAAW,KAAK,QAAQ,OAAO;CACjD;CACA,OAAO,KAAK,KAAK,QAAQ,MAAM,GAAG,gBAAgB,IAAI,MAAM,IAAI,eAAe,mBAAmB,IAAI,OAAO,CAAC;AAChH;;AAGA,IAAM,WAAN,MAAoC;CAIf;CACA;CACA;CALnB;CAEA,YACE,MACA,UACA,OACA;EAHiB,KAAA,OAAA;EACA,KAAA,WAAA;EACA,KAAA,QAAA;EAGjB,KAAK,SAAS,KAAK,QAAQ,QAAQ,QAAQ,KAAK,IAAI,QAAQ,IAAI,WAAW,MAAM,GAAG,CAAC;CACvF;CAEA,OAAO,OAAyB;EAC9B,IAAI,SAAS,GAAG,OAAO,CAAC;EACxB,OAAO,KAAK,KAAK,KAAK,KAAK,UAAU,KAAK,UAAU,KAAK,KAAK,SAAS,UAAU,IAAI,SAAS,KAAK,CAAC;CACtG;CAEA,aAAmB,CAEnB;CAEA,UAAkB,EAAE,QAAQ,cAAuB,SAAiB,OAAuB;EACzF,MAAM,SAAS,iBAAiB,YAAY,KAAK,QAAQ,KAAK,OAAO,gBAAgB,MAAM,CAAC;EAC5F,IAAI,CAAC,gBAAgB,MAAM,GAAG,OAAOA,kBAAAA,cAAc,GAAG,OAAO,GAAG,iBAAiB,WAAW,KAAK;EAEjG,MAAM,OAAOA,kBAAAA,cAAc,GAAG,OAAO,GAAG,KAAK,MAAM,GAAG,aAAa,SAAS,MAAM,IAAI,WAAW,KAAK;EACtG,OAAO,KAAK,MAAM,GAAG,eAAe,SAAS,IAAI;CACnD;AACF;;AAGA,SAAgB,eACd,MACA,OACA,UACA,YAAyBC,gCAAAA,eACd;CACX,MAAM,OAAO,cAAc,IAAI;CAC/B,OAAO,IAAI,SAAS,MAAM,aAAa,MAAM,UAAU,OAAO,SAAS,GAAG,KAAK;AACjF"}
@@ -1,9 +1,9 @@
1
- import { DoomUiState, LeaderSnapshot } from "../models/uiState.cjs";
2
- import { DoomLeaderRegistry } from "../services/leaderRegistry/index.cjs";
3
- import { CustomEditor, KeybindingsManager, Theme } from "@earendil-works/pi-coding-agent";
1
+ import { r as LeaderSnapshot, t as DoomUiState } from "./uiState-CQoAIdwc.mjs";
2
+ import { a as DoomLeaderRegistry } from "./index-BvkZav1G.mjs";
4
3
  import { EditorOptions, EditorTheme, TUI } from "@earendil-works/pi-tui";
4
+ import { CustomEditor, KeybindingsManager as KeybindingsManager$1, Theme } from "@earendil-works/pi-coding-agent";
5
5
  //#region src/tui/doomEditor.d.ts
6
- export interface DoomEditorLeaderOptions {
6
+ interface DoomEditorLeaderOptions {
7
7
  /** Overrides the harness major mode shown while the leader is inactive. */
8
8
  majorMode?: string;
9
9
  registry?: DoomLeaderRegistry;
@@ -14,7 +14,7 @@ export interface DoomEditorLeaderOptions {
14
14
  }
15
15
  type SnapshotHandler = (snapshot: LeaderSnapshot) => void;
16
16
  type ChromeTheme = Pick<Theme, 'bg' | 'bold' | 'fg' | 'inverse'>;
17
- export declare class DoomEditor extends CustomEditor {
17
+ declare class DoomEditor extends CustomEditor {
18
18
  private readonly uiState;
19
19
  private readonly onSnapshot;
20
20
  private readonly chromeTheme;
@@ -28,7 +28,7 @@ export declare class DoomEditor extends CustomEditor {
28
28
  private readonly unsubscribeUiState;
29
29
  private leaderActive;
30
30
  private leaderPath;
31
- constructor(tui: TUI, editorTheme: EditorTheme, keybindings: KeybindingsManager, uiState: DoomUiState, onSnapshot: SnapshotHandler, options?: EditorOptions, chromeTheme?: ChromeTheme, leaderOptions?: DoomEditorLeaderOptions);
31
+ constructor(tui: TUI, editorTheme: EditorTheme, keybindings: KeybindingsManager$1, uiState: DoomUiState, onSnapshot: SnapshotHandler, options?: EditorOptions, chromeTheme?: ChromeTheme, leaderOptions?: DoomEditorLeaderOptions);
32
32
  handleInput(data: string): void;
33
33
  render(width: number): string[];
34
34
  dispose(): void;
@@ -59,4 +59,5 @@ export declare class DoomEditor extends CustomEditor {
59
59
  private findBottomBorder;
60
60
  }
61
61
  //#endregion
62
- //# sourceMappingURL=doomEditor.d.cts.map
62
+ export { DoomEditorLeaderOptions as n, DoomEditor as t };
63
+ //# sourceMappingURL=doomEditor-Dvzxbz3r.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doomEditor-Dvzxbz3r.d.mts","names":[],"sources":["../src/tui/doomEditor.ts"],"mappings":";;;;;UAQiB;;EAEf;EACA,WAAW;EACX,sBAAsB;EACtB,wBAAwB;EACxB,uBAAuB;EACvB,kBAAkB,gBAAgB;;KAG/B,mBAAmB,UAAU;KAC7B,cAAc,KAAK;cAoCX,mBAAmB;mBAiBX;mBACA;mBAjBF;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;UACT;UACA;EAER,YACE,KAAK,KACL,aAAa,aACb,aAAa,sBACI,SAAS,aACT,YAAY,iBAC7B,UAAU,eACV,cAAa,aACb,gBAAe;EAkBjB,YAAY;EAgBZ,OAAO;EA4CP;UAMQ;UAMA;UAMA;UAsCA;UAIA;UA0BA;UAMA;UAsBA;UAeA;UAKA;;;;;;;;;;;UAgBA;UAQA;UAMA;UAMA;UAMA"}
@@ -1,8 +1,8 @@
1
- import { alignLine, fitLine, frameLine, padLine } from "./rendering.mjs";
2
- import { DoomLeaderRegistry } from "../services/leaderRegistry/index.mjs";
3
- import { readDoomHarnessMetadata } from "../types/harnessMetadata.mjs";
4
- import { CustomEditor } from "@earendil-works/pi-coding-agent";
1
+ import { a as frameLine, n as fitLine, s as padLine, t as alignLine } from "./rendering-AfmSPYnd.mjs";
2
+ import { t as DoomLeaderRegistry } from "./leaderRegistry-DXYQNR_c.mjs";
3
+ import { t as readDoomHarnessMetadata } from "./harnessMetadata-ClCqMmsE.mjs";
5
4
  import { parseKey } from "@earendil-works/pi-tui";
5
+ import { CustomEditor } from "@earendil-works/pi-coding-agent";
6
6
  //#region src/tui/doomEditor.ts
7
7
  const MIN_CHROME_WIDTH = 12;
8
8
  const EDITOR_CHROME_INSET = 4;
@@ -269,6 +269,6 @@ var DoomEditor = class extends CustomEditor {
269
269
  }
270
270
  };
271
271
  //#endregion
272
- export { DoomEditor };
272
+ export { DoomEditor as t };
273
273
 
274
- //# sourceMappingURL=doomEditor.mjs.map
274
+ //# sourceMappingURL=doomEditor-KbMpb-b3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doomEditor-KbMpb-b3.mjs","names":[],"sources":["../src/tui/doomEditor.ts"],"sourcesContent":["import { type AppKeybinding, CustomEditor, type KeybindingsManager, type Theme } from '@earendil-works/pi-coding-agent';\nimport { type EditorOptions, type EditorTheme, parseKey, type TUI } from '@earendil-works/pi-tui';\n\nimport { type DoomUiState, type LeaderSnapshot } from '../models/uiState';\nimport { type DoomLeaderAction, type DoomLeaderGroup, DoomLeaderRegistry } from '../services/leaderRegistry';\nimport { readDoomHarnessMetadata } from '../types/harnessMetadata';\nimport { alignLine, fitLine, frameLine, padLine } from './rendering';\n\nexport interface DoomEditorLeaderOptions {\n /** Overrides the harness major mode shown while the leader is inactive. */\n majorMode?: string;\n registry?: DoomLeaderRegistry;\n isCommandAvailable?: (commandName: string) => boolean;\n onUnavailableCommand?: (commandName: string) => void;\n onUnavailableAction?: (action: string) => void;\n onLeaderAction?: (source: string, actionName: string) => void;\n}\n\ntype SnapshotHandler = (snapshot: LeaderSnapshot) => void;\ntype ChromeTheme = Pick<Theme, 'bg' | 'bold' | 'fg' | 'inverse'>;\n\nconst MIN_CHROME_WIDTH = 12;\nconst EDITOR_CHROME_INSET = 4;\nconst FRAME_OVERHEAD = 2;\nconst BORDER_THRESHOLD_INSET = 10;\nconst MIN_BORDER_SEGMENTS = 1;\nconst APP_EXIT_ACTION = 'app.exit';\nconst ESCAPE_KEY = 'escape';\nconst BACKSPACE_KEY = 'backspace';\nconst SPACE_KEY = 'space';\nconst GLOBAL_LEADER_KEY = 'ctrl+space';\nconst LEADER_PREFIX = 'SPC';\nconst BORDER_COLOR = 'borderAccent';\nconst DIM_COLOR = 'dim';\nconst ACCENT_COLOR = 'accent';\nconst HEADING_COLOR = 'mdHeading';\nconst MUTED_BORDER_COLOR = 'borderMuted';\n/** Between mode names in the badge row. */\nconst MODE_SEPARATOR = ' · ';\nconst DOMAIN_SEPARATOR = ', ';\nconst VERTICAL_BORDER = '│';\nconst HORIZONTAL_BORDER = '─';\nconst PLAIN_CHROME_THEME: ChromeTheme = {\n bg: (_color, text) => text,\n bold: (text) => text,\n fg: (_color, text) => text,\n inverse: (text) => text,\n};\nconst INACTIVE_SNAPSHOT: LeaderSnapshot = {\n active: false,\n prefix: [],\n label: '',\n options: [],\n};\n\nexport class DoomEditor extends CustomEditor {\n private readonly chromeTheme: ChromeTheme;\n private readonly leaderRegistry: DoomLeaderRegistry;\n private readonly majorMode: string;\n private readonly isCommandAvailable: (commandName: string) => boolean;\n private readonly onUnavailableCommand: (commandName: string) => void;\n private readonly onUnavailableAction: (action: string) => void;\n private readonly onLeaderAction: ((source: string, actionName: string) => void) | undefined;\n private readonly unsubscribeLeaderRegistry: () => void;\n private readonly unsubscribeUiState: () => void;\n private leaderActive = false;\n private leaderPath: string[] = [];\n\n constructor(\n tui: TUI,\n editorTheme: EditorTheme,\n keybindings: KeybindingsManager,\n private readonly uiState: DoomUiState,\n private readonly onSnapshot: SnapshotHandler,\n options?: EditorOptions,\n chromeTheme: ChromeTheme = PLAIN_CHROME_THEME,\n leaderOptions: DoomEditorLeaderOptions = {},\n ) {\n super(tui, editorTheme, keybindings, options);\n this.chromeTheme = chromeTheme;\n this.leaderRegistry = leaderOptions.registry ?? new DoomLeaderRegistry();\n this.majorMode = leaderOptions.majorMode?.trim() || readDoomHarnessMetadata().majorMode;\n this.isCommandAvailable = leaderOptions.isCommandAvailable ?? (() => true);\n this.onUnavailableCommand = leaderOptions.onUnavailableCommand ?? (() => undefined);\n this.onUnavailableAction = leaderOptions.onUnavailableAction ?? (() => undefined);\n this.onLeaderAction = leaderOptions.onLeaderAction;\n this.unsubscribeLeaderRegistry = this.leaderRegistry.subscribe(() => {\n if (this.leaderActive) this.publishLeader();\n });\n // A mode toggling changes the badge row and nothing else about the editor,\n // so without this the new name waits for the next keystroke to appear.\n this.unsubscribeUiState = this.uiState.subscribe(() => tui.requestRender());\n }\n\n handleInput(data: string): void {\n const key = parseKey(data);\n\n if (this.leaderActive) {\n this.handleLeaderInput(key);\n return;\n }\n\n if ((key === SPACE_KEY && this.getText().length === 0) || key === GLOBAL_LEADER_KEY) {\n this.startLeader();\n return;\n }\n\n super.handleInput(data);\n }\n\n render(width: number): string[] {\n if (width < MIN_CHROME_WIDTH) return super.render(width);\n\n const editorWidth = width - EDITOR_CHROME_INSET;\n const base = super.render(editorWidth);\n if (base.length < 3) return base.map((line) => fitLine(line, width));\n\n const bottomIndex = this.findBottomBorder(base, editorWidth);\n const contentLines = base.slice(1, bottomIndex);\n const autocompleteLines = base.slice(bottomIndex + 1);\n const borderSide = this.chromeTheme.fg(BORDER_COLOR, VERTICAL_BORDER);\n const top = this.chromeTheme.fg(BORDER_COLOR, `╭${HORIZONTAL_BORDER.repeat(width - FRAME_OVERHEAD)}╮`);\n const bottom = this.chromeTheme.fg(BORDER_COLOR, `╰${HORIZONTAL_BORDER.repeat(width - FRAME_OVERHEAD)}╯`);\n const metadata = this.editorLine(\n alignLine(\n ` ${this.modeBadge()}${this.modeNames()}${this.domainNames()}`,\n this.chromeTheme.fg(DIM_COLOR, `${this.editorStatus()} `),\n width - FRAME_OVERHEAD,\n ),\n width,\n borderSide,\n );\n const promptLines = contentLines.map((line, index) => {\n const prompt = index === 0 ? this.chromeTheme.bold(this.chromeTheme.fg(ACCENT_COLOR, '❯ ')) : ' ';\n return this.editorLine(`${prompt}${line}`, width, borderSide);\n });\n // The badge and the prompt are separate registers; a rule separates them\n // without the mode label reading as a caption on the input. Junctions take\n // the frame colour so the border stays unbroken through the row.\n const divider = `${this.chromeTheme.fg(BORDER_COLOR, '├')}${this.chromeTheme.fg(\n MUTED_BORDER_COLOR,\n HORIZONTAL_BORDER.repeat(width - FRAME_OVERHEAD),\n )}${this.chromeTheme.fg(BORDER_COLOR, '┤')}`;\n\n return [\n top,\n metadata,\n divider,\n ...promptLines,\n bottom,\n ...autocompleteLines.map((line) => fitLine(` ${line}`, width)),\n ];\n }\n\n dispose(): void {\n this.unsubscribeLeaderRegistry();\n this.unsubscribeUiState();\n this.cancelLeader();\n }\n\n private startLeader(): void {\n this.leaderActive = true;\n this.leaderPath = [];\n this.publishLeader();\n }\n\n private cancelLeader(): void {\n this.leaderActive = false;\n this.leaderPath = [];\n this.publish(INACTIVE_SNAPSHOT);\n }\n\n private handleLeaderInput(key: string | undefined): void {\n if (key === ESCAPE_KEY) {\n this.cancelLeader();\n return;\n }\n if (key === BACKSPACE_KEY) {\n if (this.leaderPath.length === 0) this.cancelLeader();\n else {\n this.leaderPath.pop();\n this.publishLeader();\n }\n return;\n }\n if (!key || key.length !== 1) {\n this.cancelLeader();\n return;\n }\n\n const lowerKey = key.toLowerCase();\n const option = this.currentGroup()?.options.find((candidate) => candidate.key === lowerKey);\n if (!option) {\n this.cancelLeader();\n return;\n }\n if (option.hasChildren) {\n this.leaderPath.push(lowerKey);\n this.publishLeader();\n return;\n }\n if (!option.action) {\n this.cancelLeader();\n return;\n }\n\n this.cancelLeader();\n this.execute(option.action);\n }\n\n private currentGroup(): DoomLeaderGroup | undefined {\n return this.leaderRegistry.getGroup(this.leaderPath);\n }\n\n private publishLeader(): void {\n const group = this.currentGroup();\n if (!group) {\n this.cancelLeader();\n return;\n }\n const root = this.leaderRegistry.getGroup([]);\n this.publish({\n active: true,\n prefix: [LEADER_PREFIX, ...this.leaderPath],\n label: group.label,\n options: group.options.map((option) => ({\n key: option.key,\n label: option.label,\n ...(option.detail ? { detail: option.detail } : {}),\n ...(option.tone ? { tone: option.tone } : {}),\n })),\n rootOptions:\n root?.options.map((option) => ({\n key: option.key,\n label: option.label,\n ...(option.detail ? { detail: option.detail } : {}),\n })) ?? [],\n });\n }\n\n private publish(snapshot: LeaderSnapshot): void {\n this.uiState.setLeader(snapshot);\n this.onSnapshot(snapshot);\n this.tui.requestRender();\n }\n\n private execute(action: DoomLeaderAction): void {\n if (action.type === 'app') {\n const handler = this.actionHandlers.get(action.action as AppKeybinding);\n if (handler) {\n handler();\n return;\n }\n if (action.action === APP_EXIT_ACTION) {\n this.onCtrlD?.();\n return;\n }\n this.onUnavailableAction(action.action);\n return;\n }\n if (action.type === 'command') {\n this.submitCommand(action.command.name, action.command.args);\n return;\n }\n if (this.onLeaderAction) this.onLeaderAction(action.source, action.action.name);\n else this.onUnavailableAction(`${action.source}:${action.action.name}`);\n }\n\n private submitCommand(commandName: string, args?: string): void {\n if (!this.isCommandAvailable(commandName)) {\n this.onUnavailableCommand(commandName);\n return;\n }\n const draft = this.getText();\n const command = `/${commandName}${args ? ` ${args}` : ''}`;\n this.setText('');\n try {\n this.onSubmit?.(command);\n } finally {\n this.setText(draft);\n }\n }\n\n private modeLabel(): string {\n if (this.leaderActive) return `LEADER ${[LEADER_PREFIX, ...this.leaderPath].join(' ')}`;\n return this.majorMode.toUpperCase();\n }\n\n private modeBadge(): string {\n const label = ` ${this.modeLabel()} `;\n const color = this.leaderActive ? HEADING_COLOR : ACCENT_COLOR;\n return this.chromeTheme.inverse(this.chromeTheme.bold(this.chromeTheme.fg(color, label)));\n }\n\n /**\n * The enabled modes, names only, beside the editor's own mode badge.\n *\n * Names only because this row is glanced at, not read: which modes are on is\n * the whole question here, and their sub-state belongs where there is room to\n * explain it. The leader panel carries that longer form.\n *\n * Empty when nothing is on, so an ordinary session pays no columns for a\n * feature it is not using.\n */\n private modeNames(): string {\n const modes = this.uiState.getModes();\n if (modes.length === 0) return '';\n const separator = this.chromeTheme.fg(DIM_COLOR, MODE_SEPARATOR);\n const names = modes.map((mode) => this.chromeTheme.fg(ACCENT_COLOR, mode.label.toLowerCase())).join(separator);\n return ` ${names}`;\n }\n\n private domainNames(): string {\n const domains = readDoomHarnessMetadata().domains;\n if (domains.length === 0) return '';\n return this.chromeTheme.fg(DIM_COLOR, ` ${domains.join(DOMAIN_SEPARATOR)}`);\n }\n\n private editorStatus(): string {\n if (this.leaderActive) return 'draft preserved · esc cancel';\n const draftLength = this.getText().length;\n return draftLength === 0 ? 'draft 0 · ^SPC leader · SPC shortcut' : `draft ${draftLength} · ^SPC leader`;\n }\n\n private editorLine(content: string, width: number, side: string): string {\n // No background fill: the frame alone delimits the editor, and a painted\n // interior reads as a shadow behind the prompt.\n return frameLine(padLine(content, width - FRAME_OVERHEAD), width, side, side);\n }\n\n private findBottomBorder(lines: string[], editorWidth: number): number {\n const threshold = Math.max(MIN_BORDER_SEGMENTS, editorWidth - BORDER_THRESHOLD_INSET);\n const index = lines.findIndex((line, lineIndex) => {\n if (lineIndex === 0) return false;\n return line.split(HORIZONTAL_BORDER).length - MIN_BORDER_SEGMENTS >= threshold;\n });\n return index > 0 ? index : lines.length - 1;\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- const require_rendering = require("./rendering.cjs");
2
- const require_index = require("../services/leaderRegistry/index.cjs");
3
- const require_harnessMetadata = require("../types/harnessMetadata.cjs");
4
- let _earendil_works_pi_coding_agent = require("@earendil-works/pi-coding-agent");
1
+ const require_rendering = require("./rendering-D_d6wdrK.cjs");
2
+ const require_leaderRegistry = require("./leaderRegistry-DKTjYB4q.cjs");
3
+ const require_harnessMetadata = require("./harnessMetadata-il7ns7Vq.cjs");
5
4
  let _earendil_works_pi_tui = require("@earendil-works/pi-tui");
5
+ let _earendil_works_pi_coding_agent = require("@earendil-works/pi-coding-agent");
6
6
  //#region src/tui/doomEditor.ts
7
7
  const MIN_CHROME_WIDTH = 12;
8
8
  const EDITOR_CHROME_INSET = 4;
@@ -56,7 +56,7 @@ var DoomEditor = class extends _earendil_works_pi_coding_agent.CustomEditor {
56
56
  this.uiState = uiState;
57
57
  this.onSnapshot = onSnapshot;
58
58
  this.chromeTheme = chromeTheme;
59
- this.leaderRegistry = leaderOptions.registry ?? new require_index.DoomLeaderRegistry();
59
+ this.leaderRegistry = leaderOptions.registry ?? new require_leaderRegistry.DoomLeaderRegistry();
60
60
  this.majorMode = leaderOptions.majorMode?.trim() || require_harnessMetadata.readDoomHarnessMetadata().majorMode;
61
61
  this.isCommandAvailable = leaderOptions.isCommandAvailable ?? (() => true);
62
62
  this.onUnavailableCommand = leaderOptions.onUnavailableCommand ?? (() => void 0);
@@ -269,6 +269,11 @@ var DoomEditor = class extends _earendil_works_pi_coding_agent.CustomEditor {
269
269
  }
270
270
  };
271
271
  //#endregion
272
- exports.DoomEditor = DoomEditor;
272
+ Object.defineProperty(exports, "DoomEditor", {
273
+ enumerable: true,
274
+ get: function() {
275
+ return DoomEditor;
276
+ }
277
+ });
273
278
 
274
- //# sourceMappingURL=doomEditor.cjs.map
279
+ //# sourceMappingURL=doomEditor-woICKPEH.cjs.map