@agimon-ai/doompi-ui 0.0.1-alpha.6 → 0.0.1-alpha.65

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 (383) hide show
  1. package/README.md +81 -19
  2. package/dist/_virtual/_rolldown/runtime.cjs +1 -1
  3. package/dist/adapters/pi/extension.cjs +2 -0
  4. package/dist/adapters/pi/extension.cjs.map +1 -0
  5. package/dist/adapters/pi/extension.d.cts +7 -0
  6. package/dist/adapters/pi/extension.d.cts.map +1 -0
  7. package/dist/adapters/pi/extension.d.mts +7 -0
  8. package/dist/adapters/pi/extension.d.mts.map +1 -0
  9. package/dist/adapters/pi/extension.mjs +2 -0
  10. package/dist/adapters/pi/extension.mjs.map +1 -0
  11. package/dist/adapters/pi/extensionName.cjs +2 -0
  12. package/dist/adapters/pi/extensionName.cjs.map +1 -0
  13. package/dist/adapters/pi/extensionName.d.cts +25 -0
  14. package/dist/adapters/pi/extensionName.d.cts.map +1 -0
  15. package/dist/adapters/pi/extensionName.d.mts +25 -0
  16. package/dist/adapters/pi/extensionName.d.mts.map +1 -0
  17. package/dist/adapters/pi/extensionName.mjs +2 -0
  18. package/dist/adapters/pi/extensionName.mjs.map +1 -0
  19. package/dist/adapters/pi/toolOverrides.cjs +2 -0
  20. package/dist/adapters/pi/toolOverrides.cjs.map +1 -0
  21. package/dist/adapters/pi/toolOverrides.mjs +2 -0
  22. package/dist/adapters/pi/toolOverrides.mjs.map +1 -0
  23. package/dist/adapters/telemetry/logSinkTelemetry.cjs +2 -0
  24. package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +1 -0
  25. package/dist/adapters/telemetry/logSinkTelemetry.d.cts +28 -0
  26. package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
  27. package/dist/adapters/telemetry/logSinkTelemetry.d.mts +28 -0
  28. package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -0
  29. package/dist/adapters/telemetry/logSinkTelemetry.mjs +2 -0
  30. package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +1 -0
  31. package/dist/components/configOverlay.cjs +0 -0
  32. package/dist/components/configOverlay.d.cts +0 -0
  33. package/dist/components/configOverlay.d.mts +0 -0
  34. package/dist/components/configOverlay.mjs +0 -0
  35. package/dist/components/doomEditor.cjs +1 -2
  36. package/dist/components/doomEditor.d.cts +2 -59
  37. package/dist/components/doomEditor.d.mts +2 -59
  38. package/dist/components/doomEditor.mjs +1 -2
  39. package/dist/components/doomFooter.cjs +1 -2
  40. package/dist/components/doomFooter.d.cts +2 -32
  41. package/dist/components/doomFooter.d.mts +2 -32
  42. package/dist/components/doomFooter.mjs +1 -2
  43. package/dist/components/doomHeader.cjs +1 -2
  44. package/dist/components/doomHeader.d.cts +2 -34
  45. package/dist/components/doomHeader.d.mts +2 -34
  46. package/dist/components/doomHeader.mjs +1 -2
  47. package/dist/components/doomOverlay.cjs +1 -2
  48. package/dist/components/doomOverlay.d.cts +2 -79
  49. package/dist/components/doomOverlay.d.mts +2 -79
  50. package/dist/components/doomOverlay.mjs +1 -2
  51. package/dist/components/leaderHints.cjs +1 -2
  52. package/dist/components/leaderHints.d.cts +2 -37
  53. package/dist/components/leaderHints.d.mts +2 -37
  54. package/dist/components/leaderHints.mjs +1 -2
  55. package/dist/components/matrixPicker.cjs +1 -0
  56. package/dist/components/matrixPicker.d.cts +2 -0
  57. package/dist/components/matrixPicker.d.mts +2 -0
  58. package/dist/components/matrixPicker.mjs +1 -0
  59. package/dist/components/toolsOverlay.cjs +1 -2
  60. package/dist/components/toolsOverlay.d.cts +2 -29
  61. package/dist/components/toolsOverlay.d.mts +2 -29
  62. package/dist/components/toolsOverlay.mjs +1 -2
  63. package/dist/config.cjs +1 -2
  64. package/dist/config.d.cts +2 -5
  65. package/dist/config.d.mts +2 -5
  66. package/dist/config.mjs +1 -2
  67. package/dist/extension.cjs +1 -2
  68. package/dist/extension.d.cts +2 -7
  69. package/dist/extension.d.mts +2 -7
  70. package/dist/extension.mjs +1 -2
  71. package/dist/extensionName.cjs +1 -2
  72. package/dist/extensionName.d.cts +2 -16
  73. package/dist/extensionName.d.mts +2 -16
  74. package/dist/extensionName.mjs +1 -2
  75. package/dist/extensions/pi.cjs +1 -1
  76. package/dist/extensions/pi.cjs.map +1 -1
  77. package/dist/extensions/pi.d.cts +1 -1
  78. package/dist/extensions/pi.d.mts +1 -1
  79. package/dist/extensions/pi.mjs +1 -1
  80. package/dist/extensions/pi.mjs.map +1 -1
  81. package/dist/footer.cjs +1 -2
  82. package/dist/footer.d.cts +2 -5
  83. package/dist/footer.d.mts +2 -5
  84. package/dist/footer.mjs +1 -2
  85. package/dist/harnessMetadata.cjs +1 -2
  86. package/dist/harnessMetadata.d.cts +2 -21
  87. package/dist/harnessMetadata.d.mts +2 -21
  88. package/dist/harnessMetadata.mjs +1 -2
  89. package/dist/hashlineRendering.cjs +1 -0
  90. package/dist/hashlineRendering.d.cts +2 -0
  91. package/dist/hashlineRendering.d.mts +2 -0
  92. package/dist/hashlineRendering.mjs +1 -0
  93. package/dist/index.cjs +1 -1
  94. package/dist/index.d.cts +15 -25
  95. package/dist/index.d.mts +15 -25
  96. package/dist/index.mjs +1 -1
  97. package/dist/leader.cjs +0 -1
  98. package/dist/leader.d.cts +2 -2
  99. package/dist/leader.d.mts +2 -2
  100. package/dist/leader.mjs +1 -1
  101. package/dist/leaderRegistry.cjs +1 -2
  102. package/dist/leaderRegistry.d.cts +2 -58
  103. package/dist/leaderRegistry.d.mts +2 -58
  104. package/dist/leaderRegistry.mjs +1 -2
  105. package/dist/logSinkTelemetry.cjs +1 -2
  106. package/dist/logSinkTelemetry.d.cts +2 -29
  107. package/dist/logSinkTelemetry.d.mts +2 -29
  108. package/dist/logSinkTelemetry.mjs +1 -2
  109. package/dist/rendering.cjs +1 -2
  110. package/dist/rendering.d.cts +4 -11
  111. package/dist/rendering.d.mts +4 -11
  112. package/dist/rendering.mjs +1 -2
  113. package/dist/services/hub/uiHub.cjs +2 -0
  114. package/dist/services/hub/uiHub.cjs.map +1 -0
  115. package/dist/services/hub/uiHub.mjs +2 -0
  116. package/dist/services/hub/uiHub.mjs.map +1 -0
  117. package/dist/services/leader/leaderRegistry.cjs +2 -0
  118. package/dist/services/leader/leaderRegistry.cjs.map +1 -0
  119. package/dist/services/leader/leaderRegistry.d.cts +58 -0
  120. package/dist/services/leader/leaderRegistry.d.cts.map +1 -0
  121. package/dist/services/leader/leaderRegistry.d.mts +58 -0
  122. package/dist/services/leader/leaderRegistry.d.mts.map +1 -0
  123. package/dist/services/leader/leaderRegistry.mjs +2 -0
  124. package/dist/services/leader/leaderRegistry.mjs.map +1 -0
  125. package/dist/services/state/uiState.cjs +2 -0
  126. package/dist/services/state/uiState.cjs.map +1 -0
  127. package/dist/services/state/uiState.d.cts +39 -0
  128. package/dist/services/state/uiState.d.cts.map +1 -0
  129. package/dist/services/state/uiState.d.mts +39 -0
  130. package/dist/services/state/uiState.d.mts.map +1 -0
  131. package/dist/services/state/uiState.mjs +2 -0
  132. package/dist/services/state/uiState.mjs.map +1 -0
  133. package/dist/services/tools/toolCost.cjs +3 -0
  134. package/dist/services/tools/toolCost.cjs.map +1 -0
  135. package/dist/services/tools/toolCost.d.cts +38 -0
  136. package/dist/services/tools/toolCost.d.cts.map +1 -0
  137. package/dist/services/tools/toolCost.d.mts +38 -0
  138. package/dist/services/tools/toolCost.d.mts.map +1 -0
  139. package/dist/services/tools/toolCost.mjs +3 -0
  140. package/dist/services/tools/toolCost.mjs.map +1 -0
  141. package/dist/services/tools/toolInventory.cjs +2 -0
  142. package/dist/services/tools/toolInventory.cjs.map +1 -0
  143. package/dist/services/tools/toolInventory.d.cts +63 -0
  144. package/dist/services/tools/toolInventory.d.cts.map +1 -0
  145. package/dist/services/tools/toolInventory.d.mts +63 -0
  146. package/dist/services/tools/toolInventory.d.mts.map +1 -0
  147. package/dist/services/tools/toolInventory.mjs +2 -0
  148. package/dist/services/tools/toolInventory.mjs.map +1 -0
  149. package/dist/skills.cjs +1 -1
  150. package/dist/skills.d.cts +2 -1
  151. package/dist/skills.d.mts +2 -1
  152. package/dist/skills.mjs +1 -1
  153. package/dist/theme.cjs +1 -2
  154. package/dist/theme.d.cts +2 -95
  155. package/dist/theme.d.mts +2 -95
  156. package/dist/theme.mjs +1 -2
  157. package/dist/toolChrome.cjs +1 -0
  158. package/dist/toolChrome.d.cts +2 -0
  159. package/dist/toolChrome.d.mts +2 -0
  160. package/dist/toolChrome.mjs +1 -0
  161. package/dist/toolInventory.cjs +1 -2
  162. package/dist/toolInventory.d.cts +3 -40
  163. package/dist/toolInventory.d.mts +3 -40
  164. package/dist/toolInventory.mjs +1 -2
  165. package/dist/tui/builtinToolRender.cjs +14 -0
  166. package/dist/tui/builtinToolRender.cjs.map +1 -0
  167. package/dist/tui/builtinToolRender.mjs +14 -0
  168. package/dist/tui/builtinToolRender.mjs.map +1 -0
  169. package/dist/tui/codeGutter.cjs +2 -0
  170. package/dist/tui/codeGutter.cjs.map +1 -0
  171. package/dist/tui/codeGutter.d.cts +8 -0
  172. package/dist/tui/codeGutter.d.cts.map +1 -0
  173. package/dist/tui/codeGutter.d.mts +8 -0
  174. package/dist/tui/codeGutter.d.mts.map +1 -0
  175. package/dist/tui/codeGutter.mjs +2 -0
  176. package/dist/tui/codeGutter.mjs.map +1 -0
  177. package/dist/tui/configOverlay.cjs +0 -0
  178. package/dist/tui/configOverlay.cjs.map +1 -0
  179. package/dist/tui/configOverlay.d.cts +78 -0
  180. package/dist/tui/configOverlay.d.cts.map +1 -0
  181. package/dist/tui/configOverlay.d.mts +78 -0
  182. package/dist/tui/configOverlay.d.mts.map +1 -0
  183. package/dist/tui/configOverlay.mjs +0 -0
  184. package/dist/tui/configOverlay.mjs.map +1 -0
  185. package/dist/tui/diffRender.cjs +4 -0
  186. package/dist/tui/diffRender.cjs.map +1 -0
  187. package/dist/tui/diffRender.d.cts +8 -0
  188. package/dist/tui/diffRender.d.cts.map +1 -0
  189. package/dist/tui/diffRender.d.mts +8 -0
  190. package/dist/tui/diffRender.d.mts.map +1 -0
  191. package/dist/tui/diffRender.mjs +4 -0
  192. package/dist/tui/diffRender.mjs.map +1 -0
  193. package/dist/tui/doomEditor.cjs +2 -0
  194. package/dist/tui/doomEditor.cjs.map +1 -0
  195. package/dist/tui/doomEditor.d.cts +62 -0
  196. package/dist/tui/doomEditor.d.cts.map +1 -0
  197. package/dist/tui/doomEditor.d.mts +62 -0
  198. package/dist/tui/doomEditor.d.mts.map +1 -0
  199. package/dist/tui/doomEditor.mjs +2 -0
  200. package/dist/tui/doomEditor.mjs.map +1 -0
  201. package/dist/tui/doomFooter.cjs +2 -0
  202. package/dist/tui/doomFooter.cjs.map +1 -0
  203. package/dist/tui/doomFooter.d.cts +44 -0
  204. package/dist/tui/doomFooter.d.cts.map +1 -0
  205. package/dist/tui/doomFooter.d.mts +44 -0
  206. package/dist/tui/doomFooter.d.mts.map +1 -0
  207. package/dist/tui/doomFooter.mjs +2 -0
  208. package/dist/tui/doomFooter.mjs.map +1 -0
  209. package/dist/tui/doomHeader.cjs +2 -0
  210. package/dist/tui/doomHeader.cjs.map +1 -0
  211. package/dist/tui/doomHeader.d.cts +33 -0
  212. package/dist/tui/doomHeader.d.cts.map +1 -0
  213. package/dist/tui/doomHeader.d.mts +33 -0
  214. package/dist/tui/doomHeader.d.mts.map +1 -0
  215. package/dist/tui/doomHeader.mjs +2 -0
  216. package/dist/tui/doomHeader.mjs.map +1 -0
  217. package/dist/tui/doomOverlay.cjs +2 -0
  218. package/dist/tui/doomOverlay.cjs.map +1 -0
  219. package/dist/tui/doomOverlay.d.cts +83 -0
  220. package/dist/tui/doomOverlay.d.cts.map +1 -0
  221. package/dist/tui/doomOverlay.d.mts +83 -0
  222. package/dist/tui/doomOverlay.d.mts.map +1 -0
  223. package/dist/tui/doomOverlay.mjs +2 -0
  224. package/dist/tui/doomOverlay.mjs.map +1 -0
  225. package/dist/tui/hashlineRendering.cjs +8 -0
  226. package/dist/tui/hashlineRendering.cjs.map +1 -0
  227. package/dist/tui/hashlineRendering.d.cts +20 -0
  228. package/dist/tui/hashlineRendering.d.cts.map +1 -0
  229. package/dist/tui/hashlineRendering.d.mts +20 -0
  230. package/dist/tui/hashlineRendering.d.mts.map +1 -0
  231. package/dist/tui/hashlineRendering.mjs +8 -0
  232. package/dist/tui/hashlineRendering.mjs.map +1 -0
  233. package/dist/tui/leaderHints.cjs +2 -0
  234. package/dist/tui/leaderHints.cjs.map +1 -0
  235. package/dist/tui/leaderHints.d.cts +49 -0
  236. package/dist/tui/leaderHints.d.cts.map +1 -0
  237. package/dist/tui/leaderHints.d.mts +49 -0
  238. package/dist/tui/leaderHints.d.mts.map +1 -0
  239. package/dist/tui/leaderHints.mjs +2 -0
  240. package/dist/tui/leaderHints.mjs.map +1 -0
  241. package/dist/tui/matrixPicker.cjs +2 -0
  242. package/dist/tui/matrixPicker.cjs.map +1 -0
  243. package/dist/tui/matrixPicker.d.cts +53 -0
  244. package/dist/tui/matrixPicker.d.cts.map +1 -0
  245. package/dist/tui/matrixPicker.d.mts +53 -0
  246. package/dist/tui/matrixPicker.d.mts.map +1 -0
  247. package/dist/tui/matrixPicker.mjs +2 -0
  248. package/dist/tui/matrixPicker.mjs.map +1 -0
  249. package/dist/tui/rendering.cjs +2 -0
  250. package/dist/tui/rendering.cjs.map +1 -0
  251. package/dist/tui/rendering.d.cts +15 -0
  252. package/dist/tui/rendering.d.cts.map +1 -0
  253. package/dist/tui/rendering.d.mts +15 -0
  254. package/dist/tui/rendering.d.mts.map +1 -0
  255. package/dist/tui/rendering.mjs +2 -0
  256. package/dist/tui/rendering.mjs.map +1 -0
  257. package/dist/tui/theme.cjs +2 -0
  258. package/dist/tui/theme.cjs.map +1 -0
  259. package/dist/tui/theme.d.cts +102 -0
  260. package/dist/tui/theme.d.cts.map +1 -0
  261. package/dist/tui/theme.d.mts +102 -0
  262. package/dist/tui/theme.d.mts.map +1 -0
  263. package/dist/tui/theme.mjs +2 -0
  264. package/dist/tui/theme.mjs.map +1 -0
  265. package/dist/tui/toolChrome.cjs +2 -0
  266. package/dist/tui/toolChrome.cjs.map +1 -0
  267. package/dist/tui/toolChrome.d.cts +43 -0
  268. package/dist/tui/toolChrome.d.cts.map +1 -0
  269. package/dist/tui/toolChrome.d.mts +43 -0
  270. package/dist/tui/toolChrome.d.mts.map +1 -0
  271. package/dist/tui/toolChrome.mjs +2 -0
  272. package/dist/tui/toolChrome.mjs.map +1 -0
  273. package/dist/tui/toolsOverlay.cjs +2 -0
  274. package/dist/tui/toolsOverlay.cjs.map +1 -0
  275. package/dist/tui/toolsOverlay.d.cts +28 -0
  276. package/dist/tui/toolsOverlay.d.cts.map +1 -0
  277. package/dist/tui/toolsOverlay.d.mts +28 -0
  278. package/dist/tui/toolsOverlay.d.mts.map +1 -0
  279. package/dist/tui/toolsOverlay.mjs +2 -0
  280. package/dist/tui/toolsOverlay.mjs.map +1 -0
  281. package/dist/types/harnessMetadata.cjs +2 -0
  282. package/dist/types/harnessMetadata.cjs.map +1 -0
  283. package/dist/types/harnessMetadata.d.cts +20 -0
  284. package/dist/types/harnessMetadata.d.cts.map +1 -0
  285. package/dist/types/harnessMetadata.d.mts +20 -0
  286. package/dist/types/harnessMetadata.d.mts.map +1 -0
  287. package/dist/types/harnessMetadata.mjs +2 -0
  288. package/dist/types/harnessMetadata.mjs.map +1 -0
  289. package/dist/uiState.cjs +1 -2
  290. package/dist/uiState.d.cts +2 -37
  291. package/dist/uiState.d.mts +2 -37
  292. package/dist/uiState.mjs +1 -2
  293. package/package.json +64 -19
  294. package/src/exports/webClient.ts +1 -0
  295. package/src/web/components/FindToolMessage.tsx +32 -0
  296. package/src/web/components/ListingBody.tsx +57 -0
  297. package/src/web/components/LsToolMessage.tsx +32 -0
  298. package/src/web/components/WriteToolMessage.tsx +98 -0
  299. package/src/web/index.ts +19 -0
  300. package/src/web/lib/builtinToolView.ts +127 -0
  301. package/src/web/tsconfig.json +23 -0
  302. package/themes/doom-pi-dark.json +32 -30
  303. package/dist/_virtual/_rolldown/runtime.mjs +0 -1
  304. package/dist/components/configOverlay.cjs.map +0 -1
  305. package/dist/components/configOverlay.d.cts.map +0 -1
  306. package/dist/components/configOverlay.d.mts.map +0 -1
  307. package/dist/components/configOverlay.mjs.map +0 -1
  308. package/dist/components/doomEditor.cjs.map +0 -1
  309. package/dist/components/doomEditor.d.cts.map +0 -1
  310. package/dist/components/doomEditor.d.mts.map +0 -1
  311. package/dist/components/doomEditor.mjs.map +0 -1
  312. package/dist/components/doomFooter.cjs.map +0 -1
  313. package/dist/components/doomFooter.d.cts.map +0 -1
  314. package/dist/components/doomFooter.d.mts.map +0 -1
  315. package/dist/components/doomFooter.mjs.map +0 -1
  316. package/dist/components/doomHeader.cjs.map +0 -1
  317. package/dist/components/doomHeader.d.cts.map +0 -1
  318. package/dist/components/doomHeader.d.mts.map +0 -1
  319. package/dist/components/doomHeader.mjs.map +0 -1
  320. package/dist/components/doomOverlay.cjs.map +0 -1
  321. package/dist/components/doomOverlay.d.cts.map +0 -1
  322. package/dist/components/doomOverlay.d.mts.map +0 -1
  323. package/dist/components/doomOverlay.mjs.map +0 -1
  324. package/dist/components/leaderHints.cjs.map +0 -1
  325. package/dist/components/leaderHints.d.cts.map +0 -1
  326. package/dist/components/leaderHints.d.mts.map +0 -1
  327. package/dist/components/leaderHints.mjs.map +0 -1
  328. package/dist/components/toolsOverlay.cjs.map +0 -1
  329. package/dist/components/toolsOverlay.d.cts.map +0 -1
  330. package/dist/components/toolsOverlay.d.mts.map +0 -1
  331. package/dist/components/toolsOverlay.mjs.map +0 -1
  332. package/dist/config.cjs.map +0 -1
  333. package/dist/config.d.cts.map +0 -1
  334. package/dist/config.d.mts.map +0 -1
  335. package/dist/config.mjs.map +0 -1
  336. package/dist/extension.cjs.map +0 -1
  337. package/dist/extension.d.cts.map +0 -1
  338. package/dist/extension.d.mts.map +0 -1
  339. package/dist/extension.mjs.map +0 -1
  340. package/dist/extensionName.cjs.map +0 -1
  341. package/dist/extensionName.d.cts.map +0 -1
  342. package/dist/extensionName.d.mts.map +0 -1
  343. package/dist/extensionName.mjs.map +0 -1
  344. package/dist/footer.cjs.map +0 -1
  345. package/dist/footer.d.cts.map +0 -1
  346. package/dist/footer.d.mts.map +0 -1
  347. package/dist/footer.mjs.map +0 -1
  348. package/dist/harnessMetadata.cjs.map +0 -1
  349. package/dist/harnessMetadata.d.cts.map +0 -1
  350. package/dist/harnessMetadata.d.mts.map +0 -1
  351. package/dist/harnessMetadata.mjs.map +0 -1
  352. package/dist/leaderRegistry.cjs.map +0 -1
  353. package/dist/leaderRegistry.d.cts.map +0 -1
  354. package/dist/leaderRegistry.d.mts.map +0 -1
  355. package/dist/leaderRegistry.mjs.map +0 -1
  356. package/dist/logSinkTelemetry.cjs.map +0 -1
  357. package/dist/logSinkTelemetry.d.cts.map +0 -1
  358. package/dist/logSinkTelemetry.d.mts.map +0 -1
  359. package/dist/logSinkTelemetry.mjs.map +0 -1
  360. package/dist/mode.cjs +0 -2
  361. package/dist/mode.cjs.map +0 -1
  362. package/dist/mode.d.cts +0 -5
  363. package/dist/mode.d.cts.map +0 -1
  364. package/dist/mode.d.mts +0 -5
  365. package/dist/mode.d.mts.map +0 -1
  366. package/dist/mode.mjs +0 -2
  367. package/dist/mode.mjs.map +0 -1
  368. package/dist/rendering.cjs.map +0 -1
  369. package/dist/rendering.d.cts.map +0 -1
  370. package/dist/rendering.d.mts.map +0 -1
  371. package/dist/rendering.mjs.map +0 -1
  372. package/dist/theme.cjs.map +0 -1
  373. package/dist/theme.d.cts.map +0 -1
  374. package/dist/theme.d.mts.map +0 -1
  375. package/dist/theme.mjs.map +0 -1
  376. package/dist/toolInventory.cjs.map +0 -1
  377. package/dist/toolInventory.d.cts.map +0 -1
  378. package/dist/toolInventory.d.mts.map +0 -1
  379. package/dist/toolInventory.mjs.map +0 -1
  380. package/dist/uiState.cjs.map +0 -1
  381. package/dist/uiState.d.cts.map +0 -1
  382. package/dist/uiState.d.mts.map +0 -1
  383. package/dist/uiState.mjs.map +0 -1
