@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolInventory.cjs","names":[],"sources":["../../../src/services/tools/toolInventory.ts"],"sourcesContent":["import type { McpServerSnapshot } from '@agimon-ai/doompi-extension-contracts/mcp-status';\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 ToolInfo {\n name: string;\n description?: string;\n parameters?: unknown;\n promptGuidelines?: readonly string[];\n sourceInfo: { path: string; source?: string };\n}\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 resolveExtensionName?: (entryPath: string) => string;\n resolveExtensionToolSource?: (toolName: string) => string | undefined;\n}\n\n/** Pi tags its own tools with this source; everything else came from an extension. */\nconst BUILTIN_SOURCE = 'builtin';\n/** Pi's structural tags for an extension path, neither of which is a package name. */\nconst CLI_SOURCE = 'cli';\nconst LOCAL_SOURCE = 'local';\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: 'extension' };\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 // A composed bundle has one Pi source path for every factory inside it. Doom's\n // compiler records the original entry at registration time so those extensions\n // remain separate here even though Pi can only see the outer bundle.\n const recordedPath = input.resolveExtensionToolSource?.(tool.name);\n const key = recordedPath ?? tool.sourceInfo.path;\n const group = extensions.get(key);\n if (group) group.tools.push(entry);\n else {\n const structuralSource =\n recordedPath !== undefined ||\n tool.sourceInfo.source === CLI_SOURCE ||\n tool.sourceInfo.source === LOCAL_SOURCE ||\n !tool.sourceInfo.source;\n const name = structuralSource\n ? (input.resolveExtensionName?.(key) ?? tool.sourceInfo.source ?? key)\n : (tool.sourceInfo.source ?? key);\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":"AA4CA,MAIM,EAAW,OAIX,EAA8C,CAAE,KAAM,OAAQ,IAAK,MAAO,UAAW,WAAY,EAEjG,EAA6C,CAAE,KAAM,EAAG,IAAK,EAAG,UAAW,CAAE,EAQnF,SAAS,EAAc,EAA6C,CAClE,OAAO,EAAO,QAAU,YAAmB,IAAA,GAAY,EAAO,MAAM,QAAQ,KAAM,GAAG,CACvF,CAEA,SAAS,EAAQ,EAAgB,EAA6C,CAC5E,MAAO,CACL,KAAM,EAAK,KACX,GAAI,EAAK,YAAc,CAAE,YAAa,EAAK,WAAY,EAAI,CAAC,EAC5D,GAAI,EAAK,aAAe,IAAA,GAAY,CAAC,EAAI,CAAE,WAAY,EAAK,UAAW,EACvE,GAAI,EAAK,kBAAkB,OAAS,CAAE,iBAAkB,EAAK,gBAAiB,EAAI,CAAC,EACnF,OAAQ,EAAY,IAAI,EAAK,IAAI,CACnC,CACF,CAEA,SAAS,EAAO,EAAiB,EAA0B,CACzD,OAAO,EAAK,KAAK,cAAc,EAAM,IAAI,CAC3C,CAEA,SAAS,EAAY,EAAc,EAA8B,CAC/D,MAAO,GAAG,EAAK,KAAK,EAAY,IAClC,CASA,SAAS,EAAa,EAAmE,CACvF,IAAM,EAAQ,IAAI,IAClB,IAAK,IAAM,KAAU,EACnB,IAAK,IAAM,KAAY,EAAO,MAAO,EAAM,IAAI,EAAU,CAAM,EAEjE,OAAO,CACT,CASA,SAAgB,EAAiB,EAAkD,CACjF,IAAM,EAAc,IAAI,IAAI,EAAM,WAAW,EACvC,EAAU,EAAM,YAAc,CAAC,EAC/B,EAAe,EAAa,CAAO,EACnC,EAAoB,CAAC,EACrB,EAAW,IAAI,IACf,EAAa,IAAI,IAEvB,IAAK,IAAM,KAAQ,EAAM,MAAO,CAC9B,IAAM,EAAQ,EAAQ,EAAM,CAAW,EACjC,EAAS,EAAa,IAAI,EAAK,IAAI,EACzC,GAAI,EAAQ,CACV,IAAM,EAAS,EAAS,IAAI,EAAO,IAAI,EACnC,EAAQ,EAAO,KAAK,CAAK,EACxB,EAAS,IAAI,EAAO,KAAM,CAAC,CAAK,CAAC,EACtC,QACF,CACA,GAAI,EAAK,WAAW,SAAW,UAAgB,CAC7C,EAAK,KAAK,CAAK,EACf,QACF,CAIA,IAAM,EAAe,EAAM,6BAA6B,EAAK,IAAI,EAC3D,EAAM,GAAgB,EAAK,WAAW,KACtC,EAAQ,EAAW,IAAI,CAAG,EAChC,GAAI,EAAO,EAAM,MAAM,KAAK,CAAK,MAC5B,CAMH,IAAM,EAJJ,IAAiB,IAAA,IACjB,EAAK,WAAW,SAAW,OAC3B,EAAK,WAAW,SAAW,SAC3B,CAAC,EAAK,WAAW,OAEd,EAAM,uBAAuB,CAAG,GAAK,EAAK,WAAW,QAAU,EAC/D,EAAK,WAAW,QAAU,EAC/B,EAAW,IAAI,EAAK,CAAE,MAAO,EAAY,EAAM,WAAW,EAAG,OAAQ,EAAK,MAAO,CAAC,CAAK,CAAE,CAAC,CAC5F,CACF,CAEA,IAAM,EAAwB,CAAC,EAC3B,EAAK,OAAS,GAChB,EAAQ,KAAK,CAAE,IAAK,EAAU,MAAO,EAAY,KAAW,CAAQ,EAAG,KAAM,EAAU,MAAO,EAAK,KAAK,CAAM,CAAE,CAAC,EAEnH,IAAK,IAAM,KAAU,EAAS,CAC5B,IAAM,EAAQ,EAAS,IAAI,EAAO,IAAI,GAAK,CAAC,EACtC,EAAS,EAAc,CAAM,EAInC,EAAQ,KAAK,CACX,IAAK,OAAoB,EAAO,OAChC,MAAO,EAAY,EAAO,KAAM,KAAK,EACrC,KAAM,MACN,GAAI,EAAS,CAAE,QAAO,EAAI,CAAC,EAC3B,MAAO,EAAM,KAAK,CAAM,CAC1B,CAAC,CACH,CACA,IAAK,GAAM,CAAC,EAAK,KAAU,EACzB,EAAQ,KAAK,CACX,MACA,MAAO,EAAM,MACb,KAAM,YACN,OAAQ,EAAM,OACd,MAAO,EAAM,MAAM,KAAK,CAAM,CAChC,CAAC,EAGH,OAAO,EAAQ,MACZ,EAAM,IAAU,EAAW,EAAK,MAAQ,EAAW,EAAM,OAAS,EAAK,MAAM,cAAc,EAAM,KAAK,CACzG,CACF"}
@@ -0,0 +1,51 @@
1
+ import { McpServerSnapshot } from "@agimon-ai/doompi-extension-contracts/mcp-status";
2
+ //#region src/services/tools/toolInventory.d.ts
3
+ type ToolSourceKind = 'core' | 'mcp' | 'extension';
4
+ interface ToolEntry {
5
+ name: string;
6
+ description?: string;
7
+ parameters?: unknown;
8
+ promptGuidelines?: readonly string[];
9
+ active: boolean;
10
+ }
11
+ interface ToolSource {
12
+ key: string;
13
+ label: string;
14
+ kind: ToolSourceKind;
15
+ /** Server state for MCP sources, e.g. `disabled`; absent for core and extensions. */
16
+ status?: string;
17
+ /** The registering file for extension sources. */
18
+ detail?: string;
19
+ tools: readonly ToolEntry[];
20
+ }
21
+ /** One server row of the MCP status snapshot. */
22
+ type McpServerStatus = McpServerSnapshot;
23
+ interface ToolInfo {
24
+ name: string;
25
+ description?: string;
26
+ parameters?: unknown;
27
+ promptGuidelines?: readonly string[];
28
+ sourceInfo: {
29
+ path: string;
30
+ source?: string;
31
+ };
32
+ }
33
+ interface ToolInventoryInput {
34
+ tools: readonly ToolInfo[];
35
+ activeTools: readonly string[];
36
+ /** Absent when the MCP adapter is not loaded or has not published yet. */
37
+ mcpServers?: readonly McpServerStatus[];
38
+ resolveExtensionName?: (entryPath: string) => string;
39
+ resolveExtensionToolSource?: (toolName: string) => string | undefined;
40
+ }
41
+ /**
42
+ * Groups the session's tools by where they came from: Pi itself, one group per
43
+ * MCP server, then one per extension that registered a tool.
44
+ *
45
+ * Every MCP tool is registered by one extension, so `sourceInfo` cannot separate
46
+ * servers; the status snapshot supplies the tool-to-server mapping instead.
47
+ */
48
+ declare function buildToolSources(input: ToolInventoryInput): readonly ToolSource[];
49
+ //#endregion
50
+ export { McpServerStatus, ToolEntry, ToolInfo, ToolInventoryInput, ToolSource, ToolSourceKind, buildToolSources };
51
+ //# sourceMappingURL=toolInventory.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolInventory.d.cts","names":[],"sources":["../../../src/services/tools/toolInventory.ts"],"mappings":";;KAEY;UAEK;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA,MAAM;;EAEN;;EAEA;EACA,gBAAgB;;;KAIN,kBAAkB;UAEb;EACf;EACA;EACA;EACA;EACA;IAAc;IAAc;;;UAGb;EACf,gBAAgB;EAChB;;EAEA,sBAAsB;EACtB,wBAAwB;EACxB,8BAA8B;;;;;;;;;iBAkEhB,iBAAiB,OAAO,8BAA8B"}
@@ -0,0 +1,51 @@
1
+ import { McpServerSnapshot } from "@agimon-ai/doompi-extension-contracts/mcp-status";
2
+ //#region src/services/tools/toolInventory.d.ts
3
+ type ToolSourceKind = 'core' | 'mcp' | 'extension';
4
+ interface ToolEntry {
5
+ name: string;
6
+ description?: string;
7
+ parameters?: unknown;
8
+ promptGuidelines?: readonly string[];
9
+ active: boolean;
10
+ }
11
+ interface ToolSource {
12
+ key: string;
13
+ label: string;
14
+ kind: ToolSourceKind;
15
+ /** Server state for MCP sources, e.g. `disabled`; absent for core and extensions. */
16
+ status?: string;
17
+ /** The registering file for extension sources. */
18
+ detail?: string;
19
+ tools: readonly ToolEntry[];
20
+ }
21
+ /** One server row of the MCP status snapshot. */
22
+ type McpServerStatus = McpServerSnapshot;
23
+ interface ToolInfo {
24
+ name: string;
25
+ description?: string;
26
+ parameters?: unknown;
27
+ promptGuidelines?: readonly string[];
28
+ sourceInfo: {
29
+ path: string;
30
+ source?: string;
31
+ };
32
+ }
33
+ interface ToolInventoryInput {
34
+ tools: readonly ToolInfo[];
35
+ activeTools: readonly string[];
36
+ /** Absent when the MCP adapter is not loaded or has not published yet. */
37
+ mcpServers?: readonly McpServerStatus[];
38
+ resolveExtensionName?: (entryPath: string) => string;
39
+ resolveExtensionToolSource?: (toolName: string) => string | undefined;
40
+ }
41
+ /**
42
+ * Groups the session's tools by where they came from: Pi itself, one group per
43
+ * MCP server, then one per extension that registered a tool.
44
+ *
45
+ * Every MCP tool is registered by one extension, so `sourceInfo` cannot separate
46
+ * servers; the status snapshot supplies the tool-to-server mapping instead.
47
+ */
48
+ declare function buildToolSources(input: ToolInventoryInput): readonly ToolSource[];
49
+ //#endregion
50
+ export { McpServerStatus, ToolEntry, ToolInfo, ToolInventoryInput, ToolSource, ToolSourceKind, buildToolSources };
51
+ //# sourceMappingURL=toolInventory.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolInventory.d.mts","names":[],"sources":["../../../src/services/tools/toolInventory.ts"],"mappings":";;KAEY;UAEK;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA,MAAM;;EAEN;;EAEA;EACA,gBAAgB;;;KAIN,kBAAkB;UAEb;EACf;EACA;EACA;EACA;EACA;IAAc;IAAc;;;UAGb;EACf,gBAAgB;EAChB;;EAEA,sBAAsB;EACtB,wBAAwB;EACxB,8BAA8B;;;;;;;;;iBAkEhB,iBAAiB,OAAO,8BAA8B"}
@@ -0,0 +1,2 @@
1
+ const e=`core`,t={core:`core`,mcp:`mcp`,extension:`extension`},n={core:0,mcp:1,extension:2};function r(e){return e.state===`connected`?void 0:e.state.replace(/-/g,` `)}function i(e,t){return{name:e.name,...e.description?{description:e.description}:{},...e.parameters===void 0?{}:{parameters:e.parameters},...e.promptGuidelines?.length?{promptGuidelines:e.promptGuidelines}:{},active:t.has(e.name)}}function a(e,t){return e.name.localeCompare(t.name)}function o(e,n){return`${e} · ${t[n]}`}function s(e){let t=new Map;for(let n of e)for(let e of n.tools)t.set(e,n);return t}function c(t){let c=new Set(t.activeTools),l=t.mcpServers??[],u=s(l),d=[],f=new Map,p=new Map;for(let e of t.tools){let n=i(e,c),r=u.get(e.name);if(r){let e=f.get(r.name);e?e.push(n):f.set(r.name,[n]);continue}if(e.sourceInfo.source===`builtin`){d.push(n);continue}let a=t.resolveExtensionToolSource?.(e.name),s=a??e.sourceInfo.path,l=p.get(s);if(l)l.tools.push(n);else{let r=a!==void 0||e.sourceInfo.source===`cli`||e.sourceInfo.source===`local`||!e.sourceInfo.source?t.resolveExtensionName?.(s)??e.sourceInfo.source??s:e.sourceInfo.source??s;p.set(s,{label:o(r,`extension`),detail:s,tools:[n]})}}let m=[];d.length>0&&m.push({key:e,label:o(`pi`,e),kind:e,tools:d.sort(a)});for(let e of l){let t=f.get(e.name)??[],n=r(e);m.push({key:`mcp:${e.name}`,label:o(e.name,`mcp`),kind:`mcp`,...n?{status:n}:{},tools:t.sort(a)})}for(let[e,t]of p)m.push({key:e,label:t.label,kind:`extension`,detail:t.detail,tools:t.tools.sort(a)});return m.sort((e,t)=>n[e.kind]-n[t.kind]||e.label.localeCompare(t.label))}export{c as buildToolSources};
2
+ //# sourceMappingURL=toolInventory.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolInventory.mjs","names":[],"sources":["../../../src/services/tools/toolInventory.ts"],"sourcesContent":["import type { McpServerSnapshot } from '@agimon-ai/doompi-extension-contracts/mcp-status';\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 ToolInfo {\n name: string;\n description?: string;\n parameters?: unknown;\n promptGuidelines?: readonly string[];\n sourceInfo: { path: string; source?: string };\n}\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 resolveExtensionName?: (entryPath: string) => string;\n resolveExtensionToolSource?: (toolName: string) => string | undefined;\n}\n\n/** Pi tags its own tools with this source; everything else came from an extension. */\nconst BUILTIN_SOURCE = 'builtin';\n/** Pi's structural tags for an extension path, neither of which is a package name. */\nconst CLI_SOURCE = 'cli';\nconst LOCAL_SOURCE = 'local';\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: 'extension' };\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 // A composed bundle has one Pi source path for every factory inside it. Doom's\n // compiler records the original entry at registration time so those extensions\n // remain separate here even though Pi can only see the outer bundle.\n const recordedPath = input.resolveExtensionToolSource?.(tool.name);\n const key = recordedPath ?? tool.sourceInfo.path;\n const group = extensions.get(key);\n if (group) group.tools.push(entry);\n else {\n const structuralSource =\n recordedPath !== undefined ||\n tool.sourceInfo.source === CLI_SOURCE ||\n tool.sourceInfo.source === LOCAL_SOURCE ||\n !tool.sourceInfo.source;\n const name = structuralSource\n ? (input.resolveExtensionName?.(key) ?? tool.sourceInfo.source ?? key)\n : (tool.sourceInfo.source ?? key);\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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"}
package/dist/skills.cjs CHANGED
@@ -1 +1 @@
1
- var e=require("@agimon-ai/doompi-extension-contracts/skills");Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@agimon-ai/doompi-extension-contracts/skills");Object.defineProperty(exports,"SkillSourceContributionSchema",{enumerable:!0,get:function(){return e.SkillSourceContributionSchema}}),Object.defineProperty(exports,"SkillSourceNameSchema",{enumerable:!0,get:function(){return e.SkillSourceNameSchema}}),Object.defineProperty(exports,"SkillSourceRegistrationProtocol",{enumerable:!0,get:function(){return e.SkillSourceRegistrationProtocol}}),Object.defineProperty(exports,"SkillSourceRegistrationSchema",{enumerable:!0,get:function(){return e.SkillSourceRegistrationSchema}}),Object.defineProperty(exports,"SkillSourceUnregistrationProtocol",{enumerable:!0,get:function(){return e.SkillSourceUnregistrationProtocol}}),Object.defineProperty(exports,"registerDoomSkillSource",{enumerable:!0,get:function(){return e.registerDoomSkillSource}});
package/dist/skills.d.cts CHANGED
@@ -1 +1,2 @@
1
- export * from "@agimon-ai/doompi-extension-contracts/skills";
1
+ import { SkillSourceContribution, SkillSourceContributionSchema, SkillSourceNameSchema, SkillSourceRegistration, SkillSourceRegistrationProtocol, SkillSourceRegistrationSchema, SkillSourceUnregistrationProtocol, registerDoomSkillSource } from "@agimon-ai/doompi-extension-contracts/skills";
2
+ export { type SkillSourceContribution, SkillSourceContributionSchema, SkillSourceNameSchema, type SkillSourceRegistration, SkillSourceRegistrationProtocol, SkillSourceRegistrationSchema, SkillSourceUnregistrationProtocol, registerDoomSkillSource };
package/dist/skills.d.mts CHANGED
@@ -1 +1,2 @@
1
- export * from "@agimon-ai/doompi-extension-contracts/skills";
1
+ import { SkillSourceContribution, SkillSourceContributionSchema, SkillSourceNameSchema, SkillSourceRegistration, SkillSourceRegistrationProtocol, SkillSourceRegistrationSchema, SkillSourceUnregistrationProtocol, registerDoomSkillSource } from "@agimon-ai/doompi-extension-contracts/skills";
2
+ export { type SkillSourceContribution, SkillSourceContributionSchema, SkillSourceNameSchema, type SkillSourceRegistration, SkillSourceRegistrationProtocol, SkillSourceRegistrationSchema, SkillSourceUnregistrationProtocol, registerDoomSkillSource };
package/dist/skills.mjs CHANGED
@@ -1 +1 @@
1
- export*from"@agimon-ai/doompi-extension-contracts/skills";export{};
1
+ import{SkillSourceContributionSchema as e,SkillSourceNameSchema as t,SkillSourceRegistrationProtocol as n,SkillSourceRegistrationSchema as r,SkillSourceUnregistrationProtocol as i,registerDoomSkillSource as a}from"@agimon-ai/doompi-extension-contracts/skills";export{e as SkillSourceContributionSchema,t as SkillSourceNameSchema,n as SkillSourceRegistrationProtocol,r as SkillSourceRegistrationSchema,i as SkillSourceUnregistrationProtocol,a as registerDoomSkillSource};
package/dist/theme.cjs CHANGED
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});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=`doom-pi-dark`,i=[`accent`,`mdCode`,`toolDiffAdded`,`warning`,`mdHeading`,`syntaxNumber`];function a(e){let t=2166136261;for(let n of e)t^=n.charCodeAt(0),t=Math.imul(t,16777619);return i[(t>>>0)%i.length]}const o={$schema:`https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json`,name:r,vars:{bg:`#191919`,bgAlt:`#121212`,bgActive:`#252526`,bgHover:`#3d3d3d`,fg:`#d4d4d4`,fgAlt:`#aeafad`,grey:`#4b474c`,greyAlt:`#515151`,blue:`#8cdaff`,darkBlue:`#6699cc`,cyan:`#85ddff`,green:`#468800`,lightGreen:`#b5cea8`,teal:`#35cdaf`,orange:`#fc9354`,red:`#ff5e5e`,violet:`#bb80b3`,magenta:`#c586c0`,yellow:`#e9fdac`,lightYellow:`#fbe3bf`,comment:`#6d6d6d`},colors:{accent:`blue`,border:`greyAlt`,borderAccent:`blue`,borderMuted:`grey`,success:`green`,error:`red`,warning:`yellow`,muted:`fgAlt`,dim:`comment`,text:`fg`,thinkingText:`fgAlt`,selectedBg:`bgHover`,userMessageBg:`bgActive`,userMessageText:`fg`,customMessageBg:`#2a1b2f`,customMessageText:`fg`,customMessageLabel:`violet`,toolPendingBg:`bgAlt`,toolSuccessBg:`#1e2a16`,toolErrorBg:`#331d1d`,toolTitle:`blue`,toolOutput:`fg`,mdHeading:`magenta`,mdLink:`blue`,mdLinkUrl:`comment`,mdCode:`cyan`,mdCodeBlock:`lightYellow`,mdCodeBlockBorder:`greyAlt`,mdQuote:`fgAlt`,mdQuoteBorder:`greyAlt`,mdHr:`greyAlt`,mdListBullet:`blue`,toolDiffAdded:`lightGreen`,toolDiffRemoved:`red`,toolDiffContext:`fgAlt`,syntaxComment:`comment`,syntaxKeyword:`red`,syntaxFunction:`blue`,syntaxVariable:`yellow`,syntaxString:`lightYellow`,syntaxNumber:`orange`,syntaxType:`yellow`,syntaxOperator:`red`,syntaxPunctuation:`fgAlt`,thinkingOff:`grey`,thinkingMinimal:`fgAlt`,thinkingLow:`darkBlue`,thinkingMedium:`blue`,thinkingHigh:`teal`,thinkingXhigh:`magenta`,thinkingMax:`red`,bashMode:`lightGreen`},export:{pageBg:`bg`,cardBg:`bgAlt`,infoBg:`#26261c`}};async function s(e){let i=t.default.join(e,`${r}.json`);return await n.default.promises.writeFile(i,`${JSON.stringify(o,null,2)}\n`,{mode:384}),i}exports.DEFAULT_THEME=o,exports.DEFAULT_THEME_NAME=r,exports.agentIdentityColor=a,exports.writeDefaultTheme=s;
2
- //# sourceMappingURL=theme.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./tui/theme.cjs");exports.DEFAULT_THEME=e.DEFAULT_THEME,exports.DEFAULT_THEME_NAME=e.DEFAULT_THEME_NAME,exports.agentIdentityColor=e.agentIdentityColor,exports.allocateAgentIdentityColor=e.allocateAgentIdentityColor,exports.writeDefaultTheme=e.writeDefaultTheme;
package/dist/theme.d.cts CHANGED
@@ -1,95 +1,2 @@
1
- import { FooterTextColor } from "@agimon-ai/doompi-extension-contracts/footer";
2
- //#region src/theme.d.ts
3
- declare const DEFAULT_THEME_NAME = "doom-pi-dark";
4
- /** Stable semantic color shared by every UI surface that identifies an agent. */
5
- declare function agentIdentityColor(agentName: string): FooterTextColor;
6
- declare const DEFAULT_THEME: {
7
- readonly $schema: "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json";
8
- readonly name: "doom-pi-dark";
9
- readonly vars: {
10
- readonly bg: "#191919";
11
- readonly bgAlt: "#121212";
12
- readonly bgActive: "#252526";
13
- readonly bgHover: "#3d3d3d";
14
- readonly fg: "#d4d4d4";
15
- readonly fgAlt: "#aeafad";
16
- readonly grey: "#4b474c";
17
- readonly greyAlt: "#515151";
18
- readonly blue: "#8cdaff";
19
- readonly darkBlue: "#6699cc";
20
- readonly cyan: "#85ddff";
21
- readonly green: "#468800";
22
- readonly lightGreen: "#b5cea8";
23
- readonly teal: "#35cdaf";
24
- readonly orange: "#fc9354";
25
- readonly red: "#ff5e5e";
26
- readonly violet: "#bb80b3";
27
- readonly magenta: "#c586c0";
28
- readonly yellow: "#e9fdac";
29
- readonly lightYellow: "#fbe3bf";
30
- readonly comment: "#6d6d6d";
31
- };
32
- readonly colors: {
33
- readonly accent: "blue";
34
- readonly border: "greyAlt";
35
- readonly borderAccent: "blue";
36
- readonly borderMuted: "grey";
37
- readonly success: "green";
38
- readonly error: "red";
39
- readonly warning: "yellow";
40
- readonly muted: "fgAlt";
41
- readonly dim: "comment";
42
- readonly text: "fg";
43
- readonly thinkingText: "fgAlt";
44
- readonly selectedBg: "bgHover";
45
- readonly userMessageBg: "bgActive";
46
- readonly userMessageText: "fg";
47
- readonly customMessageBg: "#2a1b2f";
48
- readonly customMessageText: "fg";
49
- readonly customMessageLabel: "violet";
50
- readonly toolPendingBg: "bgAlt";
51
- readonly toolSuccessBg: "#1e2a16";
52
- readonly toolErrorBg: "#331d1d";
53
- readonly toolTitle: "blue";
54
- readonly toolOutput: "fg";
55
- readonly mdHeading: "magenta";
56
- readonly mdLink: "blue";
57
- readonly mdLinkUrl: "comment";
58
- readonly mdCode: "cyan";
59
- readonly mdCodeBlock: "lightYellow";
60
- readonly mdCodeBlockBorder: "greyAlt";
61
- readonly mdQuote: "fgAlt";
62
- readonly mdQuoteBorder: "greyAlt";
63
- readonly mdHr: "greyAlt";
64
- readonly mdListBullet: "blue";
65
- readonly toolDiffAdded: "lightGreen";
66
- readonly toolDiffRemoved: "red";
67
- readonly toolDiffContext: "fgAlt";
68
- readonly syntaxComment: "comment";
69
- readonly syntaxKeyword: "red";
70
- readonly syntaxFunction: "blue";
71
- readonly syntaxVariable: "yellow";
72
- readonly syntaxString: "lightYellow";
73
- readonly syntaxNumber: "orange";
74
- readonly syntaxType: "yellow";
75
- readonly syntaxOperator: "red";
76
- readonly syntaxPunctuation: "fgAlt";
77
- readonly thinkingOff: "grey";
78
- readonly thinkingMinimal: "fgAlt";
79
- readonly thinkingLow: "darkBlue";
80
- readonly thinkingMedium: "blue";
81
- readonly thinkingHigh: "teal";
82
- readonly thinkingXhigh: "magenta";
83
- readonly thinkingMax: "red";
84
- readonly bashMode: "lightGreen";
85
- };
86
- readonly export: {
87
- readonly pageBg: "bg";
88
- readonly cardBg: "bgAlt";
89
- readonly infoBg: "#26261c";
90
- };
91
- };
92
- declare function writeDefaultTheme(temporaryDirectory: string): Promise<string>;
93
- //#endregion
94
- export { DEFAULT_THEME, DEFAULT_THEME_NAME, agentIdentityColor, writeDefaultTheme };
95
- //# sourceMappingURL=theme.d.cts.map
1
+ import { DEFAULT_THEME, DEFAULT_THEME_NAME, agentIdentityColor, allocateAgentIdentityColor, writeDefaultTheme } from "./tui/theme.cjs";
2
+ export { DEFAULT_THEME, DEFAULT_THEME_NAME, agentIdentityColor, allocateAgentIdentityColor, writeDefaultTheme };
package/dist/theme.d.mts CHANGED
@@ -1,95 +1,2 @@
1
- import { FooterTextColor } from "@agimon-ai/doompi-extension-contracts/footer";
2
- //#region src/theme.d.ts
3
- declare const DEFAULT_THEME_NAME = "doom-pi-dark";
4
- /** Stable semantic color shared by every UI surface that identifies an agent. */
5
- declare function agentIdentityColor(agentName: string): FooterTextColor;
6
- declare const DEFAULT_THEME: {
7
- readonly $schema: "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json";
8
- readonly name: "doom-pi-dark";
9
- readonly vars: {
10
- readonly bg: "#191919";
11
- readonly bgAlt: "#121212";
12
- readonly bgActive: "#252526";
13
- readonly bgHover: "#3d3d3d";
14
- readonly fg: "#d4d4d4";
15
- readonly fgAlt: "#aeafad";
16
- readonly grey: "#4b474c";
17
- readonly greyAlt: "#515151";
18
- readonly blue: "#8cdaff";
19
- readonly darkBlue: "#6699cc";
20
- readonly cyan: "#85ddff";
21
- readonly green: "#468800";
22
- readonly lightGreen: "#b5cea8";
23
- readonly teal: "#35cdaf";
24
- readonly orange: "#fc9354";
25
- readonly red: "#ff5e5e";
26
- readonly violet: "#bb80b3";
27
- readonly magenta: "#c586c0";
28
- readonly yellow: "#e9fdac";
29
- readonly lightYellow: "#fbe3bf";
30
- readonly comment: "#6d6d6d";
31
- };
32
- readonly colors: {
33
- readonly accent: "blue";
34
- readonly border: "greyAlt";
35
- readonly borderAccent: "blue";
36
- readonly borderMuted: "grey";
37
- readonly success: "green";
38
- readonly error: "red";
39
- readonly warning: "yellow";
40
- readonly muted: "fgAlt";
41
- readonly dim: "comment";
42
- readonly text: "fg";
43
- readonly thinkingText: "fgAlt";
44
- readonly selectedBg: "bgHover";
45
- readonly userMessageBg: "bgActive";
46
- readonly userMessageText: "fg";
47
- readonly customMessageBg: "#2a1b2f";
48
- readonly customMessageText: "fg";
49
- readonly customMessageLabel: "violet";
50
- readonly toolPendingBg: "bgAlt";
51
- readonly toolSuccessBg: "#1e2a16";
52
- readonly toolErrorBg: "#331d1d";
53
- readonly toolTitle: "blue";
54
- readonly toolOutput: "fg";
55
- readonly mdHeading: "magenta";
56
- readonly mdLink: "blue";
57
- readonly mdLinkUrl: "comment";
58
- readonly mdCode: "cyan";
59
- readonly mdCodeBlock: "lightYellow";
60
- readonly mdCodeBlockBorder: "greyAlt";
61
- readonly mdQuote: "fgAlt";
62
- readonly mdQuoteBorder: "greyAlt";
63
- readonly mdHr: "greyAlt";
64
- readonly mdListBullet: "blue";
65
- readonly toolDiffAdded: "lightGreen";
66
- readonly toolDiffRemoved: "red";
67
- readonly toolDiffContext: "fgAlt";
68
- readonly syntaxComment: "comment";
69
- readonly syntaxKeyword: "red";
70
- readonly syntaxFunction: "blue";
71
- readonly syntaxVariable: "yellow";
72
- readonly syntaxString: "lightYellow";
73
- readonly syntaxNumber: "orange";
74
- readonly syntaxType: "yellow";
75
- readonly syntaxOperator: "red";
76
- readonly syntaxPunctuation: "fgAlt";
77
- readonly thinkingOff: "grey";
78
- readonly thinkingMinimal: "fgAlt";
79
- readonly thinkingLow: "darkBlue";
80
- readonly thinkingMedium: "blue";
81
- readonly thinkingHigh: "teal";
82
- readonly thinkingXhigh: "magenta";
83
- readonly thinkingMax: "red";
84
- readonly bashMode: "lightGreen";
85
- };
86
- readonly export: {
87
- readonly pageBg: "bg";
88
- readonly cardBg: "bgAlt";
89
- readonly infoBg: "#26261c";
90
- };
91
- };
92
- declare function writeDefaultTheme(temporaryDirectory: string): Promise<string>;
93
- //#endregion
94
- export { DEFAULT_THEME, DEFAULT_THEME_NAME, agentIdentityColor, writeDefaultTheme };
95
- //# sourceMappingURL=theme.d.mts.map
1
+ import { DEFAULT_THEME, DEFAULT_THEME_NAME, agentIdentityColor, allocateAgentIdentityColor, writeDefaultTheme } from "./tui/theme.mjs";
2
+ export { DEFAULT_THEME, DEFAULT_THEME_NAME, agentIdentityColor, allocateAgentIdentityColor, writeDefaultTheme };
package/dist/theme.mjs CHANGED
@@ -1,2 +1 @@
1
- import e from"node:path";import t from"node:fs";const n=`doom-pi-dark`,r=[`accent`,`mdCode`,`toolDiffAdded`,`warning`,`mdHeading`,`syntaxNumber`];function i(e){let t=2166136261;for(let n of e)t^=n.charCodeAt(0),t=Math.imul(t,16777619);return r[(t>>>0)%r.length]}const a={$schema:`https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json`,name:n,vars:{bg:`#191919`,bgAlt:`#121212`,bgActive:`#252526`,bgHover:`#3d3d3d`,fg:`#d4d4d4`,fgAlt:`#aeafad`,grey:`#4b474c`,greyAlt:`#515151`,blue:`#8cdaff`,darkBlue:`#6699cc`,cyan:`#85ddff`,green:`#468800`,lightGreen:`#b5cea8`,teal:`#35cdaf`,orange:`#fc9354`,red:`#ff5e5e`,violet:`#bb80b3`,magenta:`#c586c0`,yellow:`#e9fdac`,lightYellow:`#fbe3bf`,comment:`#6d6d6d`},colors:{accent:`blue`,border:`greyAlt`,borderAccent:`blue`,borderMuted:`grey`,success:`green`,error:`red`,warning:`yellow`,muted:`fgAlt`,dim:`comment`,text:`fg`,thinkingText:`fgAlt`,selectedBg:`bgHover`,userMessageBg:`bgActive`,userMessageText:`fg`,customMessageBg:`#2a1b2f`,customMessageText:`fg`,customMessageLabel:`violet`,toolPendingBg:`bgAlt`,toolSuccessBg:`#1e2a16`,toolErrorBg:`#331d1d`,toolTitle:`blue`,toolOutput:`fg`,mdHeading:`magenta`,mdLink:`blue`,mdLinkUrl:`comment`,mdCode:`cyan`,mdCodeBlock:`lightYellow`,mdCodeBlockBorder:`greyAlt`,mdQuote:`fgAlt`,mdQuoteBorder:`greyAlt`,mdHr:`greyAlt`,mdListBullet:`blue`,toolDiffAdded:`lightGreen`,toolDiffRemoved:`red`,toolDiffContext:`fgAlt`,syntaxComment:`comment`,syntaxKeyword:`red`,syntaxFunction:`blue`,syntaxVariable:`yellow`,syntaxString:`lightYellow`,syntaxNumber:`orange`,syntaxType:`yellow`,syntaxOperator:`red`,syntaxPunctuation:`fgAlt`,thinkingOff:`grey`,thinkingMinimal:`fgAlt`,thinkingLow:`darkBlue`,thinkingMedium:`blue`,thinkingHigh:`teal`,thinkingXhigh:`magenta`,thinkingMax:`red`,bashMode:`lightGreen`},export:{pageBg:`bg`,cardBg:`bgAlt`,infoBg:`#26261c`}};async function o(r){let i=e.join(r,`${n}.json`);return await t.promises.writeFile(i,`${JSON.stringify(a,null,2)}\n`,{mode:384}),i}export{a as DEFAULT_THEME,n as DEFAULT_THEME_NAME,i as agentIdentityColor,o as writeDefaultTheme};
2
- //# sourceMappingURL=theme.mjs.map
1
+ import{DEFAULT_THEME as e,DEFAULT_THEME_NAME as t,agentIdentityColor as n,allocateAgentIdentityColor as r,writeDefaultTheme as i}from"./tui/theme.mjs";export{e as DEFAULT_THEME,t as DEFAULT_THEME_NAME,n as agentIdentityColor,r as allocateAgentIdentityColor,i as writeDefaultTheme};
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./tui/toolChrome.cjs");exports.DoomToolCall=e.DoomToolCall,exports.DoomToolResult=e.DoomToolResult,exports.renderToolBadge=e.renderToolBadge,exports.renderToolHeading=e.renderToolHeading;
@@ -0,0 +1,2 @@
1
+ import { DoomToolCall, DoomToolResult, DoomToolResultOptions, renderToolBadge, renderToolHeading } from "./tui/toolChrome.cjs";
2
+ export { DoomToolCall, DoomToolResult, type DoomToolResultOptions, renderToolBadge, renderToolHeading };
@@ -0,0 +1,2 @@
1
+ import { DoomToolCall, DoomToolResult, DoomToolResultOptions, renderToolBadge, renderToolHeading } from "./tui/toolChrome.mjs";
2
+ export { DoomToolCall, DoomToolResult, type DoomToolResultOptions, renderToolBadge, renderToolHeading };
@@ -0,0 +1 @@
1
+ import{DoomToolCall as e,DoomToolResult as t,renderToolBadge as n,renderToolHeading as r}from"./tui/toolChrome.mjs";export{e as DoomToolCall,t as DoomToolResult,n as renderToolBadge,r as renderToolHeading};
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./extensionName.cjs"),t=`core`,n={core:`core`,mcp:`mcp`,extension:`cli`},r={core:0,mcp:1,extension:2};function i(e){return e.state===`connected`?void 0:e.state.replace(/-/g,` `)}function a(e,t){return{name:e.name,...e.description?{description:e.description}:{},...e.parameters===void 0?{}:{parameters:e.parameters},...e.promptGuidelines?.length?{promptGuidelines:e.promptGuidelines}:{},active:t.has(e.name)}}function o(e,t){return e.name.localeCompare(t.name)}function s(e,t){return`${e} · ${n[t]}`}function c(e){let t=new Map;for(let n of e)for(let e of n.tools)t.set(e,n);return t}function l(n){let l=new Set(n.activeTools),u=n.mcpServers??[],d=c(u),f=[],p=new Map,m=new Map;for(let t of n.tools){let n=a(t,l),r=d.get(t.name);if(r){let e=p.get(r.name);e?e.push(n):p.set(r.name,[n]);continue}if(t.sourceInfo.source===`builtin`){f.push(n);continue}let i=t.sourceInfo.path,o=m.get(i);if(o)o.tools.push(n);else{let r=t.sourceInfo.source===`cli`||!t.sourceInfo.source?e.extensionName(i):t.sourceInfo.source;m.set(i,{label:s(r,`extension`),detail:i,tools:[n]})}}let h=[];f.length>0&&h.push({key:t,label:s(`pi`,t),kind:t,tools:f.sort(o)});for(let e of u){let t=p.get(e.name)??[],n=i(e);h.push({key:`mcp:${e.name}`,label:s(e.name,`mcp`),kind:`mcp`,...n?{status:n}:{},tools:t.sort(o)})}for(let[e,t]of m)h.push({key:e,label:t.label,kind:`extension`,detail:t.detail,tools:t.tools.sort(o)});return h.sort((e,t)=>r[e.kind]-r[t.kind]||e.label.localeCompare(t.label))}exports.buildToolSources=l;
2
- //# sourceMappingURL=toolInventory.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/tools/toolInventory.cjs");exports.buildToolSources=e.buildToolSources;
@@ -1,40 +1,2 @@
1
- import { ToolInfo } from "@earendil-works/pi-coding-agent";
2
- import { McpServerSnapshot } from "@agimon-ai/doompi-extension-contracts/mcp-status";
3
- //#region src/toolInventory.d.ts
4
- type ToolSourceKind = 'core' | 'mcp' | 'extension';
5
- interface ToolEntry {
6
- name: string;
7
- description?: string;
8
- parameters?: unknown;
9
- promptGuidelines?: readonly string[];
10
- active: boolean;
11
- }
12
- interface ToolSource {
13
- key: string;
14
- label: string;
15
- kind: ToolSourceKind;
16
- /** Server state for MCP sources, e.g. `disabled`; absent for core and extensions. */
17
- status?: string;
18
- /** The registering file for extension sources. */
19
- detail?: string;
20
- tools: readonly ToolEntry[];
21
- }
22
- /** One server row of the MCP status snapshot. */
23
- type McpServerStatus = McpServerSnapshot;
24
- interface ToolInventoryInput {
25
- tools: readonly ToolInfo[];
26
- activeTools: readonly string[];
27
- /** Absent when the MCP adapter is not loaded or has not published yet. */
28
- mcpServers?: readonly McpServerStatus[];
29
- }
30
- /**
31
- * Groups the session's tools by where they came from: Pi itself, one group per
32
- * MCP server, then one per extension that registered a tool.
33
- *
34
- * Every MCP tool is registered by one extension, so `sourceInfo` cannot separate
35
- * servers; the status snapshot supplies the tool-to-server mapping instead.
36
- */
37
- declare function buildToolSources(input: ToolInventoryInput): readonly ToolSource[];
38
- //#endregion
39
- export { McpServerStatus, ToolEntry, ToolInventoryInput, ToolSource, ToolSourceKind, buildToolSources };
40
- //# sourceMappingURL=toolInventory.d.cts.map
1
+ import { McpServerStatus, ToolEntry, ToolInventoryInput, ToolSource, ToolSourceKind, buildToolSources } from "./services/tools/toolInventory.cjs";
2
+ export { type McpServerStatus, type ToolEntry, type ToolInventoryInput, type ToolSource, type ToolSourceKind, buildToolSources };
@@ -1,40 +1,2 @@
1
- import { ToolInfo } from "@earendil-works/pi-coding-agent";
2
- import { McpServerSnapshot } from "@agimon-ai/doompi-extension-contracts/mcp-status";
3
- //#region src/toolInventory.d.ts
4
- type ToolSourceKind = 'core' | 'mcp' | 'extension';
5
- interface ToolEntry {
6
- name: string;
7
- description?: string;
8
- parameters?: unknown;
9
- promptGuidelines?: readonly string[];
10
- active: boolean;
11
- }
12
- interface ToolSource {
13
- key: string;
14
- label: string;
15
- kind: ToolSourceKind;
16
- /** Server state for MCP sources, e.g. `disabled`; absent for core and extensions. */
17
- status?: string;
18
- /** The registering file for extension sources. */
19
- detail?: string;
20
- tools: readonly ToolEntry[];
21
- }
22
- /** One server row of the MCP status snapshot. */
23
- type McpServerStatus = McpServerSnapshot;
24
- interface ToolInventoryInput {
25
- tools: readonly ToolInfo[];
26
- activeTools: readonly string[];
27
- /** Absent when the MCP adapter is not loaded or has not published yet. */
28
- mcpServers?: readonly McpServerStatus[];
29
- }
30
- /**
31
- * Groups the session's tools by where they came from: Pi itself, one group per
32
- * MCP server, then one per extension that registered a tool.
33
- *
34
- * Every MCP tool is registered by one extension, so `sourceInfo` cannot separate
35
- * servers; the status snapshot supplies the tool-to-server mapping instead.
36
- */
37
- declare function buildToolSources(input: ToolInventoryInput): readonly ToolSource[];
38
- //#endregion
39
- export { McpServerStatus, ToolEntry, ToolInventoryInput, ToolSource, ToolSourceKind, buildToolSources };
40
- //# sourceMappingURL=toolInventory.d.mts.map
1
+ import { McpServerStatus, ToolEntry, ToolInventoryInput, ToolSource, ToolSourceKind, buildToolSources } from "./services/tools/toolInventory.mjs";
2
+ export { type McpServerStatus, type ToolEntry, type ToolInventoryInput, type ToolSource, type ToolSourceKind, buildToolSources };
@@ -1,2 +1 @@
1
- import{extensionName as e}from"./extensionName.mjs";const t=`core`,n={core:`core`,mcp:`mcp`,extension:`cli`},r={core:0,mcp:1,extension:2};function i(e){return e.state===`connected`?void 0:e.state.replace(/-/g,` `)}function a(e,t){return{name:e.name,...e.description?{description:e.description}:{},...e.parameters===void 0?{}:{parameters:e.parameters},...e.promptGuidelines?.length?{promptGuidelines:e.promptGuidelines}:{},active:t.has(e.name)}}function o(e,t){return e.name.localeCompare(t.name)}function s(e,t){return`${e} · ${n[t]}`}function c(e){let t=new Map;for(let n of e)for(let e of n.tools)t.set(e,n);return t}function l(n){let l=new Set(n.activeTools),u=n.mcpServers??[],d=c(u),f=[],p=new Map,m=new Map;for(let t of n.tools){let n=a(t,l),r=d.get(t.name);if(r){let e=p.get(r.name);e?e.push(n):p.set(r.name,[n]);continue}if(t.sourceInfo.source===`builtin`){f.push(n);continue}let i=t.sourceInfo.path,o=m.get(i);if(o)o.tools.push(n);else{let r=t.sourceInfo.source===`cli`||!t.sourceInfo.source?e(i):t.sourceInfo.source;m.set(i,{label:s(r,`extension`),detail:i,tools:[n]})}}let h=[];f.length>0&&h.push({key:t,label:s(`pi`,t),kind:t,tools:f.sort(o)});for(let e of u){let t=p.get(e.name)??[],n=i(e);h.push({key:`mcp:${e.name}`,label:s(e.name,`mcp`),kind:`mcp`,...n?{status:n}:{},tools:t.sort(o)})}for(let[e,t]of m)h.push({key:e,label:t.label,kind:`extension`,detail:t.detail,tools:t.tools.sort(o)});return h.sort((e,t)=>r[e.kind]-r[t.kind]||e.label.localeCompare(t.label))}export{l as buildToolSources};
2
- //# sourceMappingURL=toolInventory.mjs.map
1
+ import{buildToolSources as e}from"./services/tools/toolInventory.mjs";export{e as buildToolSources};
@@ -0,0 +1,14 @@
1
+ const e=require("./codeGutter.cjs"),t=require("./diffRender.cjs"),n=require("./toolChrome.cjs");let r=require("@earendil-works/pi-tui"),i=require("@earendil-works/pi-coding-agent");var a=class{text;constructor(e){this.text=e}render(e){return e<=0||this.text.length===0?[]:(0,r.wrapTextWithAnsi)(this.text,e)}invalidate(){}},o=class{content;theme;constructor(e,t){this.content=e,this.theme=t}setContent(e){this.content=e}getContent(){return this.content}render(e){if(e<=0)return[];if(e<3)return this.content.render(e);let t=e-2,n=this.content.render(t).map(e=>` ${e}`);return n.length===0?[]:[` ${this.theme.fg(`borderMuted`,`─`.repeat(t))}`,...n,``]}invalidate(){this.content.invalidate()}};function s(e){return e instanceof o?e.getContent():void 0}function c(e,t,n){return n instanceof o?(n.setContent(e),n):new o(e,t)}function l(e,t,r,i){let a=n.renderToolHeading(e,t,i);return r.length>0&&(a+=` ${i.fg(`muted`,`· ${r.join(` · `)}`)}`),new n.DoomToolCall(a)}function u(e,t){return e===void 0?void 0:`${e} ${t}`}function d(e){return e.filter(e=>e!==void 0&&e.length>0)}function f(e,t){return l(`read`,e.path,d([e.offset===void 0?void 0:`from ${e.offset}`,u(e.limit,`lines`)]),t)}function p(e,t){let n=e.edits.length;return l(`edit`,e.path,[`${n} edit${n===1?``:`s`}`],t)}function m(e){let t=e.at(-1);if(!(t===void 0||!t.startsWith(`[`)||!t.endsWith(`]`))){for(e.pop();e.at(-1)===``;)e.pop();return t}}function h(e){return(e.content??[]).filter(e=>e.type===`text`).map(e=>e.text??``).join(`
2
+ `).replaceAll(` `,` `).replaceAll(`\r
3
+ `,`
4
+ `)}function g(e,n,r,o,s=i.highlightCode,c=i.getLanguageFromPath){if(r.isError)return new a(o.fg(`error`,h(n)));let l=n.details?.diff;return l===void 0||l.length===0?new a(``):t.renderDoomDiff(l,o,c(e.path),s)}function _(t,r,a={},o=i.highlightCode,s=i.getLanguageFromPath){let c=n.renderToolHeading(`write`,t.path,r),l=r.fg(`muted`,`· ${t.content.length.toLocaleString(`en-US`)} chars`);if(t.content.length===0)return new n.DoomToolCall(`${c} ${l}`);let u=t.content.replaceAll(` `,` `).replaceAll(`\r
5
+ `,`
6
+ `).split(`
7
+ `);for(;u.at(-1)===``;)u.pop();let d=a.argsStreaming===!0&&a.expanded!==!0,f=a.expanded?u:d?u.slice(-10):u.slice(0,10),p=s(t.path),m=p?o(f.join(`
8
+ `),p):f.map(e=>r.fg(`toolOutput`,e)),h=u.length-f.length,g=d?h+1:1,_=e.gutterWidth(g+f.length-1),v=m.map((t,n)=>`${e.renderLineNumber(g+n,_,r)} ${t}`),y=d?[...h>0?[r.fg(`muted`,`… ${h} earlier lines · live tail`)]:[],...v]:[...v,...h>0?[r.fg(`muted`,`… ${h} more lines · ctrl+o expand`)]:[]];return new n.DoomToolCall([`${c} ${l}`,``,...y].join(`
9
+ `))}function v(t,n,r,o,s=i.highlightCode,c=i.getLanguageFromPath){let l=h(n).split(`
10
+ `);for(;l.at(-1)===``;)l.pop();if(r.isError)return new a(l.map(e=>o.fg(`error`,e)).join(`
11
+ `));let u=m(l),d=r.expanded?l:l.slice(0,10),f=c(t.path),p=f?s(d.join(`
12
+ `),f):d.map(e=>o.fg(`toolOutput`,e)),g=t.offset??1,_=e.gutterWidth(g+d.length-1),v=p.map((t,n)=>`${e.renderLineNumber(g+n,_,o)} ${t}`),y=l.length-d.length;return y>0&&v.push(o.fg(`muted`,`… ${y} more lines · ctrl+o expand`)),u!==void 0&&v.push(o.fg(`muted`,u)),new a(v.join(`
13
+ `))}function y(e,t){return l(`grep`,e.pattern,d([e.path??`.`,e.glob,e.ignoreCase===!0?`ignore case`:void 0,u(e.limit,`matches`)]),t)}function b(e,t){return l(`find`,e.pattern,d([e.path??`.`,u(e.limit,`results`)]),t)}function x(e,t){return l(`ls`,e.path??`.`,d([u(e.limit,`entries`)]),t)}exports.frameBuiltinResult=c,exports.previousBuiltinResult=s,exports.renderEditCall=p,exports.renderEditResult=g,exports.renderFindCall=b,exports.renderGrepCall=y,exports.renderLsCall=x,exports.renderReadCall=f,exports.renderReadResult=v,exports.renderWriteCall=_;
14
+ //# sourceMappingURL=builtinToolRender.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtinToolRender.cjs","names":["wrapTextWithAnsi","renderToolHeading","DoomToolCall","highlightCode","getLanguageFromPath","renderDoomDiff","gutterWidth","renderLineNumber"],"sources":["../../src/tui/builtinToolRender.ts"],"sourcesContent":["import {\n type EditToolDetails,\n type EditToolInput,\n type FindToolInput,\n type GrepToolInput,\n getLanguageFromPath,\n highlightCode,\n type LsToolInput,\n type ReadToolInput,\n type Theme,\n type WriteToolInput,\n} from '@earendil-works/pi-coding-agent';\nimport { type Component, wrapTextWithAnsi } from '@earendil-works/pi-tui';\nimport { gutterWidth, renderLineNumber } from './codeGutter.ts';\nimport { renderDoomDiff } from './diffRender.ts';\nimport { DoomToolCall, renderToolHeading } from './toolChrome.ts';\n\nconst COLLAPSED_FILE_LINES = 10;\n\ntype Highlighter = (code: string, language?: string) => string[];\ntype LanguageResolver = (path: string) => string | undefined;\n\nexport interface ToolPreviewOptions {\n expanded?: boolean;\n isError?: boolean;\n}\n\nexport interface WritePreviewOptions extends ToolPreviewOptions {\n argsStreaming?: boolean;\n}\n\nexport interface TextToolResult {\n content?: ReadonlyArray<{ type: string; text?: string }>;\n}\n\nexport interface EditToolResult extends TextToolResult {\n details?: EditToolDetails;\n}\n\n/** Self-owned result shell shared by Pi's native file and search tools. */\nclass BuiltinToolContent implements Component {\n constructor(private readonly text: string) {}\n\n render(width: number): string[] {\n if (width <= 0 || this.text.length === 0) return [];\n return wrapTextWithAnsi(this.text, width);\n }\n\n invalidate(): void {\n // Content is immutable and reflows from the current width on every render.\n }\n}\n\nclass BuiltinToolResultFrame implements Component {\n constructor(\n private content: Component,\n private readonly theme: Theme,\n ) {}\n\n setContent(content: Component): void {\n this.content = content;\n }\n\n getContent(): Component {\n return this.content;\n }\n\n render(width: number): string[] {\n if (width <= 0) return [];\n if (width < 3) return this.content.render(width);\n\n const contentWidth = width - 2;\n const lines = this.content.render(contentWidth).map((line) => ` ${line}`);\n if (lines.length === 0) return [];\n\n const divider = this.theme.fg('borderMuted', '─'.repeat(contentWidth));\n return [` ${divider}`, ...lines, ''];\n }\n\n invalidate(): void {\n this.content.invalidate();\n }\n}\n\n/** Recover the native renderer's component from the shell returned on its previous pass. */\nexport function previousBuiltinResult(component: Component | undefined): Component | undefined {\n return component instanceof BuiltinToolResultFrame ? component.getContent() : undefined;\n}\n\n/** Reuse the shell while allowing Pi's native renderer to reuse its own inner component. */\nexport function frameBuiltinResult(content: Component, theme: Theme, previous: Component | undefined): Component {\n if (previous instanceof BuiltinToolResultFrame) {\n previous.setContent(content);\n return previous;\n }\n return new BuiltinToolResultFrame(content, theme);\n}\n\nfunction renderCall(label: string, primary: string, details: readonly string[], theme: Theme): Component {\n let text = renderToolHeading(label, primary, theme);\n if (details.length > 0) text += ` ${theme.fg('muted', `· ${details.join(' · ')}`)}`;\n return new DoomToolCall(text);\n}\n\nfunction optionalCount(value: number | undefined, unit: string): string | undefined {\n return value === undefined ? undefined : `${value} ${unit}`;\n}\n\nfunction compactDetails(values: ReadonlyArray<string | undefined>): string[] {\n return values.filter((value): value is string => value !== undefined && value.length > 0);\n}\n\nexport function renderReadCall(args: ReadToolInput, theme: Theme): Component {\n return renderCall(\n 'read',\n args.path,\n compactDetails([args.offset === undefined ? undefined : `from ${args.offset}`, optionalCount(args.limit, 'lines')]),\n theme,\n );\n}\n\nexport function renderEditCall(args: EditToolInput, theme: Theme): Component {\n const count = args.edits.length;\n return renderCall('edit', args.path, [`${count} edit${count === 1 ? '' : 's'}`], theme);\n}\n\n/**\n * Read appends a bracketed pagination note after a blank line. Detach it so the\n * gutter numbers file content only, and mutate the caller's line list to match.\n */\nfunction takeTrailingNote(lines: string[]): string | undefined {\n const last = lines.at(-1);\n if (last === undefined || !last.startsWith('[') || !last.endsWith(']')) return undefined;\n\n lines.pop();\n while (lines.at(-1) === '') lines.pop();\n return last;\n}\n\nfunction textContent(result: TextToolResult): string {\n return (result.content ?? [])\n .filter((block) => block.type === 'text')\n .map((block) => block.text ?? '')\n .join('\\n')\n .replaceAll('\\t', ' ')\n .replaceAll('\\r\\n', '\\n');\n}\n\nexport function renderEditResult(\n args: EditToolInput,\n result: EditToolResult,\n options: ToolPreviewOptions,\n theme: Theme,\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n if (options.isError) return new BuiltinToolContent(theme.fg('error', textContent(result)));\n\n const diff = result.details?.diff;\n // A successful edit whose details never arrived has nothing worth a frame.\n if (diff === undefined || diff.length === 0) return new BuiltinToolContent('');\n return renderDoomDiff(diff, theme, resolveLanguage(args.path), highlight);\n}\n\nexport function renderWriteCall(\n args: WriteToolInput,\n theme: Theme,\n options: WritePreviewOptions = {},\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n const heading = renderToolHeading('write', args.path, theme);\n const details = theme.fg('muted', `· ${args.content.length.toLocaleString('en-US')} chars`);\n if (args.content.length === 0) return new DoomToolCall(`${heading} ${details}`);\n\n const normalizedLines = args.content.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (normalizedLines.at(-1) === '') normalizedLines.pop();\n const showLiveTail = options.argsStreaming === true && options.expanded !== true;\n const visibleLines = options.expanded\n ? normalizedLines\n : showLiveTail\n ? normalizedLines.slice(-COLLAPSED_FILE_LINES)\n : normalizedLines.slice(0, COLLAPSED_FILE_LINES);\n const language = resolveLanguage(args.path);\n const highlighted = language\n ? highlight(visibleLines.join('\\n'), language)\n : visibleLines.map((line) => theme.fg('toolOutput', line));\n const hiddenLineCount = normalizedLines.length - visibleLines.length;\n // A live tail shows the file's end, so numbering starts where the tail does.\n const firstVisibleLineNumber = showLiveTail ? hiddenLineCount + 1 : 1;\n const numberWidth = gutterWidth(firstVisibleLineNumber + visibleLines.length - 1);\n const preview = highlighted.map(\n (line, index) => `${renderLineNumber(firstVisibleLineNumber + index, numberWidth, theme)} ${line}`,\n );\n const previewLines = showLiveTail\n ? [\n ...(hiddenLineCount > 0 ? [theme.fg('muted', `… ${hiddenLineCount} earlier lines · live tail`)] : []),\n ...preview,\n ]\n : [\n ...preview,\n ...(hiddenLineCount > 0 ? [theme.fg('muted', `… ${hiddenLineCount} more lines · ctrl+o expand`)] : []),\n ];\n return new DoomToolCall([`${heading} ${details}`, '', ...previewLines].join('\\n'));\n}\n\nexport function renderReadResult(\n args: ReadToolInput,\n result: TextToolResult,\n options: ToolPreviewOptions,\n theme: Theme,\n highlight: Highlighter = highlightCode,\n resolveLanguage: LanguageResolver = getLanguageFromPath,\n): Component {\n const normalizedLines = textContent(result).split('\\n');\n while (normalizedLines.at(-1) === '') normalizedLines.pop();\n if (options.isError) {\n return new BuiltinToolContent(normalizedLines.map((line) => theme.fg('error', line)).join('\\n'));\n }\n\n const note = takeTrailingNote(normalizedLines);\n const visibleLines = options.expanded ? normalizedLines : normalizedLines.slice(0, COLLAPSED_FILE_LINES);\n const language = resolveLanguage(args.path);\n const highlighted = language\n ? highlight(visibleLines.join('\\n'), language)\n : visibleLines.map((line) => theme.fg('toolOutput', line));\n // Read starts at `offset`, so the gutter has to agree with the file, not the excerpt.\n const firstLineNumber = args.offset ?? 1;\n const numberWidth = gutterWidth(firstLineNumber + visibleLines.length - 1);\n const preview = highlighted.map(\n (line, index) => `${renderLineNumber(firstLineNumber + index, numberWidth, theme)} ${line}`,\n );\n const remaining = normalizedLines.length - visibleLines.length;\n if (remaining > 0) preview.push(theme.fg('muted', `… ${remaining} more lines · ctrl+o expand`));\n if (note !== undefined) preview.push(theme.fg('muted', note));\n return new BuiltinToolContent(preview.join('\\n'));\n}\n\nexport function renderGrepCall(args: GrepToolInput, theme: Theme): Component {\n return renderCall(\n 'grep',\n args.pattern,\n compactDetails([\n args.path ?? '.',\n args.glob,\n args.ignoreCase === true ? 'ignore case' : undefined,\n optionalCount(args.limit, 'matches'),\n ]),\n theme,\n );\n}\n\nexport function renderFindCall(args: FindToolInput, theme: Theme): Component {\n return renderCall(\n 'find',\n args.pattern,\n compactDetails([args.path ?? '.', optionalCount(args.limit, 'results')]),\n theme,\n );\n}\n\nexport function renderLsCall(args: LsToolInput, theme: Theme): Component {\n return renderCall('ls', args.path ?? '.', compactDetails([optionalCount(args.limit, 'entries')]), theme);\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import{gutterWidth as e,renderLineNumber as t}from"./codeGutter.mjs";import{renderDoomDiff as n}from"./diffRender.mjs";import{DoomToolCall as r,renderToolHeading as i}from"./toolChrome.mjs";import{wrapTextWithAnsi as a}from"@earendil-works/pi-tui";import{getLanguageFromPath as o,highlightCode as s}from"@earendil-works/pi-coding-agent";var c=class{text;constructor(e){this.text=e}render(e){return e<=0||this.text.length===0?[]:a(this.text,e)}invalidate(){}},l=class{content;theme;constructor(e,t){this.content=e,this.theme=t}setContent(e){this.content=e}getContent(){return this.content}render(e){if(e<=0)return[];if(e<3)return this.content.render(e);let t=e-2,n=this.content.render(t).map(e=>` ${e}`);return n.length===0?[]:[` ${this.theme.fg(`borderMuted`,`─`.repeat(t))}`,...n,``]}invalidate(){this.content.invalidate()}};function u(e){return e instanceof l?e.getContent():void 0}function d(e,t,n){return n instanceof l?(n.setContent(e),n):new l(e,t)}function f(e,t,n,a){let o=i(e,t,a);return n.length>0&&(o+=` ${a.fg(`muted`,`· ${n.join(` · `)}`)}`),new r(o)}function p(e,t){return e===void 0?void 0:`${e} ${t}`}function m(e){return e.filter(e=>e!==void 0&&e.length>0)}function h(e,t){return f(`read`,e.path,m([e.offset===void 0?void 0:`from ${e.offset}`,p(e.limit,`lines`)]),t)}function g(e,t){let n=e.edits.length;return f(`edit`,e.path,[`${n} edit${n===1?``:`s`}`],t)}function _(e){let t=e.at(-1);if(!(t===void 0||!t.startsWith(`[`)||!t.endsWith(`]`))){for(e.pop();e.at(-1)===``;)e.pop();return t}}function v(e){return(e.content??[]).filter(e=>e.type===`text`).map(e=>e.text??``).join(`
2
+ `).replaceAll(` `,` `).replaceAll(`\r
3
+ `,`
4
+ `)}function y(e,t,r,i,a=s,l=o){if(r.isError)return new c(i.fg(`error`,v(t)));let u=t.details?.diff;return u===void 0||u.length===0?new c(``):n(u,i,l(e.path),a)}function b(n,a,c={},l=s,u=o){let d=i(`write`,n.path,a),f=a.fg(`muted`,`· ${n.content.length.toLocaleString(`en-US`)} chars`);if(n.content.length===0)return new r(`${d} ${f}`);let p=n.content.replaceAll(` `,` `).replaceAll(`\r
5
+ `,`
6
+ `).split(`
7
+ `);for(;p.at(-1)===``;)p.pop();let m=c.argsStreaming===!0&&c.expanded!==!0,h=c.expanded?p:m?p.slice(-10):p.slice(0,10),g=u(n.path),_=g?l(h.join(`
8
+ `),g):h.map(e=>a.fg(`toolOutput`,e)),v=p.length-h.length,y=m?v+1:1,b=e(y+h.length-1),x=_.map((e,n)=>`${t(y+n,b,a)} ${e}`),S=m?[...v>0?[a.fg(`muted`,`… ${v} earlier lines · live tail`)]:[],...x]:[...x,...v>0?[a.fg(`muted`,`… ${v} more lines · ctrl+o expand`)]:[]];return new r([`${d} ${f}`,``,...S].join(`
9
+ `))}function x(n,r,i,a,l=s,u=o){let d=v(r).split(`
10
+ `);for(;d.at(-1)===``;)d.pop();if(i.isError)return new c(d.map(e=>a.fg(`error`,e)).join(`
11
+ `));let f=_(d),p=i.expanded?d:d.slice(0,10),m=u(n.path),h=m?l(p.join(`
12
+ `),m):p.map(e=>a.fg(`toolOutput`,e)),g=n.offset??1,y=e(g+p.length-1),b=h.map((e,n)=>`${t(g+n,y,a)} ${e}`),x=d.length-p.length;return x>0&&b.push(a.fg(`muted`,`… ${x} more lines · ctrl+o expand`)),f!==void 0&&b.push(a.fg(`muted`,f)),new c(b.join(`
13
+ `))}function S(e,t){return f(`grep`,e.pattern,m([e.path??`.`,e.glob,e.ignoreCase===!0?`ignore case`:void 0,p(e.limit,`matches`)]),t)}function C(e,t){return f(`find`,e.pattern,m([e.path??`.`,p(e.limit,`results`)]),t)}function w(e,t){return f(`ls`,e.path??`.`,m([p(e.limit,`entries`)]),t)}export{d as frameBuiltinResult,u as previousBuiltinResult,g as renderEditCall,y as renderEditResult,C as renderFindCall,S as renderGrepCall,w as renderLsCall,h as renderReadCall,x as renderReadResult,b as renderWriteCall};
14
+ //# sourceMappingURL=builtinToolRender.mjs.map