@agimon-ai/doompi-ui 0.0.1-alpha.2 → 0.0.1-alpha.21

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 (327) hide show
  1. package/README.md +21 -18
  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 +16 -0
  14. package/dist/adapters/pi/extensionName.d.cts.map +1 -0
  15. package/dist/adapters/pi/extensionName.d.mts +16 -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 +29 -0
  26. package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
  27. package/dist/adapters/telemetry/logSinkTelemetry.d.mts +29 -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/toolsOverlay.cjs +1 -2
  56. package/dist/components/toolsOverlay.d.cts +2 -29
  57. package/dist/components/toolsOverlay.d.mts +2 -29
  58. package/dist/components/toolsOverlay.mjs +1 -2
  59. package/dist/config.cjs +1 -2
  60. package/dist/config.d.cts +2 -5
  61. package/dist/config.d.mts +2 -5
  62. package/dist/config.mjs +1 -2
  63. package/dist/extension.cjs +1 -2
  64. package/dist/extension.d.cts +2 -7
  65. package/dist/extension.d.mts +2 -7
  66. package/dist/extension.mjs +1 -2
  67. package/dist/extensionName.cjs +1 -2
  68. package/dist/extensionName.d.cts +2 -5
  69. package/dist/extensionName.d.mts +2 -5
  70. package/dist/extensionName.mjs +1 -2
  71. package/dist/extensions/pi.cjs +1 -1
  72. package/dist/extensions/pi.cjs.map +1 -1
  73. package/dist/extensions/pi.d.cts +1 -1
  74. package/dist/extensions/pi.d.mts +1 -1
  75. package/dist/extensions/pi.mjs +1 -1
  76. package/dist/extensions/pi.mjs.map +1 -1
  77. package/dist/footer.cjs +1 -2
  78. package/dist/footer.d.cts +2 -5
  79. package/dist/footer.d.mts +2 -5
  80. package/dist/footer.mjs +1 -2
  81. package/dist/harnessMetadata.cjs +1 -2
  82. package/dist/harnessMetadata.d.cts +2 -21
  83. package/dist/harnessMetadata.d.mts +2 -21
  84. package/dist/harnessMetadata.mjs +1 -2
  85. package/dist/index.cjs +1 -1
  86. package/dist/index.d.cts +14 -25
  87. package/dist/index.d.mts +14 -25
  88. package/dist/index.mjs +1 -1
  89. package/dist/leaderRegistry.cjs +1 -2
  90. package/dist/leaderRegistry.d.cts +2 -58
  91. package/dist/leaderRegistry.d.mts +2 -58
  92. package/dist/leaderRegistry.mjs +1 -2
  93. package/dist/logSinkTelemetry.cjs +1 -2
  94. package/dist/logSinkTelemetry.d.cts +2 -29
  95. package/dist/logSinkTelemetry.d.mts +2 -29
  96. package/dist/logSinkTelemetry.mjs +1 -2
  97. package/dist/rendering.cjs +1 -2
  98. package/dist/rendering.d.cts +2 -11
  99. package/dist/rendering.d.mts +2 -11
  100. package/dist/rendering.mjs +1 -2
  101. package/dist/services/leader/leaderRegistry.cjs +2 -0
  102. package/dist/services/leader/leaderRegistry.cjs.map +1 -0
  103. package/dist/services/leader/leaderRegistry.d.cts +58 -0
  104. package/dist/services/leader/leaderRegistry.d.cts.map +1 -0
  105. package/dist/services/leader/leaderRegistry.d.mts +58 -0
  106. package/dist/services/leader/leaderRegistry.d.mts.map +1 -0
  107. package/dist/services/leader/leaderRegistry.mjs +2 -0
  108. package/dist/services/leader/leaderRegistry.mjs.map +1 -0
  109. package/dist/services/state/uiState.cjs +2 -0
  110. package/dist/services/state/uiState.cjs.map +1 -0
  111. package/dist/services/state/uiState.d.cts +38 -0
  112. package/dist/services/state/uiState.d.cts.map +1 -0
  113. package/dist/services/state/uiState.d.mts +38 -0
  114. package/dist/services/state/uiState.d.mts.map +1 -0
  115. package/dist/services/state/uiState.mjs +2 -0
  116. package/dist/services/state/uiState.mjs.map +1 -0
  117. package/dist/services/tools/toolInventory.cjs +2 -0
  118. package/dist/services/tools/toolInventory.cjs.map +1 -0
  119. package/dist/services/tools/toolInventory.d.cts +51 -0
  120. package/dist/services/tools/toolInventory.d.cts.map +1 -0
  121. package/dist/services/tools/toolInventory.d.mts +51 -0
  122. package/dist/services/tools/toolInventory.d.mts.map +1 -0
  123. package/dist/services/tools/toolInventory.mjs +2 -0
  124. package/dist/services/tools/toolInventory.mjs.map +1 -0
  125. package/dist/skills.cjs +1 -1
  126. package/dist/skills.d.cts +2 -1
  127. package/dist/skills.d.mts +2 -1
  128. package/dist/skills.mjs +1 -1
  129. package/dist/theme.cjs +1 -2
  130. package/dist/theme.d.cts +2 -95
  131. package/dist/theme.d.mts +2 -95
  132. package/dist/theme.mjs +1 -2
  133. package/dist/toolChrome.cjs +1 -0
  134. package/dist/toolChrome.d.cts +2 -0
  135. package/dist/toolChrome.d.mts +2 -0
  136. package/dist/toolChrome.mjs +1 -0
  137. package/dist/toolInventory.cjs +1 -2
  138. package/dist/toolInventory.d.cts +2 -40
  139. package/dist/toolInventory.d.mts +2 -40
  140. package/dist/toolInventory.mjs +1 -2
  141. package/dist/tui/builtinToolRender.cjs +14 -0
  142. package/dist/tui/builtinToolRender.cjs.map +1 -0
  143. package/dist/tui/builtinToolRender.mjs +14 -0
  144. package/dist/tui/builtinToolRender.mjs.map +1 -0
  145. package/dist/tui/codeGutter.cjs +2 -0
  146. package/dist/tui/codeGutter.cjs.map +1 -0
  147. package/dist/tui/codeGutter.mjs +2 -0
  148. package/dist/tui/codeGutter.mjs.map +1 -0
  149. package/dist/tui/configOverlay.cjs +0 -0
  150. package/dist/tui/configOverlay.cjs.map +1 -0
  151. package/dist/tui/configOverlay.d.cts +0 -0
  152. package/dist/tui/configOverlay.d.cts.map +1 -0
  153. package/dist/tui/configOverlay.d.mts +0 -0
  154. package/dist/tui/configOverlay.d.mts.map +1 -0
  155. package/dist/tui/configOverlay.mjs +0 -0
  156. package/dist/tui/configOverlay.mjs.map +1 -0
  157. package/dist/tui/diffRender.cjs +4 -0
  158. package/dist/tui/diffRender.cjs.map +1 -0
  159. package/dist/tui/diffRender.mjs +4 -0
  160. package/dist/tui/diffRender.mjs.map +1 -0
  161. package/dist/tui/doomEditor.cjs +2 -0
  162. package/dist/tui/doomEditor.cjs.map +1 -0
  163. package/dist/tui/doomEditor.d.cts +63 -0
  164. package/dist/tui/doomEditor.d.cts.map +1 -0
  165. package/dist/tui/doomEditor.d.mts +63 -0
  166. package/dist/tui/doomEditor.d.mts.map +1 -0
  167. package/dist/tui/doomEditor.mjs +2 -0
  168. package/dist/tui/doomEditor.mjs.map +1 -0
  169. package/dist/tui/doomFooter.cjs +2 -0
  170. package/dist/tui/doomFooter.cjs.map +1 -0
  171. package/dist/tui/doomFooter.d.cts +32 -0
  172. package/dist/tui/doomFooter.d.cts.map +1 -0
  173. package/dist/tui/doomFooter.d.mts +32 -0
  174. package/dist/tui/doomFooter.d.mts.map +1 -0
  175. package/dist/tui/doomFooter.mjs +2 -0
  176. package/dist/tui/doomFooter.mjs.map +1 -0
  177. package/dist/tui/doomHeader.cjs +2 -0
  178. package/dist/tui/doomHeader.cjs.map +1 -0
  179. package/dist/tui/doomHeader.d.cts +34 -0
  180. package/dist/tui/doomHeader.d.cts.map +1 -0
  181. package/dist/tui/doomHeader.d.mts +34 -0
  182. package/dist/tui/doomHeader.d.mts.map +1 -0
  183. package/dist/tui/doomHeader.mjs +2 -0
  184. package/dist/tui/doomHeader.mjs.map +1 -0
  185. package/dist/tui/doomOverlay.cjs +2 -0
  186. package/dist/tui/doomOverlay.cjs.map +1 -0
  187. package/dist/tui/doomOverlay.d.cts +84 -0
  188. package/dist/tui/doomOverlay.d.cts.map +1 -0
  189. package/dist/tui/doomOverlay.d.mts +84 -0
  190. package/dist/tui/doomOverlay.d.mts.map +1 -0
  191. package/dist/tui/doomOverlay.mjs +2 -0
  192. package/dist/tui/doomOverlay.mjs.map +1 -0
  193. package/dist/tui/leaderHints.cjs +2 -0
  194. package/dist/tui/leaderHints.cjs.map +1 -0
  195. package/dist/tui/leaderHints.d.cts +36 -0
  196. package/dist/tui/leaderHints.d.cts.map +1 -0
  197. package/dist/tui/leaderHints.d.mts +36 -0
  198. package/dist/tui/leaderHints.d.mts.map +1 -0
  199. package/dist/tui/leaderHints.mjs +2 -0
  200. package/dist/tui/leaderHints.mjs.map +1 -0
  201. package/dist/tui/rendering.cjs +2 -0
  202. package/dist/tui/rendering.cjs.map +1 -0
  203. package/dist/tui/rendering.d.cts +16 -0
  204. package/dist/tui/rendering.d.cts.map +1 -0
  205. package/dist/tui/rendering.d.mts +16 -0
  206. package/dist/tui/rendering.d.mts.map +1 -0
  207. package/dist/tui/rendering.mjs +2 -0
  208. package/dist/tui/rendering.mjs.map +1 -0
  209. package/dist/tui/theme.cjs +2 -0
  210. package/dist/tui/theme.cjs.map +1 -0
  211. package/dist/tui/theme.d.cts +103 -0
  212. package/dist/tui/theme.d.cts.map +1 -0
  213. package/dist/tui/theme.d.mts +103 -0
  214. package/dist/tui/theme.d.mts.map +1 -0
  215. package/dist/tui/theme.mjs +2 -0
  216. package/dist/tui/theme.mjs.map +1 -0
  217. package/dist/tui/toolChrome.cjs +2 -0
  218. package/dist/tui/toolChrome.cjs.map +1 -0
  219. package/dist/tui/toolChrome.d.cts +30 -0
  220. package/dist/tui/toolChrome.d.cts.map +1 -0
  221. package/dist/tui/toolChrome.d.mts +30 -0
  222. package/dist/tui/toolChrome.d.mts.map +1 -0
  223. package/dist/tui/toolChrome.mjs +2 -0
  224. package/dist/tui/toolChrome.mjs.map +1 -0
  225. package/dist/tui/toolsOverlay.cjs +2 -0
  226. package/dist/tui/toolsOverlay.cjs.map +1 -0
  227. package/dist/tui/toolsOverlay.d.cts +29 -0
  228. package/dist/tui/toolsOverlay.d.cts.map +1 -0
  229. package/dist/tui/toolsOverlay.d.mts +29 -0
  230. package/dist/tui/toolsOverlay.d.mts.map +1 -0
  231. package/dist/tui/toolsOverlay.mjs +2 -0
  232. package/dist/tui/toolsOverlay.mjs.map +1 -0
  233. package/dist/types/harnessMetadata.cjs +2 -0
  234. package/dist/types/harnessMetadata.cjs.map +1 -0
  235. package/dist/types/harnessMetadata.d.cts +21 -0
  236. package/dist/types/harnessMetadata.d.cts.map +1 -0
  237. package/dist/types/harnessMetadata.d.mts +21 -0
  238. package/dist/types/harnessMetadata.d.mts.map +1 -0
  239. package/dist/types/harnessMetadata.mjs +2 -0
  240. package/dist/types/harnessMetadata.mjs.map +1 -0
  241. package/dist/uiState.cjs +1 -2
  242. package/dist/uiState.d.cts +2 -37
  243. package/dist/uiState.d.mts +2 -37
  244. package/dist/uiState.mjs +1 -2
  245. package/package.json +19 -12
  246. package/themes/doom-pi-dark.json +32 -30
  247. package/dist/_virtual/_rolldown/runtime.mjs +0 -1
  248. package/dist/components/configOverlay.cjs.map +0 -1
  249. package/dist/components/configOverlay.d.cts.map +0 -1
  250. package/dist/components/configOverlay.d.mts.map +0 -1
  251. package/dist/components/configOverlay.mjs.map +0 -1
  252. package/dist/components/doomEditor.cjs.map +0 -1
  253. package/dist/components/doomEditor.d.cts.map +0 -1
  254. package/dist/components/doomEditor.d.mts.map +0 -1
  255. package/dist/components/doomEditor.mjs.map +0 -1
  256. package/dist/components/doomFooter.cjs.map +0 -1
  257. package/dist/components/doomFooter.d.cts.map +0 -1
  258. package/dist/components/doomFooter.d.mts.map +0 -1
  259. package/dist/components/doomFooter.mjs.map +0 -1
  260. package/dist/components/doomHeader.cjs.map +0 -1
  261. package/dist/components/doomHeader.d.cts.map +0 -1
  262. package/dist/components/doomHeader.d.mts.map +0 -1
  263. package/dist/components/doomHeader.mjs.map +0 -1
  264. package/dist/components/doomOverlay.cjs.map +0 -1
  265. package/dist/components/doomOverlay.d.cts.map +0 -1
  266. package/dist/components/doomOverlay.d.mts.map +0 -1
  267. package/dist/components/doomOverlay.mjs.map +0 -1
  268. package/dist/components/leaderHints.cjs.map +0 -1
  269. package/dist/components/leaderHints.d.cts.map +0 -1
  270. package/dist/components/leaderHints.d.mts.map +0 -1
  271. package/dist/components/leaderHints.mjs.map +0 -1
  272. package/dist/components/toolsOverlay.cjs.map +0 -1
  273. package/dist/components/toolsOverlay.d.cts.map +0 -1
  274. package/dist/components/toolsOverlay.d.mts.map +0 -1
  275. package/dist/components/toolsOverlay.mjs.map +0 -1
  276. package/dist/config.cjs.map +0 -1
  277. package/dist/config.d.cts.map +0 -1
  278. package/dist/config.d.mts.map +0 -1
  279. package/dist/config.mjs.map +0 -1
  280. package/dist/extension.cjs.map +0 -1
  281. package/dist/extension.d.cts.map +0 -1
  282. package/dist/extension.d.mts.map +0 -1
  283. package/dist/extension.mjs.map +0 -1
  284. package/dist/extensionName.cjs.map +0 -1
  285. package/dist/extensionName.d.cts.map +0 -1
  286. package/dist/extensionName.d.mts.map +0 -1
  287. package/dist/extensionName.mjs.map +0 -1
  288. package/dist/footer.cjs.map +0 -1
  289. package/dist/footer.d.cts.map +0 -1
  290. package/dist/footer.d.mts.map +0 -1
  291. package/dist/footer.mjs.map +0 -1
  292. package/dist/harnessMetadata.cjs.map +0 -1
  293. package/dist/harnessMetadata.d.cts.map +0 -1
  294. package/dist/harnessMetadata.d.mts.map +0 -1
  295. package/dist/harnessMetadata.mjs.map +0 -1
  296. package/dist/leaderRegistry.cjs.map +0 -1
  297. package/dist/leaderRegistry.d.cts.map +0 -1
  298. package/dist/leaderRegistry.d.mts.map +0 -1
  299. package/dist/leaderRegistry.mjs.map +0 -1
  300. package/dist/logSinkTelemetry.cjs.map +0 -1
  301. package/dist/logSinkTelemetry.d.cts.map +0 -1
  302. package/dist/logSinkTelemetry.d.mts.map +0 -1
  303. package/dist/logSinkTelemetry.mjs.map +0 -1
  304. package/dist/mode.cjs +0 -2
  305. package/dist/mode.cjs.map +0 -1
  306. package/dist/mode.d.cts +0 -5
  307. package/dist/mode.d.cts.map +0 -1
  308. package/dist/mode.d.mts +0 -5
  309. package/dist/mode.d.mts.map +0 -1
  310. package/dist/mode.mjs +0 -2
  311. package/dist/mode.mjs.map +0 -1
  312. package/dist/rendering.cjs.map +0 -1
  313. package/dist/rendering.d.cts.map +0 -1
  314. package/dist/rendering.d.mts.map +0 -1
  315. package/dist/rendering.mjs.map +0 -1
  316. package/dist/theme.cjs.map +0 -1
  317. package/dist/theme.d.cts.map +0 -1
  318. package/dist/theme.d.mts.map +0 -1
  319. package/dist/theme.mjs.map +0 -1
  320. package/dist/toolInventory.cjs.map +0 -1
  321. package/dist/toolInventory.d.cts.map +0 -1
  322. package/dist/toolInventory.d.mts.map +0 -1
  323. package/dist/toolInventory.mjs.map +0 -1
  324. package/dist/uiState.cjs.map +0 -1
  325. package/dist/uiState.d.cts.map +0 -1
  326. package/dist/uiState.d.mts.map +0 -1
  327. package/dist/uiState.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"rendering.mjs","names":[],"sources":["../src/rendering.ts"],"sourcesContent":["import { truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';\n\nconst THOUSAND = 1000;\nconst MILLION = 1_000_000;\n/** Below this many tokens the \"k\" form keeps a decimal, above it rounds. */\nconst K_DECIMAL_LIMIT = 10_000;\n\n/** Compact token count, e.g. `812`, `4.2k`, `186k`, `1.3M`. */\nexport function formatTokens(value: number): string {\n if (value < THOUSAND) return String(value);\n if (value < MILLION) return `${(value / THOUSAND).toFixed(value < K_DECIMAL_LIMIT ? 1 : 0)}k`;\n return `${(value / MILLION).toFixed(1)}M`;\n}\n\nexport function fitLine(text: string, width: number): string {\n return truncateToWidth(text, Math.max(0, width), '');\n}\n\nexport function padLine(text: string, width: number): string {\n const safeWidth = Math.max(0, width);\n const fitted = fitLine(text, safeWidth);\n return `${fitted}${' '.repeat(Math.max(0, safeWidth - visibleWidth(fitted)))}`;\n}\n\nexport function alignLine(left: string, right: string, width: number): string {\n const safeWidth = Math.max(0, width);\n const rightWidth = visibleWidth(right);\n if (!right || rightWidth >= safeWidth) return fitLine(right || left, safeWidth);\n\n const maxLeftWidth = Math.max(0, safeWidth - rightWidth - 1);\n const fittedLeft = fitLine(left, maxLeftWidth);\n const gap = ' '.repeat(Math.max(1, safeWidth - visibleWidth(fittedLeft) - rightWidth));\n return fitLine(`${fittedLeft}${gap}${right}`, safeWidth);\n}\n\nexport function frameLine(content: string, width: number, left = '│', right = '│'): string {\n const safeWidth = Math.max(0, width);\n const frameWidth = visibleWidth(left) + visibleWidth(right);\n if (safeWidth <= frameWidth) return fitLine(`${left}${right}`, safeWidth);\n return `${left}${padLine(content, safeWidth - frameWidth)}${right}`;\n}\n\nexport function packSegments(segments: string[], width: number, separator = ' '): string[] {\n const safeWidth = Math.max(0, width);\n if (safeWidth === 0) return [];\n\n const lines: string[] = [];\n let current = '';\n for (const segment of segments) {\n const candidate = current ? `${current}${separator}${segment}` : segment;\n if (visibleWidth(candidate) <= safeWidth) {\n current = candidate;\n continue;\n }\n if (current) lines.push(fitLine(current, safeWidth));\n current = fitLine(segment, safeWidth);\n }\n if (current) lines.push(current);\n return lines;\n}\n"],"mappings":"2EAEA,MAAM,EAAW,IACX,EAAU,IAKhB,SAAgB,EAAa,EAAuB,CAGlD,OAFI,EAAQ,EAAiB,OAAO,CAAK,EACrC,EAAQ,EAAgB,IAAI,EAAQ,EAAA,CAAU,QAAQ,IAAQ,IAAuB,EAAE,GACpF,IAAI,EAAQ,EAAA,CAAS,QAAQ,CAAC,EAAE,EACzC,CAEA,SAAgB,EAAQ,EAAc,EAAuB,CAC3D,OAAO,EAAgB,EAAM,KAAK,IAAI,EAAG,CAAK,EAAG,EAAE,CACrD,CAEA,SAAgB,EAAQ,EAAc,EAAuB,CAC3D,IAAM,EAAY,KAAK,IAAI,EAAG,CAAK,EAC7B,EAAS,EAAQ,EAAM,CAAS,EACtC,MAAO,GAAG,IAAS,IAAI,OAAO,KAAK,IAAI,EAAG,EAAY,EAAa,CAAM,CAAC,CAAC,GAC7E,CAEA,SAAgB,EAAU,EAAc,EAAe,EAAuB,CAC5E,IAAM,EAAY,KAAK,IAAI,EAAG,CAAK,EAC7B,EAAa,EAAa,CAAK,EACrC,GAAI,CAAC,GAAS,GAAc,EAAW,OAAO,EAAQ,GAAS,EAAM,CAAS,EAG9E,IAAM,EAAa,EAAQ,EADN,KAAK,IAAI,EAAG,EAAY,EAAa,CACd,CAAC,EAE7C,OAAO,EAAQ,GAAG,IADN,IAAI,OAAO,KAAK,IAAI,EAAG,EAAY,EAAa,CAAU,EAAI,CAAU,CACnD,IAAI,IAAS,CAAS,CACzD,CAEA,SAAgB,EAAU,EAAiB,EAAe,EAAO,IAAK,EAAQ,IAAa,CACzF,IAAM,EAAY,KAAK,IAAI,EAAG,CAAK,EAC7B,EAAa,EAAa,CAAI,EAAI,EAAa,CAAK,EAE1D,OADI,GAAa,EAAmB,EAAQ,GAAG,IAAO,IAAS,CAAS,EACjE,GAAG,IAAO,EAAQ,EAAS,EAAY,CAAU,IAAI,GAC9D,CAEA,SAAgB,EAAa,EAAoB,EAAe,EAAY,KAAgB,CAC1F,IAAM,EAAY,KAAK,IAAI,EAAG,CAAK,EACnC,GAAI,IAAc,EAAG,MAAO,CAAC,EAE7B,IAAM,EAAkB,CAAC,EACrB,EAAU,GACd,IAAK,IAAM,KAAW,EAAU,CAC9B,IAAM,EAAY,EAAU,GAAG,IAAU,IAAY,IAAY,EACjE,GAAI,EAAa,CAAS,GAAK,EAAW,CACxC,EAAU,EACV,QACF,CACI,GAAS,EAAM,KAAK,EAAQ,EAAS,CAAS,CAAC,EACnD,EAAU,EAAQ,EAAS,CAAS,CACtC,CAEA,OADI,GAAS,EAAM,KAAK,CAAO,EACxB,CACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.cjs","names":["path","fs"],"sources":["../src/theme.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { FooterTextColor } from '@agimon-ai/doompi-extension-contracts/footer';\nimport type { ThemeColor } from '@earendil-works/pi-coding-agent';\n\nexport const DEFAULT_THEME_NAME = 'doom-pi-dark';\n\nconst AGENT_IDENTITY_COLORS = [\n 'accent',\n 'mdCode',\n 'toolDiffAdded',\n 'warning',\n 'mdHeading',\n 'syntaxNumber',\n] as const satisfies readonly (FooterTextColor & ThemeColor)[];\n\n/** Stable semantic color shared by every UI surface that identifies an agent. */\nexport function agentIdentityColor(agentName: string): FooterTextColor {\n let hash = 2_166_136_261;\n for (const character of agentName) {\n hash ^= character.charCodeAt(0);\n hash = Math.imul(hash, 16_777_619);\n }\n return AGENT_IDENTITY_COLORS[(hash >>> 0) % AGENT_IDENTITY_COLORS.length]!;\n}\n\nexport const DEFAULT_THEME = {\n $schema:\n 'https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json',\n name: DEFAULT_THEME_NAME,\n // Palette ported from doom-emacs' doom-1337 theme, itself a port of VSCode's\n // 1337 theme. Variable names follow this file's own scheme rather than the\n // upstream base0..base8 ladder; the upstream name is noted where it differs.\n vars: {\n bg: '#191919',\n bgAlt: '#121212', // base2\n bgActive: '#252526', // bg-alt upstream, the current-selection background\n bgHover: '#3d3d3d', // base3\n fg: '#d4d4d4',\n fgAlt: '#aeafad',\n grey: '#4b474c', // base4, one step above bgHover so muted borders stay visible\n greyAlt: '#515151', // base5, upstream `selection`\n blue: '#8cdaff',\n darkBlue: '#6699cc', // upstream `builtin` and `methods`\n cyan: '#85ddff',\n green: '#468800',\n lightGreen: '#b5cea8',\n teal: '#35cdaf',\n orange: '#fc9354',\n red: '#ff5e5e',\n violet: '#bb80b3',\n magenta: '#c586c0',\n yellow: '#e9fdac',\n lightYellow: '#fbe3bf', // upstream `strings`\n comment: '#6d6d6d', // base6\n },\n colors: {\n accent: 'blue',\n border: 'greyAlt',\n borderAccent: 'blue',\n borderMuted: 'grey',\n success: 'green',\n error: 'red',\n warning: 'yellow',\n muted: 'fgAlt',\n dim: 'comment',\n text: 'fg',\n thinkingText: 'fgAlt',\n\n selectedBg: 'bgHover',\n userMessageBg: 'bgActive',\n userMessageText: 'fg',\n customMessageBg: '#2a1b2f', // tinted toward upstream dark-violet #68217a\n customMessageText: 'fg',\n customMessageLabel: 'violet',\n toolPendingBg: 'bgAlt',\n toolSuccessBg: '#1e2a16',\n toolErrorBg: '#331d1d',\n toolTitle: 'blue',\n toolOutput: 'fg',\n\n mdHeading: 'magenta',\n mdLink: 'blue',\n mdLinkUrl: 'comment',\n mdCode: 'cyan',\n mdCodeBlock: 'lightYellow',\n mdCodeBlockBorder: 'greyAlt',\n mdQuote: 'fgAlt',\n mdQuoteBorder: 'greyAlt',\n mdHr: 'greyAlt',\n mdListBullet: 'blue',\n\n // Upstream vc-added is the dark `green`, which is too dim to read as diff\n // body text, so added lines use the palette's light-green instead.\n toolDiffAdded: 'lightGreen',\n toolDiffRemoved: 'red',\n toolDiffContext: 'fgAlt',\n\n // Straight from doom-1337's face categories.\n syntaxComment: 'comment',\n syntaxKeyword: 'red',\n syntaxFunction: 'blue',\n syntaxVariable: 'yellow',\n syntaxString: 'lightYellow',\n syntaxNumber: 'orange',\n syntaxType: 'yellow',\n syntaxOperator: 'red',\n syntaxPunctuation: 'fgAlt',\n\n // A rising ramp. Upstream's blue and cyan are nearly the same hue, so the\n // low end starts at dark-blue to keep the steps distinguishable.\n thinkingOff: 'grey',\n thinkingMinimal: 'fgAlt',\n thinkingLow: 'darkBlue',\n thinkingMedium: 'blue',\n thinkingHigh: 'teal',\n thinkingXhigh: 'magenta',\n thinkingMax: 'red',\n\n // Upstream `green` is reserved for success; the prompt indicator needs to\n // stay legible against the near-black background.\n bashMode: 'lightGreen',\n },\n export: {\n pageBg: 'bg',\n cardBg: 'bgAlt',\n infoBg: '#26261c',\n },\n} as const;\n\nexport async function writeDefaultTheme(temporaryDirectory: string): Promise<string> {\n const themePath = path.join(temporaryDirectory, `${DEFAULT_THEME_NAME}.json`);\n await fs.promises.writeFile(themePath, `${JSON.stringify(DEFAULT_THEME, null, 2)}\\n`, { mode: 0o600 });\n return themePath;\n}\n"],"mappings":"6MAKA,MAAa,EAAqB,eAE5B,EAAwB,CAC5B,SACA,SACA,gBACA,UACA,YACA,cACF,EAGA,SAAgB,EAAmB,EAAoC,CACrE,IAAI,EAAO,WACX,IAAK,IAAM,KAAa,EACtB,GAAQ,EAAU,WAAW,CAAC,EAC9B,EAAO,KAAK,KAAK,EAAM,QAAU,EAEnC,OAAO,GAAuB,IAAS,GAAK,EAAsB,OACpE,CAEA,MAAa,EAAgB,CAC3B,QACE,+HACF,KAAM,EAIN,KAAM,CACJ,GAAI,UACJ,MAAO,UACP,SAAU,UACV,QAAS,UACT,GAAI,UACJ,MAAO,UACP,KAAM,UACN,QAAS,UACT,KAAM,UACN,SAAU,UACV,KAAM,UACN,MAAO,UACP,WAAY,UACZ,KAAM,UACN,OAAQ,UACR,IAAK,UACL,OAAQ,UACR,QAAS,UACT,OAAQ,UACR,YAAa,UACb,QAAS,SACX,EACA,OAAQ,CACN,OAAQ,OACR,OAAQ,UACR,aAAc,OACd,YAAa,OACb,QAAS,QACT,MAAO,MACP,QAAS,SACT,MAAO,QACP,IAAK,UACL,KAAM,KACN,aAAc,QAEd,WAAY,UACZ,cAAe,WACf,gBAAiB,KACjB,gBAAiB,UACjB,kBAAmB,KACnB,mBAAoB,SACpB,cAAe,QACf,cAAe,UACf,YAAa,UACb,UAAW,OACX,WAAY,KAEZ,UAAW,UACX,OAAQ,OACR,UAAW,UACX,OAAQ,OACR,YAAa,cACb,kBAAmB,UACnB,QAAS,QACT,cAAe,UACf,KAAM,UACN,aAAc,OAId,cAAe,aACf,gBAAiB,MACjB,gBAAiB,QAGjB,cAAe,UACf,cAAe,MACf,eAAgB,OAChB,eAAgB,SAChB,aAAc,cACd,aAAc,SACd,WAAY,SACZ,eAAgB,MAChB,kBAAmB,QAInB,YAAa,OACb,gBAAiB,QACjB,YAAa,WACb,eAAgB,OAChB,aAAc,OACd,cAAe,UACf,YAAa,MAIb,SAAU,YACZ,EACA,OAAQ,CACN,OAAQ,KACR,OAAQ,QACR,OAAQ,SACV,CACF,EAEA,eAAsB,EAAkB,EAA6C,CACnF,IAAM,EAAYA,EAAAA,QAAK,KAAK,EAAoB,GAAG,EAAmB,MAAM,EAE5E,OADA,MAAMC,EAAAA,QAAG,SAAS,UAAU,EAAW,GAAG,KAAK,UAAU,EAAe,KAAM,CAAC,EAAE,IAAK,CAAE,KAAM,GAAM,CAAC,EAC9F,CACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.d.cts","names":[],"sources":["../src/theme.ts"],"mappings":";;cAKa;;iBAYG,mBAAmB,oBAAoB;cAS1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwGS,kBAAkB,6BAA6B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.d.mts","names":[],"sources":["../src/theme.ts"],"mappings":";;cAKa;;iBAYG,mBAAmB,oBAAoB;cAS1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwGS,kBAAkB,6BAA6B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.mjs","names":[],"sources":["../src/theme.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { FooterTextColor } from '@agimon-ai/doompi-extension-contracts/footer';\nimport type { ThemeColor } from '@earendil-works/pi-coding-agent';\n\nexport const DEFAULT_THEME_NAME = 'doom-pi-dark';\n\nconst AGENT_IDENTITY_COLORS = [\n 'accent',\n 'mdCode',\n 'toolDiffAdded',\n 'warning',\n 'mdHeading',\n 'syntaxNumber',\n] as const satisfies readonly (FooterTextColor & ThemeColor)[];\n\n/** Stable semantic color shared by every UI surface that identifies an agent. */\nexport function agentIdentityColor(agentName: string): FooterTextColor {\n let hash = 2_166_136_261;\n for (const character of agentName) {\n hash ^= character.charCodeAt(0);\n hash = Math.imul(hash, 16_777_619);\n }\n return AGENT_IDENTITY_COLORS[(hash >>> 0) % AGENT_IDENTITY_COLORS.length]!;\n}\n\nexport const DEFAULT_THEME = {\n $schema:\n 'https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json',\n name: DEFAULT_THEME_NAME,\n // Palette ported from doom-emacs' doom-1337 theme, itself a port of VSCode's\n // 1337 theme. Variable names follow this file's own scheme rather than the\n // upstream base0..base8 ladder; the upstream name is noted where it differs.\n vars: {\n bg: '#191919',\n bgAlt: '#121212', // base2\n bgActive: '#252526', // bg-alt upstream, the current-selection background\n bgHover: '#3d3d3d', // base3\n fg: '#d4d4d4',\n fgAlt: '#aeafad',\n grey: '#4b474c', // base4, one step above bgHover so muted borders stay visible\n greyAlt: '#515151', // base5, upstream `selection`\n blue: '#8cdaff',\n darkBlue: '#6699cc', // upstream `builtin` and `methods`\n cyan: '#85ddff',\n green: '#468800',\n lightGreen: '#b5cea8',\n teal: '#35cdaf',\n orange: '#fc9354',\n red: '#ff5e5e',\n violet: '#bb80b3',\n magenta: '#c586c0',\n yellow: '#e9fdac',\n lightYellow: '#fbe3bf', // upstream `strings`\n comment: '#6d6d6d', // base6\n },\n colors: {\n accent: 'blue',\n border: 'greyAlt',\n borderAccent: 'blue',\n borderMuted: 'grey',\n success: 'green',\n error: 'red',\n warning: 'yellow',\n muted: 'fgAlt',\n dim: 'comment',\n text: 'fg',\n thinkingText: 'fgAlt',\n\n selectedBg: 'bgHover',\n userMessageBg: 'bgActive',\n userMessageText: 'fg',\n customMessageBg: '#2a1b2f', // tinted toward upstream dark-violet #68217a\n customMessageText: 'fg',\n customMessageLabel: 'violet',\n toolPendingBg: 'bgAlt',\n toolSuccessBg: '#1e2a16',\n toolErrorBg: '#331d1d',\n toolTitle: 'blue',\n toolOutput: 'fg',\n\n mdHeading: 'magenta',\n mdLink: 'blue',\n mdLinkUrl: 'comment',\n mdCode: 'cyan',\n mdCodeBlock: 'lightYellow',\n mdCodeBlockBorder: 'greyAlt',\n mdQuote: 'fgAlt',\n mdQuoteBorder: 'greyAlt',\n mdHr: 'greyAlt',\n mdListBullet: 'blue',\n\n // Upstream vc-added is the dark `green`, which is too dim to read as diff\n // body text, so added lines use the palette's light-green instead.\n toolDiffAdded: 'lightGreen',\n toolDiffRemoved: 'red',\n toolDiffContext: 'fgAlt',\n\n // Straight from doom-1337's face categories.\n syntaxComment: 'comment',\n syntaxKeyword: 'red',\n syntaxFunction: 'blue',\n syntaxVariable: 'yellow',\n syntaxString: 'lightYellow',\n syntaxNumber: 'orange',\n syntaxType: 'yellow',\n syntaxOperator: 'red',\n syntaxPunctuation: 'fgAlt',\n\n // A rising ramp. Upstream's blue and cyan are nearly the same hue, so the\n // low end starts at dark-blue to keep the steps distinguishable.\n thinkingOff: 'grey',\n thinkingMinimal: 'fgAlt',\n thinkingLow: 'darkBlue',\n thinkingMedium: 'blue',\n thinkingHigh: 'teal',\n thinkingXhigh: 'magenta',\n thinkingMax: 'red',\n\n // Upstream `green` is reserved for success; the prompt indicator needs to\n // stay legible against the near-black background.\n bashMode: 'lightGreen',\n },\n export: {\n pageBg: 'bg',\n cardBg: 'bgAlt',\n infoBg: '#26261c',\n },\n} as const;\n\nexport async function writeDefaultTheme(temporaryDirectory: string): Promise<string> {\n const themePath = path.join(temporaryDirectory, `${DEFAULT_THEME_NAME}.json`);\n await fs.promises.writeFile(themePath, `${JSON.stringify(DEFAULT_THEME, null, 2)}\\n`, { mode: 0o600 });\n return themePath;\n}\n"],"mappings":"gDAKA,MAAa,EAAqB,eAE5B,EAAwB,CAC5B,SACA,SACA,gBACA,UACA,YACA,cACF,EAGA,SAAgB,EAAmB,EAAoC,CACrE,IAAI,EAAO,WACX,IAAK,IAAM,KAAa,EACtB,GAAQ,EAAU,WAAW,CAAC,EAC9B,EAAO,KAAK,KAAK,EAAM,QAAU,EAEnC,OAAO,GAAuB,IAAS,GAAK,EAAsB,OACpE,CAEA,MAAa,EAAgB,CAC3B,QACE,+HACF,KAAM,EAIN,KAAM,CACJ,GAAI,UACJ,MAAO,UACP,SAAU,UACV,QAAS,UACT,GAAI,UACJ,MAAO,UACP,KAAM,UACN,QAAS,UACT,KAAM,UACN,SAAU,UACV,KAAM,UACN,MAAO,UACP,WAAY,UACZ,KAAM,UACN,OAAQ,UACR,IAAK,UACL,OAAQ,UACR,QAAS,UACT,OAAQ,UACR,YAAa,UACb,QAAS,SACX,EACA,OAAQ,CACN,OAAQ,OACR,OAAQ,UACR,aAAc,OACd,YAAa,OACb,QAAS,QACT,MAAO,MACP,QAAS,SACT,MAAO,QACP,IAAK,UACL,KAAM,KACN,aAAc,QAEd,WAAY,UACZ,cAAe,WACf,gBAAiB,KACjB,gBAAiB,UACjB,kBAAmB,KACnB,mBAAoB,SACpB,cAAe,QACf,cAAe,UACf,YAAa,UACb,UAAW,OACX,WAAY,KAEZ,UAAW,UACX,OAAQ,OACR,UAAW,UACX,OAAQ,OACR,YAAa,cACb,kBAAmB,UACnB,QAAS,QACT,cAAe,UACf,KAAM,UACN,aAAc,OAId,cAAe,aACf,gBAAiB,MACjB,gBAAiB,QAGjB,cAAe,UACf,cAAe,MACf,eAAgB,OAChB,eAAgB,SAChB,aAAc,cACd,aAAc,SACd,WAAY,SACZ,eAAgB,MAChB,kBAAmB,QAInB,YAAa,OACb,gBAAiB,QACjB,YAAa,WACb,eAAgB,OAChB,aAAc,OACd,cAAe,UACf,YAAa,MAIb,SAAU,YACZ,EACA,OAAQ,CACN,OAAQ,KACR,OAAQ,QACR,OAAQ,SACV,CACF,EAEA,eAAsB,EAAkB,EAA6C,CACnF,IAAM,EAAY,EAAK,KAAK,EAAoB,GAAG,EAAmB,MAAM,EAE5E,OADA,MAAM,EAAG,SAAS,UAAU,EAAW,GAAG,KAAK,UAAU,EAAe,KAAM,CAAC,EAAE,IAAK,CAAE,KAAM,GAAM,CAAC,EAC9F,CACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolInventory.cjs","names":["extensionName"],"sources":["../src/toolInventory.ts"],"sourcesContent":["import type { McpServerSnapshot } from '@agimon-ai/doompi-extension-contracts/mcp-status';\nimport type { ToolInfo } from '@earendil-works/pi-coding-agent';\nimport { extensionName } from './extensionName.ts';\n\nexport type ToolSourceKind = 'core' | 'mcp' | 'extension';\n\nexport interface ToolEntry {\n name: string;\n description?: string;\n parameters?: unknown;\n promptGuidelines?: readonly string[];\n active: boolean;\n}\n\nexport interface ToolSource {\n key: string;\n label: string;\n kind: ToolSourceKind;\n /** Server state for MCP sources, e.g. `disabled`; absent for core and extensions. */\n status?: string;\n /** The registering file for extension sources. */\n detail?: string;\n tools: readonly ToolEntry[];\n}\n\n/** One server row of the MCP status snapshot. */\nexport type McpServerStatus = McpServerSnapshot;\n\nexport interface ToolInventoryInput {\n tools: readonly ToolInfo[];\n activeTools: readonly string[];\n /** Absent when the MCP adapter is not loaded or has not published yet. */\n mcpServers?: readonly McpServerStatus[];\n}\n\n/** Pi tags its own tools with this source; everything else came from an extension. */\nconst BUILTIN_SOURCE = 'builtin';\n/** Pi's tag for an extension passed as a `--extension` argument, which carries no package name. */\nconst CLI_SOURCE = 'cli';\nconst CORE_KEY = 'core';\nconst CORE_NAME = 'pi';\nconst MCP_KEY_PREFIX = 'mcp:';\n/** Labels read name first, then kind, because the name is what the eye scans for. */\nconst KIND_SUFFIX: Record<ToolSourceKind, string> = { core: 'core', mcp: 'mcp', extension: 'cli' };\nconst CONNECTED_STATUS = 'connected';\nconst KIND_ORDER: Record<ToolSourceKind, number> = { core: 0, mcp: 1, extension: 2 };\n\n/**\n * Server state worth reporting, which takes the place of the tool count.\n *\n * A connected server is the unremarkable case, so it keeps its count rather\n * than spending the column on a word that says nothing went wrong.\n */\nfunction displayStatus(server: McpServerStatus): string | undefined {\n return server.state === CONNECTED_STATUS ? undefined : server.state.replace(/-/g, ' ');\n}\n\nfunction toEntry(tool: ToolInfo, activeTools: ReadonlySet<string>): ToolEntry {\n return {\n name: tool.name,\n ...(tool.description ? { description: tool.description } : {}),\n ...(tool.parameters === undefined ? {} : { parameters: tool.parameters }),\n ...(tool.promptGuidelines?.length ? { promptGuidelines: tool.promptGuidelines } : {}),\n active: activeTools.has(tool.name),\n };\n}\n\nfunction byName(left: ToolEntry, right: ToolEntry): number {\n return left.name.localeCompare(right.name);\n}\n\nfunction sourceLabel(name: string, kind: ToolSourceKind): string {\n return `${name} · ${KIND_SUFFIX[kind]}`;\n}\n\n/**\n * Indexes each server's declared tool names.\n *\n * The snapshot names its tools outright, so attribution is a lookup rather than a\n * guess at the naming scheme. A tool the snapshot does not claim falls through to\n * the extension that registered it.\n */\nfunction serverByTool(servers: readonly McpServerStatus[]): Map<string, McpServerStatus> {\n const index = new Map<string, McpServerStatus>();\n for (const server of servers) {\n for (const toolName of server.tools) index.set(toolName, server);\n }\n return index;\n}\n\n/**\n * Groups the session's tools by where they came from: Pi itself, one group per\n * MCP server, then one per extension that registered a tool.\n *\n * Every MCP tool is registered by one extension, so `sourceInfo` cannot separate\n * servers; the status snapshot supplies the tool-to-server mapping instead.\n */\nexport function buildToolSources(input: ToolInventoryInput): readonly ToolSource[] {\n const activeTools = new Set(input.activeTools);\n const servers = input.mcpServers ?? [];\n const owningServer = serverByTool(servers);\n const core: ToolEntry[] = [];\n const mcpTools = new Map<string, ToolEntry[]>();\n const extensions = new Map<string, { label: string; detail: string; tools: ToolEntry[] }>();\n\n for (const tool of input.tools) {\n const entry = toEntry(tool, activeTools);\n const server = owningServer.get(tool.name);\n if (server) {\n const bucket = mcpTools.get(server.name);\n if (bucket) bucket.push(entry);\n else mcpTools.set(server.name, [entry]);\n continue;\n }\n if (tool.sourceInfo.source === BUILTIN_SOURCE) {\n core.push(entry);\n continue;\n }\n const key = tool.sourceInfo.path;\n const group = extensions.get(key);\n if (group) group.tools.push(entry);\n else {\n // `cli` is Pi's tag for a `--extension` argument, not a name: recover one from the path.\n const name =\n tool.sourceInfo.source === CLI_SOURCE || !tool.sourceInfo.source ? extensionName(key) : tool.sourceInfo.source;\n extensions.set(key, { label: sourceLabel(name, 'extension'), detail: key, tools: [entry] });\n }\n }\n\n const sources: ToolSource[] = [];\n if (core.length > 0) {\n sources.push({ key: CORE_KEY, label: sourceLabel(CORE_NAME, CORE_KEY), kind: CORE_KEY, tools: core.sort(byName) });\n }\n for (const server of servers) {\n const tools = mcpTools.get(server.name) ?? [];\n const status = displayStatus(server);\n // Every configured server is listed, including one with no tools: attribution\n // is exact now, so an empty list is a fact about the server rather than a\n // failure to recognise its tool names.\n sources.push({\n key: `${MCP_KEY_PREFIX}${server.name}`,\n label: sourceLabel(server.name, 'mcp'),\n kind: 'mcp',\n ...(status ? { status } : {}),\n tools: tools.sort(byName),\n });\n }\n for (const [key, group] of extensions) {\n sources.push({\n key,\n label: group.label,\n kind: 'extension',\n detail: group.detail,\n tools: group.tools.sort(byName),\n });\n }\n\n return sources.sort(\n (left, right) => KIND_ORDER[left.kind] - KIND_ORDER[right.kind] || left.label.localeCompare(right.label),\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolInventory.d.cts","names":[],"sources":["../src/toolInventory.ts"],"mappings":";;;KAIY;UAEK;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA,MAAM;;EAEN;;EAEA;EACA,gBAAgB;;;KAIN,kBAAkB;UAEb;EACf,gBAAgB;EAChB;;EAEA,sBAAsB;;;;;;;;;iBAiER,iBAAiB,OAAO,8BAA8B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolInventory.d.mts","names":[],"sources":["../src/toolInventory.ts"],"mappings":";;;KAIY;UAEK;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA,MAAM;;EAEN;;EAEA;EACA,gBAAgB;;;KAIN,kBAAkB;UAEb;EACf,gBAAgB;EAChB;;EAEA,sBAAsB;;;;;;;;;iBAiER,iBAAiB,OAAO,8BAA8B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolInventory.mjs","names":[],"sources":["../src/toolInventory.ts"],"sourcesContent":["import type { McpServerSnapshot } from '@agimon-ai/doompi-extension-contracts/mcp-status';\nimport type { ToolInfo } from '@earendil-works/pi-coding-agent';\nimport { extensionName } from './extensionName.ts';\n\nexport type ToolSourceKind = 'core' | 'mcp' | 'extension';\n\nexport interface ToolEntry {\n name: string;\n description?: string;\n parameters?: unknown;\n promptGuidelines?: readonly string[];\n active: boolean;\n}\n\nexport interface ToolSource {\n key: string;\n label: string;\n kind: ToolSourceKind;\n /** Server state for MCP sources, e.g. `disabled`; absent for core and extensions. */\n status?: string;\n /** The registering file for extension sources. */\n detail?: string;\n tools: readonly ToolEntry[];\n}\n\n/** One server row of the MCP status snapshot. */\nexport type McpServerStatus = McpServerSnapshot;\n\nexport interface ToolInventoryInput {\n tools: readonly ToolInfo[];\n activeTools: readonly string[];\n /** Absent when the MCP adapter is not loaded or has not published yet. */\n mcpServers?: readonly McpServerStatus[];\n}\n\n/** Pi tags its own tools with this source; everything else came from an extension. */\nconst BUILTIN_SOURCE = 'builtin';\n/** Pi's tag for an extension passed as a `--extension` argument, which carries no package name. */\nconst CLI_SOURCE = 'cli';\nconst CORE_KEY = 'core';\nconst CORE_NAME = 'pi';\nconst MCP_KEY_PREFIX = 'mcp:';\n/** Labels read name first, then kind, because the name is what the eye scans for. */\nconst KIND_SUFFIX: Record<ToolSourceKind, string> = { core: 'core', mcp: 'mcp', extension: 'cli' };\nconst CONNECTED_STATUS = 'connected';\nconst KIND_ORDER: Record<ToolSourceKind, number> = { core: 0, mcp: 1, extension: 2 };\n\n/**\n * Server state worth reporting, which takes the place of the tool count.\n *\n * A connected server is the unremarkable case, so it keeps its count rather\n * than spending the column on a word that says nothing went wrong.\n */\nfunction displayStatus(server: McpServerStatus): string | undefined {\n return server.state === CONNECTED_STATUS ? undefined : server.state.replace(/-/g, ' ');\n}\n\nfunction toEntry(tool: ToolInfo, activeTools: ReadonlySet<string>): ToolEntry {\n return {\n name: tool.name,\n ...(tool.description ? { description: tool.description } : {}),\n ...(tool.parameters === undefined ? {} : { parameters: tool.parameters }),\n ...(tool.promptGuidelines?.length ? { promptGuidelines: tool.promptGuidelines } : {}),\n active: activeTools.has(tool.name),\n };\n}\n\nfunction byName(left: ToolEntry, right: ToolEntry): number {\n return left.name.localeCompare(right.name);\n}\n\nfunction sourceLabel(name: string, kind: ToolSourceKind): string {\n return `${name} · ${KIND_SUFFIX[kind]}`;\n}\n\n/**\n * Indexes each server's declared tool names.\n *\n * The snapshot names its tools outright, so attribution is a lookup rather than a\n * guess at the naming scheme. A tool the snapshot does not claim falls through to\n * the extension that registered it.\n */\nfunction serverByTool(servers: readonly McpServerStatus[]): Map<string, McpServerStatus> {\n const index = new Map<string, McpServerStatus>();\n for (const server of servers) {\n for (const toolName of server.tools) index.set(toolName, server);\n }\n return index;\n}\n\n/**\n * Groups the session's tools by where they came from: Pi itself, one group per\n * MCP server, then one per extension that registered a tool.\n *\n * Every MCP tool is registered by one extension, so `sourceInfo` cannot separate\n * servers; the status snapshot supplies the tool-to-server mapping instead.\n */\nexport function buildToolSources(input: ToolInventoryInput): readonly ToolSource[] {\n const activeTools = new Set(input.activeTools);\n const servers = input.mcpServers ?? [];\n const owningServer = serverByTool(servers);\n const core: ToolEntry[] = [];\n const mcpTools = new Map<string, ToolEntry[]>();\n const extensions = new Map<string, { label: string; detail: string; tools: ToolEntry[] }>();\n\n for (const tool of input.tools) {\n const entry = toEntry(tool, activeTools);\n const server = owningServer.get(tool.name);\n if (server) {\n const bucket = mcpTools.get(server.name);\n if (bucket) bucket.push(entry);\n else mcpTools.set(server.name, [entry]);\n continue;\n }\n if (tool.sourceInfo.source === BUILTIN_SOURCE) {\n core.push(entry);\n continue;\n }\n const key = tool.sourceInfo.path;\n const group = extensions.get(key);\n if (group) group.tools.push(entry);\n else {\n // `cli` is Pi's tag for a `--extension` argument, not a name: recover one from the path.\n const name =\n tool.sourceInfo.source === CLI_SOURCE || !tool.sourceInfo.source ? extensionName(key) : tool.sourceInfo.source;\n extensions.set(key, { label: sourceLabel(name, 'extension'), detail: key, tools: [entry] });\n }\n }\n\n const sources: ToolSource[] = [];\n if (core.length > 0) {\n sources.push({ key: CORE_KEY, label: sourceLabel(CORE_NAME, CORE_KEY), kind: CORE_KEY, tools: core.sort(byName) });\n }\n for (const server of servers) {\n const tools = mcpTools.get(server.name) ?? [];\n const status = displayStatus(server);\n // Every configured server is listed, including one with no tools: attribution\n // is exact now, so an empty list is a fact about the server rather than a\n // failure to recognise its tool names.\n sources.push({\n key: `${MCP_KEY_PREFIX}${server.name}`,\n label: sourceLabel(server.name, 'mcp'),\n kind: 'mcp',\n ...(status ? { status } : {}),\n tools: tools.sort(byName),\n });\n }\n for (const [key, group] of extensions) {\n sources.push({\n key,\n label: group.label,\n kind: 'extension',\n detail: group.detail,\n tools: group.tools.sort(byName),\n });\n }\n\n return sources.sort(\n (left, right) => KIND_ORDER[left.kind] - KIND_ORDER[right.kind] || left.label.localeCompare(right.label),\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"uiState.cjs","names":[],"sources":["../src/uiState.ts"],"sourcesContent":["import type { DoomModeStatus } from './mode.ts';\n\nexport interface LeaderOption {\n key: string;\n label: string;\n detail?: string;\n}\n\nexport interface LeaderSnapshot {\n active: boolean;\n prefix: string[];\n label: string;\n options: LeaderOption[];\n rootOptions?: LeaderOption[];\n}\n\ntype StateListener = (snapshot: LeaderSnapshot) => void;\n\nconst INACTIVE_SNAPSHOT: LeaderSnapshot = {\n active: false,\n prefix: [],\n label: '',\n options: [],\n};\n\nfunction cloneSnapshot(snapshot: LeaderSnapshot): LeaderSnapshot {\n return {\n active: snapshot.active,\n prefix: [...snapshot.prefix],\n label: snapshot.label,\n options: snapshot.options.map((option) => ({ ...option })),\n ...(snapshot.rootOptions ? { rootOptions: snapshot.rootOptions.map((option) => ({ ...option })) } : {}),\n };\n}\n\nexport class DoomUiState {\n private snapshot = INACTIVE_SNAPSHOT;\n /**\n * The enabled modes, shown in two places at two levels of detail.\n *\n * Held here rather than read from the mode registry by each surface because\n * both readers already take this state: the editor prints the names beside\n * its mode badge, and the leader panel prints them with their detail. One\n * source, so the two can never disagree about what is on.\n */\n private modes: readonly DoomModeStatus[] = [];\n private readonly listeners = new Set<StateListener>();\n\n getSnapshot(): LeaderSnapshot {\n return cloneSnapshot(this.snapshot);\n }\n\n getModes(): readonly DoomModeStatus[] {\n return this.modes;\n }\n\n setModes(modes: readonly DoomModeStatus[]): void {\n this.modes = modes.map((mode) => ({ ...mode }));\n for (const listener of this.listeners) listener(this.getSnapshot());\n }\n\n setLeader(snapshot: LeaderSnapshot): void {\n this.snapshot = cloneSnapshot(snapshot);\n for (const listener of this.listeners) listener(this.getSnapshot());\n }\n\n reset(): void {\n this.modes = [];\n this.setLeader(INACTIVE_SNAPSHOT);\n }\n\n subscribe(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n}\n"],"mappings":"mEAkBA,MAAM,EAAoC,CACxC,OAAQ,GACR,OAAQ,CAAC,EACT,MAAO,GACP,QAAS,CAAC,CACZ,EAEA,SAAS,EAAc,EAA0C,CAC/D,MAAO,CACL,OAAQ,EAAS,OACjB,OAAQ,CAAC,GAAG,EAAS,MAAM,EAC3B,MAAO,EAAS,MAChB,QAAS,EAAS,QAAQ,IAAK,IAAY,CAAE,GAAG,CAAO,EAAE,EACzD,GAAI,EAAS,YAAc,CAAE,YAAa,EAAS,YAAY,IAAK,IAAY,CAAE,GAAG,CAAO,EAAE,CAAE,EAAI,CAAC,CACvG,CACF,CAEA,IAAa,EAAb,KAAyB,CACvB,SAAmB,EASnB,MAA2C,CAAC,EAC5C,UAA6B,IAAI,IAEjC,aAA8B,CAC5B,OAAO,EAAc,KAAK,QAAQ,CACpC,CAEA,UAAsC,CACpC,OAAO,KAAK,KACd,CAEA,SAAS,EAAwC,CAC/C,KAAK,MAAQ,EAAM,IAAK,IAAU,CAAE,GAAG,CAAK,EAAE,EAC9C,IAAK,IAAM,KAAY,KAAK,UAAW,EAAS,KAAK,YAAY,CAAC,CACpE,CAEA,UAAU,EAAgC,CACxC,KAAK,SAAW,EAAc,CAAQ,EACtC,IAAK,IAAM,KAAY,KAAK,UAAW,EAAS,KAAK,YAAY,CAAC,CACpE,CAEA,OAAc,CACZ,KAAK,MAAQ,CAAC,EACd,KAAK,UAAU,CAAiB,CAClC,CAEA,UAAU,EAAqC,CAE7C,OADA,KAAK,UAAU,IAAI,CAAQ,MACd,KAAK,UAAU,OAAO,CAAQ,CAC7C,CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"uiState.d.cts","names":[],"sources":["../src/uiState.ts"],"mappings":";;UAEiB;EACf;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA,SAAS;EACT,cAAc;;KAGX,iBAAiB,UAAU;cAmBnB;UACH;;;;;;;;;UASA;mBACS;EAEjB,eAAe;EAIf,qBAAqB,eAAA;EAIrB,SAAS,gBAAgB,eAAA;EAKzB,UAAU,UAAU;EAKpB;EAKA,UAAU,UAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"uiState.d.mts","names":[],"sources":["../src/uiState.ts"],"mappings":";;UAEiB;EACf;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA,SAAS;EACT,cAAc;;KAGX,iBAAiB,UAAU;cAmBnB;UACH;;;;;;;;;UASA;mBACS;EAEjB,eAAe;EAIf,qBAAqB,eAAA;EAIrB,SAAS,gBAAgB,eAAA;EAKzB,UAAU,UAAU;EAKpB;EAKA,UAAU,UAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"uiState.mjs","names":[],"sources":["../src/uiState.ts"],"sourcesContent":["import type { DoomModeStatus } from './mode.ts';\n\nexport interface LeaderOption {\n key: string;\n label: string;\n detail?: string;\n}\n\nexport interface LeaderSnapshot {\n active: boolean;\n prefix: string[];\n label: string;\n options: LeaderOption[];\n rootOptions?: LeaderOption[];\n}\n\ntype StateListener = (snapshot: LeaderSnapshot) => void;\n\nconst INACTIVE_SNAPSHOT: LeaderSnapshot = {\n active: false,\n prefix: [],\n label: '',\n options: [],\n};\n\nfunction cloneSnapshot(snapshot: LeaderSnapshot): LeaderSnapshot {\n return {\n active: snapshot.active,\n prefix: [...snapshot.prefix],\n label: snapshot.label,\n options: snapshot.options.map((option) => ({ ...option })),\n ...(snapshot.rootOptions ? { rootOptions: snapshot.rootOptions.map((option) => ({ ...option })) } : {}),\n };\n}\n\nexport class DoomUiState {\n private snapshot = INACTIVE_SNAPSHOT;\n /**\n * The enabled modes, shown in two places at two levels of detail.\n *\n * Held here rather than read from the mode registry by each surface because\n * both readers already take this state: the editor prints the names beside\n * its mode badge, and the leader panel prints them with their detail. One\n * source, so the two can never disagree about what is on.\n */\n private modes: readonly DoomModeStatus[] = [];\n private readonly listeners = new Set<StateListener>();\n\n getSnapshot(): LeaderSnapshot {\n return cloneSnapshot(this.snapshot);\n }\n\n getModes(): readonly DoomModeStatus[] {\n return this.modes;\n }\n\n setModes(modes: readonly DoomModeStatus[]): void {\n this.modes = modes.map((mode) => ({ ...mode }));\n for (const listener of this.listeners) listener(this.getSnapshot());\n }\n\n setLeader(snapshot: LeaderSnapshot): void {\n this.snapshot = cloneSnapshot(snapshot);\n for (const listener of this.listeners) listener(this.getSnapshot());\n }\n\n reset(): void {\n this.modes = [];\n this.setLeader(INACTIVE_SNAPSHOT);\n }\n\n subscribe(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n}\n"],"mappings":"AAkBA,MAAM,EAAoC,CACxC,OAAQ,GACR,OAAQ,CAAC,EACT,MAAO,GACP,QAAS,CAAC,CACZ,EAEA,SAAS,EAAc,EAA0C,CAC/D,MAAO,CACL,OAAQ,EAAS,OACjB,OAAQ,CAAC,GAAG,EAAS,MAAM,EAC3B,MAAO,EAAS,MAChB,QAAS,EAAS,QAAQ,IAAK,IAAY,CAAE,GAAG,CAAO,EAAE,EACzD,GAAI,EAAS,YAAc,CAAE,YAAa,EAAS,YAAY,IAAK,IAAY,CAAE,GAAG,CAAO,EAAE,CAAE,EAAI,CAAC,CACvG,CACF,CAEA,IAAa,EAAb,KAAyB,CACvB,SAAmB,EASnB,MAA2C,CAAC,EAC5C,UAA6B,IAAI,IAEjC,aAA8B,CAC5B,OAAO,EAAc,KAAK,QAAQ,CACpC,CAEA,UAAsC,CACpC,OAAO,KAAK,KACd,CAEA,SAAS,EAAwC,CAC/C,KAAK,MAAQ,EAAM,IAAK,IAAU,CAAE,GAAG,CAAK,EAAE,EAC9C,IAAK,IAAM,KAAY,KAAK,UAAW,EAAS,KAAK,YAAY,CAAC,CACpE,CAEA,UAAU,EAAgC,CACxC,KAAK,SAAW,EAAc,CAAQ,EACtC,IAAK,IAAM,KAAY,KAAK,UAAW,EAAS,KAAK,YAAY,CAAC,CACpE,CAEA,OAAc,CACZ,KAAK,MAAQ,CAAC,EACd,KAAK,UAAU,CAAiB,CAClC,CAEA,UAAU,EAAqC,CAE7C,OADA,KAAK,UAAU,IAAI,CAAQ,MACd,KAAK,UAAU,OAAO,CAAQ,CAC7C,CACF"}