package/README.md CHANGED
@@ -1,40 +1,102 @@
1
1
  # @agimon-ai/doompi-ui
2
2
 
3
- Doom-inspired interactive UI extension for Pi.
3
+ DoomPi's shared terminal interface, Leader Space host, theme, overlays, and UI registries.
4
4
 
5
- Owns the leader state machine, rendering, conflict handling, and the core key bindings.
6
- Space opens the leader only when the draft is empty, so a half-written prompt is never lost
7
- to a keystroke.
5
+ The [DoomPi distribution](https://www.npmjs.com/package/@agimon-ai/doompi) loads this package as
6
+ core. Extension authors can depend on its public contracts without adopting the full distribution.
8
7
 
9
- Part of [Doompi](https://www.npmjs.com/package/@agimon-ai/doompi), a coding agent that loads
10
- only the skills and tools you name. This package is composed by Doompi and is not usually
11
- installed on its own.
8
+ > **Alpha:** UI and contribution contracts may change between releases.
9
+
10
+ ## Requirements
11
+
12
+ - Node.js 22.19.0 or newer
13
+ - Pi 0.85.0
14
+ - Pi TUI 0.85.0
12
15
 
13
16
  ## Install
14
17
 
18
+ To load the UI directly in Pi:
19
+
15
20
  ```bash
16
- npm install @agimon-ai/doompi-ui
21
+ pi install npm:@agimon-ai/doompi-ui
22
+ ```
23
+
24
+ DoomPi users should not add it to a layer; the distribution loads it before layer contributions.
25
+
26
+ ## Commands and keys
27
+
28
+ | Input | Behavior |
29
+ | ------------ | ---------------------------------------------------------------------------------- |
30
+ | `Ctrl+Space` | Opens Leader Space from anywhere in the editor |
31
+ | `SPC` | Opens Leader Space only when the current draft is empty; otherwise inserts a space |
32
+ | `/tools` | Opens the current tool and MCP inventory |
33
+ | `/config` | Opens settings contributed by active extensions |
34
+
35
+ The registry rejects or diagnoses conflicting Leader contributions instead of silently replacing
36
+ an existing binding. Diagnostics are recorded through telemetry and shown as TUI warnings when a
37
+ UI is attached.
38
+
39
+ ## Contribute to Leader Space
40
+
41
+ ```ts
42
+ import { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-extension-contracts/ui-hub';
43
+ import type { Context } from '@deepseek-ai/cordis';
44
+
45
+ export function reviewPlugin(ctx: Context): void {
46
+ ctx.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {
47
+ const contribution = requireDoomUiHub(uiContext).registerLeader({
48
+ source: '@example/review-extension',
49
+ bindings: [
50
+ {
51
+ id: 'review.open',
52
+ path: [{ key: 'r', label: 'review', detail: 'open review tools' }],
53
+ command: { name: 'review' },
54
+ },
55
+ ],
56
+ });
57
+ return () => contribution.dispose();
58
+ });
59
+ }
17
60
  ```
18
61
 
19
- ## How it loads
62
+ Mount this plugin beneath the shared Doom Cordis host. Cordis retracts the registration when either
63
+ the contributor or UI provider disappears, so reloads cannot retain stale bindings.
20
64
 
21
- Doompi loads this unconditionally. It is core, not a layer, so it does not appear in
22
- `.doom/modes.yaml`: making it optional would only create broken configurations.
65
+ ## TUI and headless sessions
23
66
 
24
- Extension entry: `@agimon-ai/doompi-ui/extensions/pi`
67
+ The editor, header, footer, overlays, Leader menu, and notifications require an interactive TUI.
68
+ The underlying typed contribution registries can still be installed and queried in headless
69
+ sessions, but UI-only commands have no panel to render. Provide a tool, RPC, or CLI route when a
70
+ capability must also work headlessly.
25
71
 
26
- ## Leader
72
+ ## Theme
27
73
 
28
- `SPC e c` opens the config panel, once the extension is loaded.
74
+ The package publishes `@agimon-ai/doompi-ui/themes/doom-pi-dark.json`. DoomPi synchronizes that
75
+ resource and selects it by default. Set `DOOMPI_THEME` to select another available Pi theme for the
76
+ UI adapter.
29
77
 
30
- ## Notes
78
+ ## Public API
31
79
 
32
- Other extensions contribute bindings through the public `@agimon-ai/doompi-ui/leader` API
33
- rather than hardcoding chords.
80
+ Declared exports cover UI state, rendering, tool chrome, header/footer/editor components,
81
+ configuration and tools overlays, telemetry integration, and theme helpers. Contribution schemas
82
+ and the direct UI hub service live in extension contracts. Use these exports rather than importing
83
+ generated `dist` paths.
34
84
 
35
- ## Entry points
85
+ ```ts
86
+ import { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-extension-contracts/ui-hub';
87
+ import { DEFAULT_THEME_NAME } from '@agimon-ai/doompi-ui/theme';
88
+ ```
89
+
90
+ ## Development
91
+
92
+ ```bash
93
+ pnpm build
94
+ pnpm typecheck
95
+ pnpm test
96
+ pnpm lint
97
+ ```
36
98
 
37
- 24 subpaths are declared in the `exports` field of `package.json`.
99
+ Maintained by [Agimon](https://agimon.ai/about).
38
100
 
39
101
  ## License
40
102
 
@@ -1 +1 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(e,t,n)=>(s(e,t,`default`),n&&s(n,t,`default`)),l=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));exports.__exportAll=o,exports.__reExport=c,exports.__toESM=l;
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));exports.__toESM=s;
@@ -0,0 +1,2 @@
1
+ const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../services/leader/leaderRegistry.cjs"),n=require("../../services/hub/uiHub.cjs"),r=require("../../services/state/uiState.cjs"),i=require("../../services/tools/toolInventory.cjs"),a=require("../../tui/configOverlay.cjs"),o=require("../../tui/doomEditor.cjs"),s=require("../../tui/doomFooter.cjs"),c=require("../../tui/doomHeader.cjs"),l=require("../../tui/leaderHints.cjs");require("../../tui/theme.cjs");const u=require("../../tui/toolsOverlay.cjs"),d=require("../telemetry/logSinkTelemetry.cjs"),f=require("./extensionName.cjs"),p=require("./toolOverrides.cjs");let m=require("node:path");m=e.__toESM(m,1);let h=require("@agimon-ai/doompi-extension-contracts/cordis-host"),g=require("@agimon-ai/doompi-extension-contracts/mcp-status"),_=require("@agimon-ai/doompi-extension-contracts/notification"),v=require("@agimon-ai/doompi-extension-contracts/mode"),y=require("@agimon-ai/doompi-extension-contracts/ui-hub"),b=require("@agimon-ai/doompi-extension-contracts/tool-overrides");const x=`doom-pi-leader`,S=`belowEditor`,C=`warning`,w=`doom-pi`,T=new Set([`hotkeys`]),E=`@agimon-ai/doompi-ui`;function D(e,t,n,r){let i=(0,_.readDoomNotificationService)(e);if(i){try{Promise.resolve(i.request({body:n,level:r})).catch(()=>void 0)}catch{}return}t.ui.notify(n,r)}function O(e,t){let n=e.trim().replace(/\s+/g,` `);if(!n)return;let r=n.slice(0,64).trimEnd();return`${w} · ${r} · ${m.default.basename(t)||t}`}function k(e,{pi:h,telemetry:_,hostMode:k}){e.inject([b.DOOM_TOOL_OVERRIDES_SERVICE],e=>{let t=(0,b.requireDoomToolOverrides)(e),n=[],r=e=>{if(k===`composed`)return!0;let r=t.claim({source:E,tools:[e]});return r.granted&&n.push(r),r.granted};try{p.registerBuiltinToolUi(h,process.cwd(),r)}catch(e){for(let e of n)e.dispose();throw e}return()=>{for(let e of n)e.dispose()}});let A=new r.DoomUiState,j=new t.DoomLeaderRegistry,M=new Set,N,P,F=0,I=!1,L=()=>(0,g.readDoomMcpStatus)(e)?.getSnapshot().servers;h.registerCommand(`tools`,{description:`Browse the tools available in this session`,handler:async(e,t)=>{let n=L(),r=i.buildToolSources({tools:h.getAllTools(),activeTools:h.getActiveTools(),...n?{mcpServers:n}:{},resolveExtensionName:f.extensionName,resolveExtensionPackageName:f.extensionPackageName,resolveExtensionToolSource:e=>f.extensionToolSource(h,e)});await u.openToolsOverlay(t,r)}}),h.registerCommand(`config`,{description:`Browse and change the settings extensions contribute`,handler:async(e,t)=>{await a.openConfigOverlay(t,z.config)}});let R=t=>{for(let n of t){let t=n.bindingId?` (${n.bindingId})`:``,r=`Leader contribution from ${n.source}${t}: ${n.message}`;M.has(r)||(M.add(r),_.recordWarning(d.UI_EVENT.leaderContributionRejected,n.message,{"leader.source":n.source,...n.bindingId?{"leader.binding.id":n.bindingId}:{}}),P?.mode===`tui`&&D(e,P,r,C))}},z=n.createDoomUiHub({leaderRegistry:j,reportDiagnostics:R});e.provide(y.DOOM_UI_HUB_SERVICE,z),e.inject([v.DOOM_MINOR_MODE_CATALOG_SERVICE],e=>{let t=(0,v.createMinorModeCatalogClient)((0,v.requireMinorModeCatalog)(e)),n=()=>A.setModes(r.projectMinorModeRecords(t.list())),i=t.subscribe(n);return n(),()=>{i(),A.setModes([])}}),h.on(`session_start`,(t,n)=>{P=n,z.setContext(n);let r=++F;if(R(j.flush()),I=n.sessionManager.getEntries().some(e=>e.type===`message`),n.mode!==`tui`)return;for(let t of M)D(e,n,t,C);let i=process.env.DOOMPI_THEME||`doom-pi-dark`,a=n.ui.setTheme(i);a.success||(D(e,n,`Could not apply Doom Pi theme: ${a.error}`,C),_.recordWarning(d.UI_EVENT.themeApplyFailed,a.error??`Unknown theme error`,{"ui.theme":i})),n.ui.setTitle(`${w} · ${m.default.basename(n.cwd)||n.cwd} · pi/coding`),n.ui.setHeader((e,t)=>new c.DoomHeader(t,n.cwd,void 0,n,()=>e.terminal.rows)),n.ui.setFooter((e,t,r)=>(N=r,new s.DoomFooter(e,t,n,r,z.footer,A))),n.ui.setEditorComponent((t,i,a)=>new o.DoomEditor(t,i,a,A,e=>{if(!e.active){n.ui.setWidget(x,void 0,{placement:S});return}n.ui.setWidget(x,(t,r)=>new l.LeaderHints(r,e,n,N,A.getModes()),{placement:S})},void 0,n.ui.theme,{registry:j,isCommandAvailable:e=>T.has(e)||h.getCommands().some(t=>t.name===e),onLeaderAction:(t,i)=>{if(P!==n||F!==r){D(e,n,`Leader action ${i} is unavailable.`,C);return}z.invokeLeaderAction(t,i)},onUnavailableCommand:t=>{_.recordWarning(d.UI_EVENT.leaderCommandUnavailable,`Leader command /${t} is unavailable.`,{"ui.kind":`command`}),D(e,n,`Leader command /${t} is unavailable.`,C)},onUnavailableAction:t=>{_.recordWarning(d.UI_EVENT.leaderActionUnavailable,`Leader action ${t} is unavailable.`,{"ui.kind":`action`}),D(e,n,`Leader action ${t} is unavailable.`,C)}})),_.recordEvent(d.UI_EVENT.shellInstalled,{"ui.theme":i,"ui.theme.applied":a.success,"ui.leader.group.count":j.getGroup([])?.options.length??0})}),h.on(`input`,(e,t)=>{if(t.mode!==`tui`||e.source!==`interactive`||I)return;I=!0;let n=O(e.text,t.cwd);n&&t.ui.setTitle(n)}),e.effect(()=>async()=>{let e=P;++F,P=void 0,z.setContext(void 0),N=void 0,z.dispose(),A.reset(),e?.mode===`tui`&&e.ui.setWidget(x,void 0,{placement:S}),await _.shutdown()},E)}async function A(e,t=d.createUiTelemetry()){let n=await(0,h.connectDoomCordisHost)(e,E),r=n.root.plugin(k,{pi:e,telemetry:t,hostMode:n.runtime.mode});try{await r}catch(e){try{await r.dispose()}finally{await n.dispose()}throw e}let i;e.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await n.dispose()}})())}exports.doomPiUiExtension=A;
2
+ //# sourceMappingURL=extension.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.cjs","names":["readDoomNotificationService","path","DOOM_TOOL_OVERRIDES_SERVICE","requireDoomToolOverrides","DoomUiState","DoomLeaderRegistry","readDoomMcpStatus","buildToolSources","extensionName","extensionPackageName","extensionToolSource","openToolsOverlay","openConfigOverlay","UI_EVENT","createDoomUiHub","DOOM_UI_HUB_SERVICE","DOOM_MINOR_MODE_CATALOG_SERVICE","createMinorModeCatalogClient","requireMinorModeCatalog","projectMinorModeRecords","DoomHeader","DoomFooter","DoomEditor","LeaderHints","createUiTelemetry","connectDoomCordisHost"],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import path from 'node:path';\nimport { connectDoomCordisHost, type DoomCordisHostMode } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { readDoomMcpStatus } from '@agimon-ai/doompi-extension-contracts/mcp-status';\nimport {\n type DoomNotificationLevel,\n readDoomNotificationService,\n} from '@agimon-ai/doompi-extension-contracts/notification';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n createMinorModeCatalogClient,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport {\n DOOM_TOOL_OVERRIDES_SERVICE,\n type DoomToolOverrideRegistration,\n requireDoomToolOverrides,\n} from '@agimon-ai/doompi-extension-contracts/tool-overrides';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, ReadonlyFooterDataProvider } from '@earendil-works/pi-coding-agent';\nimport { type DoomLeaderDiagnostic, DoomLeaderRegistry } from '../../services/leader/leaderRegistry.ts';\nimport { createDoomUiHub } from '../../services/hub/uiHub.ts';\nimport { DoomUiState, type LeaderSnapshot, projectMinorModeRecords } from '../../services/state/uiState.ts';\nimport { buildToolSources, type McpServerStatus } from '../../services/tools/toolInventory.ts';\nimport { openConfigOverlay } from '../../tui/configOverlay.ts';\nimport { DoomEditor } from '../../tui/doomEditor.ts';\nimport { DoomFooter } from '../../tui/doomFooter.ts';\nimport { DoomHeader } from '../../tui/doomHeader.ts';\nimport { LeaderHints } from '../../tui/leaderHints.ts';\nimport { DEFAULT_THEME_NAME } from '../../tui/theme.ts';\nimport { openToolsOverlay } from '../../tui/toolsOverlay.ts';\nimport { createUiTelemetry, UI_EVENT, type UiTelemetry } from '../telemetry/logSinkTelemetry.ts';\nimport { extensionName, extensionPackageName, extensionToolSource } from './extensionName.ts';\nimport { registerBuiltinToolUi } from './toolOverrides.ts';\n\nconst LEADER_WIDGET_KEY = 'doom-pi-leader';\nconst TUI_MODE = 'tui';\nconst WIDGET_PLACEMENT = 'belowEditor';\nconst WARNING_STYLE = 'warning';\nconst THEME_ENVIRONMENT_KEY = 'DOOMPI_THEME';\nconst HOTKEYS_COMMAND = 'hotkeys';\nconst TOOLS_COMMAND = 'tools';\nconst CONFIG_COMMAND = 'config';\nconst SESSION_START_EVENT = 'session_start';\nconst SESSION_MESSAGE_ENTRY = 'message';\nconst INPUT_EVENT = 'input';\nconst INTERACTIVE_INPUT_SOURCE = 'interactive';\nconst SESSION_SHUTDOWN_EVENT = 'session_shutdown';\nconst TITLE_MESSAGE_MAX_LENGTH = 64;\nconst TITLE_PREFIX = 'doom-pi';\nconst BUILTIN_LEADER_COMMANDS = new Set([HOTKEYS_COMMAND]);\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-ui';\n\nfunction notify(cordis: Context, context: ExtensionContext, body: string, level: DoomNotificationLevel): void {\n const service = readDoomNotificationService(cordis);\n if (service) {\n try {\n void Promise.resolve(service.request({ body, level })).catch(() => undefined);\n } catch {\n // Notification delivery is best effort and does not fall back after routing.\n }\n return;\n }\n context.ui.notify(body, level);\n}\n\nfunction createMessageTitle(message: string, cwd: string): string | undefined {\n const normalizedMessage = message.trim().replace(/\\s+/g, ' ');\n if (!normalizedMessage) return undefined;\n const messageTitle = normalizedMessage.slice(0, TITLE_MESSAGE_MAX_LENGTH).trimEnd();\n return `${TITLE_PREFIX} · ${messageTitle} · ${path.basename(cwd) || cwd}`;\n}\n\ninterface UiPluginOptions {\n readonly pi: ExtensionAPI;\n readonly telemetry: UiTelemetry;\n readonly hostMode: DoomCordisHostMode;\n}\n\nfunction doomPiUiPlugin(cordis: Context, { pi, telemetry, hostMode }: UiPluginOptions): void {\n cordis.inject([DOOM_TOOL_OVERRIDES_SERVICE], (overridesContext) => {\n const toolOverrides = requireDoomToolOverrides(overridesContext);\n const registrations: DoomToolOverrideRegistration[] = [];\n const shouldRegister = (tool: string): boolean => {\n if (hostMode === 'composed') return true;\n const registration = toolOverrides.claim({ source: PACKAGE_SOURCE, tools: [tool] });\n if (registration.granted) registrations.push(registration);\n return registration.granted;\n };\n try {\n registerBuiltinToolUi(pi, process.cwd(), shouldRegister);\n } catch (error) {\n for (const registration of registrations) registration.dispose();\n throw error;\n }\n return () => {\n for (const registration of registrations) registration.dispose();\n };\n });\n const uiState = new DoomUiState();\n const leaderRegistry = new DoomLeaderRegistry();\n const pendingDiagnostics = new Set<string>();\n let footerData: ReadonlyFooterDataProvider | undefined;\n let activeContext: ExtensionContext | undefined;\n let sessionGeneration = 0;\n let hasSessionMessage = false;\n\n /**\n * Asks the MCP extension what it is currently connected to.\n *\n * No answer is a normal session: `--no-mcp` leaves nobody providing the query,\n * and the panel simply lists MCP tools under the extension that registered them.\n */\n const readMcpServers = (): readonly McpServerStatus[] | undefined => readDoomMcpStatus(cordis)?.getSnapshot().servers;\n\n pi.registerCommand(TOOLS_COMMAND, {\n description: 'Browse the tools available in this session',\n handler: async (_args, ctx) => {\n // Read at open time so a reconnected server or a plan-mode tool swap shows\n // up without restarting the session.\n const mcpServers = readMcpServers();\n const sources = buildToolSources({\n tools: pi.getAllTools(),\n activeTools: pi.getActiveTools(),\n ...(mcpServers ? { mcpServers } : {}),\n resolveExtensionName: extensionName,\n resolveExtensionPackageName: extensionPackageName,\n resolveExtensionToolSource: (toolName) => extensionToolSource(pi, toolName),\n });\n await openToolsOverlay(ctx, sources);\n },\n });\n\n pi.registerCommand(CONFIG_COMMAND, {\n description: 'Browse and change the settings extensions contribute',\n handler: async (_args, ctx) => {\n // The registry is passed live rather than snapshotted: a contributor can be\n // fetching or installing something while the panel is open, and that\n // progress is meant to land in it.\n await openConfigOverlay(ctx, hub.config);\n },\n });\n\n const reportDiagnostics = (diagnostics: readonly DoomLeaderDiagnostic[]): void => {\n for (const diagnostic of diagnostics) {\n const binding = diagnostic.bindingId ? ` (${diagnostic.bindingId})` : '';\n const message = `Leader contribution from ${diagnostic.source}${binding}: ${diagnostic.message}`;\n if (pendingDiagnostics.has(message)) continue;\n pendingDiagnostics.add(message);\n // A rejected contribution silently drops another extension's keybindings,\n // and the notice below only reaches a run that has a TUI attached.\n void telemetry.recordWarning(UI_EVENT.leaderContributionRejected, diagnostic.message, {\n 'leader.source': diagnostic.source,\n ...(diagnostic.bindingId ? { 'leader.binding.id': diagnostic.bindingId } : {}),\n });\n if (activeContext?.mode === TUI_MODE) notify(cordis, activeContext, message, WARNING_STYLE);\n }\n };\n\n const hub = createDoomUiHub({ leaderRegistry, reportDiagnostics });\n cordis.provide(DOOM_UI_HUB_SERVICE, hub);\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (modeContext) => {\n const catalog = createMinorModeCatalogClient(requireMinorModeCatalog(modeContext));\n const update = (): void => uiState.setModes(projectMinorModeRecords(catalog.list()));\n const dispose = catalog.subscribe(update);\n update();\n return () => {\n dispose();\n uiState.setModes([]);\n };\n });\n\n pi.on(SESSION_START_EVENT, (_event, ctx) => {\n activeContext = ctx;\n hub.setContext(ctx);\n const activeGeneration = ++sessionGeneration;\n reportDiagnostics(leaderRegistry.flush());\n hasSessionMessage = ctx.sessionManager.getEntries().some((entry) => entry.type === SESSION_MESSAGE_ENTRY);\n if (ctx.mode !== TUI_MODE) return;\n for (const message of pendingDiagnostics) notify(cordis, ctx, message, WARNING_STYLE);\n\n const themeName = process.env[THEME_ENVIRONMENT_KEY] || DEFAULT_THEME_NAME;\n const themeResult = ctx.ui.setTheme(themeName);\n if (!themeResult.success) {\n notify(cordis, ctx, `Could not apply Doom Pi theme: ${themeResult.error}`, WARNING_STYLE);\n void telemetry.recordWarning(UI_EVENT.themeApplyFailed, themeResult.error ?? 'Unknown theme error', {\n 'ui.theme': themeName,\n });\n }\n\n ctx.ui.setTitle(`${TITLE_PREFIX} · ${path.basename(ctx.cwd) || ctx.cwd} · pi/coding`);\n ctx.ui.setHeader((tui, theme) => new DoomHeader(theme, ctx.cwd, undefined, ctx, () => tui.terminal.rows));\n ctx.ui.setFooter((tui, theme, data) => {\n footerData = data;\n return new DoomFooter(tui, theme, ctx, data, hub.footer, uiState);\n });\n ctx.ui.setEditorComponent(\n (tui, editorTheme, keybindings) =>\n new DoomEditor(\n tui,\n editorTheme,\n keybindings,\n uiState,\n (snapshot: LeaderSnapshot) => {\n if (!snapshot.active) {\n ctx.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n return;\n }\n ctx.ui.setWidget(\n LEADER_WIDGET_KEY,\n (_widgetTui, widgetTheme) => new LeaderHints(widgetTheme, snapshot, ctx, footerData, uiState.getModes()),\n { placement: WIDGET_PLACEMENT },\n );\n },\n undefined,\n ctx.ui.theme,\n {\n registry: leaderRegistry,\n isCommandAvailable: (commandName) =>\n BUILTIN_LEADER_COMMANDS.has(commandName) ||\n pi.getCommands().some((command) => command.name === commandName),\n onLeaderAction: (source, action) => {\n if (activeContext !== ctx || sessionGeneration !== activeGeneration) {\n notify(cordis, ctx, `Leader action ${action} is unavailable.`, WARNING_STYLE);\n return;\n }\n hub.invokeLeaderAction(source, action);\n },\n onUnavailableCommand: (commandName) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderCommandUnavailable,\n `Leader command /${commandName} is unavailable.`,\n { 'ui.kind': 'command' },\n );\n notify(cordis, ctx, `Leader command /${commandName} is unavailable.`, WARNING_STYLE);\n },\n onUnavailableAction: (action) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderActionUnavailable,\n `Leader action ${action} is unavailable.`,\n {\n 'ui.kind': 'action',\n },\n );\n notify(cordis, ctx, `Leader action ${action} is unavailable.`, WARNING_STYLE);\n },\n },\n ),\n );\n\n void telemetry.recordEvent(UI_EVENT.shellInstalled, {\n 'ui.theme': themeName,\n 'ui.theme.applied': themeResult.success,\n 'ui.leader.group.count': leaderRegistry.getGroup([])?.options.length ?? 0,\n });\n });\n\n pi.on(INPUT_EVENT, (event, ctx) => {\n if (ctx.mode !== TUI_MODE || event.source !== INTERACTIVE_INPUT_SOURCE || hasSessionMessage) return;\n hasSessionMessage = true;\n const title = createMessageTitle(event.text, ctx.cwd);\n if (title) ctx.ui.setTitle(title);\n });\n\n cordis.effect(\n () => async () => {\n const context = activeContext;\n ++sessionGeneration;\n activeContext = undefined;\n hub.setContext(undefined);\n footerData = undefined;\n hub.dispose();\n uiState.reset();\n if (context?.mode === TUI_MODE) {\n context.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n }\n await telemetry.shutdown();\n },\n PACKAGE_SOURCE,\n );\n}\n\n/** The package's standard Pi factory, mounted under the session Cordis host. */\nexport async function doomPiUiExtension(pi: ExtensionAPI, telemetry: UiTelemetry = createUiTelemetry()): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(doomPiUiPlugin, { pi, telemetry, hostMode: connection.runtime.mode });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n\n let disposal: Promise<void> | undefined;\n pi.on(\n SESSION_SHUTDOWN_EVENT,\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { UiTelemetry } from "../telemetry/logSinkTelemetry.cjs";
2
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
3
+ //#region src/adapters/pi/extension.d.ts
4
+ /** The package's standard Pi factory, mounted under the session Cordis host. */
5
+ export declare function doomPiUiExtension(pi: ExtensionAPI, telemetry?: UiTelemetry): Promise<void>;
6
+ //#endregion
7
+ //# sourceMappingURL=extension.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.cts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;;wBA2RsB,kBAAkB,IAAI,cAAc,YAAW,cAAoC"}
@@ -0,0 +1,7 @@
1
+ import { UiTelemetry } from "../telemetry/logSinkTelemetry.mjs";
2
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
3
+ //#region src/adapters/pi/extension.d.ts
4
+ /** The package's standard Pi factory, mounted under the session Cordis host. */
5
+ export declare function doomPiUiExtension(pi: ExtensionAPI, telemetry?: UiTelemetry): Promise<void>;
6
+ //#endregion
7
+ //# sourceMappingURL=extension.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.mts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;;wBA2RsB,kBAAkB,IAAI,cAAc,YAAW,cAAoC"}
@@ -0,0 +1,2 @@
1
+ import{DoomLeaderRegistry as e}from"../../services/leader/leaderRegistry.mjs";import{createDoomUiHub as t}from"../../services/hub/uiHub.mjs";import{DoomUiState as n,projectMinorModeRecords as r}from"../../services/state/uiState.mjs";import{buildToolSources as i}from"../../services/tools/toolInventory.mjs";import{openConfigOverlay as a}from"../../tui/configOverlay.mjs";import{DoomEditor as o}from"../../tui/doomEditor.mjs";import{DoomFooter as s}from"../../tui/doomFooter.mjs";import{DoomHeader as c}from"../../tui/doomHeader.mjs";import{LeaderHints as l}from"../../tui/leaderHints.mjs";import"../../tui/theme.mjs";import{openToolsOverlay as u}from"../../tui/toolsOverlay.mjs";import{UI_EVENT as d,createUiTelemetry as f}from"../telemetry/logSinkTelemetry.mjs";import{extensionName as p,extensionPackageName as m,extensionToolSource as h}from"./extensionName.mjs";import{registerBuiltinToolUi as g}from"./toolOverrides.mjs";import _ from"node:path";import{connectDoomCordisHost as v}from"@agimon-ai/doompi-extension-contracts/cordis-host";import{readDoomMcpStatus as y}from"@agimon-ai/doompi-extension-contracts/mcp-status";import{readDoomNotificationService as b}from"@agimon-ai/doompi-extension-contracts/notification";import{DOOM_MINOR_MODE_CATALOG_SERVICE as x,createMinorModeCatalogClient as S,requireMinorModeCatalog as C}from"@agimon-ai/doompi-extension-contracts/mode";import{DOOM_UI_HUB_SERVICE as w}from"@agimon-ai/doompi-extension-contracts/ui-hub";import{DOOM_TOOL_OVERRIDES_SERVICE as T,requireDoomToolOverrides as E}from"@agimon-ai/doompi-extension-contracts/tool-overrides";const D=`doom-pi-leader`,O=`belowEditor`,k=`warning`,A=`doom-pi`,j=new Set([`hotkeys`]),M=`@agimon-ai/doompi-ui`;function N(e,t,n,r){let i=b(e);if(i){try{Promise.resolve(i.request({body:n,level:r})).catch(()=>void 0)}catch{}return}t.ui.notify(n,r)}function P(e,t){let n=e.trim().replace(/\s+/g,` `);if(!n)return;let r=n.slice(0,64).trimEnd();return`${A} · ${r} · ${_.basename(t)||t}`}function F(f,{pi:v,telemetry:b,hostMode:F}){f.inject([T],e=>{let t=E(e),n=[],r=e=>{if(F===`composed`)return!0;let r=t.claim({source:M,tools:[e]});return r.granted&&n.push(r),r.granted};try{g(v,process.cwd(),r)}catch(e){for(let e of n)e.dispose();throw e}return()=>{for(let e of n)e.dispose()}});let I=new n,L=new e,R=new Set,z,B,V=0,H=!1,U=()=>y(f)?.getSnapshot().servers;v.registerCommand(`tools`,{description:`Browse the tools available in this session`,handler:async(e,t)=>{let n=U(),r=i({tools:v.getAllTools(),activeTools:v.getActiveTools(),...n?{mcpServers:n}:{},resolveExtensionName:p,resolveExtensionPackageName:m,resolveExtensionToolSource:e=>h(v,e)});await u(t,r)}}),v.registerCommand(`config`,{description:`Browse and change the settings extensions contribute`,handler:async(e,t)=>{await a(t,G.config)}});let W=e=>{for(let t of e){let e=t.bindingId?` (${t.bindingId})`:``,n=`Leader contribution from ${t.source}${e}: ${t.message}`;R.has(n)||(R.add(n),b.recordWarning(d.leaderContributionRejected,t.message,{"leader.source":t.source,...t.bindingId?{"leader.binding.id":t.bindingId}:{}}),B?.mode===`tui`&&N(f,B,n,k))}},G=t({leaderRegistry:L,reportDiagnostics:W});f.provide(w,G),f.inject([x],e=>{let t=S(C(e)),n=()=>I.setModes(r(t.list())),i=t.subscribe(n);return n(),()=>{i(),I.setModes([])}}),v.on(`session_start`,(e,t)=>{B=t,G.setContext(t);let n=++V;if(W(L.flush()),H=t.sessionManager.getEntries().some(e=>e.type===`message`),t.mode!==`tui`)return;for(let e of R)N(f,t,e,k);let r=process.env.DOOMPI_THEME||`doom-pi-dark`,i=t.ui.setTheme(r);i.success||(N(f,t,`Could not apply Doom Pi theme: ${i.error}`,k),b.recordWarning(d.themeApplyFailed,i.error??`Unknown theme error`,{"ui.theme":r})),t.ui.setTitle(`${A} · ${_.basename(t.cwd)||t.cwd} · pi/coding`),t.ui.setHeader((e,n)=>new c(n,t.cwd,void 0,t,()=>e.terminal.rows)),t.ui.setFooter((e,n,r)=>(z=r,new s(e,n,t,r,G.footer,I))),t.ui.setEditorComponent((e,r,i)=>new o(e,r,i,I,e=>{if(!e.active){t.ui.setWidget(D,void 0,{placement:O});return}t.ui.setWidget(D,(n,r)=>new l(r,e,t,z,I.getModes()),{placement:O})},void 0,t.ui.theme,{registry:L,isCommandAvailable:e=>j.has(e)||v.getCommands().some(t=>t.name===e),onLeaderAction:(e,r)=>{if(B!==t||V!==n){N(f,t,`Leader action ${r} is unavailable.`,k);return}G.invokeLeaderAction(e,r)},onUnavailableCommand:e=>{b.recordWarning(d.leaderCommandUnavailable,`Leader command /${e} is unavailable.`,{"ui.kind":`command`}),N(f,t,`Leader command /${e} is unavailable.`,k)},onUnavailableAction:e=>{b.recordWarning(d.leaderActionUnavailable,`Leader action ${e} is unavailable.`,{"ui.kind":`action`}),N(f,t,`Leader action ${e} is unavailable.`,k)}})),b.recordEvent(d.shellInstalled,{"ui.theme":r,"ui.theme.applied":i.success,"ui.leader.group.count":L.getGroup([])?.options.length??0})}),v.on(`input`,(e,t)=>{if(t.mode!==`tui`||e.source!==`interactive`||H)return;H=!0;let n=P(e.text,t.cwd);n&&t.ui.setTitle(n)}),f.effect(()=>async()=>{let e=B;++V,B=void 0,G.setContext(void 0),z=void 0,G.dispose(),I.reset(),e?.mode===`tui`&&e.ui.setWidget(D,void 0,{placement:O}),await b.shutdown()},M)}async function I(e,t=f()){let n=await v(e,M),r=n.root.plugin(F,{pi:e,telemetry:t,hostMode:n.runtime.mode});try{await r}catch(e){try{await r.dispose()}finally{await n.dispose()}throw e}let i;e.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await n.dispose()}})())}export{I as doomPiUiExtension};
2
+ //# sourceMappingURL=extension.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.mjs","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import path from 'node:path';\nimport { connectDoomCordisHost, type DoomCordisHostMode } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { readDoomMcpStatus } from '@agimon-ai/doompi-extension-contracts/mcp-status';\nimport {\n type DoomNotificationLevel,\n readDoomNotificationService,\n} from '@agimon-ai/doompi-extension-contracts/notification';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n createMinorModeCatalogClient,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport { DOOM_UI_HUB_SERVICE } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport {\n DOOM_TOOL_OVERRIDES_SERVICE,\n type DoomToolOverrideRegistration,\n requireDoomToolOverrides,\n} from '@agimon-ai/doompi-extension-contracts/tool-overrides';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, ReadonlyFooterDataProvider } from '@earendil-works/pi-coding-agent';\nimport { type DoomLeaderDiagnostic, DoomLeaderRegistry } from '../../services/leader/leaderRegistry.ts';\nimport { createDoomUiHub } from '../../services/hub/uiHub.ts';\nimport { DoomUiState, type LeaderSnapshot, projectMinorModeRecords } from '../../services/state/uiState.ts';\nimport { buildToolSources, type McpServerStatus } from '../../services/tools/toolInventory.ts';\nimport { openConfigOverlay } from '../../tui/configOverlay.ts';\nimport { DoomEditor } from '../../tui/doomEditor.ts';\nimport { DoomFooter } from '../../tui/doomFooter.ts';\nimport { DoomHeader } from '../../tui/doomHeader.ts';\nimport { LeaderHints } from '../../tui/leaderHints.ts';\nimport { DEFAULT_THEME_NAME } from '../../tui/theme.ts';\nimport { openToolsOverlay } from '../../tui/toolsOverlay.ts';\nimport { createUiTelemetry, UI_EVENT, type UiTelemetry } from '../telemetry/logSinkTelemetry.ts';\nimport { extensionName, extensionPackageName, extensionToolSource } from './extensionName.ts';\nimport { registerBuiltinToolUi } from './toolOverrides.ts';\n\nconst LEADER_WIDGET_KEY = 'doom-pi-leader';\nconst TUI_MODE = 'tui';\nconst WIDGET_PLACEMENT = 'belowEditor';\nconst WARNING_STYLE = 'warning';\nconst THEME_ENVIRONMENT_KEY = 'DOOMPI_THEME';\nconst HOTKEYS_COMMAND = 'hotkeys';\nconst TOOLS_COMMAND = 'tools';\nconst CONFIG_COMMAND = 'config';\nconst SESSION_START_EVENT = 'session_start';\nconst SESSION_MESSAGE_ENTRY = 'message';\nconst INPUT_EVENT = 'input';\nconst INTERACTIVE_INPUT_SOURCE = 'interactive';\nconst SESSION_SHUTDOWN_EVENT = 'session_shutdown';\nconst TITLE_MESSAGE_MAX_LENGTH = 64;\nconst TITLE_PREFIX = 'doom-pi';\nconst BUILTIN_LEADER_COMMANDS = new Set([HOTKEYS_COMMAND]);\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-ui';\n\nfunction notify(cordis: Context, context: ExtensionContext, body: string, level: DoomNotificationLevel): void {\n const service = readDoomNotificationService(cordis);\n if (service) {\n try {\n void Promise.resolve(service.request({ body, level })).catch(() => undefined);\n } catch {\n // Notification delivery is best effort and does not fall back after routing.\n }\n return;\n }\n context.ui.notify(body, level);\n}\n\nfunction createMessageTitle(message: string, cwd: string): string | undefined {\n const normalizedMessage = message.trim().replace(/\\s+/g, ' ');\n if (!normalizedMessage) return undefined;\n const messageTitle = normalizedMessage.slice(0, TITLE_MESSAGE_MAX_LENGTH).trimEnd();\n return `${TITLE_PREFIX} · ${messageTitle} · ${path.basename(cwd) || cwd}`;\n}\n\ninterface UiPluginOptions {\n readonly pi: ExtensionAPI;\n readonly telemetry: UiTelemetry;\n readonly hostMode: DoomCordisHostMode;\n}\n\nfunction doomPiUiPlugin(cordis: Context, { pi, telemetry, hostMode }: UiPluginOptions): void {\n cordis.inject([DOOM_TOOL_OVERRIDES_SERVICE], (overridesContext) => {\n const toolOverrides = requireDoomToolOverrides(overridesContext);\n const registrations: DoomToolOverrideRegistration[] = [];\n const shouldRegister = (tool: string): boolean => {\n if (hostMode === 'composed') return true;\n const registration = toolOverrides.claim({ source: PACKAGE_SOURCE, tools: [tool] });\n if (registration.granted) registrations.push(registration);\n return registration.granted;\n };\n try {\n registerBuiltinToolUi(pi, process.cwd(), shouldRegister);\n } catch (error) {\n for (const registration of registrations) registration.dispose();\n throw error;\n }\n return () => {\n for (const registration of registrations) registration.dispose();\n };\n });\n const uiState = new DoomUiState();\n const leaderRegistry = new DoomLeaderRegistry();\n const pendingDiagnostics = new Set<string>();\n let footerData: ReadonlyFooterDataProvider | undefined;\n let activeContext: ExtensionContext | undefined;\n let sessionGeneration = 0;\n let hasSessionMessage = false;\n\n /**\n * Asks the MCP extension what it is currently connected to.\n *\n * No answer is a normal session: `--no-mcp` leaves nobody providing the query,\n * and the panel simply lists MCP tools under the extension that registered them.\n */\n const readMcpServers = (): readonly McpServerStatus[] | undefined => readDoomMcpStatus(cordis)?.getSnapshot().servers;\n\n pi.registerCommand(TOOLS_COMMAND, {\n description: 'Browse the tools available in this session',\n handler: async (_args, ctx) => {\n // Read at open time so a reconnected server or a plan-mode tool swap shows\n // up without restarting the session.\n const mcpServers = readMcpServers();\n const sources = buildToolSources({\n tools: pi.getAllTools(),\n activeTools: pi.getActiveTools(),\n ...(mcpServers ? { mcpServers } : {}),\n resolveExtensionName: extensionName,\n resolveExtensionPackageName: extensionPackageName,\n resolveExtensionToolSource: (toolName) => extensionToolSource(pi, toolName),\n });\n await openToolsOverlay(ctx, sources);\n },\n });\n\n pi.registerCommand(CONFIG_COMMAND, {\n description: 'Browse and change the settings extensions contribute',\n handler: async (_args, ctx) => {\n // The registry is passed live rather than snapshotted: a contributor can be\n // fetching or installing something while the panel is open, and that\n // progress is meant to land in it.\n await openConfigOverlay(ctx, hub.config);\n },\n });\n\n const reportDiagnostics = (diagnostics: readonly DoomLeaderDiagnostic[]): void => {\n for (const diagnostic of diagnostics) {\n const binding = diagnostic.bindingId ? ` (${diagnostic.bindingId})` : '';\n const message = `Leader contribution from ${diagnostic.source}${binding}: ${diagnostic.message}`;\n if (pendingDiagnostics.has(message)) continue;\n pendingDiagnostics.add(message);\n // A rejected contribution silently drops another extension's keybindings,\n // and the notice below only reaches a run that has a TUI attached.\n void telemetry.recordWarning(UI_EVENT.leaderContributionRejected, diagnostic.message, {\n 'leader.source': diagnostic.source,\n ...(diagnostic.bindingId ? { 'leader.binding.id': diagnostic.bindingId } : {}),\n });\n if (activeContext?.mode === TUI_MODE) notify(cordis, activeContext, message, WARNING_STYLE);\n }\n };\n\n const hub = createDoomUiHub({ leaderRegistry, reportDiagnostics });\n cordis.provide(DOOM_UI_HUB_SERVICE, hub);\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (modeContext) => {\n const catalog = createMinorModeCatalogClient(requireMinorModeCatalog(modeContext));\n const update = (): void => uiState.setModes(projectMinorModeRecords(catalog.list()));\n const dispose = catalog.subscribe(update);\n update();\n return () => {\n dispose();\n uiState.setModes([]);\n };\n });\n\n pi.on(SESSION_START_EVENT, (_event, ctx) => {\n activeContext = ctx;\n hub.setContext(ctx);\n const activeGeneration = ++sessionGeneration;\n reportDiagnostics(leaderRegistry.flush());\n hasSessionMessage = ctx.sessionManager.getEntries().some((entry) => entry.type === SESSION_MESSAGE_ENTRY);\n if (ctx.mode !== TUI_MODE) return;\n for (const message of pendingDiagnostics) notify(cordis, ctx, message, WARNING_STYLE);\n\n const themeName = process.env[THEME_ENVIRONMENT_KEY] || DEFAULT_THEME_NAME;\n const themeResult = ctx.ui.setTheme(themeName);\n if (!themeResult.success) {\n notify(cordis, ctx, `Could not apply Doom Pi theme: ${themeResult.error}`, WARNING_STYLE);\n void telemetry.recordWarning(UI_EVENT.themeApplyFailed, themeResult.error ?? 'Unknown theme error', {\n 'ui.theme': themeName,\n });\n }\n\n ctx.ui.setTitle(`${TITLE_PREFIX} · ${path.basename(ctx.cwd) || ctx.cwd} · pi/coding`);\n ctx.ui.setHeader((tui, theme) => new DoomHeader(theme, ctx.cwd, undefined, ctx, () => tui.terminal.rows));\n ctx.ui.setFooter((tui, theme, data) => {\n footerData = data;\n return new DoomFooter(tui, theme, ctx, data, hub.footer, uiState);\n });\n ctx.ui.setEditorComponent(\n (tui, editorTheme, keybindings) =>\n new DoomEditor(\n tui,\n editorTheme,\n keybindings,\n uiState,\n (snapshot: LeaderSnapshot) => {\n if (!snapshot.active) {\n ctx.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n return;\n }\n ctx.ui.setWidget(\n LEADER_WIDGET_KEY,\n (_widgetTui, widgetTheme) => new LeaderHints(widgetTheme, snapshot, ctx, footerData, uiState.getModes()),\n { placement: WIDGET_PLACEMENT },\n );\n },\n undefined,\n ctx.ui.theme,\n {\n registry: leaderRegistry,\n isCommandAvailable: (commandName) =>\n BUILTIN_LEADER_COMMANDS.has(commandName) ||\n pi.getCommands().some((command) => command.name === commandName),\n onLeaderAction: (source, action) => {\n if (activeContext !== ctx || sessionGeneration !== activeGeneration) {\n notify(cordis, ctx, `Leader action ${action} is unavailable.`, WARNING_STYLE);\n return;\n }\n hub.invokeLeaderAction(source, action);\n },\n onUnavailableCommand: (commandName) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderCommandUnavailable,\n `Leader command /${commandName} is unavailable.`,\n { 'ui.kind': 'command' },\n );\n notify(cordis, ctx, `Leader command /${commandName} is unavailable.`, WARNING_STYLE);\n },\n onUnavailableAction: (action) => {\n void telemetry.recordWarning(\n UI_EVENT.leaderActionUnavailable,\n `Leader action ${action} is unavailable.`,\n {\n 'ui.kind': 'action',\n },\n );\n notify(cordis, ctx, `Leader action ${action} is unavailable.`, WARNING_STYLE);\n },\n },\n ),\n );\n\n void telemetry.recordEvent(UI_EVENT.shellInstalled, {\n 'ui.theme': themeName,\n 'ui.theme.applied': themeResult.success,\n 'ui.leader.group.count': leaderRegistry.getGroup([])?.options.length ?? 0,\n });\n });\n\n pi.on(INPUT_EVENT, (event, ctx) => {\n if (ctx.mode !== TUI_MODE || event.source !== INTERACTIVE_INPUT_SOURCE || hasSessionMessage) return;\n hasSessionMessage = true;\n const title = createMessageTitle(event.text, ctx.cwd);\n if (title) ctx.ui.setTitle(title);\n });\n\n cordis.effect(\n () => async () => {\n const context = activeContext;\n ++sessionGeneration;\n activeContext = undefined;\n hub.setContext(undefined);\n footerData = undefined;\n hub.dispose();\n uiState.reset();\n if (context?.mode === TUI_MODE) {\n context.ui.setWidget(LEADER_WIDGET_KEY, undefined, { placement: WIDGET_PLACEMENT });\n }\n await telemetry.shutdown();\n },\n PACKAGE_SOURCE,\n );\n}\n\n/** The package's standard Pi factory, mounted under the session Cordis host. */\nexport async function doomPiUiExtension(pi: ExtensionAPI, telemetry: UiTelemetry = createUiTelemetry()): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(doomPiUiPlugin, { pi, telemetry, hostMode: connection.runtime.mode });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n\n let disposal: Promise<void> | undefined;\n pi.on(\n SESSION_SHUTDOWN_EVENT,\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("../../_virtual/_rolldown/runtime.cjs");let t=require("node:path");t=e.__toESM(t,1);let n=require("node:fs");n=e.__toESM(n,1);const r=new Map,i=new Map,a=`__doompiExtensionToolSources__`;function o(e){let t=e,n=t[a];if(n)return n;let r=new Map;return Object.defineProperty(t,a,{configurable:!1,enumerable:!1,value:r,writable:!1}),r}function s(e,t){let n=Reflect.get(e,t,e);return typeof n==`function`?n.bind(e):n}function c(e,t){return new Proxy(e,{get(e,n){return n===`registerTool`?n=>{e.registerTool(n),o(e).set(n.name,Object.freeze({entryPath:t}))}:s(e,n)}})}function l(e,t){return o(e).get(t)?.entryPath}function u(e){let r=e;for(;;){try{let e=JSON.parse(n.default.readFileSync(t.default.join(r,`package.json`),`utf8`));if(typeof e.name==`string`&&e.name.length>0)return e.name}catch{}let e=t.default.dirname(r);if(e===r)return;r=e}}function d(e){let n=r.get(e);if(n!==void 0)return n;let i=u(t.default.dirname(e)),a=i?i.split(`/`).pop()??i:t.default.basename(e,t.default.extname(e));return r.set(e,a),a}function f(e){let n=i.get(e);if(n!==void 0)return n.name;let r=u(t.default.dirname(e));return i.set(e,{name:r}),r}exports.extensionName=d,exports.extensionPackageName=f,exports.extensionToolSource=l,exports.withExtensionSource=c;
2
+ //# sourceMappingURL=extensionName.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionName.cjs","names":["fs","path"],"sources":["../../../src/adapters/pi/extensionName.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\n/**\n * Display name for an extension that Pi could not attribute to a package.\n *\n * Pi stamps every `--extension <path>` argument with the literal source `cli`,\n * and doom-pi launches all of its extensions that way, so the only surviving\n * identity is the entry path. The nearest `package.json` above it names the\n * package that registered the tools.\n */\n\n/** Results are stable for the life of a session, and every source hits the same few dirs. */\nconst cache = new Map<string, string>();\n// Wrapped, because \"no package above this path\" is a real answer worth caching\n// and a bare undefined cannot be told apart from a miss.\nconst packageCache = new Map<string, { readonly name: string | undefined }>();\nconst TOOL_SOURCE_REGISTRY_KEY = '__doompiExtensionToolSources__' as const;\n\ntype RegisteredTool = Parameters<ExtensionAPI['registerTool']>[0];\ninterface ToolSourceMetadata {\n readonly entryPath: string;\n}\ntype RegistryHost = ExtensionAPI & { [TOOL_SOURCE_REGISTRY_KEY]?: Map<string, ToolSourceMetadata> };\n\n/** Session-local provenance attached to Pi's API rather than process-global state. */\nfunction toolSourceRegistry(pi: ExtensionAPI): Map<string, ToolSourceMetadata> {\n const host = pi as RegistryHost;\n const existing = host[TOOL_SOURCE_REGISTRY_KEY];\n if (existing) return existing;\n const registry = new Map<string, ToolSourceMetadata>();\n Object.defineProperty(host, TOOL_SOURCE_REGISTRY_KEY, {\n configurable: false,\n enumerable: false,\n value: registry,\n writable: false,\n });\n return registry;\n}\n\nfunction boundValue(target: object, property: PropertyKey): unknown {\n const value = Reflect.get(target, property, target);\n return typeof value === 'function' ? value.bind(target) : value;\n}\n\n/**\n * Gives one composed extension a Pi API that remembers which tools it registers.\n *\n * Pi attributes every factory inside a compiled Doom bundle to the outer bundle.\n * The compiler still knows each original entry path, so it calls factories through\n * this boundary and preserves that identity before the information is lost.\n */\nexport function withExtensionSource(pi: ExtensionAPI, entryPath: string): ExtensionAPI {\n return new Proxy(pi, {\n get(target, property) {\n if (property !== 'registerTool') return boundValue(target, property);\n return (tool: RegisteredTool): void => {\n target.registerTool(tool);\n toolSourceRegistry(target).set(tool.name, Object.freeze({ entryPath }));\n };\n },\n });\n}\n\n/** Original extension entry that registered a tool inside a composed bundle. */\nexport function extensionToolSource(pi: ExtensionAPI, toolName: string): string | undefined {\n return toolSourceRegistry(pi).get(toolName)?.entryPath;\n}\n\nfunction packageName(directory: string): string | undefined {\n let current = directory;\n for (;;) {\n try {\n const manifest = JSON.parse(fs.readFileSync(path.join(current, 'package.json'), 'utf8')) as { name?: unknown };\n if (typeof manifest.name === 'string' && manifest.name.length > 0) return manifest.name;\n } catch {\n // No manifest here, or an unreadable one; keep walking up.\n }\n const parent = path.dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\nexport function extensionName(entryPath: string): string {\n const cached = cache.get(entryPath);\n if (cached !== undefined) return cached;\n const name = packageName(path.dirname(entryPath));\n // `@agimon-ai/doompi-task` reads as `doom-task`; the scope is noise in a tree.\n const resolved = name ? (name.split('/').pop() ?? name) : path.basename(entryPath, path.extname(entryPath));\n cache.set(entryPath, resolved);\n return resolved;\n}\n\n/**\n * The package name exactly as a manifest spells it, scope and all.\n *\n * `extensionName` drops the scope because a tree reads better without it, but\n * that makes it useless as a key: `.doom/modes.yaml` names packages as\n * `@agimon-ai/doompi-team`, so joining a registered tool back to the layer that\n * admitted it needs the unshortened name. Attribution and display are different\n * jobs, so they get different functions rather than one lossy one.\n */\nexport function extensionPackageName(entryPath: string): string | undefined {\n const cached = packageCache.get(entryPath);\n if (cached !== undefined) return cached.name;\n const name = packageName(path.dirname(entryPath));\n packageCache.set(entryPath, { name });\n return name;\n}\n"],"mappings":"8IAcA,MAAM,EAAQ,IAAI,IAGZ,EAAe,IAAI,IACnB,EAA2B,iCASjC,SAAS,EAAmB,EAAmD,CAC7E,IAAM,EAAO,EACP,EAAW,EAAK,GACtB,GAAI,EAAU,OAAO,EACrB,IAAM,EAAW,IAAI,IAOrB,OANA,OAAO,eAAe,EAAM,EAA0B,CACpD,aAAc,GACd,WAAY,GACZ,MAAO,EACP,SAAU,EACZ,CAAC,EACM,CACT,CAEA,SAAS,EAAW,EAAgB,EAAgC,CAClE,IAAM,EAAQ,QAAQ,IAAI,EAAQ,EAAU,CAAM,EAClD,OAAO,OAAO,GAAU,WAAa,EAAM,KAAK,CAAM,EAAI,CAC5D,CASA,SAAgB,EAAoB,EAAkB,EAAiC,CACrF,OAAO,IAAI,MAAM,EAAI,CACnB,IAAI,EAAQ,EAAU,CAEpB,OADI,IAAa,eACT,GAA+B,CACrC,EAAO,aAAa,CAAI,EACxB,EAAmB,CAAM,CAAC,CAAC,IAAI,EAAK,KAAM,OAAO,OAAO,CAAE,WAAU,CAAC,CAAC,CACxE,EAJwC,EAAW,EAAQ,CAAQ,CAKrE,CACF,CAAC,CACH,CAGA,SAAgB,EAAoB,EAAkB,EAAsC,CAC1F,OAAO,EAAmB,CAAE,CAAC,CAAC,IAAI,CAAQ,CAAC,EAAE,SAC/C,CAEA,SAAS,EAAY,EAAuC,CAC1D,IAAI,EAAU,EACd,OAAS,CACP,GAAI,CACF,IAAM,EAAW,KAAK,MAAMA,EAAAA,QAAG,aAAaC,EAAAA,QAAK,KAAK,EAAS,cAAc,EAAG,MAAM,CAAC,EACvF,GAAI,OAAO,EAAS,MAAS,UAAY,EAAS,KAAK,OAAS,EAAG,OAAO,EAAS,IACrF,MAAQ,CAER,CACA,IAAM,EAASA,EAAAA,QAAK,QAAQ,CAAO,EACnC,GAAI,IAAW,EAAS,OACxB,EAAU,CACZ,CACF,CAEA,SAAgB,EAAc,EAA2B,CACvD,IAAM,EAAS,EAAM,IAAI,CAAS,EAClC,GAAI,IAAW,IAAA,GAAW,OAAO,EACjC,IAAM,EAAO,EAAYA,EAAAA,QAAK,QAAQ,CAAS,CAAC,EAE1C,EAAW,EAAQ,EAAK,MAAM,GAAG,CAAC,CAAC,IAAI,GAAK,EAAQA,EAAAA,QAAK,SAAS,EAAWA,EAAAA,QAAK,QAAQ,CAAS,CAAC,EAE1G,OADA,EAAM,IAAI,EAAW,CAAQ,EACtB,CACT,CAWA,SAAgB,EAAqB,EAAuC,CAC1E,IAAM,EAAS,EAAa,IAAI,CAAS,EACzC,GAAI,IAAW,IAAA,GAAW,OAAO,EAAO,KACxC,IAAM,EAAO,EAAYA,EAAAA,QAAK,QAAQ,CAAS,CAAC,EAEhD,OADA,EAAa,IAAI,EAAW,CAAE,MAAK,CAAC,EAC7B,CACT"}
@@ -0,0 +1,25 @@
1
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ //#region src/adapters/pi/extensionName.d.ts
3
+ /**
4
+ * Gives one composed extension a Pi API that remembers which tools it registers.
5
+ *
6
+ * Pi attributes every factory inside a compiled Doom bundle to the outer bundle.
7
+ * The compiler still knows each original entry path, so it calls factories through
8
+ * this boundary and preserves that identity before the information is lost.
9
+ */
10
+ export declare function withExtensionSource(pi: ExtensionAPI, entryPath: string): ExtensionAPI;
11
+ /** Original extension entry that registered a tool inside a composed bundle. */
12
+ export declare function extensionToolSource(pi: ExtensionAPI, toolName: string): string | undefined;
13
+ export declare function extensionName(entryPath: string): string;
14
+ /**
15
+ * The package name exactly as a manifest spells it, scope and all.
16
+ *
17
+ * `extensionName` drops the scope because a tree reads better without it, but
18
+ * that makes it useless as a key: `.doom/modes.yaml` names packages as
19
+ * `@agimon-ai/doompi-team`, so joining a registered tool back to the layer that
20
+ * admitted it needs the unshortened name. Attribution and display are different
21
+ * jobs, so they get different functions rather than one lossy one.
22
+ */
23
+ export declare function extensionPackageName(entryPath: string): string | undefined;
24
+ //#endregion
25
+ //# sourceMappingURL=extensionName.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionName.d.cts","names":[],"sources":["../../../src/adapters/pi/extensionName.ts"],"mappings":";;;;;;;;;wBAqDgB,oBAAoB,IAAI,cAAc,oBAAoB;;wBAa1D,oBAAoB,IAAI,cAAc;wBAmBtC,cAAc;;;;;;;;;;wBAmBd,qBAAqB"}
@@ -0,0 +1,25 @@
1
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ //#region src/adapters/pi/extensionName.d.ts
3
+ /**
4
+ * Gives one composed extension a Pi API that remembers which tools it registers.
5
+ *
6
+ * Pi attributes every factory inside a compiled Doom bundle to the outer bundle.
7
+ * The compiler still knows each original entry path, so it calls factories through
8
+ * this boundary and preserves that identity before the information is lost.
9
+ */
10
+ export declare function withExtensionSource(pi: ExtensionAPI, entryPath: string): ExtensionAPI;
11
+ /** Original extension entry that registered a tool inside a composed bundle. */
12
+ export declare function extensionToolSource(pi: ExtensionAPI, toolName: string): string | undefined;
13
+ export declare function extensionName(entryPath: string): string;
14
+ /**
15
+ * The package name exactly as a manifest spells it, scope and all.
16
+ *
17
+ * `extensionName` drops the scope because a tree reads better without it, but
18
+ * that makes it useless as a key: `.doom/modes.yaml` names packages as
19
+ * `@agimon-ai/doompi-team`, so joining a registered tool back to the layer that
20
+ * admitted it needs the unshortened name. Attribution and display are different
21
+ * jobs, so they get different functions rather than one lossy one.
22
+ */
23
+ export declare function extensionPackageName(entryPath: string): string | undefined;
24
+ //#endregion
25
+ //# sourceMappingURL=extensionName.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionName.d.mts","names":[],"sources":["../../../src/adapters/pi/extensionName.ts"],"mappings":";;;;;;;;;wBAqDgB,oBAAoB,IAAI,cAAc,oBAAoB;;wBAa1D,oBAAoB,IAAI,cAAc;wBAmBtC,cAAc;;;;;;;;;;wBAmBd,qBAAqB"}
@@ -0,0 +1,2 @@
1
+ import e from"node:path";import t from"node:fs";const n=new Map,r=new Map,i=`__doompiExtensionToolSources__`;function a(e){let t=e,n=t[i];if(n)return n;let r=new Map;return Object.defineProperty(t,i,{configurable:!1,enumerable:!1,value:r,writable:!1}),r}function o(e,t){let n=Reflect.get(e,t,e);return typeof n==`function`?n.bind(e):n}function s(e,t){return new Proxy(e,{get(e,n){return n===`registerTool`?n=>{e.registerTool(n),a(e).set(n.name,Object.freeze({entryPath:t}))}:o(e,n)}})}function c(e,t){return a(e).get(t)?.entryPath}function l(n){let r=n;for(;;){try{let n=JSON.parse(t.readFileSync(e.join(r,`package.json`),`utf8`));if(typeof n.name==`string`&&n.name.length>0)return n.name}catch{}let n=e.dirname(r);if(n===r)return;r=n}}function u(t){let r=n.get(t);if(r!==void 0)return r;let i=l(e.dirname(t)),a=i?i.split(`/`).pop()??i:e.basename(t,e.extname(t));return n.set(t,a),a}function d(t){let n=r.get(t);if(n!==void 0)return n.name;let i=l(e.dirname(t));return r.set(t,{name:i}),i}export{u as extensionName,d as extensionPackageName,c as extensionToolSource,s as withExtensionSource};
2
+ //# sourceMappingURL=extensionName.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionName.mjs","names":[],"sources":["../../../src/adapters/pi/extensionName.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\n/**\n * Display name for an extension that Pi could not attribute to a package.\n *\n * Pi stamps every `--extension <path>` argument with the literal source `cli`,\n * and doom-pi launches all of its extensions that way, so the only surviving\n * identity is the entry path. The nearest `package.json` above it names the\n * package that registered the tools.\n */\n\n/** Results are stable for the life of a session, and every source hits the same few dirs. */\nconst cache = new Map<string, string>();\n// Wrapped, because \"no package above this path\" is a real answer worth caching\n// and a bare undefined cannot be told apart from a miss.\nconst packageCache = new Map<string, { readonly name: string | undefined }>();\nconst TOOL_SOURCE_REGISTRY_KEY = '__doompiExtensionToolSources__' as const;\n\ntype RegisteredTool = Parameters<ExtensionAPI['registerTool']>[0];\ninterface ToolSourceMetadata {\n readonly entryPath: string;\n}\ntype RegistryHost = ExtensionAPI & { [TOOL_SOURCE_REGISTRY_KEY]?: Map<string, ToolSourceMetadata> };\n\n/** Session-local provenance attached to Pi's API rather than process-global state. */\nfunction toolSourceRegistry(pi: ExtensionAPI): Map<string, ToolSourceMetadata> {\n const host = pi as RegistryHost;\n const existing = host[TOOL_SOURCE_REGISTRY_KEY];\n if (existing) return existing;\n const registry = new Map<string, ToolSourceMetadata>();\n Object.defineProperty(host, TOOL_SOURCE_REGISTRY_KEY, {\n configurable: false,\n enumerable: false,\n value: registry,\n writable: false,\n });\n return registry;\n}\n\nfunction boundValue(target: object, property: PropertyKey): unknown {\n const value = Reflect.get(target, property, target);\n return typeof value === 'function' ? value.bind(target) : value;\n}\n\n/**\n * Gives one composed extension a Pi API that remembers which tools it registers.\n *\n * Pi attributes every factory inside a compiled Doom bundle to the outer bundle.\n * The compiler still knows each original entry path, so it calls factories through\n * this boundary and preserves that identity before the information is lost.\n */\nexport function withExtensionSource(pi: ExtensionAPI, entryPath: string): ExtensionAPI {\n return new Proxy(pi, {\n get(target, property) {\n if (property !== 'registerTool') return boundValue(target, property);\n return (tool: RegisteredTool): void => {\n target.registerTool(tool);\n toolSourceRegistry(target).set(tool.name, Object.freeze({ entryPath }));\n };\n },\n });\n}\n\n/** Original extension entry that registered a tool inside a composed bundle. */\nexport function extensionToolSource(pi: ExtensionAPI, toolName: string): string | undefined {\n return toolSourceRegistry(pi).get(toolName)?.entryPath;\n}\n\nfunction packageName(directory: string): string | undefined {\n let current = directory;\n for (;;) {\n try {\n const manifest = JSON.parse(fs.readFileSync(path.join(current, 'package.json'), 'utf8')) as { name?: unknown };\n if (typeof manifest.name === 'string' && manifest.name.length > 0) return manifest.name;\n } catch {\n // No manifest here, or an unreadable one; keep walking up.\n }\n const parent = path.dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\nexport function extensionName(entryPath: string): string {\n const cached = cache.get(entryPath);\n if (cached !== undefined) return cached;\n const name = packageName(path.dirname(entryPath));\n // `@agimon-ai/doompi-task` reads as `doom-task`; the scope is noise in a tree.\n const resolved = name ? (name.split('/').pop() ?? name) : path.basename(entryPath, path.extname(entryPath));\n cache.set(entryPath, resolved);\n return resolved;\n}\n\n/**\n * The package name exactly as a manifest spells it, scope and all.\n *\n * `extensionName` drops the scope because a tree reads better without it, but\n * that makes it useless as a key: `.doom/modes.yaml` names packages as\n * `@agimon-ai/doompi-team`, so joining a registered tool back to the layer that\n * admitted it needs the unshortened name. Attribution and display are different\n * jobs, so they get different functions rather than one lossy one.\n */\nexport function extensionPackageName(entryPath: string): string | undefined {\n const cached = packageCache.get(entryPath);\n if (cached !== undefined) return cached.name;\n const name = packageName(path.dirname(entryPath));\n packageCache.set(entryPath, { name });\n return name;\n}\n"],"mappings":"gDAcA,MAAM,EAAQ,IAAI,IAGZ,EAAe,IAAI,IACnB,EAA2B,iCASjC,SAAS,EAAmB,EAAmD,CAC7E,IAAM,EAAO,EACP,EAAW,EAAK,GACtB,GAAI,EAAU,OAAO,EACrB,IAAM,EAAW,IAAI,IAOrB,OANA,OAAO,eAAe,EAAM,EAA0B,CACpD,aAAc,GACd,WAAY,GACZ,MAAO,EACP,SAAU,EACZ,CAAC,EACM,CACT,CAEA,SAAS,EAAW,EAAgB,EAAgC,CAClE,IAAM,EAAQ,QAAQ,IAAI,EAAQ,EAAU,CAAM,EAClD,OAAO,OAAO,GAAU,WAAa,EAAM,KAAK,CAAM,EAAI,CAC5D,CASA,SAAgB,EAAoB,EAAkB,EAAiC,CACrF,OAAO,IAAI,MAAM,EAAI,CACnB,IAAI,EAAQ,EAAU,CAEpB,OADI,IAAa,eACT,GAA+B,CACrC,EAAO,aAAa,CAAI,EACxB,EAAmB,CAAM,CAAC,CAAC,IAAI,EAAK,KAAM,OAAO,OAAO,CAAE,WAAU,CAAC,CAAC,CACxE,EAJwC,EAAW,EAAQ,CAAQ,CAKrE,CACF,CAAC,CACH,CAGA,SAAgB,EAAoB,EAAkB,EAAsC,CAC1F,OAAO,EAAmB,CAAE,CAAC,CAAC,IAAI,CAAQ,CAAC,EAAE,SAC/C,CAEA,SAAS,EAAY,EAAuC,CAC1D,IAAI,EAAU,EACd,OAAS,CACP,GAAI,CACF,IAAM,EAAW,KAAK,MAAM,EAAG,aAAa,EAAK,KAAK,EAAS,cAAc,EAAG,MAAM,CAAC,EACvF,GAAI,OAAO,EAAS,MAAS,UAAY,EAAS,KAAK,OAAS,EAAG,OAAO,EAAS,IACrF,MAAQ,CAER,CACA,IAAM,EAAS,EAAK,QAAQ,CAAO,EACnC,GAAI,IAAW,EAAS,OACxB,EAAU,CACZ,CACF,CAEA,SAAgB,EAAc,EAA2B,CACvD,IAAM,EAAS,EAAM,IAAI,CAAS,EAClC,GAAI,IAAW,IAAA,GAAW,OAAO,EACjC,IAAM,EAAO,EAAY,EAAK,QAAQ,CAAS,CAAC,EAE1C,EAAW,EAAQ,EAAK,MAAM,GAAG,CAAC,CAAC,IAAI,GAAK,EAAQ,EAAK,SAAS,EAAW,EAAK,QAAQ,CAAS,CAAC,EAE1G,OADA,EAAM,IAAI,EAAW,CAAQ,EACtB,CACT,CAWA,SAAgB,EAAqB,EAAuC,CAC1E,IAAM,EAAS,EAAa,IAAI,CAAS,EACzC,GAAI,IAAW,IAAA,GAAW,OAAO,EAAO,KACxC,IAAM,EAAO,EAAY,EAAK,QAAQ,CAAS,CAAC,EAEhD,OADA,EAAa,IAAI,EAAW,CAAE,MAAK,CAAC,EAC7B,CACT"}
@@ -0,0 +1,2 @@
1
+ const e=require("../../tui/builtinToolRender.cjs");let t=require("@earendil-works/pi-coding-agent");function n(n,r,i=()=>!0){let a=(0,t.createReadToolDefinition)(r);i(a.name)&&n.registerTool({...a,renderShell:`self`,renderCall:(t,n)=>e.renderReadCall(t,n),renderResult:(t,n,r,i)=>{let a=e.renderReadResult(i.args,t,{expanded:n.expanded,isError:i.isError},r);return e.frameBuiltinResult(a,r,i.lastComponent)}});let o=(0,t.createEditToolDefinition)(r);i(o.name)&&n.registerTool({...o,renderShell:`self`,renderCall:(t,n)=>e.renderEditCall(t,n),renderResult:(t,n,r,i)=>{let a=e.renderEditResult(i.args,t,{expanded:n.expanded,isError:i.isError},r);return e.frameBuiltinResult(a,r,i.lastComponent)}});let s=(0,t.createWriteToolDefinition)(r),c=s.renderResult;i(s.name)&&n.registerTool({...s,renderShell:`self`,renderCall:(t,n,r)=>e.renderWriteCall(t,n,{expanded:r.expanded,argsStreaming:r.argsComplete===!1&&r.isPartial}),renderResult:(t,n,r,i)=>{let a=c(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}});let l=(0,t.createGrepToolDefinition)(r),u=l.renderResult;i(l.name)&&n.registerTool({...l,renderShell:`self`,renderCall:(t,n)=>e.renderGrepCall(t,n),renderResult:(t,n,r,i)=>{let a=u(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}});let d=(0,t.createFindToolDefinition)(r),f=d.renderResult;i(d.name)&&n.registerTool({...d,renderShell:`self`,renderCall:(t,n)=>e.renderFindCall(t,n),renderResult:(t,n,r,i)=>{let a=f(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}});let p=(0,t.createLsToolDefinition)(r),m=p.renderResult;i(p.name)&&n.registerTool({...p,renderShell:`self`,renderCall:(t,n)=>e.renderLsCall(t,n),renderResult:(t,n,r,i)=>{let a=m(t,n,r,{...i,lastComponent:e.previousBuiltinResult(i.lastComponent)});return e.frameBuiltinResult(a,r,i.lastComponent)}})}exports.registerBuiltinToolUi=n;
2
+ //# sourceMappingURL=toolOverrides.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolOverrides.cjs","names":["createReadToolDefinition","renderReadCall","renderReadResult","frameBuiltinResult","createEditToolDefinition","renderEditCall","renderEditResult","createWriteToolDefinition","renderWriteCall","previousBuiltinResult","createGrepToolDefinition","renderGrepCall","createFindToolDefinition","renderFindCall","createLsToolDefinition","renderLsCall"],"sources":["../../../src/adapters/pi/toolOverrides.ts"],"sourcesContent":["import {\n createEditToolDefinition,\n createFindToolDefinition,\n createGrepToolDefinition,\n createLsToolDefinition,\n createReadToolDefinition,\n createWriteToolDefinition,\n type ExtensionAPI,\n} from '@earendil-works/pi-coding-agent';\nimport {\n frameBuiltinResult,\n previousBuiltinResult,\n renderEditCall,\n renderEditResult,\n renderFindCall,\n renderGrepCall,\n renderLsCall,\n renderReadCall,\n renderReadResult,\n renderWriteCall,\n} from '../../tui/builtinToolRender.ts';\n\n/**\n * Keep Pi's native schemas, prompt metadata, execution, and result formatting;\n * replace only the broad status-background shell and call heading.\n */\nexport function registerBuiltinToolUi(\n pi: ExtensionAPI,\n cwd: string,\n shouldRegister: (tool: string) => boolean = () => true,\n): void {\n const read = createReadToolDefinition(cwd);\n if (shouldRegister(read.name))\n pi.registerTool({\n ...read,\n renderShell: 'self',\n renderCall: (args, theme) => renderReadCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = renderReadResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const edit = createEditToolDefinition(cwd);\n if (shouldRegister(edit.name))\n pi.registerTool({\n ...edit,\n renderShell: 'self',\n renderCall: (args, theme) => renderEditCall(args, theme),\n // Doom bands the diff on the background and keeps syntax highlighting on\n // the foreground, which Pi's foreground-only diff renderer cannot express.\n renderResult: (result, options, theme, context) => {\n const content = renderEditResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const write = createWriteToolDefinition(cwd);\n const writeResult = write.renderResult!;\n if (shouldRegister(write.name))\n pi.registerTool({\n ...write,\n renderShell: 'self',\n renderCall: (args, theme, context) =>\n renderWriteCall(args, theme, {\n expanded: context.expanded,\n // Restored completed rows may not mark args complete, but their result is no longer partial.\n argsStreaming: context.argsComplete === false && context.isPartial,\n }),\n renderResult: (result, options, theme, context) => {\n const content = writeResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const grep = createGrepToolDefinition(cwd);\n const grepResult = grep.renderResult!;\n if (shouldRegister(grep.name))\n pi.registerTool({\n ...grep,\n renderShell: 'self',\n renderCall: (args, theme) => renderGrepCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = grepResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const find = createFindToolDefinition(cwd);\n const findResult = find.renderResult!;\n if (shouldRegister(find.name))\n pi.registerTool({\n ...find,\n renderShell: 'self',\n renderCall: (args, theme) => renderFindCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = findResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const ls = createLsToolDefinition(cwd);\n const lsResult = ls.renderResult!;\n if (shouldRegister(ls.name))\n pi.registerTool({\n ...ls,\n renderShell: 'self',\n renderCall: (args, theme) => renderLsCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = lsResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{frameBuiltinResult as e,previousBuiltinResult as t,renderEditCall as n,renderEditResult as r,renderFindCall as i,renderGrepCall as a,renderLsCall as o,renderReadCall as s,renderReadResult as c,renderWriteCall as l}from"../../tui/builtinToolRender.mjs";import{createEditToolDefinition as u,createFindToolDefinition as d,createGrepToolDefinition as f,createLsToolDefinition as p,createReadToolDefinition as m,createWriteToolDefinition as h}from"@earendil-works/pi-coding-agent";function g(g,_,v=()=>!0){let y=m(_);v(y.name)&&g.registerTool({...y,renderShell:`self`,renderCall:(e,t)=>s(e,t),renderResult:(t,n,r,i)=>{let a=c(i.args,t,{expanded:n.expanded,isError:i.isError},r);return e(a,r,i.lastComponent)}});let b=u(_);v(b.name)&&g.registerTool({...b,renderShell:`self`,renderCall:(e,t)=>n(e,t),renderResult:(t,n,i,a)=>{let o=r(a.args,t,{expanded:n.expanded,isError:a.isError},i);return e(o,i,a.lastComponent)}});let x=h(_),S=x.renderResult;v(x.name)&&g.registerTool({...x,renderShell:`self`,renderCall:(e,t,n)=>l(e,t,{expanded:n.expanded,argsStreaming:n.argsComplete===!1&&n.isPartial}),renderResult:(n,r,i,a)=>{let o=S(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}});let C=f(_),w=C.renderResult;v(C.name)&&g.registerTool({...C,renderShell:`self`,renderCall:(e,t)=>a(e,t),renderResult:(n,r,i,a)=>{let o=w(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}});let T=d(_),E=T.renderResult;v(T.name)&&g.registerTool({...T,renderShell:`self`,renderCall:(e,t)=>i(e,t),renderResult:(n,r,i,a)=>{let o=E(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}});let D=p(_),O=D.renderResult;v(D.name)&&g.registerTool({...D,renderShell:`self`,renderCall:(e,t)=>o(e,t),renderResult:(n,r,i,a)=>{let o=O(n,r,i,{...a,lastComponent:t(a.lastComponent)});return e(o,i,a.lastComponent)}})}export{g as registerBuiltinToolUi};
2
+ //# sourceMappingURL=toolOverrides.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolOverrides.mjs","names":[],"sources":["../../../src/adapters/pi/toolOverrides.ts"],"sourcesContent":["import {\n createEditToolDefinition,\n createFindToolDefinition,\n createGrepToolDefinition,\n createLsToolDefinition,\n createReadToolDefinition,\n createWriteToolDefinition,\n type ExtensionAPI,\n} from '@earendil-works/pi-coding-agent';\nimport {\n frameBuiltinResult,\n previousBuiltinResult,\n renderEditCall,\n renderEditResult,\n renderFindCall,\n renderGrepCall,\n renderLsCall,\n renderReadCall,\n renderReadResult,\n renderWriteCall,\n} from '../../tui/builtinToolRender.ts';\n\n/**\n * Keep Pi's native schemas, prompt metadata, execution, and result formatting;\n * replace only the broad status-background shell and call heading.\n */\nexport function registerBuiltinToolUi(\n pi: ExtensionAPI,\n cwd: string,\n shouldRegister: (tool: string) => boolean = () => true,\n): void {\n const read = createReadToolDefinition(cwd);\n if (shouldRegister(read.name))\n pi.registerTool({\n ...read,\n renderShell: 'self',\n renderCall: (args, theme) => renderReadCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = renderReadResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const edit = createEditToolDefinition(cwd);\n if (shouldRegister(edit.name))\n pi.registerTool({\n ...edit,\n renderShell: 'self',\n renderCall: (args, theme) => renderEditCall(args, theme),\n // Doom bands the diff on the background and keeps syntax highlighting on\n // the foreground, which Pi's foreground-only diff renderer cannot express.\n renderResult: (result, options, theme, context) => {\n const content = renderEditResult(\n context.args,\n result,\n { expanded: options.expanded, isError: context.isError },\n theme,\n );\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const write = createWriteToolDefinition(cwd);\n const writeResult = write.renderResult!;\n if (shouldRegister(write.name))\n pi.registerTool({\n ...write,\n renderShell: 'self',\n renderCall: (args, theme, context) =>\n renderWriteCall(args, theme, {\n expanded: context.expanded,\n // Restored completed rows may not mark args complete, but their result is no longer partial.\n argsStreaming: context.argsComplete === false && context.isPartial,\n }),\n renderResult: (result, options, theme, context) => {\n const content = writeResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const grep = createGrepToolDefinition(cwd);\n const grepResult = grep.renderResult!;\n if (shouldRegister(grep.name))\n pi.registerTool({\n ...grep,\n renderShell: 'self',\n renderCall: (args, theme) => renderGrepCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = grepResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const find = createFindToolDefinition(cwd);\n const findResult = find.renderResult!;\n if (shouldRegister(find.name))\n pi.registerTool({\n ...find,\n renderShell: 'self',\n renderCall: (args, theme) => renderFindCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = findResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n\n const ls = createLsToolDefinition(cwd);\n const lsResult = ls.renderResult!;\n if (shouldRegister(ls.name))\n pi.registerTool({\n ...ls,\n renderShell: 'self',\n renderCall: (args, theme) => renderLsCall(args, theme),\n renderResult: (result, options, theme, context) => {\n const content = lsResult(result, options, theme, {\n ...context,\n lastComponent: previousBuiltinResult(context.lastComponent),\n });\n return frameBuiltinResult(content, theme, context.lastComponent);\n },\n });\n}\n"],"mappings":"meA0BA,SAAgB,EACd,EACA,EACA,MAAkD,GAC5C,CACN,IAAM,EAAO,EAAyB,CAAG,EACrC,EAAe,EAAK,IAAI,GAC1B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EACd,EAAQ,KACR,EACA,CAAE,SAAU,EAAQ,SAAU,QAAS,EAAQ,OAAQ,EACvD,CACF,EACA,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAEH,IAAM,EAAO,EAAyB,CAAG,EACrC,EAAe,EAAK,IAAI,GAC1B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EAGvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EACd,EAAQ,KACR,EACA,CAAE,SAAU,EAAQ,SAAU,QAAS,EAAQ,OAAQ,EACvD,CACF,EACA,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAEH,IAAM,EAAQ,EAA0B,CAAG,EACrC,EAAc,EAAM,aACtB,EAAe,EAAM,IAAI,GAC3B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,EAAO,IACxB,EAAgB,EAAM,EAAO,CAC3B,SAAU,EAAQ,SAElB,cAAe,EAAQ,eAAiB,IAAS,EAAQ,SAC3D,CAAC,EACH,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAY,EAAQ,EAAS,EAAO,CAClD,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAEH,IAAM,EAAO,EAAyB,CAAG,EACnC,EAAa,EAAK,aACpB,EAAe,EAAK,IAAI,GAC1B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAW,EAAQ,EAAS,EAAO,CACjD,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAEH,IAAM,EAAO,EAAyB,CAAG,EACnC,EAAa,EAAK,aACpB,EAAe,EAAK,IAAI,GAC1B,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAe,EAAM,CAAK,EACvD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAW,EAAQ,EAAS,EAAO,CACjD,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,EAEH,IAAM,EAAK,EAAuB,CAAG,EAC/B,EAAW,EAAG,aAChB,EAAe,EAAG,IAAI,GACxB,EAAG,aAAa,CACd,GAAG,EACH,YAAa,OACb,YAAa,EAAM,IAAU,EAAa,EAAM,CAAK,EACrD,cAAe,EAAQ,EAAS,EAAO,IAAY,CACjD,IAAM,EAAU,EAAS,EAAQ,EAAS,EAAO,CAC/C,GAAG,EACH,cAAe,EAAsB,EAAQ,aAAa,CAC5D,CAAC,EACD,OAAO,EAAmB,EAAS,EAAO,EAAQ,aAAa,CACjE,CACF,CAAC,CACL"}
@@ -0,0 +1,2 @@
1
+ let e=require("@agimon-ai/doompi-telemetry");const t={leaderContributionRejected:`doom_pi_ui.leader_contribution_rejected`,leaderCommandUnavailable:`doom_pi_ui.leader_command_unavailable`,leaderActionUnavailable:`doom_pi_ui.leader_action_unavailable`,themeApplyFailed:`doom_pi_ui.theme_apply_failed`,shellInstalled:`doom_pi_ui.shell_installed`};function n(t={}){let n=(0,e.createDoomTelemetry)({serviceName:`doom-pi-ui`,packageName:`@agimon-ai/doompi-ui`,cwd:t.cwd,workspaceRoot:t.workspaceRoot,env:t.env,telemetryFactory:t.telemetryFactory,warn:t.warn,enableLogs:!0,enableTraces:!0});return{recordError:(e,t,r)=>n.recordError(e,t,r),recordWarning:(e,t,r)=>n.recordWarning(e,t,r),recordEvent:(e,t)=>n.recordEvent(e,t),flush:()=>n.flush(),shutdown:()=>n.shutdown()}}exports.UI_EVENT=t,exports.createUiTelemetry=n;
2
+ //# sourceMappingURL=logSinkTelemetry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logSinkTelemetry.cjs","names":["createDoomTelemetry"],"sources":["../../../src/adapters/telemetry/logSinkTelemetry.ts"],"sourcesContent":["import { createDoomTelemetry, type DoomTelemetry, type DoomTelemetryOptions } from '@agimon-ai/doompi-telemetry';\n\nconst SERVICE_NAME = 'doom-pi-ui';\nconst PACKAGE_NAME = '@agimon-ai/doompi-ui';\n\nexport const UI_EVENT = {\n leaderContributionRejected: 'doom_pi_ui.leader_contribution_rejected',\n leaderCommandUnavailable: 'doom_pi_ui.leader_command_unavailable',\n leaderActionUnavailable: 'doom_pi_ui.leader_action_unavailable',\n themeApplyFailed: 'doom_pi_ui.theme_apply_failed',\n shellInstalled: 'doom_pi_ui.shell_installed',\n} as const;\n\nexport type UiEventName = (typeof UI_EVENT)[keyof typeof UI_EVENT];\nexport type UiEventAttributes = Record<string, string | number | boolean>;\n\nexport interface UiTelemetryOptions {\n cwd?: string;\n workspaceRoot?: string;\n env?: NodeJS.ProcessEnv;\n telemetryFactory?: NonNullable<DoomTelemetryOptions['telemetryFactory']>;\n warn?: (message: string) => void;\n}\n\nexport interface UiTelemetry {\n recordError(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;\n recordWarning(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;\n recordEvent(event: UiEventName, attributes?: UiEventAttributes): Promise<void>;\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport function createUiTelemetry(options: UiTelemetryOptions = {}): UiTelemetry {\n const telemetry: DoomTelemetry = createDoomTelemetry({\n serviceName: SERVICE_NAME,\n packageName: PACKAGE_NAME,\n cwd: options.cwd,\n workspaceRoot: options.workspaceRoot,\n env: options.env,\n telemetryFactory: options.telemetryFactory,\n warn: options.warn,\n enableLogs: true,\n enableTraces: true,\n });\n return {\n recordError: (event, error, attributes) => telemetry.recordError(event, error, attributes),\n recordWarning: (event, error, attributes) => telemetry.recordWarning(event, error, attributes),\n recordEvent: (event, attributes) => telemetry.recordEvent(event, attributes),\n flush: () => telemetry.flush(),\n shutdown: () => telemetry.shutdown(),\n };\n}\n"],"mappings":"6CAEA,MAGa,EAAW,CACtB,2BAA4B,0CAC5B,yBAA0B,wCAC1B,wBAAyB,uCACzB,iBAAkB,gCAClB,eAAgB,4BAClB,EAqBA,SAAgB,EAAkB,EAA8B,CAAC,EAAgB,CAC/E,IAAM,GAAA,EAA2BA,EAAAA,oBAAAA,CAAoB,CACnD,YAAa,aACb,YAAa,uBACb,IAAK,EAAQ,IACb,cAAe,EAAQ,cACvB,IAAK,EAAQ,IACb,iBAAkB,EAAQ,iBAC1B,KAAM,EAAQ,KACd,WAAY,GACZ,aAAc,EAChB,CAAC,EACD,MAAO,CACL,aAAc,EAAO,EAAO,IAAe,EAAU,YAAY,EAAO,EAAO,CAAU,EACzF,eAAgB,EAAO,EAAO,IAAe,EAAU,cAAc,EAAO,EAAO,CAAU,EAC7F,aAAc,EAAO,IAAe,EAAU,YAAY,EAAO,CAAU,EAC3E,UAAa,EAAU,MAAM,EAC7B,aAAgB,EAAU,SAAS,CACrC,CACF"}
@@ -0,0 +1,28 @@
1
+ import { DoomTelemetryOptions } from "@agimon-ai/doompi-telemetry";
2
+ //#region src/adapters/telemetry/logSinkTelemetry.d.ts
3
+ export declare const UI_EVENT: {
4
+ readonly leaderContributionRejected: 'doom_pi_ui.leader_contribution_rejected';
5
+ readonly leaderCommandUnavailable: 'doom_pi_ui.leader_command_unavailable';
6
+ readonly leaderActionUnavailable: 'doom_pi_ui.leader_action_unavailable';
7
+ readonly themeApplyFailed: 'doom_pi_ui.theme_apply_failed';
8
+ readonly shellInstalled: 'doom_pi_ui.shell_installed';
9
+ };
10
+ export type UiEventName = (typeof UI_EVENT)[keyof typeof UI_EVENT];
11
+ export type UiEventAttributes = Record<string, string | number | boolean>;
12
+ export interface UiTelemetryOptions {
13
+ cwd?: string;
14
+ workspaceRoot?: string;
15
+ env?: NodeJS.ProcessEnv;
16
+ telemetryFactory?: NonNullable<DoomTelemetryOptions['telemetryFactory']>;
17
+ warn?: (message: string) => void;
18
+ }
19
+ export interface UiTelemetry {
20
+ recordError(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;
21
+ recordWarning(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;
22
+ recordEvent(event: UiEventName, attributes?: UiEventAttributes): Promise<void>;
23
+ flush(): Promise<void>;
24
+ shutdown(): Promise<void>;
25
+ }
26
+ export declare function createUiTelemetry(options?: UiTelemetryOptions): UiTelemetry;
27
+ //#endregion
28
+ //# sourceMappingURL=logSinkTelemetry.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logSinkTelemetry.d.cts","names":[],"sources":["../../../src/adapters/telemetry/logSinkTelemetry.ts"],"mappings":";;qBAKa;WACX;WACA;WACA;WACA;WACA;;YAGU,sBAAsB,uBAAuB;YAC7C,oBAAoB;iBAEf;EACf;EACA;EACA,MAAM,OAAO;EACb,mBAAmB,YAAY;EAC/B,QAAQ;;iBAGO;EACf,YAAY,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACjF,cAAc,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACnF,YAAY,OAAO,aAAa,aAAa,oBAAoB;EACjE,SAAS;EACT,YAAY;;wBAGE,kBAAkB,UAAS,qBAA0B"}
@@ -0,0 +1,28 @@
1
+ import { DoomTelemetryOptions } from "@agimon-ai/doompi-telemetry";
2
+ //#region src/adapters/telemetry/logSinkTelemetry.d.ts
3
+ export declare const UI_EVENT: {
4
+ readonly leaderContributionRejected: 'doom_pi_ui.leader_contribution_rejected';
5
+ readonly leaderCommandUnavailable: 'doom_pi_ui.leader_command_unavailable';
6
+ readonly leaderActionUnavailable: 'doom_pi_ui.leader_action_unavailable';
7
+ readonly themeApplyFailed: 'doom_pi_ui.theme_apply_failed';
8
+ readonly shellInstalled: 'doom_pi_ui.shell_installed';
9
+ };
10
+ export type UiEventName = (typeof UI_EVENT)[keyof typeof UI_EVENT];
11
+ export type UiEventAttributes = Record<string, string | number | boolean>;
12
+ export interface UiTelemetryOptions {
13
+ cwd?: string;
14
+ workspaceRoot?: string;
15
+ env?: NodeJS.ProcessEnv;
16
+ telemetryFactory?: NonNullable<DoomTelemetryOptions['telemetryFactory']>;
17
+ warn?: (message: string) => void;
18
+ }
19
+ export interface UiTelemetry {
20
+ recordError(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;
21
+ recordWarning(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;
22
+ recordEvent(event: UiEventName, attributes?: UiEventAttributes): Promise<void>;
23
+ flush(): Promise<void>;
24
+ shutdown(): Promise<void>;
25
+ }
26
+ export declare function createUiTelemetry(options?: UiTelemetryOptions): UiTelemetry;
27
+ //#endregion
28
+ //# sourceMappingURL=logSinkTelemetry.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logSinkTelemetry.d.mts","names":[],"sources":["../../../src/adapters/telemetry/logSinkTelemetry.ts"],"mappings":";;qBAKa;WACX;WACA;WACA;WACA;WACA;;YAGU,sBAAsB,uBAAuB;YAC7C,oBAAoB;iBAEf;EACf;EACA;EACA,MAAM,OAAO;EACb,mBAAmB,YAAY;EAC/B,QAAQ;;iBAGO;EACf,YAAY,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACjF,cAAc,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACnF,YAAY,OAAO,aAAa,aAAa,oBAAoB;EACjE,SAAS;EACT,YAAY;;wBAGE,kBAAkB,UAAS,qBAA0B"}
@@ -0,0 +1,2 @@
1
+ import{createDoomTelemetry as e}from"@agimon-ai/doompi-telemetry";const t={leaderContributionRejected:`doom_pi_ui.leader_contribution_rejected`,leaderCommandUnavailable:`doom_pi_ui.leader_command_unavailable`,leaderActionUnavailable:`doom_pi_ui.leader_action_unavailable`,themeApplyFailed:`doom_pi_ui.theme_apply_failed`,shellInstalled:`doom_pi_ui.shell_installed`};function n(t={}){let n=e({serviceName:`doom-pi-ui`,packageName:`@agimon-ai/doompi-ui`,cwd:t.cwd,workspaceRoot:t.workspaceRoot,env:t.env,telemetryFactory:t.telemetryFactory,warn:t.warn,enableLogs:!0,enableTraces:!0});return{recordError:(e,t,r)=>n.recordError(e,t,r),recordWarning:(e,t,r)=>n.recordWarning(e,t,r),recordEvent:(e,t)=>n.recordEvent(e,t),flush:()=>n.flush(),shutdown:()=>n.shutdown()}}export{t as UI_EVENT,n as createUiTelemetry};
2
+ //# sourceMappingURL=logSinkTelemetry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logSinkTelemetry.mjs","names":[],"sources":["../../../src/adapters/telemetry/logSinkTelemetry.ts"],"sourcesContent":["import { createDoomTelemetry, type DoomTelemetry, type DoomTelemetryOptions } from '@agimon-ai/doompi-telemetry';\n\nconst SERVICE_NAME = 'doom-pi-ui';\nconst PACKAGE_NAME = '@agimon-ai/doompi-ui';\n\nexport const UI_EVENT = {\n leaderContributionRejected: 'doom_pi_ui.leader_contribution_rejected',\n leaderCommandUnavailable: 'doom_pi_ui.leader_command_unavailable',\n leaderActionUnavailable: 'doom_pi_ui.leader_action_unavailable',\n themeApplyFailed: 'doom_pi_ui.theme_apply_failed',\n shellInstalled: 'doom_pi_ui.shell_installed',\n} as const;\n\nexport type UiEventName = (typeof UI_EVENT)[keyof typeof UI_EVENT];\nexport type UiEventAttributes = Record<string, string | number | boolean>;\n\nexport interface UiTelemetryOptions {\n cwd?: string;\n workspaceRoot?: string;\n env?: NodeJS.ProcessEnv;\n telemetryFactory?: NonNullable<DoomTelemetryOptions['telemetryFactory']>;\n warn?: (message: string) => void;\n}\n\nexport interface UiTelemetry {\n recordError(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;\n recordWarning(event: UiEventName, error: unknown, attributes?: UiEventAttributes): Promise<void>;\n recordEvent(event: UiEventName, attributes?: UiEventAttributes): Promise<void>;\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport function createUiTelemetry(options: UiTelemetryOptions = {}): UiTelemetry {\n const telemetry: DoomTelemetry = createDoomTelemetry({\n serviceName: SERVICE_NAME,\n packageName: PACKAGE_NAME,\n cwd: options.cwd,\n workspaceRoot: options.workspaceRoot,\n env: options.env,\n telemetryFactory: options.telemetryFactory,\n warn: options.warn,\n enableLogs: true,\n enableTraces: true,\n });\n return {\n recordError: (event, error, attributes) => telemetry.recordError(event, error, attributes),\n recordWarning: (event, error, attributes) => telemetry.recordWarning(event, error, attributes),\n recordEvent: (event, attributes) => telemetry.recordEvent(event, attributes),\n flush: () => telemetry.flush(),\n shutdown: () => telemetry.shutdown(),\n };\n}\n"],"mappings":"kEAEA,MAGa,EAAW,CACtB,2BAA4B,0CAC5B,yBAA0B,wCAC1B,wBAAyB,uCACzB,iBAAkB,gCAClB,eAAgB,4BAClB,EAqBA,SAAgB,EAAkB,EAA8B,CAAC,EAAgB,CAC/E,IAAM,EAA2B,EAAoB,CACnD,YAAa,aACb,YAAa,uBACb,IAAK,EAAQ,IACb,cAAe,EAAQ,cACvB,IAAK,EAAQ,IACb,iBAAkB,EAAQ,iBAC1B,KAAM,EAAQ,KACd,WAAY,GACZ,aAAc,EAChB,CAAC,EACD,MAAO,CACL,aAAc,EAAO,EAAO,IAAe,EAAU,YAAY,EAAO,EAAO,CAAU,EACzF,eAAgB,EAAO,EAAO,IAAe,EAAU,cAAc,EAAO,EAAO,CAAU,EAC7F,aAAc,EAAO,IAAe,EAAU,YAAY,EAAO,CAAU,EAC3E,UAAa,EAAU,MAAM,EAC7B,aAAgB,EAAU,SAAS,CACrC,CACF"}
Binary file
Binary file
Binary file
Binary file
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../leaderRegistry.cjs"),t=require("../rendering.cjs");let n=require("@earendil-works/pi-coding-agent"),r=require("@earendil-works/pi-tui");const i=`borderAccent`,a=`accent`,o={bg:(e,t)=>t,bold:e=>e,fg:(e,t)=>t,inverse:e=>e},s={active:!1,prefix:[],label:``,options:[]};var c=class extends n.CustomEditor{uiState;onSnapshot;chromeTheme;leaderRegistry;isCommandAvailable;onUnavailableCommand;onUnavailableAction;onLeaderAction;unsubscribeLeaderRegistry;unsubscribeUiState;leaderActive=!1;leaderPath=[];constructor(t,n,r,i,a,s,c=o,l={}){super(t,n,r,s),this.uiState=i,this.onSnapshot=a,this.chromeTheme=c,this.leaderRegistry=l.registry??new e.DoomLeaderRegistry,this.isCommandAvailable=l.isCommandAvailable??(()=>!0),this.onUnavailableCommand=l.onUnavailableCommand??(()=>void 0),this.onUnavailableAction=l.onUnavailableAction??(()=>void 0),this.onLeaderAction=l.onLeaderAction,this.unsubscribeLeaderRegistry=this.leaderRegistry.subscribe(()=>{this.leaderActive&&this.publishLeader()}),this.unsubscribeUiState=this.uiState.subscribe(()=>t.requestRender())}handleInput(e){let t=(0,r.parseKey)(e);if(this.leaderActive){this.handleLeaderInput(t);return}if(t===`space`&&this.getText().length===0||t===`ctrl+space`){this.startLeader();return}super.handleInput(e)}render(e){if(e<12)return super.render(e);let n=e-4,r=super.render(n);if(r.length<3)return r.map(n=>t.fitLine(n,e));let o=this.findBottomBorder(r,n),s=r.slice(1,o),c=r.slice(o+1),l=this.chromeTheme.fg(i,`│`),u=this.chromeTheme.fg(i,`╭${`─`.repeat(e-2)}╮`),d=this.chromeTheme.fg(i,`╰${`─`.repeat(e-2)}╯`),f=this.editorLine(t.alignLine(` ${this.modeBadge()}${this.modeNames()}`,this.chromeTheme.fg(`dim`,`${this.editorStatus()} `),e-2),e,l),p=s.map((t,n)=>{let r=n===0?this.chromeTheme.bold(this.chromeTheme.fg(a,`❯ `)):` `;return this.editorLine(`${r}${t}`,e,l)});return[u,f,`${this.chromeTheme.fg(i,`├`)}${this.chromeTheme.fg(`borderMuted`,`─`.repeat(e-2))}${this.chromeTheme.fg(i,`┤`)}`,...p,d,...c.map(n=>t.fitLine(` ${n}`,e))]}dispose(){this.unsubscribeLeaderRegistry(),this.unsubscribeUiState(),this.cancelLeader()}startLeader(){this.leaderActive=!0,this.leaderPath=[],this.publishLeader()}cancelLeader(){this.leaderActive=!1,this.leaderPath=[],this.publish(s)}handleLeaderInput(e){if(e===`escape`){this.cancelLeader();return}if(e===`backspace`){this.leaderPath.length===0?this.cancelLeader():(this.leaderPath.pop(),this.publishLeader());return}if(!e||e.length!==1){this.cancelLeader();return}let t=e.toLowerCase(),n=this.currentGroup()?.options.find(e=>e.key===t);if(!n){this.cancelLeader();return}if(n.hasChildren){this.leaderPath.push(t),this.publishLeader();return}if(!n.action){this.cancelLeader();return}this.cancelLeader(),this.execute(n.action)}currentGroup(){return this.leaderRegistry.getGroup(this.leaderPath)}publishLeader(){let e=this.currentGroup();if(!e){this.cancelLeader();return}let t=this.leaderRegistry.getGroup([]);this.publish({active:!0,prefix:[`SPC`,...this.leaderPath],label:e.label,options:e.options.map(e=>({key:e.key,label:e.label,...e.detail?{detail:e.detail}:{}})),rootOptions:t?.options.map(e=>({key:e.key,label:e.label,...e.detail?{detail:e.detail}:{}}))??[]})}publish(e){this.uiState.setLeader(e),this.onSnapshot(e),this.tui.requestRender()}execute(e){if(e.type===`app`){let t=this.actionHandlers.get(e.action);if(t){t();return}if(e.action===`app.exit`){this.onCtrlD?.();return}this.onUnavailableAction(e.action);return}if(e.type===`command`){this.submitCommand(e.command.name,e.command.args);return}this.onLeaderAction?this.onLeaderAction(e.source,e.action.name):this.onUnavailableAction(`${e.source}:${e.action.name}`)}submitCommand(e,t){if(!this.isCommandAvailable(e)){this.onUnavailableCommand(e);return}let n=this.getText(),r=`/${e}${t?` ${t}`:``}`;this.setText(``);try{this.onSubmit?.(r)}finally{this.setText(n)}}modeLabel(){return this.leaderActive?`LEADER ${[`SPC`,...this.leaderPath].join(` `)}`:`INSERT`}modeBadge(){let e=` ${this.modeLabel()} `,t=this.leaderActive?`mdHeading`:a;return this.chromeTheme.inverse(this.chromeTheme.bold(this.chromeTheme.fg(t,e)))}modeNames(){let e=this.uiState.getModes();if(e.length===0)return``;let t=e.map(e=>e.label.toLowerCase()).join(` · `);return this.chromeTheme.fg(`muted`,` ${t}`)}editorStatus(){if(this.leaderActive)return`draft preserved · esc cancel`;let e=this.getText().length;return e===0?`draft 0 · ^SPC leader · SPC shortcut`:`draft ${e} · ^SPC leader`}editorLine(e,n,r){return t.frameLine(t.padLine(e,n-2),n,r,r)}findBottomBorder(e,t){let n=Math.max(1,t-10),r=e.findIndex((e,t)=>t!==0&&e.split(`─`).length-1>=n);return r>0?r:e.length-1}};exports.DoomEditor=c;
2
- //# sourceMappingURL=doomEditor.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../tui/doomEditor.cjs");exports.DoomEditor=e.DoomEditor;