@agimon-ai/doompi 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 (944) hide show
  1. package/README.md +437 -452
  2. package/assets/doompi-tui.png +0 -0
  3. package/dist/adapters/bootstrapClaim.cjs +2 -0
  4. package/dist/adapters/bootstrapClaim.cjs.map +1 -0
  5. package/dist/adapters/bootstrapClaim.mjs +2 -0
  6. package/dist/adapters/bootstrapClaim.mjs.map +1 -0
  7. package/dist/adapters/bootstrapLocator.cjs +2 -0
  8. package/dist/adapters/bootstrapLocator.cjs.map +1 -0
  9. package/dist/adapters/bootstrapLocator.d.cts +6 -0
  10. package/dist/adapters/bootstrapLocator.d.cts.map +1 -0
  11. package/dist/adapters/bootstrapLocator.d.mts +6 -0
  12. package/dist/adapters/bootstrapLocator.d.mts.map +1 -0
  13. package/dist/adapters/bootstrapLocator.mjs +2 -0
  14. package/dist/adapters/bootstrapLocator.mjs.map +1 -0
  15. package/dist/adapters/compatibility/antigravity.cjs +2 -0
  16. package/dist/{services → adapters}/compatibility/antigravity.cjs.map +1 -1
  17. package/dist/adapters/compatibility/antigravity.d.cts +11 -0
  18. package/dist/{services → adapters}/compatibility/antigravity.d.cts.map +1 -1
  19. package/dist/adapters/compatibility/antigravity.d.mts +11 -0
  20. package/dist/{services → adapters}/compatibility/antigravity.d.mts.map +1 -1
  21. package/dist/adapters/compatibility/antigravity.mjs +2 -0
  22. package/dist/{services → adapters}/compatibility/antigravity.mjs.map +1 -1
  23. package/dist/adapters/compatibility/codex.cjs +2 -0
  24. package/dist/{services → adapters}/compatibility/codex.cjs.map +1 -1
  25. package/dist/adapters/compatibility/codex.d.cts +19 -0
  26. package/dist/{services → adapters}/compatibility/codex.d.cts.map +1 -1
  27. package/dist/adapters/compatibility/codex.d.mts +19 -0
  28. package/dist/{services → adapters}/compatibility/codex.d.mts.map +1 -1
  29. package/dist/adapters/compatibility/codex.mjs +2 -0
  30. package/dist/{services → adapters}/compatibility/codex.mjs.map +1 -1
  31. package/dist/adapters/compatibility/index.cjs +2 -0
  32. package/dist/adapters/compatibility/index.cjs.map +1 -0
  33. package/dist/adapters/compatibility/index.d.cts +16 -0
  34. package/dist/{services → adapters}/compatibility/index.d.cts.map +1 -1
  35. package/dist/adapters/compatibility/index.d.mts +16 -0
  36. package/dist/{services → adapters}/compatibility/index.d.mts.map +1 -1
  37. package/dist/adapters/compatibility/index.mjs +2 -0
  38. package/dist/adapters/compatibility/index.mjs.map +1 -0
  39. package/dist/adapters/compatibility/process.cjs +2 -0
  40. package/dist/{services → adapters}/compatibility/process.cjs.map +1 -1
  41. package/dist/adapters/compatibility/process.d.cts +35 -0
  42. package/dist/{services → adapters}/compatibility/process.d.cts.map +1 -1
  43. package/dist/adapters/compatibility/process.d.mts +35 -0
  44. package/dist/{services → adapters}/compatibility/process.d.mts.map +1 -1
  45. package/dist/adapters/compatibility/process.mjs +2 -0
  46. package/dist/{services → adapters}/compatibility/process.mjs.map +1 -1
  47. package/dist/adapters/compatibility/shared.cjs +2 -0
  48. package/dist/{services → adapters}/compatibility/shared.cjs.map +1 -1
  49. package/dist/adapters/compatibility/shared.d.cts +33 -0
  50. package/dist/{services → adapters}/compatibility/shared.d.cts.map +1 -1
  51. package/dist/adapters/compatibility/shared.d.mts +33 -0
  52. package/dist/{services → adapters}/compatibility/shared.d.mts.map +1 -1
  53. package/dist/adapters/compatibility/shared.mjs +2 -0
  54. package/dist/{services → adapters}/compatibility/shared.mjs.map +1 -1
  55. package/dist/adapters/compatibilityContext.cjs +2 -0
  56. package/dist/adapters/compatibilityContext.cjs.map +1 -0
  57. package/dist/adapters/compatibilityContext.d.cts +23 -0
  58. package/dist/{services → adapters}/compatibilityContext.d.cts.map +1 -1
  59. package/dist/adapters/compatibilityContext.d.mts +23 -0
  60. package/dist/{services → adapters}/compatibilityContext.d.mts.map +1 -1
  61. package/dist/adapters/compatibilityContext.mjs +2 -0
  62. package/dist/adapters/compatibilityContext.mjs.map +1 -0
  63. package/dist/adapters/composer.cjs +2 -0
  64. package/dist/adapters/composer.cjs.map +1 -0
  65. package/dist/adapters/composer.d.cts +113 -0
  66. package/dist/adapters/composer.d.cts.map +1 -0
  67. package/dist/adapters/composer.d.mts +113 -0
  68. package/dist/adapters/composer.d.mts.map +1 -0
  69. package/dist/adapters/composer.mjs +2 -0
  70. package/dist/adapters/composer.mjs.map +1 -0
  71. package/dist/adapters/compositionState.cjs +2 -0
  72. package/dist/adapters/compositionState.cjs.map +1 -0
  73. package/dist/adapters/compositionState.d.cts +12 -0
  74. package/dist/adapters/compositionState.d.cts.map +1 -0
  75. package/dist/adapters/compositionState.d.mts +12 -0
  76. package/dist/adapters/compositionState.d.mts.map +1 -0
  77. package/dist/adapters/compositionState.mjs +2 -0
  78. package/dist/adapters/compositionState.mjs.map +1 -0
  79. package/dist/adapters/config/harnessState.cjs +2 -0
  80. package/dist/adapters/config/harnessState.cjs.map +1 -0
  81. package/dist/adapters/config/harnessState.d.cts +26 -0
  82. package/dist/adapters/config/harnessState.d.cts.map +1 -0
  83. package/dist/adapters/config/harnessState.d.mts +26 -0
  84. package/dist/adapters/config/harnessState.d.mts.map +1 -0
  85. package/dist/adapters/config/harnessState.mjs +2 -0
  86. package/dist/adapters/config/harnessState.mjs.map +1 -0
  87. package/dist/adapters/deferredSkills.cjs +12 -0
  88. package/dist/adapters/deferredSkills.cjs.map +1 -0
  89. package/dist/adapters/deferredSkills.mjs +12 -0
  90. package/dist/adapters/deferredSkills.mjs.map +1 -0
  91. package/dist/adapters/doomPackage.cjs +2 -0
  92. package/dist/adapters/doomPackage.cjs.map +1 -0
  93. package/dist/adapters/doomPackage.mjs +2 -0
  94. package/dist/adapters/doomPackage.mjs.map +1 -0
  95. package/dist/adapters/dpiRunner.cjs +3 -0
  96. package/dist/adapters/dpiRunner.cjs.map +1 -0
  97. package/dist/adapters/dpiRunner.mjs +3 -0
  98. package/dist/adapters/dpiRunner.mjs.map +1 -0
  99. package/dist/adapters/dpiSettings.cjs +2 -0
  100. package/dist/adapters/dpiSettings.cjs.map +1 -0
  101. package/dist/adapters/dpiSettings.mjs +2 -0
  102. package/dist/adapters/dpiSettings.mjs.map +1 -0
  103. package/dist/adapters/extensionCompiler.cjs +3 -0
  104. package/dist/adapters/extensionCompiler.cjs.map +1 -0
  105. package/dist/adapters/extensionCompiler.mjs +3 -0
  106. package/dist/adapters/extensionCompiler.mjs.map +1 -0
  107. package/dist/adapters/harnessContext.cjs +2 -0
  108. package/dist/adapters/harnessContext.cjs.map +1 -0
  109. package/dist/adapters/harnessContext.d.cts +61 -0
  110. package/dist/{services → adapters}/harnessContext.d.cts.map +1 -1
  111. package/dist/adapters/harnessContext.d.mts +61 -0
  112. package/dist/{services → adapters}/harnessContext.d.mts.map +1 -1
  113. package/dist/adapters/harnessContext.mjs +2 -0
  114. package/dist/adapters/harnessContext.mjs.map +1 -0
  115. package/dist/adapters/helpSkills.cjs +2 -0
  116. package/dist/adapters/helpSkills.cjs.map +1 -0
  117. package/dist/adapters/helpSkills.mjs +2 -0
  118. package/dist/adapters/helpSkills.mjs.map +1 -0
  119. package/dist/adapters/layerPackageInstaller.cjs +2 -0
  120. package/dist/adapters/layerPackageInstaller.cjs.map +1 -0
  121. package/dist/adapters/layerPackageInstaller.mjs +2 -0
  122. package/dist/adapters/layerPackageInstaller.mjs.map +1 -0
  123. package/dist/adapters/matrixSwitcher.cjs +2 -0
  124. package/dist/adapters/matrixSwitcher.cjs.map +1 -0
  125. package/dist/adapters/matrixSwitcher.d.cts +46 -0
  126. package/dist/{services → adapters}/matrixSwitcher.d.cts.map +1 -1
  127. package/dist/adapters/matrixSwitcher.d.mts +46 -0
  128. package/dist/{services → adapters}/matrixSwitcher.d.mts.map +1 -1
  129. package/dist/adapters/matrixSwitcher.mjs +2 -0
  130. package/dist/adapters/matrixSwitcher.mjs.map +1 -0
  131. package/dist/adapters/mcpFilter.cjs +3 -0
  132. package/dist/adapters/mcpFilter.cjs.map +1 -0
  133. package/dist/adapters/mcpFilter.d.cts +40 -0
  134. package/dist/adapters/mcpFilter.d.cts.map +1 -0
  135. package/dist/adapters/mcpFilter.d.mts +40 -0
  136. package/dist/adapters/mcpFilter.d.mts.map +1 -0
  137. package/dist/adapters/mcpFilter.mjs +3 -0
  138. package/dist/adapters/mcpFilter.mjs.map +1 -0
  139. package/dist/adapters/modules/moduleResolution.cjs +2 -0
  140. package/dist/adapters/modules/moduleResolution.cjs.map +1 -0
  141. package/dist/adapters/modules/moduleResolution.d.cts +69 -0
  142. package/dist/adapters/modules/moduleResolution.d.cts.map +1 -0
  143. package/dist/adapters/modules/moduleResolution.d.mts +69 -0
  144. package/dist/adapters/modules/moduleResolution.d.mts.map +1 -0
  145. package/dist/adapters/modules/moduleResolution.mjs +2 -0
  146. package/dist/adapters/modules/moduleResolution.mjs.map +1 -0
  147. package/dist/adapters/packageBootstrap.cjs +2 -0
  148. package/dist/adapters/packageBootstrap.cjs.map +1 -0
  149. package/dist/adapters/packageBootstrap.d.cts +8 -0
  150. package/dist/adapters/packageBootstrap.d.cts.map +1 -0
  151. package/dist/adapters/packageBootstrap.d.mts +8 -0
  152. package/dist/adapters/packageBootstrap.d.mts.map +1 -0
  153. package/dist/adapters/packageBootstrap.mjs +2 -0
  154. package/dist/adapters/packageBootstrap.mjs.map +1 -0
  155. package/dist/adapters/piExtensionAlias.cjs +2 -0
  156. package/dist/adapters/piExtensionAlias.cjs.map +1 -0
  157. package/dist/adapters/piExtensionAlias.mjs +2 -0
  158. package/dist/adapters/piExtensionAlias.mjs.map +1 -0
  159. package/dist/adapters/piSettings.cjs +2 -0
  160. package/dist/adapters/piSettings.cjs.map +1 -0
  161. package/dist/adapters/piSettings.d.cts +25 -0
  162. package/dist/adapters/piSettings.d.cts.map +1 -0
  163. package/dist/adapters/piSettings.d.mts +25 -0
  164. package/dist/adapters/piSettings.d.mts.map +1 -0
  165. package/dist/adapters/piSettings.mjs +2 -0
  166. package/dist/adapters/piSettings.mjs.map +1 -0
  167. package/dist/adapters/pluginMaterializer.cjs +2 -0
  168. package/dist/adapters/pluginMaterializer.cjs.map +1 -0
  169. package/dist/adapters/pluginMaterializer.mjs +2 -0
  170. package/dist/adapters/pluginMaterializer.mjs.map +1 -0
  171. package/dist/adapters/projectPiSettings.cjs +2 -0
  172. package/dist/adapters/projectPiSettings.cjs.map +1 -0
  173. package/dist/adapters/projectPiSettings.d.cts +29 -0
  174. package/dist/adapters/projectPiSettings.d.cts.map +1 -0
  175. package/dist/adapters/projectPiSettings.d.mts +29 -0
  176. package/dist/adapters/projectPiSettings.d.mts.map +1 -0
  177. package/dist/adapters/projectPiSettings.mjs +2 -0
  178. package/dist/adapters/projectPiSettings.mjs.map +1 -0
  179. package/dist/adapters/repository/repository.cjs +2 -0
  180. package/dist/adapters/repository/repository.cjs.map +1 -0
  181. package/dist/adapters/repository/repository.d.cts +21 -0
  182. package/dist/adapters/repository/repository.d.cts.map +1 -0
  183. package/dist/adapters/repository/repository.d.mts +21 -0
  184. package/dist/adapters/repository/repository.d.mts.map +1 -0
  185. package/dist/adapters/repository/repository.mjs +2 -0
  186. package/dist/adapters/repository/repository.mjs.map +1 -0
  187. package/dist/adapters/resourceCollector.cjs +3 -0
  188. package/dist/adapters/resourceCollector.cjs.map +1 -0
  189. package/dist/adapters/resourceCollector.d.cts +25 -0
  190. package/dist/adapters/resourceCollector.d.cts.map +1 -0
  191. package/dist/adapters/resourceCollector.d.mts +25 -0
  192. package/dist/adapters/resourceCollector.d.mts.map +1 -0
  193. package/dist/adapters/resourceCollector.mjs +3 -0
  194. package/dist/adapters/resourceCollector.mjs.map +1 -0
  195. package/dist/adapters/runtimeBundle.cjs +2 -0
  196. package/dist/adapters/runtimeBundle.cjs.map +1 -0
  197. package/dist/{services → adapters}/runtimeBundle.d.cts +4 -2
  198. package/dist/adapters/runtimeBundle.d.cts.map +1 -0
  199. package/dist/{services → adapters}/runtimeBundle.d.mts +4 -2
  200. package/dist/adapters/runtimeBundle.d.mts.map +1 -0
  201. package/dist/adapters/runtimeBundle.mjs +2 -0
  202. package/dist/adapters/runtimeBundle.mjs.map +1 -0
  203. package/dist/adapters/serialization/json.cjs +2 -0
  204. package/dist/adapters/serialization/json.cjs.map +1 -0
  205. package/dist/adapters/serialization/json.d.cts +23 -0
  206. package/dist/adapters/serialization/json.d.cts.map +1 -0
  207. package/dist/adapters/serialization/json.d.mts +23 -0
  208. package/dist/adapters/serialization/json.d.mts.map +1 -0
  209. package/dist/adapters/serialization/json.mjs +2 -0
  210. package/dist/adapters/serialization/json.mjs.map +1 -0
  211. package/dist/adapters/sharedBuildCache.cjs +2 -0
  212. package/dist/adapters/sharedBuildCache.cjs.map +1 -0
  213. package/dist/adapters/sharedBuildCache.mjs +2 -0
  214. package/dist/adapters/sharedBuildCache.mjs.map +1 -0
  215. package/dist/adapters/skillCatalog.cjs +2 -0
  216. package/dist/adapters/skillCatalog.cjs.map +1 -0
  217. package/dist/adapters/skillCatalog.d.cts +61 -0
  218. package/dist/adapters/skillCatalog.d.cts.map +1 -0
  219. package/dist/adapters/skillCatalog.d.mts +61 -0
  220. package/dist/adapters/skillCatalog.d.mts.map +1 -0
  221. package/dist/adapters/skillCatalog.mjs +2 -0
  222. package/dist/adapters/skillCatalog.mjs.map +1 -0
  223. package/dist/adapters/skillSources.cjs +2 -0
  224. package/dist/{services → adapters}/skillSources.cjs.map +1 -1
  225. package/dist/adapters/skillSources.d.cts +24 -0
  226. package/dist/{services → adapters}/skillSources.d.cts.map +1 -1
  227. package/dist/adapters/skillSources.d.mts +24 -0
  228. package/dist/{services → adapters}/skillSources.d.mts.map +1 -1
  229. package/dist/adapters/skillSources.mjs +2 -0
  230. package/dist/{services → adapters}/skillSources.mjs.map +1 -1
  231. package/dist/adapters/startupPrecompiler.cjs +2 -0
  232. package/dist/adapters/startupPrecompiler.cjs.map +1 -0
  233. package/dist/adapters/startupPrecompiler.d.cts +13 -0
  234. package/dist/adapters/startupPrecompiler.d.cts.map +1 -0
  235. package/dist/adapters/startupPrecompiler.d.mts +13 -0
  236. package/dist/adapters/startupPrecompiler.d.mts.map +1 -0
  237. package/dist/adapters/startupPrecompiler.mjs +2 -0
  238. package/dist/adapters/startupPrecompiler.mjs.map +1 -0
  239. package/dist/adapters/syncLocation.cjs +2 -0
  240. package/dist/adapters/syncLocation.cjs.map +1 -0
  241. package/dist/adapters/syncLocation.d.cts +19 -0
  242. package/dist/adapters/syncLocation.d.cts.map +1 -0
  243. package/dist/adapters/syncLocation.d.mts +19 -0
  244. package/dist/adapters/syncLocation.d.mts.map +1 -0
  245. package/dist/adapters/syncLocation.mjs +2 -0
  246. package/dist/adapters/syncLocation.mjs.map +1 -0
  247. package/dist/adapters/syncState.cjs +2 -0
  248. package/dist/adapters/syncState.cjs.map +1 -0
  249. package/dist/adapters/syncState.d.cts +153 -0
  250. package/dist/adapters/syncState.d.cts.map +1 -0
  251. package/dist/adapters/syncState.d.mts +153 -0
  252. package/dist/adapters/syncState.d.mts.map +1 -0
  253. package/dist/adapters/syncState.mjs +2 -0
  254. package/dist/adapters/syncState.mjs.map +1 -0
  255. package/dist/adapters/syncStateContract.cjs +2 -0
  256. package/dist/adapters/syncStateContract.cjs.map +1 -0
  257. package/dist/adapters/syncStateContract.d.cts +13 -0
  258. package/dist/adapters/syncStateContract.d.cts.map +1 -0
  259. package/dist/adapters/syncStateContract.d.mts +13 -0
  260. package/dist/adapters/syncStateContract.d.mts.map +1 -0
  261. package/dist/adapters/syncStateContract.mjs +2 -0
  262. package/dist/adapters/syncStateContract.mjs.map +1 -0
  263. package/dist/adapters/syncedRuntimeBuilder.cjs +2 -0
  264. package/dist/adapters/syncedRuntimeBuilder.cjs.map +1 -0
  265. package/dist/adapters/syncedRuntimeBuilder.d.cts +11 -0
  266. package/dist/adapters/syncedRuntimeBuilder.d.cts.map +1 -0
  267. package/dist/adapters/syncedRuntimeBuilder.d.mts +11 -0
  268. package/dist/adapters/syncedRuntimeBuilder.d.mts.map +1 -0
  269. package/dist/adapters/syncedRuntimeBuilder.mjs +2 -0
  270. package/dist/adapters/syncedRuntimeBuilder.mjs.map +1 -0
  271. package/dist/adapters/telemetry/logSinkTelemetry.cjs +2 -0
  272. package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +1 -0
  273. package/dist/adapters/telemetry/logSinkTelemetry.d.cts +51 -0
  274. package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
  275. package/dist/adapters/telemetry/logSinkTelemetry.d.mts +51 -0
  276. package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -0
  277. package/dist/adapters/telemetry/logSinkTelemetry.mjs +2 -0
  278. package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +1 -0
  279. package/dist/bin/cli.cjs +1 -1
  280. package/dist/bin/cli.cjs.map +1 -1
  281. package/dist/bin/cli.mjs +1 -1
  282. package/dist/bin/cli.mjs.map +1 -1
  283. package/dist/bin/dpi.cjs +3 -0
  284. package/dist/bin/dpi.cjs.map +1 -0
  285. package/dist/bin/dpi.d.cts +1 -0
  286. package/dist/bin/dpi.d.mts +1 -0
  287. package/dist/bin/dpi.mjs +3 -0
  288. package/dist/bin/dpi.mjs.map +1 -0
  289. package/dist/cli/cliApp.cjs +1 -2
  290. package/dist/cli/cliApp.d.cts +2 -45
  291. package/dist/cli/cliApp.d.mts +2 -45
  292. package/dist/cli/cliApp.mjs +1 -2
  293. package/dist/cli/compatibilityOptions.cjs +1 -2
  294. package/dist/cli/compatibilityOptions.d.cts +2 -15
  295. package/dist/cli/compatibilityOptions.d.mts +2 -15
  296. package/dist/cli/compatibilityOptions.mjs +1 -2
  297. package/dist/cli/help.cjs +1 -63
  298. package/dist/cli/help.d.cts +2 -6
  299. package/dist/cli/help.d.mts +2 -6
  300. package/dist/cli/help.mjs +1 -63
  301. package/dist/cli/index.cjs +1 -1
  302. package/dist/cli/index.d.cts +4 -4
  303. package/dist/cli/index.d.mts +4 -4
  304. package/dist/cli/index.mjs +1 -1
  305. package/dist/cli/matrixOptions.cjs +1 -2
  306. package/dist/cli/matrixOptions.d.cts +2 -99
  307. package/dist/cli/matrixOptions.d.mts +2 -99
  308. package/dist/cli/matrixOptions.mjs +1 -2
  309. package/dist/cli/options.cjs +1 -2
  310. package/dist/cli/options.d.cts +2 -7
  311. package/dist/cli/options.d.mts +2 -7
  312. package/dist/cli/options.mjs +1 -2
  313. package/dist/commands/baseCommand.cjs.map +1 -1
  314. package/dist/commands/baseCommand.d.cts +3 -3
  315. package/dist/commands/baseCommand.d.mts +3 -3
  316. package/dist/commands/baseCommand.mjs.map +1 -1
  317. package/dist/commands/buildCommand.cjs +2 -2
  318. package/dist/commands/buildCommand.cjs.map +1 -1
  319. package/dist/commands/buildCommand.mjs +2 -2
  320. package/dist/commands/buildCommand.mjs.map +1 -1
  321. package/dist/commands/cli/cliApp.cjs +2 -0
  322. package/dist/commands/cli/cliApp.cjs.map +1 -0
  323. package/dist/commands/cli/cliApp.d.cts +45 -0
  324. package/dist/commands/cli/cliApp.d.cts.map +1 -0
  325. package/dist/commands/cli/cliApp.d.mts +45 -0
  326. package/dist/commands/cli/cliApp.d.mts.map +1 -0
  327. package/dist/commands/cli/cliApp.mjs +2 -0
  328. package/dist/commands/cli/cliApp.mjs.map +1 -0
  329. package/dist/commands/cli/compatibilityOptions.cjs +2 -0
  330. package/dist/commands/cli/compatibilityOptions.cjs.map +1 -0
  331. package/dist/commands/cli/compatibilityOptions.d.cts +15 -0
  332. package/dist/commands/cli/compatibilityOptions.d.cts.map +1 -0
  333. package/dist/commands/cli/compatibilityOptions.d.mts +15 -0
  334. package/dist/commands/cli/compatibilityOptions.d.mts.map +1 -0
  335. package/dist/commands/cli/compatibilityOptions.mjs +2 -0
  336. package/dist/commands/cli/compatibilityOptions.mjs.map +1 -0
  337. package/dist/commands/cli/help.cjs +68 -0
  338. package/dist/{cli → commands/cli}/help.cjs.map +1 -1
  339. package/dist/commands/cli/help.d.cts +6 -0
  340. package/dist/commands/cli/help.d.cts.map +1 -0
  341. package/dist/commands/cli/help.d.mts +6 -0
  342. package/dist/commands/cli/help.d.mts.map +1 -0
  343. package/dist/commands/cli/help.mjs +68 -0
  344. package/dist/{cli → commands/cli}/help.mjs.map +1 -1
  345. package/dist/commands/cli/index.cjs +1 -0
  346. package/dist/commands/cli/index.d.cts +4 -0
  347. package/dist/commands/cli/index.d.mts +4 -0
  348. package/dist/commands/cli/index.mjs +1 -0
  349. package/dist/commands/cli/matrixOptions.cjs +2 -0
  350. package/dist/commands/cli/matrixOptions.cjs.map +1 -0
  351. package/dist/commands/cli/matrixOptions.d.cts +99 -0
  352. package/dist/commands/cli/matrixOptions.d.cts.map +1 -0
  353. package/dist/commands/cli/matrixOptions.d.mts +99 -0
  354. package/dist/commands/cli/matrixOptions.d.mts.map +1 -0
  355. package/dist/commands/cli/matrixOptions.mjs +2 -0
  356. package/dist/commands/cli/matrixOptions.mjs.map +1 -0
  357. package/dist/commands/cli/options.cjs +2 -0
  358. package/dist/commands/cli/options.cjs.map +1 -0
  359. package/dist/commands/cli/options.d.cts +7 -0
  360. package/dist/commands/cli/options.d.cts.map +1 -0
  361. package/dist/commands/cli/options.d.mts +7 -0
  362. package/dist/commands/cli/options.d.mts.map +1 -0
  363. package/dist/commands/cli/options.mjs +2 -0
  364. package/dist/commands/cli/options.mjs.map +1 -0
  365. package/dist/commands/compatibilityCommand.cjs +1 -1
  366. package/dist/commands/compatibilityCommand.cjs.map +1 -1
  367. package/dist/commands/compatibilityCommand.d.cts +1 -1
  368. package/dist/commands/compatibilityCommand.d.cts.map +1 -1
  369. package/dist/commands/compatibilityCommand.d.mts +1 -1
  370. package/dist/commands/compatibilityCommand.d.mts.map +1 -1
  371. package/dist/commands/compatibilityCommand.mjs +1 -1
  372. package/dist/commands/compatibilityCommand.mjs.map +1 -1
  373. package/dist/commands/emitMcpCommand.cjs +1 -1
  374. package/dist/commands/emitMcpCommand.cjs.map +1 -1
  375. package/dist/commands/emitMcpCommand.d.cts +2 -2
  376. package/dist/commands/emitMcpCommand.d.mts +2 -2
  377. package/dist/commands/emitMcpCommand.mjs +1 -1
  378. package/dist/commands/emitMcpCommand.mjs.map +1 -1
  379. package/dist/commands/explainCommand.cjs +2 -2
  380. package/dist/commands/explainCommand.cjs.map +1 -1
  381. package/dist/commands/explainCommand.d.cts +2 -2
  382. package/dist/commands/explainCommand.d.mts +2 -2
  383. package/dist/commands/explainCommand.mjs +2 -2
  384. package/dist/commands/explainCommand.mjs.map +1 -1
  385. package/dist/commands/index.cjs +1 -1
  386. package/dist/commands/index.d.cts +2 -3
  387. package/dist/commands/index.d.mts +2 -3
  388. package/dist/commands/index.mjs +1 -1
  389. package/dist/commands/initCommand.cjs +1 -2
  390. package/dist/commands/initCommand.cjs.map +1 -1
  391. package/dist/commands/initCommand.d.cts +4 -3
  392. package/dist/commands/initCommand.d.cts.map +1 -1
  393. package/dist/commands/initCommand.d.mts +4 -3
  394. package/dist/commands/initCommand.d.mts.map +1 -1
  395. package/dist/commands/initCommand.mjs +1 -2
  396. package/dist/commands/initCommand.mjs.map +1 -1
  397. package/dist/commands/initPresenter.cjs +3 -0
  398. package/dist/commands/initPresenter.cjs.map +1 -0
  399. package/dist/commands/initPresenter.d.cts +8 -0
  400. package/dist/commands/initPresenter.d.cts.map +1 -0
  401. package/dist/commands/initPresenter.d.mts +8 -0
  402. package/dist/commands/initPresenter.d.mts.map +1 -0
  403. package/dist/commands/initPresenter.mjs +3 -0
  404. package/dist/commands/initPresenter.mjs.map +1 -0
  405. package/dist/commands/launchCommand.cjs +1 -1
  406. package/dist/commands/launchCommand.cjs.map +1 -1
  407. package/dist/commands/launchCommand.d.cts +6 -4
  408. package/dist/commands/launchCommand.d.cts.map +1 -1
  409. package/dist/commands/launchCommand.d.mts +6 -4
  410. package/dist/commands/launchCommand.d.mts.map +1 -1
  411. package/dist/commands/launchCommand.mjs +1 -1
  412. package/dist/commands/launchCommand.mjs.map +1 -1
  413. package/dist/commands/syncCommand.cjs +5 -5
  414. package/dist/commands/syncCommand.cjs.map +1 -1
  415. package/dist/commands/syncCommand.d.cts +19 -7
  416. package/dist/commands/syncCommand.d.cts.map +1 -1
  417. package/dist/commands/syncCommand.d.mts +19 -7
  418. package/dist/commands/syncCommand.d.mts.map +1 -1
  419. package/dist/commands/syncCommand.mjs +5 -5
  420. package/dist/commands/syncCommand.mjs.map +1 -1
  421. package/dist/commands/syncPipeline.cjs +2 -0
  422. package/dist/commands/syncPipeline.cjs.map +1 -0
  423. package/dist/commands/syncPipeline.mjs +2 -0
  424. package/dist/commands/syncPipeline.mjs.map +1 -0
  425. package/dist/config/harnessState.cjs +1 -2
  426. package/dist/config/harnessState.d.cts +2 -24
  427. package/dist/config/harnessState.d.mts +2 -24
  428. package/dist/config/harnessState.mjs +1 -2
  429. package/dist/config/index.cjs +1 -1
  430. package/dist/config/index.d.cts +4 -7
  431. package/dist/config/index.d.mts +4 -7
  432. package/dist/config/index.mjs +1 -1
  433. package/dist/config/projectTrust.cjs +1 -2
  434. package/dist/config/projectTrust.d.cts +2 -14
  435. package/dist/config/projectTrust.d.mts +2 -14
  436. package/dist/config/projectTrust.mjs +1 -2
  437. package/dist/entries/autoStop.cjs +1 -2
  438. package/dist/entries/autoStop.d.cts +2 -6
  439. package/dist/entries/autoStop.d.mts +2 -7
  440. package/dist/entries/autoStop.mjs +1 -2
  441. package/dist/entries/components/matrixPicker.cjs +1 -2
  442. package/dist/entries/components/matrixPicker.d.cts +2 -55
  443. package/dist/entries/components/matrixPicker.d.mts +2 -55
  444. package/dist/entries/components/matrixPicker.mjs +1 -2
  445. package/dist/entries/components/skillsOverlay.cjs +1 -4
  446. package/dist/entries/components/skillsOverlay.d.cts +2 -58
  447. package/dist/entries/components/skillsOverlay.d.mts +2 -58
  448. package/dist/entries/components/skillsOverlay.mjs +1 -4
  449. package/dist/entries/domains.cjs +1 -2
  450. package/dist/entries/domains.d.cts +2 -10
  451. package/dist/entries/domains.d.mts +2 -10
  452. package/dist/entries/domains.mjs +1 -2
  453. package/dist/entries/doom.cjs +1 -2
  454. package/dist/entries/doom.d.cts +2 -13
  455. package/dist/entries/doom.d.mts +2 -14
  456. package/dist/entries/doom.mjs +1 -2
  457. package/dist/entries/effort.cjs +1 -2
  458. package/dist/entries/effort.d.cts +2 -10
  459. package/dist/entries/effort.d.mts +2 -10
  460. package/dist/entries/effort.mjs +1 -2
  461. package/dist/entries/majorMode.cjs +1 -6
  462. package/dist/entries/majorMode.d.cts +2 -29
  463. package/dist/entries/majorMode.d.mts +2 -29
  464. package/dist/entries/majorMode.mjs +1 -6
  465. package/dist/entries/modeCatalog.cjs +1 -0
  466. package/dist/entries/modeCatalog.d.cts +2 -0
  467. package/dist/entries/modeCatalog.d.mts +2 -0
  468. package/dist/entries/modeCatalog.mjs +1 -0
  469. package/dist/entries/notifications.cjs +1 -2
  470. package/dist/entries/notifications.d.cts +2 -13
  471. package/dist/entries/notifications.d.mts +2 -13
  472. package/dist/entries/notifications.mjs +1 -2
  473. package/dist/entries/ollamaProvider.cjs +1 -2
  474. package/dist/entries/ollamaProvider.d.cts +2 -6
  475. package/dist/entries/ollamaProvider.d.mts +2 -7
  476. package/dist/entries/ollamaProvider.mjs +1 -2
  477. package/dist/entries/persona.cjs +1 -2
  478. package/dist/entries/persona.d.cts +2 -14
  479. package/dist/entries/persona.d.mts +2 -15
  480. package/dist/entries/persona.mjs +1 -2
  481. package/dist/entries/profile.cjs +1 -3
  482. package/dist/entries/profile.d.cts +2 -16
  483. package/dist/entries/profile.d.mts +2 -16
  484. package/dist/entries/profile.mjs +1 -3
  485. package/dist/entries/repositoryHooks.cjs +1 -9
  486. package/dist/entries/repositoryHooks.d.cts +2 -7
  487. package/dist/entries/repositoryHooks.d.mts +2 -8
  488. package/dist/entries/repositoryHooks.mjs +1 -9
  489. package/dist/entries/skills.cjs +1 -2
  490. package/dist/entries/skills.d.cts +2 -34
  491. package/dist/entries/skills.d.mts +2 -34
  492. package/dist/entries/skills.mjs +1 -2
  493. package/dist/entries/styleSystem.cjs +1 -4
  494. package/dist/entries/styleSystem.d.cts +2 -32
  495. package/dist/entries/styleSystem.d.mts +2 -32
  496. package/dist/entries/styleSystem.mjs +1 -4
  497. package/dist/extensions/entries/autoStop.cjs +2 -0
  498. package/dist/extensions/entries/autoStop.cjs.map +1 -0
  499. package/dist/extensions/entries/autoStop.d.cts +7 -0
  500. package/dist/extensions/entries/autoStop.d.cts.map +1 -0
  501. package/dist/extensions/entries/autoStop.d.mts +7 -0
  502. package/dist/extensions/entries/autoStop.d.mts.map +1 -0
  503. package/dist/extensions/entries/autoStop.mjs +2 -0
  504. package/dist/extensions/entries/autoStop.mjs.map +1 -0
  505. package/dist/extensions/entries/cacheOptimizer.mjs +2 -0
  506. package/dist/extensions/entries/cacheOptimizer.mjs.map +1 -0
  507. package/dist/extensions/entries/components/matrixPicker.cjs +2 -0
  508. package/dist/extensions/entries/components/matrixPicker.cjs.map +1 -0
  509. package/dist/extensions/entries/components/matrixPicker.d.cts +55 -0
  510. package/dist/extensions/entries/components/matrixPicker.d.cts.map +1 -0
  511. package/dist/extensions/entries/components/matrixPicker.d.mts +55 -0
  512. package/dist/extensions/entries/components/matrixPicker.d.mts.map +1 -0
  513. package/dist/extensions/entries/components/matrixPicker.mjs +2 -0
  514. package/dist/extensions/entries/components/matrixPicker.mjs.map +1 -0
  515. package/dist/extensions/entries/components/skillsOverlay.cjs +4 -0
  516. package/dist/extensions/entries/components/skillsOverlay.cjs.map +1 -0
  517. package/dist/extensions/entries/components/skillsOverlay.d.cts +58 -0
  518. package/dist/extensions/entries/components/skillsOverlay.d.cts.map +1 -0
  519. package/dist/extensions/entries/components/skillsOverlay.d.mts +58 -0
  520. package/dist/extensions/entries/components/skillsOverlay.d.mts.map +1 -0
  521. package/dist/extensions/entries/components/skillsOverlay.mjs +4 -0
  522. package/dist/extensions/entries/components/skillsOverlay.mjs.map +1 -0
  523. package/dist/extensions/entries/domains.cjs +2 -0
  524. package/dist/extensions/entries/domains.cjs.map +1 -0
  525. package/dist/extensions/entries/domains.d.cts +18 -0
  526. package/dist/extensions/entries/domains.d.cts.map +1 -0
  527. package/dist/extensions/entries/domains.d.mts +18 -0
  528. package/dist/extensions/entries/domains.d.mts.map +1 -0
  529. package/dist/extensions/entries/domains.mjs +2 -0
  530. package/dist/extensions/entries/domains.mjs.map +1 -0
  531. package/dist/extensions/entries/doom.cjs +2 -0
  532. package/dist/extensions/entries/doom.cjs.map +1 -0
  533. package/dist/extensions/entries/doom.d.cts +14 -0
  534. package/dist/extensions/entries/doom.d.cts.map +1 -0
  535. package/dist/extensions/entries/doom.d.mts +14 -0
  536. package/dist/extensions/entries/doom.d.mts.map +1 -0
  537. package/dist/extensions/entries/doom.mjs +2 -0
  538. package/dist/extensions/entries/doom.mjs.map +1 -0
  539. package/dist/extensions/entries/effort.cjs +2 -0
  540. package/dist/extensions/entries/effort.cjs.map +1 -0
  541. package/dist/extensions/entries/effort.d.cts +10 -0
  542. package/dist/extensions/entries/effort.d.cts.map +1 -0
  543. package/dist/extensions/entries/effort.d.mts +10 -0
  544. package/dist/extensions/entries/effort.d.mts.map +1 -0
  545. package/dist/extensions/entries/effort.mjs +2 -0
  546. package/dist/extensions/entries/effort.mjs.map +1 -0
  547. package/dist/extensions/entries/majorMode.cjs +6 -0
  548. package/dist/extensions/entries/majorMode.cjs.map +1 -0
  549. package/dist/extensions/entries/majorMode.d.cts +27 -0
  550. package/dist/extensions/entries/majorMode.d.cts.map +1 -0
  551. package/dist/extensions/entries/majorMode.d.mts +27 -0
  552. package/dist/extensions/entries/majorMode.d.mts.map +1 -0
  553. package/dist/extensions/entries/majorMode.mjs +6 -0
  554. package/dist/extensions/entries/majorMode.mjs.map +1 -0
  555. package/dist/extensions/entries/modeCatalog.cjs +2 -0
  556. package/dist/extensions/entries/modeCatalog.cjs.map +1 -0
  557. package/dist/extensions/entries/modeCatalog.d.cts +7 -0
  558. package/dist/extensions/entries/modeCatalog.d.cts.map +1 -0
  559. package/dist/extensions/entries/modeCatalog.d.mts +7 -0
  560. package/dist/extensions/entries/modeCatalog.d.mts.map +1 -0
  561. package/dist/extensions/entries/modeCatalog.mjs +2 -0
  562. package/dist/extensions/entries/modeCatalog.mjs.map +1 -0
  563. package/dist/extensions/entries/notifications.cjs +2 -0
  564. package/dist/extensions/entries/notifications.cjs.map +1 -0
  565. package/dist/extensions/entries/notifications.d.cts +14 -0
  566. package/dist/extensions/entries/notifications.d.cts.map +1 -0
  567. package/dist/extensions/entries/notifications.d.mts +14 -0
  568. package/dist/extensions/entries/notifications.d.mts.map +1 -0
  569. package/dist/extensions/entries/notifications.mjs +2 -0
  570. package/dist/extensions/entries/notifications.mjs.map +1 -0
  571. package/dist/extensions/entries/ollamaProvider.cjs +2 -0
  572. package/dist/extensions/entries/ollamaProvider.cjs.map +1 -0
  573. package/dist/extensions/entries/ollamaProvider.d.cts +7 -0
  574. package/dist/extensions/entries/ollamaProvider.d.cts.map +1 -0
  575. package/dist/extensions/entries/ollamaProvider.d.mts +7 -0
  576. package/dist/extensions/entries/ollamaProvider.d.mts.map +1 -0
  577. package/dist/extensions/entries/ollamaProvider.mjs +2 -0
  578. package/dist/extensions/entries/ollamaProvider.mjs.map +1 -0
  579. package/dist/extensions/entries/persona.cjs +2 -0
  580. package/dist/extensions/entries/persona.cjs.map +1 -0
  581. package/dist/extensions/entries/persona.d.cts +15 -0
  582. package/dist/extensions/entries/persona.d.cts.map +1 -0
  583. package/dist/extensions/entries/persona.d.mts +15 -0
  584. package/dist/extensions/entries/persona.d.mts.map +1 -0
  585. package/dist/extensions/entries/persona.mjs +2 -0
  586. package/dist/extensions/entries/persona.mjs.map +1 -0
  587. package/dist/extensions/entries/profile.cjs +3 -0
  588. package/dist/extensions/entries/profile.cjs.map +1 -0
  589. package/dist/extensions/entries/profile.d.cts +18 -0
  590. package/dist/extensions/entries/profile.d.cts.map +1 -0
  591. package/dist/extensions/entries/profile.d.mts +18 -0
  592. package/dist/extensions/entries/profile.d.mts.map +1 -0
  593. package/dist/extensions/entries/profile.mjs +3 -0
  594. package/dist/extensions/entries/profile.mjs.map +1 -0
  595. package/dist/extensions/entries/repositoryHooks.cjs +9 -0
  596. package/dist/extensions/entries/repositoryHooks.cjs.map +1 -0
  597. package/dist/extensions/entries/repositoryHooks.d.cts +8 -0
  598. package/dist/extensions/entries/repositoryHooks.d.cts.map +1 -0
  599. package/dist/extensions/entries/repositoryHooks.d.mts +8 -0
  600. package/dist/extensions/entries/repositoryHooks.d.mts.map +1 -0
  601. package/dist/extensions/entries/repositoryHooks.mjs +9 -0
  602. package/dist/extensions/entries/repositoryHooks.mjs.map +1 -0
  603. package/dist/extensions/entries/shellTitleController.cjs +27 -0
  604. package/dist/extensions/entries/shellTitleController.cjs.map +1 -0
  605. package/dist/extensions/entries/shellTitleController.d.cts +11 -0
  606. package/dist/extensions/entries/shellTitleController.d.cts.map +1 -0
  607. package/dist/extensions/entries/shellTitleController.d.mts +11 -0
  608. package/dist/extensions/entries/shellTitleController.d.mts.map +1 -0
  609. package/dist/extensions/entries/shellTitleController.mjs +27 -0
  610. package/dist/extensions/entries/shellTitleController.mjs.map +1 -0
  611. package/dist/extensions/entries/skills.cjs +4 -0
  612. package/dist/extensions/entries/skills.cjs.map +1 -0
  613. package/dist/extensions/entries/skills.d.cts +34 -0
  614. package/dist/extensions/entries/skills.d.cts.map +1 -0
  615. package/dist/extensions/entries/skills.d.mts +34 -0
  616. package/dist/extensions/entries/skills.d.mts.map +1 -0
  617. package/dist/extensions/entries/skills.mjs +4 -0
  618. package/dist/extensions/entries/skills.mjs.map +1 -0
  619. package/dist/extensions/entries/styleSystem.cjs +4 -0
  620. package/dist/extensions/entries/styleSystem.cjs.map +1 -0
  621. package/dist/extensions/entries/styleSystem.d.cts +32 -0
  622. package/dist/extensions/entries/styleSystem.d.cts.map +1 -0
  623. package/dist/extensions/entries/styleSystem.d.mts +32 -0
  624. package/dist/extensions/entries/styleSystem.d.mts.map +1 -0
  625. package/dist/extensions/entries/styleSystem.mjs +4 -0
  626. package/dist/{entries/styleSystem.cjs.map → extensions/entries/styleSystem.mjs.map} +1 -1
  627. package/dist/extensions/pi.cjs +1 -0
  628. package/dist/extensions/pi.d.cts +2 -0
  629. package/dist/extensions/pi.d.mts +2 -0
  630. package/dist/extensions/pi.mjs +1 -0
  631. package/dist/extensions/services/domainSwitchHandoff.cjs +2 -0
  632. package/dist/extensions/services/domainSwitchHandoff.cjs.map +1 -0
  633. package/dist/extensions/services/domainSwitchHandoff.mjs +2 -0
  634. package/dist/extensions/services/domainSwitchHandoff.mjs.map +1 -0
  635. package/dist/index.cjs +1 -1
  636. package/dist/index.d.cts +33 -29
  637. package/dist/index.d.mts +33 -29
  638. package/dist/index.mjs +1 -1
  639. package/dist/logSinkTelemetry.cjs +1 -2
  640. package/dist/logSinkTelemetry.d.cts +2 -51
  641. package/dist/logSinkTelemetry.d.mts +2 -51
  642. package/dist/logSinkTelemetry.mjs +1 -2
  643. package/dist/pi-cache-optimizer-D9beVnnH.mjs +50 -0
  644. package/dist/pi-cache-optimizer-D9beVnnH.mjs.map +1 -0
  645. package/dist/schemas/domainVoiceTools.cjs +2 -0
  646. package/dist/schemas/domainVoiceTools.cjs.map +1 -0
  647. package/dist/schemas/domainVoiceTools.mjs +2 -0
  648. package/dist/schemas/domainVoiceTools.mjs.map +1 -0
  649. package/dist/schemas/majorModeVoiceTools.cjs +2 -0
  650. package/dist/schemas/majorModeVoiceTools.cjs.map +1 -0
  651. package/dist/schemas/majorModeVoiceTools.mjs +2 -0
  652. package/dist/schemas/majorModeVoiceTools.mjs.map +1 -0
  653. package/dist/services/compatibility/antigravity.cjs +1 -2
  654. package/dist/services/compatibility/antigravity.d.cts +2 -11
  655. package/dist/services/compatibility/antigravity.d.mts +2 -11
  656. package/dist/services/compatibility/antigravity.mjs +1 -2
  657. package/dist/services/compatibility/codex.cjs +1 -2
  658. package/dist/services/compatibility/codex.d.cts +2 -19
  659. package/dist/services/compatibility/codex.d.mts +2 -19
  660. package/dist/services/compatibility/codex.mjs +1 -2
  661. package/dist/services/compatibility/index.cjs +1 -2
  662. package/dist/services/compatibility/index.d.cts +6 -16
  663. package/dist/services/compatibility/index.d.mts +6 -16
  664. package/dist/services/compatibility/index.mjs +1 -2
  665. package/dist/services/compatibility/process.cjs +1 -2
  666. package/dist/services/compatibility/process.d.cts +2 -35
  667. package/dist/services/compatibility/process.d.mts +2 -35
  668. package/dist/services/compatibility/process.mjs +1 -2
  669. package/dist/services/compatibility/shared.cjs +1 -2
  670. package/dist/services/compatibility/shared.d.cts +2 -33
  671. package/dist/services/compatibility/shared.d.mts +2 -33
  672. package/dist/services/compatibility/shared.mjs +1 -2
  673. package/dist/services/compatibilityContext.cjs +1 -2
  674. package/dist/services/compatibilityContext.d.cts +2 -23
  675. package/dist/services/compatibilityContext.d.mts +2 -23
  676. package/dist/services/compatibilityContext.mjs +1 -2
  677. package/dist/services/composer.cjs +1 -2
  678. package/dist/services/composer.d.cts +4 -135
  679. package/dist/services/composer.d.mts +4 -135
  680. package/dist/services/composer.mjs +1 -2
  681. package/dist/services/config/index.cjs +1 -0
  682. package/dist/services/config/index.d.cts +7 -0
  683. package/dist/services/config/index.d.mts +7 -0
  684. package/dist/services/config/index.mjs +1 -0
  685. package/dist/services/config/projectTrust.cjs +2 -0
  686. package/dist/services/config/projectTrust.cjs.map +1 -0
  687. package/dist/services/config/projectTrust.d.cts +14 -0
  688. package/dist/services/config/projectTrust.d.cts.map +1 -0
  689. package/dist/services/config/projectTrust.d.mts +14 -0
  690. package/dist/services/config/projectTrust.d.mts.map +1 -0
  691. package/dist/services/config/projectTrust.mjs +2 -0
  692. package/dist/services/config/projectTrust.mjs.map +1 -0
  693. package/dist/services/extensionAssembler.cjs +1 -1
  694. package/dist/services/extensionAssembler.cjs.map +1 -1
  695. package/dist/services/extensionAssembler.d.cts +13 -6
  696. package/dist/services/extensionAssembler.d.cts.map +1 -1
  697. package/dist/services/extensionAssembler.d.mts +13 -6
  698. package/dist/services/extensionAssembler.d.mts.map +1 -1
  699. package/dist/services/extensionAssembler.mjs +1 -1
  700. package/dist/services/extensionAssembler.mjs.map +1 -1
  701. package/dist/services/harnessContext.cjs +1 -2
  702. package/dist/services/harnessContext.d.cts +2 -61
  703. package/dist/services/harnessContext.d.mts +2 -61
  704. package/dist/services/harnessContext.mjs +1 -2
  705. package/dist/services/index.cjs +1 -1
  706. package/dist/services/index.d.cts +18 -14
  707. package/dist/services/index.d.mts +18 -14
  708. package/dist/services/index.mjs +1 -1
  709. package/dist/services/matrixSwitcher.cjs +1 -2
  710. package/dist/services/matrixSwitcher.d.cts +2 -46
  711. package/dist/services/matrixSwitcher.d.mts +2 -46
  712. package/dist/services/matrixSwitcher.mjs +1 -2
  713. package/dist/services/mcpFilter.cjs +1 -3
  714. package/dist/services/mcpFilter.d.cts +2 -40
  715. package/dist/services/mcpFilter.d.mts +2 -40
  716. package/dist/services/mcpFilter.mjs +1 -3
  717. package/dist/services/modeCatalog.cjs +2 -0
  718. package/dist/services/modeCatalog.cjs.map +1 -0
  719. package/dist/services/modeCatalog.d.cts +18 -0
  720. package/dist/services/modeCatalog.d.cts.map +1 -0
  721. package/dist/services/modeCatalog.d.mts +18 -0
  722. package/dist/services/modeCatalog.d.mts.map +1 -0
  723. package/dist/services/modeCatalog.mjs +2 -0
  724. package/dist/services/modeCatalog.mjs.map +1 -0
  725. package/dist/services/piSettings.cjs +1 -2
  726. package/dist/services/piSettings.d.cts +2 -24
  727. package/dist/services/piSettings.d.mts +2 -24
  728. package/dist/services/piSettings.mjs +1 -2
  729. package/dist/services/resourceCollector.cjs +1 -3
  730. package/dist/services/resourceCollector.d.cts +2 -23
  731. package/dist/services/resourceCollector.d.mts +2 -23
  732. package/dist/services/resourceCollector.mjs +1 -3
  733. package/dist/services/skillCatalog.cjs +1 -2
  734. package/dist/services/skillCatalog.d.cts +2 -56
  735. package/dist/services/skillCatalog.d.mts +2 -56
  736. package/dist/services/skillCatalog.mjs +1 -2
  737. package/dist/services/skillSources.cjs +1 -2
  738. package/dist/services/skillSources.d.cts +2 -24
  739. package/dist/services/skillSources.d.mts +2 -24
  740. package/dist/services/skillSources.mjs +1 -2
  741. package/dist/services/syncState.cjs +1 -2
  742. package/dist/services/syncState.d.cts +3 -133
  743. package/dist/services/syncState.d.mts +3 -133
  744. package/dist/services/syncState.mjs +1 -2
  745. package/dist/services/tools/toolNames.cjs +2 -0
  746. package/dist/services/tools/toolNames.cjs.map +1 -0
  747. package/dist/services/tools/toolNames.d.cts +25 -0
  748. package/dist/services/tools/toolNames.d.cts.map +1 -0
  749. package/dist/services/tools/toolNames.d.mts +25 -0
  750. package/dist/services/tools/toolNames.d.mts.map +1 -0
  751. package/dist/services/tools/toolNames.mjs +2 -0
  752. package/dist/services/tools/toolNames.mjs.map +1 -0
  753. package/dist/{interfaces → types/interfaces}/compatibility.d.cts +1 -1
  754. package/dist/types/interfaces/compatibility.d.cts.map +1 -0
  755. package/dist/{interfaces → types/interfaces}/compatibility.d.mts +1 -1
  756. package/dist/types/interfaces/compatibility.d.mts.map +1 -0
  757. package/dist/{interfaces → types/interfaces}/harness.d.cts +6 -2
  758. package/dist/types/interfaces/harness.d.cts.map +1 -0
  759. package/dist/{interfaces → types/interfaces}/harness.d.mts +6 -2
  760. package/dist/types/interfaces/harness.d.mts.map +1 -0
  761. package/dist/utils/index.cjs +1 -1
  762. package/dist/utils/index.d.cts +5 -5
  763. package/dist/utils/index.d.mts +5 -5
  764. package/dist/utils/index.mjs +1 -1
  765. package/dist/utils/json.cjs +1 -2
  766. package/dist/utils/json.d.cts +2 -23
  767. package/dist/utils/json.d.mts +2 -23
  768. package/dist/utils/json.mjs +1 -2
  769. package/dist/utils/moduleResolution.cjs +1 -2
  770. package/dist/utils/moduleResolution.d.cts +2 -56
  771. package/dist/utils/moduleResolution.d.mts +2 -56
  772. package/dist/utils/moduleResolution.mjs +1 -2
  773. package/dist/utils/repository.cjs +1 -2
  774. package/dist/utils/repository.d.cts +2 -21
  775. package/dist/utils/repository.d.mts +2 -21
  776. package/dist/utils/repository.mjs +1 -2
  777. package/dist/utils/toolNames.cjs +1 -2
  778. package/dist/utils/toolNames.d.cts +2 -25
  779. package/dist/utils/toolNames.d.mts +2 -25
  780. package/dist/utils/toolNames.mjs +1 -2
  781. package/package.json +59 -37
  782. package/dist/cli/cliApp.cjs.map +0 -1
  783. package/dist/cli/cliApp.d.cts.map +0 -1
  784. package/dist/cli/cliApp.d.mts.map +0 -1
  785. package/dist/cli/cliApp.mjs.map +0 -1
  786. package/dist/cli/compatibilityOptions.cjs.map +0 -1
  787. package/dist/cli/compatibilityOptions.d.cts.map +0 -1
  788. package/dist/cli/compatibilityOptions.d.mts.map +0 -1
  789. package/dist/cli/compatibilityOptions.mjs.map +0 -1
  790. package/dist/cli/help.d.cts.map +0 -1
  791. package/dist/cli/help.d.mts.map +0 -1
  792. package/dist/cli/matrixOptions.cjs.map +0 -1
  793. package/dist/cli/matrixOptions.d.cts.map +0 -1
  794. package/dist/cli/matrixOptions.d.mts.map +0 -1
  795. package/dist/cli/matrixOptions.mjs.map +0 -1
  796. package/dist/cli/options.cjs.map +0 -1
  797. package/dist/cli/options.d.cts.map +0 -1
  798. package/dist/cli/options.d.mts.map +0 -1
  799. package/dist/cli/options.mjs.map +0 -1
  800. package/dist/commands/buildCommand.d.cts +0 -23
  801. package/dist/commands/buildCommand.d.cts.map +0 -1
  802. package/dist/commands/buildCommand.d.mts +0 -23
  803. package/dist/commands/buildCommand.d.mts.map +0 -1
  804. package/dist/config/harnessState.cjs.map +0 -1
  805. package/dist/config/harnessState.d.cts.map +0 -1
  806. package/dist/config/harnessState.d.mts.map +0 -1
  807. package/dist/config/harnessState.mjs.map +0 -1
  808. package/dist/config/projectTrust.cjs.map +0 -1
  809. package/dist/config/projectTrust.d.cts.map +0 -1
  810. package/dist/config/projectTrust.d.mts.map +0 -1
  811. package/dist/config/projectTrust.mjs.map +0 -1
  812. package/dist/entries/addDirCompatibility.cjs +0 -2
  813. package/dist/entries/addDirCompatibility.cjs.map +0 -1
  814. package/dist/entries/addDirCompatibility.d.cts +0 -13
  815. package/dist/entries/addDirCompatibility.d.cts.map +0 -1
  816. package/dist/entries/addDirCompatibility.d.mts +0 -14
  817. package/dist/entries/addDirCompatibility.d.mts.map +0 -1
  818. package/dist/entries/addDirCompatibility.mjs +0 -2
  819. package/dist/entries/addDirCompatibility.mjs.map +0 -1
  820. package/dist/entries/autoStop.cjs.map +0 -1
  821. package/dist/entries/autoStop.d.cts.map +0 -1
  822. package/dist/entries/autoStop.d.mts.map +0 -1
  823. package/dist/entries/autoStop.mjs.map +0 -1
  824. package/dist/entries/components/matrixPicker.cjs.map +0 -1
  825. package/dist/entries/components/matrixPicker.d.cts.map +0 -1
  826. package/dist/entries/components/matrixPicker.d.mts.map +0 -1
  827. package/dist/entries/components/matrixPicker.mjs.map +0 -1
  828. package/dist/entries/components/skillsOverlay.cjs.map +0 -1
  829. package/dist/entries/components/skillsOverlay.d.cts.map +0 -1
  830. package/dist/entries/components/skillsOverlay.d.mts.map +0 -1
  831. package/dist/entries/components/skillsOverlay.mjs.map +0 -1
  832. package/dist/entries/domains.cjs.map +0 -1
  833. package/dist/entries/domains.d.cts.map +0 -1
  834. package/dist/entries/domains.d.mts.map +0 -1
  835. package/dist/entries/domains.mjs.map +0 -1
  836. package/dist/entries/doom.cjs.map +0 -1
  837. package/dist/entries/doom.d.cts.map +0 -1
  838. package/dist/entries/doom.d.mts.map +0 -1
  839. package/dist/entries/doom.mjs.map +0 -1
  840. package/dist/entries/effort.cjs.map +0 -1
  841. package/dist/entries/effort.d.cts.map +0 -1
  842. package/dist/entries/effort.d.mts.map +0 -1
  843. package/dist/entries/effort.mjs.map +0 -1
  844. package/dist/entries/majorMode.cjs.map +0 -1
  845. package/dist/entries/majorMode.d.cts.map +0 -1
  846. package/dist/entries/majorMode.d.mts.map +0 -1
  847. package/dist/entries/majorMode.mjs.map +0 -1
  848. package/dist/entries/notifications.cjs.map +0 -1
  849. package/dist/entries/notifications.d.cts.map +0 -1
  850. package/dist/entries/notifications.d.mts.map +0 -1
  851. package/dist/entries/notifications.mjs.map +0 -1
  852. package/dist/entries/ollamaProvider.cjs.map +0 -1
  853. package/dist/entries/ollamaProvider.d.cts.map +0 -1
  854. package/dist/entries/ollamaProvider.d.mts.map +0 -1
  855. package/dist/entries/ollamaProvider.mjs.map +0 -1
  856. package/dist/entries/persona.cjs.map +0 -1
  857. package/dist/entries/persona.d.cts.map +0 -1
  858. package/dist/entries/persona.d.mts.map +0 -1
  859. package/dist/entries/persona.mjs.map +0 -1
  860. package/dist/entries/profile.cjs.map +0 -1
  861. package/dist/entries/profile.d.cts.map +0 -1
  862. package/dist/entries/profile.d.mts.map +0 -1
  863. package/dist/entries/profile.mjs.map +0 -1
  864. package/dist/entries/repositoryHooks.cjs.map +0 -1
  865. package/dist/entries/repositoryHooks.d.cts.map +0 -1
  866. package/dist/entries/repositoryHooks.d.mts.map +0 -1
  867. package/dist/entries/repositoryHooks.mjs.map +0 -1
  868. package/dist/entries/skills.cjs.map +0 -1
  869. package/dist/entries/skills.d.cts.map +0 -1
  870. package/dist/entries/skills.d.mts.map +0 -1
  871. package/dist/entries/skills.mjs.map +0 -1
  872. package/dist/entries/styleSystem.d.cts.map +0 -1
  873. package/dist/entries/styleSystem.d.mts.map +0 -1
  874. package/dist/entries/styleSystem.mjs.map +0 -1
  875. package/dist/interfaces/compatibility.d.cts.map +0 -1
  876. package/dist/interfaces/compatibility.d.mts.map +0 -1
  877. package/dist/interfaces/harness.d.cts.map +0 -1
  878. package/dist/interfaces/harness.d.mts.map +0 -1
  879. package/dist/logSinkTelemetry.cjs.map +0 -1
  880. package/dist/logSinkTelemetry.d.cts.map +0 -1
  881. package/dist/logSinkTelemetry.d.mts.map +0 -1
  882. package/dist/logSinkTelemetry.mjs.map +0 -1
  883. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs +0 -2
  884. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs.map +0 -1
  885. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs +0 -2
  886. package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs.map +0 -1
  887. package/dist/services/compatibility/index.cjs.map +0 -1
  888. package/dist/services/compatibility/index.mjs.map +0 -1
  889. package/dist/services/compatibilityContext.cjs.map +0 -1
  890. package/dist/services/compatibilityContext.mjs.map +0 -1
  891. package/dist/services/composer.cjs.map +0 -1
  892. package/dist/services/composer.d.cts.map +0 -1
  893. package/dist/services/composer.d.mts.map +0 -1
  894. package/dist/services/composer.mjs.map +0 -1
  895. package/dist/services/extensionCompiler.cjs +0 -3
  896. package/dist/services/extensionCompiler.cjs.map +0 -1
  897. package/dist/services/extensionCompiler.mjs +0 -3
  898. package/dist/services/extensionCompiler.mjs.map +0 -1
  899. package/dist/services/harnessContext.cjs.map +0 -1
  900. package/dist/services/harnessContext.mjs.map +0 -1
  901. package/dist/services/matrixSwitcher.cjs.map +0 -1
  902. package/dist/services/matrixSwitcher.mjs.map +0 -1
  903. package/dist/services/mcpFilter.cjs.map +0 -1
  904. package/dist/services/mcpFilter.d.cts.map +0 -1
  905. package/dist/services/mcpFilter.d.mts.map +0 -1
  906. package/dist/services/mcpFilter.mjs.map +0 -1
  907. package/dist/services/piSettings.cjs.map +0 -1
  908. package/dist/services/piSettings.d.cts.map +0 -1
  909. package/dist/services/piSettings.d.mts.map +0 -1
  910. package/dist/services/piSettings.mjs.map +0 -1
  911. package/dist/services/resourceCollector.cjs.map +0 -1
  912. package/dist/services/resourceCollector.d.cts.map +0 -1
  913. package/dist/services/resourceCollector.d.mts.map +0 -1
  914. package/dist/services/resourceCollector.mjs.map +0 -1
  915. package/dist/services/runtimeBundle.cjs +0 -2
  916. package/dist/services/runtimeBundle.cjs.map +0 -1
  917. package/dist/services/runtimeBundle.d.cts.map +0 -1
  918. package/dist/services/runtimeBundle.d.mts.map +0 -1
  919. package/dist/services/runtimeBundle.mjs +0 -2
  920. package/dist/services/runtimeBundle.mjs.map +0 -1
  921. package/dist/services/skillCatalog.cjs.map +0 -1
  922. package/dist/services/skillCatalog.d.cts.map +0 -1
  923. package/dist/services/skillCatalog.d.mts.map +0 -1
  924. package/dist/services/skillCatalog.mjs.map +0 -1
  925. package/dist/services/syncState.cjs.map +0 -1
  926. package/dist/services/syncState.d.cts.map +0 -1
  927. package/dist/services/syncState.d.mts.map +0 -1
  928. package/dist/services/syncState.mjs.map +0 -1
  929. package/dist/utils/json.cjs.map +0 -1
  930. package/dist/utils/json.d.cts.map +0 -1
  931. package/dist/utils/json.d.mts.map +0 -1
  932. package/dist/utils/json.mjs.map +0 -1
  933. package/dist/utils/moduleResolution.cjs.map +0 -1
  934. package/dist/utils/moduleResolution.d.cts.map +0 -1
  935. package/dist/utils/moduleResolution.d.mts.map +0 -1
  936. package/dist/utils/moduleResolution.mjs.map +0 -1
  937. package/dist/utils/repository.cjs.map +0 -1
  938. package/dist/utils/repository.d.cts.map +0 -1
  939. package/dist/utils/repository.d.mts.map +0 -1
  940. package/dist/utils/repository.mjs.map +0 -1
  941. package/dist/utils/toolNames.cjs.map +0 -1
  942. package/dist/utils/toolNames.d.cts.map +0 -1
  943. package/dist/utils/toolNames.d.mts.map +0 -1
  944. package/dist/utils/toolNames.mjs.map +0 -1
@@ -1,13 +0,0 @@
1
- import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
-
3
- //#region src/entries/addDirCompatibility.d.ts
4
- /**
5
- * Compatibility boundary for pi-add-dir@1.3.1.
6
- *
7
- * Its tool queues the built-in `/reload` through sendUserMessage(), but Pi treats
8
- * extension-origin input as model input. Keep that message out of the model and
9
- * offer an extension command, whose command context can reload safely instead.
10
- */
11
- declare function addDirCompatibility(pi: ExtensionAPI): void;
12
- export = addDirCompatibility;
13
- //# sourceMappingURL=addDirCompatibility.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"addDirCompatibility.d.cts","names":[],"sources":["../../src/entries/addDirCompatibility.ts"],"mappings":";;;;;AAAqF;;;;;iBAgE7D,mBAAA,CAAoB,EAAA,EAAI,YAAA;AAAA"}
@@ -1,14 +0,0 @@
1
- import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
-
3
- //#region src/entries/addDirCompatibility.d.ts
4
- /**
5
- * Compatibility boundary for pi-add-dir@1.3.1.
6
- *
7
- * Its tool queues the built-in `/reload` through sendUserMessage(), but Pi treats
8
- * extension-origin input as model input. Keep that message out of the model and
9
- * offer an extension command, whose command context can reload safely instead.
10
- */
11
- declare function addDirCompatibility(pi: ExtensionAPI): void;
12
- //#endregion
13
- export { addDirCompatibility as default };
14
- //# sourceMappingURL=addDirCompatibility.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"addDirCompatibility.d.mts","names":[],"sources":["../../src/entries/addDirCompatibility.ts"],"mappings":";;;;;AAAqF;;;;;iBAgE7D,mBAAA,CAAoB,EAAA,EAAI,YAAA"}
@@ -1,2 +0,0 @@
1
- const e=`doompi-add-dir-reload`,t=`Reload skills added by add_directory (Doom Pi compatibility bridge)`,n=`add_directory`,r=`/reload`;function i(e){if(e.toolName!==n||e.isError||!e.details||typeof e.details!=`object`||Array.isArray(e.details))return!1;let t=e.details.skillCount;return typeof t==`number`&&t>0}function a(e){let n=e.getCommands().find(e=>e.source===`extension`&&e.description===t);return n?`/${n.name}`:r}function o(t){let n=t.getCommands().map(e=>e.name),r=e=>n.some(t=>t===e||t.startsWith(`${e}:`));if(!r(e))return e;let i=2;for(;r(`${e}-${i}`);)i+=1;return`${e}-${i}`}function s(e){return e===r?`After this turn, submit ${e} to register the discovered skills as /skill:name commands.`:`Submit ${e} to register the discovered skills as /skill:name commands; it waits for the current turn to finish.`}function c(e,t){let n=e.map(e=>e.type===`text`?{...e,text:e.text.replaceAll(`Triggering reload to register skills as /skill:name commands...`,``).trimEnd()}:e);for(let e=n.length-1;e>=0;--e){let r=n[e];if(!(!r||r.type!==`text`))return n[e]={...r,text:`${r.text}\n\n${t}`},n}return[...n,{type:`text`,text:t}]}function l(e){let l=new Set,u=!1,d,f=!1,p=()=>{if(u)return;let n=o(e);e.registerCommand(n,{description:t,handler:async(e,t)=>{await t.waitForIdle(),d&&clearTimeout(d),await t.reload()}}),u=!0},m=()=>{d&&clearTimeout(d),d=setTimeout(()=>{d=void 0},1e3),d.unref()};e.on(`tool_call`,e=>{e.toolName===n&&(p(),l.add(e.toolCallId))}),e.on(`tool_result`,t=>{if(t.toolName!==n||(l.delete(t.toolCallId),!i(t)))return;m();let r=a(e);return{content:c(t.content,s(r))}}),e.on(`input`,(t,n)=>{let i=l.size>0||d!==void 0;if(!(t.source!==`extension`||t.text!==r||!i)){if(!f&&n.hasUI){let t=a(e);n.ui.getEditorText().trim()||n.ui.setEditorText(t),n.ui.notify(`pi-add-dir added skills. Submit ${t} to reload when the current turn is idle.`,`info`),f=!0}return{action:`handled`}}})}export{l as default};
2
- //# sourceMappingURL=addDirCompatibility.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"addDirCompatibility.mjs","names":[],"sources":["../../src/entries/addDirCompatibility.ts"],"sourcesContent":["import type { ExtensionAPI, ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nconst ADD_DIR_RELOAD_COMMAND = 'doompi-add-dir-reload';\nconst ADD_DIR_RELOAD_DESCRIPTION = 'Reload skills added by add_directory (Doom Pi compatibility bridge)';\n\nconst ADD_DIRECTORY_TOOL = 'add_directory';\nconst BUILTIN_RELOAD_COMMAND = '/reload';\nconst PI_ADD_DIR_RELOAD_NOTICE = 'Triggering reload to register skills as /skill:name commands...';\nconst RELOAD_INPUT_WINDOW_MS = 1_000;\n\nfunction addedSkills(event: ToolResultEvent): boolean {\n if (event.toolName !== ADD_DIRECTORY_TOOL || event.isError) return false;\n if (!event.details || typeof event.details !== 'object' || Array.isArray(event.details)) return false;\n const skillCount = (event.details as Record<string, unknown>).skillCount;\n return typeof skillCount === 'number' && skillCount > 0;\n}\n\nfunction reloadInvocation(pi: ExtensionAPI): string {\n const command = pi\n .getCommands()\n .find((candidate) => candidate.source === 'extension' && candidate.description === ADD_DIR_RELOAD_DESCRIPTION);\n return command ? `/${command.name}` : BUILTIN_RELOAD_COMMAND;\n}\n\nfunction availableReloadCommand(pi: ExtensionAPI): string {\n const names = pi.getCommands().map((command) => command.name);\n const isTaken = (name: string): boolean =>\n names.some((candidate) => candidate === name || candidate.startsWith(`${name}:`));\n if (!isTaken(ADD_DIR_RELOAD_COMMAND)) return ADD_DIR_RELOAD_COMMAND;\n\n let suffix = 2;\n while (isTaken(`${ADD_DIR_RELOAD_COMMAND}-${suffix}`)) suffix += 1;\n return `${ADD_DIR_RELOAD_COMMAND}-${suffix}`;\n}\n\nfunction reloadInstruction(invocation: string): string {\n if (invocation === BUILTIN_RELOAD_COMMAND) {\n return `After this turn, submit ${invocation} to register the discovered skills as /skill:name commands.`;\n }\n return `Submit ${invocation} to register the discovered skills as /skill:name commands; it waits for the current turn to finish.`;\n}\n\nfunction rewriteResultContent(content: ToolResultEvent['content'], instruction: string): ToolResultEvent['content'] {\n const rewritten = content.map((part) =>\n part.type === 'text' ? { ...part, text: part.text.replaceAll(PI_ADD_DIR_RELOAD_NOTICE, '').trimEnd() } : part,\n );\n\n for (let index = rewritten.length - 1; index >= 0; index -= 1) {\n const part = rewritten[index];\n if (!part || part.type !== 'text') continue;\n rewritten[index] = { ...part, text: `${part.text}\\n\\n${instruction}` };\n return rewritten;\n }\n\n return [...rewritten, { type: 'text', text: instruction }];\n}\n\n/**\n * Compatibility boundary for pi-add-dir@1.3.1.\n *\n * Its tool queues the built-in `/reload` through sendUserMessage(), but Pi treats\n * extension-origin input as model input. Keep that message out of the model and\n * offer an extension command, whose command context can reload safely instead.\n */\nexport default function addDirCompatibility(pi: ExtensionAPI): void {\n const activeCalls = new Set<string>();\n let commandRegistered = false;\n let reloadGuardExpiration: ReturnType<typeof setTimeout> | undefined;\n let reloadPromptShown = false;\n\n const ensureReloadCommand = (): void => {\n if (commandRegistered) return;\n const commandName = availableReloadCommand(pi);\n pi.registerCommand(commandName, {\n description: ADD_DIR_RELOAD_DESCRIPTION,\n handler: async (_args, ctx) => {\n await ctx.waitForIdle();\n if (reloadGuardExpiration) clearTimeout(reloadGuardExpiration);\n await ctx.reload();\n return;\n },\n });\n commandRegistered = true;\n };\n\n const armReloadGuard = (): void => {\n if (reloadGuardExpiration) clearTimeout(reloadGuardExpiration);\n reloadGuardExpiration = setTimeout(() => {\n reloadGuardExpiration = undefined;\n }, RELOAD_INPUT_WINDOW_MS);\n reloadGuardExpiration.unref();\n };\n\n pi.on('tool_call', (event) => {\n if (event.toolName !== ADD_DIRECTORY_TOOL) return;\n ensureReloadCommand();\n activeCalls.add(event.toolCallId);\n });\n\n pi.on('tool_result', (event) => {\n if (event.toolName !== ADD_DIRECTORY_TOOL) return;\n activeCalls.delete(event.toolCallId);\n if (!addedSkills(event)) return;\n\n armReloadGuard();\n const invocation = reloadInvocation(pi);\n return {\n content: rewriteResultContent(event.content, reloadInstruction(invocation)),\n };\n });\n\n pi.on('input', (event, ctx) => {\n // Pi exposes only the broad \"extension\" source, not the sending factory.\n // Keep this non-consuming guard narrow in command and time so concurrent\n // pi-add-dir timers cannot exhaust it and leak a later `/reload`.\n const reloadGuarded = activeCalls.size > 0 || reloadGuardExpiration !== undefined;\n if (event.source !== 'extension' || event.text !== BUILTIN_RELOAD_COMMAND || !reloadGuarded) return;\n\n if (!reloadPromptShown && ctx.hasUI) {\n const invocation = reloadInvocation(pi);\n if (!ctx.ui.getEditorText().trim()) ctx.ui.setEditorText(invocation);\n ctx.ui.notify(`pi-add-dir added skills. Submit ${invocation} to reload when the current turn is idle.`, 'info');\n reloadPromptShown = true;\n }\n\n return { action: 'handled' };\n });\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"autoStop.cjs","names":[],"sources":["../../src/entries/autoStop.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nconst AUTO_STOP_COOLDOWN_MS = 5_000;\n\nexport default function autoStop(pi: ExtensionAPI): void {\n let shutdownTimer: NodeJS.Timeout | undefined;\n\n const cancelScheduledShutdown = () => {\n if (!shutdownTimer) return;\n clearTimeout(shutdownTimer);\n shutdownTimer = undefined;\n };\n\n pi.on('input', () => {\n cancelScheduledShutdown();\n });\n\n pi.on('agent_start', () => {\n cancelScheduledShutdown();\n });\n\n pi.on('agent_settled', (_event, context) => {\n cancelScheduledShutdown();\n if (context.hasPendingMessages()) return;\n\n shutdownTimer = setTimeout(() => {\n shutdownTimer = undefined;\n if (!context.hasPendingMessages() && context.isIdle()) context.shutdown();\n }, AUTO_STOP_COOLDOWN_MS);\n });\n}\n"],"mappings":"AAIA,SAAwB,EAAS,EAAwB,CACvD,IAAI,EAEE,MAAgC,CAC/B,AAEL,KADA,aAAa,EAAc,CACX,IAAA,KAGlB,EAAG,GAAG,YAAe,CACnB,GAAyB,EACzB,CAEF,EAAG,GAAG,kBAAqB,CACzB,GAAyB,EACzB,CAEF,EAAG,GAAG,iBAAkB,EAAQ,IAAY,CAC1C,GAAyB,CACrB,GAAQ,oBAAoB,GAEhC,EAAgB,eAAiB,CAC/B,EAAgB,IAAA,GACZ,CAAC,EAAQ,oBAAoB,EAAI,EAAQ,QAAQ,EAAE,EAAQ,UAAU,EACxE,IAAsB,GACzB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"autoStop.d.cts","names":[],"sources":["../../src/entries/autoStop.ts"],"mappings":";;;iBAIwB,QAAA,CAAS,EAAA,EAAI,YAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"autoStop.d.mts","names":[],"sources":["../../src/entries/autoStop.ts"],"mappings":";;;iBAIwB,QAAA,CAAS,EAAA,EAAI,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"autoStop.mjs","names":[],"sources":["../../src/entries/autoStop.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nconst AUTO_STOP_COOLDOWN_MS = 5_000;\n\nexport default function autoStop(pi: ExtensionAPI): void {\n let shutdownTimer: NodeJS.Timeout | undefined;\n\n const cancelScheduledShutdown = () => {\n if (!shutdownTimer) return;\n clearTimeout(shutdownTimer);\n shutdownTimer = undefined;\n };\n\n pi.on('input', () => {\n cancelScheduledShutdown();\n });\n\n pi.on('agent_start', () => {\n cancelScheduledShutdown();\n });\n\n pi.on('agent_settled', (_event, context) => {\n cancelScheduledShutdown();\n if (context.hasPendingMessages()) return;\n\n shutdownTimer = setTimeout(() => {\n shutdownTimer = undefined;\n if (!context.hasPendingMessages() && context.isIdle()) context.shutdown();\n }, AUTO_STOP_COOLDOWN_MS);\n });\n}\n"],"mappings":"AAIA,SAAwB,EAAS,EAAwB,CACvD,IAAI,EAEE,MAAgC,CAC/B,AAEL,KADA,aAAa,EAAc,CACX,IAAA,KAGlB,EAAG,GAAG,YAAe,CACnB,GAAyB,EACzB,CAEF,EAAG,GAAG,kBAAqB,CACzB,GAAyB,EACzB,CAEF,EAAG,GAAG,iBAAkB,EAAQ,IAAY,CAC1C,GAAyB,CACrB,GAAQ,oBAAoB,GAEhC,EAAgB,eAAiB,CAC/B,EAAgB,IAAA,GACZ,CAAC,EAAQ,oBAAoB,EAAI,EAAQ,QAAQ,EAAE,EAAQ,UAAU,EACxE,IAAsB,GACzB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"matrixPicker.cjs","names":["Container","Input","SelectList","DynamicBorder","Spacer","Text"],"sources":["../../../src/entries/components/matrixPicker.ts"],"sourcesContent":["import { DynamicBorder, getSelectListTheme, type Theme } from '@earendil-works/pi-coding-agent';\nimport {\n Container,\n Input,\n type KeybindingsManager,\n type SelectItem,\n SelectList,\n Spacer,\n Text,\n} from '@earendil-works/pi-tui';\n\nconst MAX_VISIBLE = 10;\nconst SINGLE_HINT = '↑↓ navigate enter select esc cancel type to filter';\nconst MULTI_HINT = '↑↓ navigate space toggle enter confirm esc cancel type to filter';\nconst SPACE = ' ';\nconst MARK_ON = '[x]';\nconst MARK_OFF = '[ ]';\n\nexport interface MatrixPickerOptions {\n title: string;\n /** Rows with plain labels. Selection markers are added by the component. */\n items: SelectItem[];\n /** Values selected on open. In single mode the first one is the cursor row. */\n selected: string[];\n multi: boolean;\n}\n\n/**\n * Rows carrying their current selection marker.\n *\n * Multi-select only. A single-select list is a button group: the cursor is the\n * selection, so adding checkboxes would show two competing indicators.\n */\nexport function markItems(items: SelectItem[], selected: string[], multi: boolean): SelectItem[] {\n if (!multi) return items;\n return items.map((item) => ({\n ...item,\n label: `${selected.includes(item.value) ? MARK_ON : MARK_OFF} ${item.label}`,\n }));\n}\n\n/** SelectList filters on a value prefix, so the visible rows follow that rule. */\nexport function visibleValues(items: SelectItem[], filter: string): string[] {\n return items.filter((item) => item.value.toLowerCase().startsWith(filter.toLowerCase())).map((item) => item.value);\n}\n\nexport function toggleValue(selected: string[], value: string): string[] {\n return selected.includes(value) ? selected.filter((entry) => entry !== value) : [...selected, value];\n}\n\n/**\n * Filterable picker with preselected rows and optional multi-select.\n *\n * Pi's built-in ui.select() offers none of that: it takes a bare string[], has\n * no filter input, hardcodes selectedIndex = 0 (extension-selector.js:12), and\n * resolves on the first enter. This drives SelectList directly instead.\n */\nexport class MatrixPickerComponent extends Container {\n private readonly filterInput = new Input();\n private readonly items: SelectItem[];\n private readonly multi: boolean;\n private readonly title: string;\n private readonly theme: Theme;\n // Declared and assigned separately, never as parameter properties: Pi loads\n // extensions through Node's strip-only type stripping, which rejects those.\n private readonly keybindings: KeybindingsManager;\n private readonly done: (value: string[] | undefined) => void;\n private list: SelectList;\n private selected: string[];\n private cursorValue: string | undefined;\n private settled = false;\n\n constructor(\n options: MatrixPickerOptions,\n theme: Theme,\n keybindings: KeybindingsManager,\n done: (value: string[] | undefined) => void,\n ) {\n super();\n this.items = options.items;\n this.multi = options.multi;\n this.title = options.title;\n this.theme = theme;\n this.keybindings = keybindings;\n this.done = done;\n this.selected = [...options.selected];\n this.cursorValue = options.selected[0];\n\n // Focus is set here rather than by the TUI, which focuses the component it\n // was handed (this container) and not the input nested inside it.\n this.filterInput.focused = true;\n this.filterInput.onEscape = () => this.settle(undefined);\n\n this.list = this.buildList();\n this.render_();\n }\n\n private buildList(): SelectList {\n const list = new SelectList(markItems(this.items, this.selected, this.multi), MAX_VISIBLE, getSelectListTheme());\n const filter = this.filterInput.getValue();\n if (filter) list.setFilter(filter);\n\n const visible = visibleValues(this.items, filter);\n const index = this.cursorValue ? visible.indexOf(this.cursorValue) : -1;\n if (index >= 0) list.setSelectedIndex(index);\n\n list.onSelectionChange = (item) => {\n this.cursorValue = item.value;\n };\n list.onSelect = (item) => (this.multi ? this.settle(this.selected) : this.settle([item.value]));\n list.onCancel = () => this.settle(undefined);\n return list;\n }\n\n /**\n * SelectList takes its rows at construction and exposes no setter, so a\n * toggled marker means rebuilding the list and the container around it.\n */\n private render_(): void {\n this.clear();\n this.addChild(new DynamicBorder());\n this.addChild(new Spacer(1));\n this.addChild(new Text(this.theme.fg('accent', this.theme.bold(this.title)), 1, 0));\n this.addChild(new Spacer(1));\n this.addChild(this.filterInput);\n this.addChild(this.list);\n this.addChild(new Spacer(1));\n this.addChild(new Text(this.theme.fg('muted', this.multi ? MULTI_HINT : SINGLE_HINT), 1, 0));\n this.addChild(new Spacer(1));\n this.addChild(new DynamicBorder());\n }\n\n private rebuild(): void {\n this.list = this.buildList();\n this.render_();\n }\n\n private settle(value: string[] | undefined): void {\n // The list can fire onSelect after a cancel has already resolved, and\n // resolving twice would drop the first answer on the floor.\n if (this.settled) return;\n this.settled = true;\n this.done(value);\n }\n\n handleInput(data: string): void {\n if (this.multi && data === SPACE) {\n const current = this.list.getSelectedItem();\n if (current) {\n this.selected = toggleValue(this.selected, current.value);\n this.cursorValue = current.value;\n this.rebuild();\n }\n return;\n }\n\n // Navigation keys belong to the list, everything else edits the filter, so\n // typing narrows the list without stealing the arrow keys from it.\n const navigational =\n this.keybindings.matches(data, 'tui.select.up') ||\n this.keybindings.matches(data, 'tui.select.down') ||\n this.keybindings.matches(data, 'tui.select.confirm') ||\n this.keybindings.matches(data, 'tui.select.cancel');\n\n if (navigational) {\n this.list.handleInput(data);\n return;\n }\n\n const before = this.filterInput.getValue();\n this.filterInput.handleInput(data);\n const after = this.filterInput.getValue();\n if (after !== before) this.list.setFilter(after);\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"matrixPicker.d.cts","names":[],"sources":["../../../src/entries/components/matrixPicker.ts"],"mappings":";;;;UAkBiB,mBAAA;EACf,KAAA;EADe;EAGf,KAAA,EAAO,UAAA;;EAEP,QAAA;EACA,KAAA;AAAA;;;;;;AASF;iBAAgB,SAAA,CAAU,KAAA,EAAO,UAAA,IAAc,QAAA,YAAoB,KAAA,YAAiB,UAAA;;iBASpE,aAAA,CAAc,KAAA,EAAO,UAAA,IAAc,MAAA;AAAA,iBAInC,WAAA,CAAY,QAAA,YAAoB,KAAA;;;;;;;AAJhD;cAea,qBAAA,SAA8B,SAAA;EAAA,iBACxB,WAAA;EAAA,iBACA,KAAA;EAAA,iBACA,KAAA;EAAA,iBACA,KAAA;EAAA,iBACA,KAAA;EAAA,iBAGA,WAAA;EAAA,iBACA,IAAA;EAAA,QACT,IAAA;EAAA,QACA,QAAA;EAAA,QACA,WAAA;EAAA,QACA,OAAA;cAGN,OAAA,EAAS,mBAAA,EACT,KAAA,EAAO,KAAA,EACP,WAAA,EAAa,kBAAA,EACb,IAAA,GAAO,KAAA;EAAA,QAqBD,SAAA;EAxCyB;;;;EAAA,QA6DzB,OAAA;EAAA,QAcA,OAAA;EAAA,QAKA,MAAA;EAQR,WAAA,CAAY,IAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"matrixPicker.d.mts","names":[],"sources":["../../../src/entries/components/matrixPicker.ts"],"mappings":";;;;UAkBiB,mBAAA;EACf,KAAA;EADe;EAGf,KAAA,EAAO,UAAA;;EAEP,QAAA;EACA,KAAA;AAAA;;;;;;AASF;iBAAgB,SAAA,CAAU,KAAA,EAAO,UAAA,IAAc,QAAA,YAAoB,KAAA,YAAiB,UAAA;;iBASpE,aAAA,CAAc,KAAA,EAAO,UAAA,IAAc,MAAA;AAAA,iBAInC,WAAA,CAAY,QAAA,YAAoB,KAAA;;;;;;;AAJhD;cAea,qBAAA,SAA8B,SAAA;EAAA,iBACxB,WAAA;EAAA,iBACA,KAAA;EAAA,iBACA,KAAA;EAAA,iBACA,KAAA;EAAA,iBACA,KAAA;EAAA,iBAGA,WAAA;EAAA,iBACA,IAAA;EAAA,QACT,IAAA;EAAA,QACA,QAAA;EAAA,QACA,WAAA;EAAA,QACA,OAAA;cAGN,OAAA,EAAS,mBAAA,EACT,KAAA,EAAO,KAAA,EACP,WAAA,EAAa,kBAAA,EACb,IAAA,GAAO,KAAA;EAAA,QAqBD,SAAA;EAxCyB;;;;EAAA,QA6DzB,OAAA;EAAA,QAcA,OAAA;EAAA,QAKA,MAAA;EAQR,WAAA,CAAY,IAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"matrixPicker.mjs","names":[],"sources":["../../../src/entries/components/matrixPicker.ts"],"sourcesContent":["import { DynamicBorder, getSelectListTheme, type Theme } from '@earendil-works/pi-coding-agent';\nimport {\n Container,\n Input,\n type KeybindingsManager,\n type SelectItem,\n SelectList,\n Spacer,\n Text,\n} from '@earendil-works/pi-tui';\n\nconst MAX_VISIBLE = 10;\nconst SINGLE_HINT = '↑↓ navigate enter select esc cancel type to filter';\nconst MULTI_HINT = '↑↓ navigate space toggle enter confirm esc cancel type to filter';\nconst SPACE = ' ';\nconst MARK_ON = '[x]';\nconst MARK_OFF = '[ ]';\n\nexport interface MatrixPickerOptions {\n title: string;\n /** Rows with plain labels. Selection markers are added by the component. */\n items: SelectItem[];\n /** Values selected on open. In single mode the first one is the cursor row. */\n selected: string[];\n multi: boolean;\n}\n\n/**\n * Rows carrying their current selection marker.\n *\n * Multi-select only. A single-select list is a button group: the cursor is the\n * selection, so adding checkboxes would show two competing indicators.\n */\nexport function markItems(items: SelectItem[], selected: string[], multi: boolean): SelectItem[] {\n if (!multi) return items;\n return items.map((item) => ({\n ...item,\n label: `${selected.includes(item.value) ? MARK_ON : MARK_OFF} ${item.label}`,\n }));\n}\n\n/** SelectList filters on a value prefix, so the visible rows follow that rule. */\nexport function visibleValues(items: SelectItem[], filter: string): string[] {\n return items.filter((item) => item.value.toLowerCase().startsWith(filter.toLowerCase())).map((item) => item.value);\n}\n\nexport function toggleValue(selected: string[], value: string): string[] {\n return selected.includes(value) ? selected.filter((entry) => entry !== value) : [...selected, value];\n}\n\n/**\n * Filterable picker with preselected rows and optional multi-select.\n *\n * Pi's built-in ui.select() offers none of that: it takes a bare string[], has\n * no filter input, hardcodes selectedIndex = 0 (extension-selector.js:12), and\n * resolves on the first enter. This drives SelectList directly instead.\n */\nexport class MatrixPickerComponent extends Container {\n private readonly filterInput = new Input();\n private readonly items: SelectItem[];\n private readonly multi: boolean;\n private readonly title: string;\n private readonly theme: Theme;\n // Declared and assigned separately, never as parameter properties: Pi loads\n // extensions through Node's strip-only type stripping, which rejects those.\n private readonly keybindings: KeybindingsManager;\n private readonly done: (value: string[] | undefined) => void;\n private list: SelectList;\n private selected: string[];\n private cursorValue: string | undefined;\n private settled = false;\n\n constructor(\n options: MatrixPickerOptions,\n theme: Theme,\n keybindings: KeybindingsManager,\n done: (value: string[] | undefined) => void,\n ) {\n super();\n this.items = options.items;\n this.multi = options.multi;\n this.title = options.title;\n this.theme = theme;\n this.keybindings = keybindings;\n this.done = done;\n this.selected = [...options.selected];\n this.cursorValue = options.selected[0];\n\n // Focus is set here rather than by the TUI, which focuses the component it\n // was handed (this container) and not the input nested inside it.\n this.filterInput.focused = true;\n this.filterInput.onEscape = () => this.settle(undefined);\n\n this.list = this.buildList();\n this.render_();\n }\n\n private buildList(): SelectList {\n const list = new SelectList(markItems(this.items, this.selected, this.multi), MAX_VISIBLE, getSelectListTheme());\n const filter = this.filterInput.getValue();\n if (filter) list.setFilter(filter);\n\n const visible = visibleValues(this.items, filter);\n const index = this.cursorValue ? visible.indexOf(this.cursorValue) : -1;\n if (index >= 0) list.setSelectedIndex(index);\n\n list.onSelectionChange = (item) => {\n this.cursorValue = item.value;\n };\n list.onSelect = (item) => (this.multi ? this.settle(this.selected) : this.settle([item.value]));\n list.onCancel = () => this.settle(undefined);\n return list;\n }\n\n /**\n * SelectList takes its rows at construction and exposes no setter, so a\n * toggled marker means rebuilding the list and the container around it.\n */\n private render_(): void {\n this.clear();\n this.addChild(new DynamicBorder());\n this.addChild(new Spacer(1));\n this.addChild(new Text(this.theme.fg('accent', this.theme.bold(this.title)), 1, 0));\n this.addChild(new Spacer(1));\n this.addChild(this.filterInput);\n this.addChild(this.list);\n this.addChild(new Spacer(1));\n this.addChild(new Text(this.theme.fg('muted', this.multi ? MULTI_HINT : SINGLE_HINT), 1, 0));\n this.addChild(new Spacer(1));\n this.addChild(new DynamicBorder());\n }\n\n private rebuild(): void {\n this.list = this.buildList();\n this.render_();\n }\n\n private settle(value: string[] | undefined): void {\n // The list can fire onSelect after a cancel has already resolved, and\n // resolving twice would drop the first answer on the floor.\n if (this.settled) return;\n this.settled = true;\n this.done(value);\n }\n\n handleInput(data: string): void {\n if (this.multi && data === SPACE) {\n const current = this.list.getSelectedItem();\n if (current) {\n this.selected = toggleValue(this.selected, current.value);\n this.cursorValue = current.value;\n this.rebuild();\n }\n return;\n }\n\n // Navigation keys belong to the list, everything else edits the filter, so\n // typing narrows the list without stealing the arrow keys from it.\n const navigational =\n this.keybindings.matches(data, 'tui.select.up') ||\n this.keybindings.matches(data, 'tui.select.down') ||\n this.keybindings.matches(data, 'tui.select.confirm') ||\n this.keybindings.matches(data, 'tui.select.cancel');\n\n if (navigational) {\n this.list.handleInput(data);\n return;\n }\n\n const before = this.filterInput.getValue();\n this.filterInput.handleInput(data);\n const after = this.filterInput.getValue();\n if (after !== before) this.list.setFilter(after);\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skillsOverlay.cjs","names":["DoomOverlay","fs","DOOM_OVERLAY_ACCENT","path","DOOM_FULLSCREEN_UI_OPTIONS"],"sources":["../../../src/entries/components/skillsOverlay.ts"],"sourcesContent":["/**\n * Skills: the `SPC e s` overlay.\n *\n * A tree of the skills this session loaded on the left, the selected skill's\n * frontmatter and body on the right. Everything listed is loaded, so the\n * surface answers \"what do I have, and what does it cost\" rather than doubling\n * as a domain browser.\n *\n * The tree is flat and always open: groups and owners are headings, only skills\n * take the selection. Rendering is pure: the catalogue is resolved once by the\n * caller and passed in, so `render(width)` returns lines with no side effects\n * and the whole surface can be asserted as text without a live terminal.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from '@agimon-ai/doompi-ui/components/doomOverlay';\nimport { formatTokens } from '@agimon-ai/doompi-ui/rendering';\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';\nimport type { SkillCatalog, SkillEntry } from '../../services/skillCatalog.ts';\n\ntype ThemeColor = Parameters<Theme['fg']>[0];\ntype ThemeBg = Parameters<Theme['bg']>[0];\n\nconst MIN_WIDTH = 60;\n/** A third for the tree, two thirds for the skill being read. */\nconst TREE_PANE_RATIO = 1 / 3;\n/** One blank column each side of the pane divider so neither column touches it. */\nconst PANE_GUTTER = 1;\nconst MIN_PANE_WIDTH = 20;\nconst LABEL_COLUMN = 13;\n/** Ceiling on the columns a row's right-hand tag may take from its label. */\nconst TAG_SHARE = 0.4;\nconst INDENT = 2;\nconst ELLIPSIS = '…';\nconst SELECTION_MARKER = '›';\nconst RULE = '─';\nconst KEY_TAB = '\\t';\nconst KEY_ENTER = '\\r';\nconst KEY_NEWLINE = '\\n';\nconst KEY_BACKSPACE = '\\x7f';\nconst FILTER_KEY = '/';\nconst BODY_PAGE = 10;\n\nconst TITLE = 'SKILLS';\nconst BREADCRUMB = 'SPC › e / extension › s / skills';\nconst HEADING = 'CATALOG';\nconst EMPTY_TREE = 'No skills discovered.';\nconst NO_SELECTION = 'Select a skill to read it.';\nconst UNREADABLE = 'Could not read SKILL.md.';\n\nconst TREE_HINTS: readonly (readonly [string, string])[] = [\n ['↑↓', 'select'],\n ['enter', 'use skill'],\n ['tab', 'detail pane'],\n ['/', 'filter'],\n ['esc', 'close'],\n];\nconst BODY_HINTS: readonly (readonly [string, string])[] = [\n ['pgup/pgdn', 'scroll'],\n ['tab', 'tree'],\n ['esc', 'close'],\n];\nconst FILTER_HINTS: readonly (readonly [string, string])[] = [\n ['type', 'to filter'],\n ['enter', 'keep'],\n ['esc', 'clear'],\n];\n\nexport type SkillsOverlayResult = { kind: 'invoke'; skill: SkillEntry } | undefined;\n\nexport interface SkillsOverlayOptions {\n catalog: SkillCatalog;\n /** Repo root, so paths render relative rather than as absolute noise. */\n repoRoot: string;\n readFile?: (filePath: string) => string;\n}\n\ntype RowKind = 'group' | 'owner' | 'skill';\n\ninterface TreeRow {\n kind: RowKind;\n depth: number;\n label: string;\n tag: string;\n /** Only a skill row carries one; group and owner rows are headings. */\n skill?: SkillEntry;\n}\n\nfunction fit(text: string, width: number): string {\n const clipped = truncateToWidth(text, Math.max(0, width), ELLIPSIS);\n return clipped + ' '.repeat(Math.max(0, width - visibleWidth(clipped)));\n}\n\nfunction wrap(text: string, width: number): string[] {\n if (width <= 0) return [];\n const lines: string[] = [];\n let current = '';\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n if (current.length === 0) current = word;\n else if (visibleWidth(current) + 1 + visibleWidth(word) <= width) current += ` ${word}`;\n else {\n lines.push(current);\n current = word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\n/** Drops YAML frontmatter so the preview starts at the prose, as Pi does. */\nexport function skillBody(content: string): string {\n const match = content.match(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n return (match ? (match[1] ?? '') : content).replace(/^\\s+/, '');\n}\n\nfunction matches(skill: SkillEntry, query: string): boolean {\n const needle = query.toLowerCase();\n return skill.name.toLowerCase().includes(needle) || skill.description.toLowerCase().includes(needle);\n}\n\nexport class SkillsOverlayComponent extends DoomOverlay {\n private readonly options: SkillsOverlayOptions;\n private readonly done: (result: SkillsOverlayResult) => void;\n private readonly readFile: (filePath: string) => string;\n private readonly bodyCache = new Map<string, string[]>();\n\n /** Index into the skill rows, not into every row: headings are not selectable. */\n private selected = 0;\n private focus: 'tree' | 'body' = 'tree';\n private filtering = false;\n private query = '';\n private bodyOffset = 0;\n\n constructor(\n tui: DoomOverlayTui,\n theme: Theme,\n options: SkillsOverlayOptions,\n done: (result: SkillsOverlayResult) => void,\n ) {\n super(tui, theme);\n this.options = options;\n this.done = done;\n this.readFile = options.readFile ?? ((filePath) => fs.readFileSync(filePath, 'utf8'));\n }\n\n /** Every row, honouring the active filter. The tree does not fold. */\n private rows(): TreeRow[] {\n const query = this.query.trim();\n const rows: TreeRow[] = [];\n for (const group of this.options.catalog.groups) {\n const owners = query\n ? group.owners\n .map((owner) => ({ ...owner, skills: owner.skills.filter((skill) => matches(skill, query)) }))\n .filter((owner) => owner.skills.length > 0)\n : group.owners;\n if (owners.length === 0) continue;\n const count = owners.reduce((total, owner) => total + owner.skills.length, 0);\n rows.push({ kind: 'group', depth: 0, label: group.label, tag: String(count) });\n for (const owner of owners) {\n rows.push({ kind: 'owner', depth: 1, label: owner.owner, tag: String(owner.skills.length) });\n for (const skill of owner.skills) {\n rows.push({ kind: 'skill', depth: 2, label: skill.name, tag: '', skill });\n }\n }\n }\n return rows;\n }\n\n /**\n * Where the skill rows sit in `rows()`.\n *\n * The selection indexes this list rather than `rows()`, which is what keeps\n * headings unselectable without the key handler having to hunt past them, and\n * what puts the opening selection on a skill rather than on the first group.\n */\n private selectable(rows: TreeRow[]): number[] {\n const indexes: number[] = [];\n for (const [index, row] of rows.entries()) if (row.skill) indexes.push(index);\n return indexes;\n }\n\n private currentRow(): TreeRow | undefined {\n const rows = this.rows();\n const indexes = this.selectable(rows);\n if (indexes.length === 0) return undefined;\n return rows[indexes[Math.min(this.selected, indexes.length - 1)] as number];\n }\n\n private move(delta: number): void {\n const count = this.selectable(this.rows()).length;\n if (count === 0) return;\n this.selected = Math.max(0, Math.min(count - 1, this.selected + delta));\n this.bodyOffset = 0;\n this.invalidate();\n }\n\n private bodyLines(skill: SkillEntry, width: number): string[] {\n let raw = this.bodyCache.get(skill.filePath);\n if (!raw) {\n let source: string;\n try {\n source = skillBody(this.readFile(skill.filePath));\n } catch {\n source = UNREADABLE;\n }\n raw = source.split(/\\r?\\n/);\n this.bodyCache.set(skill.filePath, raw);\n }\n // Wrapped at render width rather than at read time, so a resize reflows the\n // same cached file instead of re-reading it.\n return raw.flatMap((line) => (line.trim() === '' ? [''] : wrap(line, width)));\n }\n\n handleInput(data: string): void {\n if (this.filtering) return this.handleFilterInput(data);\n\n if (matchesKey(data, 'escape')) {\n // The filter clears before the overlay closes: escaping straight out of a\n // narrowed tree loses the search with no way to see what it hid.\n if (this.query) {\n this.query = '';\n this.selected = 0;\n this.invalidate();\n return;\n }\n this.done(undefined);\n return;\n }\n if (data === KEY_TAB || matchesKey(data, 'tab')) {\n this.focus = this.focus === 'tree' ? 'body' : 'tree';\n this.invalidate();\n return;\n }\n if (matchesKey(data, 'pageUp')) {\n this.bodyOffset = Math.max(0, this.bodyOffset - BODY_PAGE);\n this.invalidate();\n return;\n }\n if (matchesKey(data, 'pageDown')) {\n this.bodyOffset += BODY_PAGE;\n this.invalidate();\n return;\n }\n if (this.focus === 'body') return;\n\n if (data === FILTER_KEY) {\n this.filtering = true;\n this.invalidate();\n return;\n }\n if (matchesKey(data, 'up') || matchesKey(data, 'k')) return this.move(-1);\n if (matchesKey(data, 'down') || matchesKey(data, 'j')) return this.move(1);\n\n if (data === KEY_ENTER || data === KEY_NEWLINE || matchesKey(data, 'enter')) {\n const skill = this.currentRow()?.skill;\n if (skill) this.done({ kind: 'invoke', skill });\n }\n }\n\n private handleFilterInput(data: string): void {\n if (matchesKey(data, 'escape')) {\n this.filtering = false;\n this.query = '';\n this.selected = 0;\n this.invalidate();\n return;\n }\n if (data === KEY_ENTER || data === KEY_NEWLINE) {\n this.filtering = false;\n this.invalidate();\n return;\n }\n if (data === KEY_BACKSPACE) this.query = this.query.slice(0, -1);\n // Control sequences are dropped rather than appended: an arrow key would\n // otherwise land in the query as a raw escape sequence.\n else if (data.length === 1 && data >= ' ') this.query += data;\n this.selected = 0;\n this.invalidate();\n }\n\n protected getChrome(): DoomOverlayChrome {\n const { skillCount, promptTokens, bodyTokens } = this.options.catalog;\n const sources = this.options.catalog.groups.filter((group) => group.owners.length > 0).length;\n const hints = this.filtering ? FILTER_HINTS : this.focus === 'body' ? BODY_HINTS : TREE_HINTS;\n return {\n title: TITLE,\n accent: DOOM_OVERLAY_ACCENT,\n breadcrumb: BREADCRUMB,\n // Two token figures, because they answer different questions: what the\n // catalogue costs on every request, and what reading all of it would cost.\n headerRight: `${skillCount} skills · ${sources} sources · ${formatTokens(promptTokens)} always-on · ${formatTokens(bodyTokens)} full`,\n footer: this.hintLine(hints),\n };\n }\n\n private badge(text: string, background: ThemeBg, colour: ThemeColor = 'text'): string {\n return this.theme.bg(background, this.theme.fg(colour, ` ${text} `));\n }\n\n /** Footer hints as capped keys: `[ enter ] use skill`, per the mockup. */\n private hintLine(hints: readonly (readonly [string, string])[]): string {\n return hints\n .map(([key, label]) => `${this.badge(key, 'selectedBg')}${this.theme.fg('dim', ` ${label}`)}`)\n .join(this.theme.fg('dim', ' '));\n }\n\n protected renderBody(width: number, height: number): string[] {\n if (width < MIN_WIDTH) return this.renderStacked(width, height);\n\n const treeWidth = Math.max(MIN_PANE_WIDTH, Math.floor((width - 1) * TREE_PANE_RATIO));\n const detailWidth = Math.max(1, width - treeWidth - 1);\n const treeContent = Math.max(1, treeWidth - PANE_GUTTER);\n const detailContent = Math.max(1, detailWidth - PANE_GUTTER);\n\n const left = this.treeLines(treeContent, height);\n const right = this.detailLines(detailContent, height);\n const divider = this.theme.fg('borderMuted', '│');\n return Array.from({ length: height }, (_, index) => {\n const row = `${fit(left[index] ?? '', treeContent)} ${divider} ${fit(right[index] ?? '', detailContent)}`;\n return truncateToWidth(row, width, ELLIPSIS);\n });\n }\n\n private renderStacked(width: number, height: number): string[] {\n const topHeight = Math.max(1, Math.floor((height - 1) / 2));\n const bottomHeight = Math.max(0, height - topHeight - 1);\n const top = this.treeLines(width, topHeight);\n const bottom = this.detailLines(width, bottomHeight);\n return [\n ...top.slice(0, topHeight),\n ...Array.from({ length: Math.max(0, topHeight - top.length) }, () => ''),\n this.theme.fg('borderMuted', RULE.repeat(width)),\n ...bottom.slice(0, bottomHeight),\n ];\n }\n\n private treeLines(width: number, height: number): string[] {\n const heading = this.filtering || this.query ? `${HEADING} ${FILTER_KEY}${this.query}` : HEADING;\n const lines = [this.theme.bold(this.theme.fg('accent', heading)), ''];\n const rows = this.rows();\n if (rows.length === 0) {\n lines.push(this.theme.fg('dim', EMPTY_TREE));\n return lines;\n }\n\n const budget = Math.max(1, height - lines.length);\n const indexes = this.selectable(rows);\n // No skill rows means the filter matched nothing, so nothing is highlighted.\n const selected = indexes[Math.min(this.selected, indexes.length - 1)] ?? -1;\n const start = Math.max(0, Math.min(selected - budget + 1, Math.max(0, rows.length - budget)));\n for (const [offset, row] of rows.slice(start, start + budget).entries()) {\n const isSelected = start + offset === selected;\n const marker = isSelected ? this.theme.fg('accent', SELECTION_MARKER) : ' ';\n const indent = ' '.repeat(row.depth * INDENT);\n // Three tiers rather than two: the group heading leads, the owner beneath\n // it recedes to a caption, and the skills it holds carry the reading\n // weight because they are the only rows that do anything.\n const colour: ThemeColor = row.kind === 'group' ? 'accent' : row.kind === 'owner' ? 'dim' : 'text';\n let label = this.theme.fg(colour, `${indent}${row.label}`);\n if (row.kind === 'group' || isSelected) label = this.theme.bold(label);\n // The tag is capped before it claims columns: an owner in many domains\n // carries a long `+a,b,c` hint that would otherwise leave the name with\n // no room at all and render the row as a bare count.\n const tag = row.tag ? truncateToWidth(row.tag, Math.floor(width * TAG_SHARE), ELLIPSIS) : '';\n const tagWidth = tag ? visibleWidth(tag) + 1 : 0;\n const body = fit(`${marker} ${label}`, Math.max(1, width - tagWidth));\n const line = tag ? `${body} ${this.theme.fg('dim', tag)}` : body;\n lines.push(isSelected ? this.theme.bg('selectedBg', fit(line, width)) : line);\n }\n return lines;\n }\n\n private field(label: string, value: string, colour: ThemeColor, width: number): string[] {\n const valueWidth = Math.max(1, width - LABEL_COLUMN);\n return wrap(value, valueWidth).map(\n (line, index) =>\n `${this.theme.fg('dim', fit(index === 0 ? label : '', LABEL_COLUMN))}${this.theme.fg(colour, line)}`,\n );\n }\n\n private detailLines(width: number, height: number): string[] {\n const skill = this.currentRow()?.skill;\n if (!skill) return ['', '', this.theme.fg('dim', NO_SELECTION)];\n\n const relative = path.relative(this.options.repoRoot, skill.filePath) || skill.filePath;\n const lines = [\n this.theme.bold(this.theme.fg('accent', skill.name)),\n '',\n ...this.field('description', skill.description, 'text', width),\n ...this.field('source', `${skill.group} › ${skill.owner}`, 'success', width),\n ...this.field('path', relative, 'text', width),\n ...this.field(\n 'invocable',\n skill.modelInvocable ? `model · /skill:${skill.name}` : `/skill:${skill.name} only`,\n 'success',\n width,\n ),\n ];\n\n const body = this.bodyLines(skill, width);\n const remaining = Math.max(0, height - lines.length - 2);\n // Clamped here rather than in the key handler, because how far the body can\n // scroll depends on the width it has just wrapped to.\n this.bodyOffset = Math.min(this.bodyOffset, Math.max(0, body.length - remaining));\n const shown = body.slice(this.bodyOffset, this.bodyOffset + remaining);\n const position =\n body.length > remaining\n ? `lines ${this.bodyOffset + 1}-${this.bodyOffset + shown.length} / ${body.length}`\n : 'SKILL.md';\n const focus = this.focus === 'body' ? this.theme.fg('accent', ' ◀ focused') : '';\n\n lines.push('', `${this.theme.fg('dim', position)}${focus}`);\n for (const line of shown) lines.push(this.theme.fg('dim', line));\n return lines;\n }\n}\n\nexport async function openSkillsOverlay(\n ctx: ExtensionContext,\n options: SkillsOverlayOptions,\n): Promise<SkillsOverlayResult> {\n return ctx.ui.custom<SkillsOverlayResult>(\n (tui, theme, _keybindings, done) => new SkillsOverlayComponent(tui, theme, options, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skillsOverlay.d.cts","names":[],"sources":["../../../src/entries/components/skillsOverlay.ts"],"mappings":";;;;;KA4EY,mBAAA;EAAwB,IAAA;EAAgB,KAAA,EAAO,UAAA;AAAA;AAAA,UAE1C,oBAAA;EACf,OAAA,EAAS,YAAA;EAGG;EADZ,QAAA;EACA,QAAA,IAAY,QAAA;AAAA;;iBAoCE,SAAA,CAAU,OAAA;AAAA,cAUb,sBAAA,SAA+B,WAAA;EAAA,iBACzB,OAAA;EAAA,iBACA,IAAA;EAAA,iBACA,QAAA;EAAA,iBACA,SAAA;EAUV;EAAA,QAPC,QAAA;EAAA,QACA,KAAA;EAAA,QACA,SAAA;EAAA,QACA,KAAA;EAAA,QACA,UAAA;cAGN,GAAA,EAAK,cAAA,EACL,KAAA,EAAO,KAAA,EACP,OAAA,EAAS,oBAAA,EACT,IAAA,GAAO,MAAA,EAAQ,mBAAA;EAjBoC;EAAA,QA0B7C,IAAA;EAzBS;;;;;;;EAAA,QAsDT,UAAA;EAAA,QAMA,UAAA;EAAA,QAOA,IAAA;EAAA,QAQA,SAAA;EAiBR,WAAA,CAAY,IAAA;EAAA,QA8CJ,iBAAA;EAAA,UAqBE,SAAA,CAAA,GAAa,iBAAA;EAAA,QAef,KAAA;EA/JN;EAAA,QAoKM,QAAA;EAAA,UAME,UAAA,CAAW,KAAA,UAAe,MAAA;EAAA,QAiB5B,aAAA;EAAA,QAaA,SAAA;EAAA,QAoCA,KAAA;EAAA,QAQA,WAAA;AAAA;AAAA,iBAqCY,iBAAA,CACpB,GAAA,EAAK,gBAAA,EACL,OAAA,EAAS,oBAAA,GACR,OAAA,CAAQ,mBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skillsOverlay.d.mts","names":[],"sources":["../../../src/entries/components/skillsOverlay.ts"],"mappings":";;;;;KA4EY,mBAAA;EAAwB,IAAA;EAAgB,KAAA,EAAO,UAAA;AAAA;AAAA,UAE1C,oBAAA;EACf,OAAA,EAAS,YAAA;EAGG;EADZ,QAAA;EACA,QAAA,IAAY,QAAA;AAAA;;iBAoCE,SAAA,CAAU,OAAA;AAAA,cAUb,sBAAA,SAA+B,WAAA;EAAA,iBACzB,OAAA;EAAA,iBACA,IAAA;EAAA,iBACA,QAAA;EAAA,iBACA,SAAA;EAUV;EAAA,QAPC,QAAA;EAAA,QACA,KAAA;EAAA,QACA,SAAA;EAAA,QACA,KAAA;EAAA,QACA,UAAA;cAGN,GAAA,EAAK,cAAA,EACL,KAAA,EAAO,KAAA,EACP,OAAA,EAAS,oBAAA,EACT,IAAA,GAAO,MAAA,EAAQ,mBAAA;EAjBoC;EAAA,QA0B7C,IAAA;EAzBS;;;;;;;EAAA,QAsDT,UAAA;EAAA,QAMA,UAAA;EAAA,QAOA,IAAA;EAAA,QAQA,SAAA;EAiBR,WAAA,CAAY,IAAA;EAAA,QA8CJ,iBAAA;EAAA,UAqBE,SAAA,CAAA,GAAa,iBAAA;EAAA,QAef,KAAA;EA/JN;EAAA,QAoKM,QAAA;EAAA,UAME,UAAA,CAAW,KAAA,UAAe,MAAA;EAAA,QAiB5B,aAAA;EAAA,QAaA,SAAA;EAAA,QAoCA,KAAA;EAAA,QAQA,WAAA;AAAA;AAAA,iBAqCY,iBAAA,CACpB,GAAA,EAAK,gBAAA,EACL,OAAA,EAAS,oBAAA,GACR,OAAA,CAAQ,mBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skillsOverlay.mjs","names":[],"sources":["../../../src/entries/components/skillsOverlay.ts"],"sourcesContent":["/**\n * Skills: the `SPC e s` overlay.\n *\n * A tree of the skills this session loaded on the left, the selected skill's\n * frontmatter and body on the right. Everything listed is loaded, so the\n * surface answers \"what do I have, and what does it cost\" rather than doubling\n * as a domain browser.\n *\n * The tree is flat and always open: groups and owners are headings, only skills\n * take the selection. Rendering is pure: the catalogue is resolved once by the\n * caller and passed in, so `render(width)` returns lines with no side effects\n * and the whole surface can be asserted as text without a live terminal.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from '@agimon-ai/doompi-ui/components/doomOverlay';\nimport { formatTokens } from '@agimon-ai/doompi-ui/rendering';\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';\nimport type { SkillCatalog, SkillEntry } from '../../services/skillCatalog.ts';\n\ntype ThemeColor = Parameters<Theme['fg']>[0];\ntype ThemeBg = Parameters<Theme['bg']>[0];\n\nconst MIN_WIDTH = 60;\n/** A third for the tree, two thirds for the skill being read. */\nconst TREE_PANE_RATIO = 1 / 3;\n/** One blank column each side of the pane divider so neither column touches it. */\nconst PANE_GUTTER = 1;\nconst MIN_PANE_WIDTH = 20;\nconst LABEL_COLUMN = 13;\n/** Ceiling on the columns a row's right-hand tag may take from its label. */\nconst TAG_SHARE = 0.4;\nconst INDENT = 2;\nconst ELLIPSIS = '…';\nconst SELECTION_MARKER = '›';\nconst RULE = '─';\nconst KEY_TAB = '\\t';\nconst KEY_ENTER = '\\r';\nconst KEY_NEWLINE = '\\n';\nconst KEY_BACKSPACE = '\\x7f';\nconst FILTER_KEY = '/';\nconst BODY_PAGE = 10;\n\nconst TITLE = 'SKILLS';\nconst BREADCRUMB = 'SPC › e / extension › s / skills';\nconst HEADING = 'CATALOG';\nconst EMPTY_TREE = 'No skills discovered.';\nconst NO_SELECTION = 'Select a skill to read it.';\nconst UNREADABLE = 'Could not read SKILL.md.';\n\nconst TREE_HINTS: readonly (readonly [string, string])[] = [\n ['↑↓', 'select'],\n ['enter', 'use skill'],\n ['tab', 'detail pane'],\n ['/', 'filter'],\n ['esc', 'close'],\n];\nconst BODY_HINTS: readonly (readonly [string, string])[] = [\n ['pgup/pgdn', 'scroll'],\n ['tab', 'tree'],\n ['esc', 'close'],\n];\nconst FILTER_HINTS: readonly (readonly [string, string])[] = [\n ['type', 'to filter'],\n ['enter', 'keep'],\n ['esc', 'clear'],\n];\n\nexport type SkillsOverlayResult = { kind: 'invoke'; skill: SkillEntry } | undefined;\n\nexport interface SkillsOverlayOptions {\n catalog: SkillCatalog;\n /** Repo root, so paths render relative rather than as absolute noise. */\n repoRoot: string;\n readFile?: (filePath: string) => string;\n}\n\ntype RowKind = 'group' | 'owner' | 'skill';\n\ninterface TreeRow {\n kind: RowKind;\n depth: number;\n label: string;\n tag: string;\n /** Only a skill row carries one; group and owner rows are headings. */\n skill?: SkillEntry;\n}\n\nfunction fit(text: string, width: number): string {\n const clipped = truncateToWidth(text, Math.max(0, width), ELLIPSIS);\n return clipped + ' '.repeat(Math.max(0, width - visibleWidth(clipped)));\n}\n\nfunction wrap(text: string, width: number): string[] {\n if (width <= 0) return [];\n const lines: string[] = [];\n let current = '';\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n if (current.length === 0) current = word;\n else if (visibleWidth(current) + 1 + visibleWidth(word) <= width) current += ` ${word}`;\n else {\n lines.push(current);\n current = word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\n/** Drops YAML frontmatter so the preview starts at the prose, as Pi does. */\nexport function skillBody(content: string): string {\n const match = content.match(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n return (match ? (match[1] ?? '') : content).replace(/^\\s+/, '');\n}\n\nfunction matches(skill: SkillEntry, query: string): boolean {\n const needle = query.toLowerCase();\n return skill.name.toLowerCase().includes(needle) || skill.description.toLowerCase().includes(needle);\n}\n\nexport class SkillsOverlayComponent extends DoomOverlay {\n private readonly options: SkillsOverlayOptions;\n private readonly done: (result: SkillsOverlayResult) => void;\n private readonly readFile: (filePath: string) => string;\n private readonly bodyCache = new Map<string, string[]>();\n\n /** Index into the skill rows, not into every row: headings are not selectable. */\n private selected = 0;\n private focus: 'tree' | 'body' = 'tree';\n private filtering = false;\n private query = '';\n private bodyOffset = 0;\n\n constructor(\n tui: DoomOverlayTui,\n theme: Theme,\n options: SkillsOverlayOptions,\n done: (result: SkillsOverlayResult) => void,\n ) {\n super(tui, theme);\n this.options = options;\n this.done = done;\n this.readFile = options.readFile ?? ((filePath) => fs.readFileSync(filePath, 'utf8'));\n }\n\n /** Every row, honouring the active filter. The tree does not fold. */\n private rows(): TreeRow[] {\n const query = this.query.trim();\n const rows: TreeRow[] = [];\n for (const group of this.options.catalog.groups) {\n const owners = query\n ? group.owners\n .map((owner) => ({ ...owner, skills: owner.skills.filter((skill) => matches(skill, query)) }))\n .filter((owner) => owner.skills.length > 0)\n : group.owners;\n if (owners.length === 0) continue;\n const count = owners.reduce((total, owner) => total + owner.skills.length, 0);\n rows.push({ kind: 'group', depth: 0, label: group.label, tag: String(count) });\n for (const owner of owners) {\n rows.push({ kind: 'owner', depth: 1, label: owner.owner, tag: String(owner.skills.length) });\n for (const skill of owner.skills) {\n rows.push({ kind: 'skill', depth: 2, label: skill.name, tag: '', skill });\n }\n }\n }\n return rows;\n }\n\n /**\n * Where the skill rows sit in `rows()`.\n *\n * The selection indexes this list rather than `rows()`, which is what keeps\n * headings unselectable without the key handler having to hunt past them, and\n * what puts the opening selection on a skill rather than on the first group.\n */\n private selectable(rows: TreeRow[]): number[] {\n const indexes: number[] = [];\n for (const [index, row] of rows.entries()) if (row.skill) indexes.push(index);\n return indexes;\n }\n\n private currentRow(): TreeRow | undefined {\n const rows = this.rows();\n const indexes = this.selectable(rows);\n if (indexes.length === 0) return undefined;\n return rows[indexes[Math.min(this.selected, indexes.length - 1)] as number];\n }\n\n private move(delta: number): void {\n const count = this.selectable(this.rows()).length;\n if (count === 0) return;\n this.selected = Math.max(0, Math.min(count - 1, this.selected + delta));\n this.bodyOffset = 0;\n this.invalidate();\n }\n\n private bodyLines(skill: SkillEntry, width: number): string[] {\n let raw = this.bodyCache.get(skill.filePath);\n if (!raw) {\n let source: string;\n try {\n source = skillBody(this.readFile(skill.filePath));\n } catch {\n source = UNREADABLE;\n }\n raw = source.split(/\\r?\\n/);\n this.bodyCache.set(skill.filePath, raw);\n }\n // Wrapped at render width rather than at read time, so a resize reflows the\n // same cached file instead of re-reading it.\n return raw.flatMap((line) => (line.trim() === '' ? [''] : wrap(line, width)));\n }\n\n handleInput(data: string): void {\n if (this.filtering) return this.handleFilterInput(data);\n\n if (matchesKey(data, 'escape')) {\n // The filter clears before the overlay closes: escaping straight out of a\n // narrowed tree loses the search with no way to see what it hid.\n if (this.query) {\n this.query = '';\n this.selected = 0;\n this.invalidate();\n return;\n }\n this.done(undefined);\n return;\n }\n if (data === KEY_TAB || matchesKey(data, 'tab')) {\n this.focus = this.focus === 'tree' ? 'body' : 'tree';\n this.invalidate();\n return;\n }\n if (matchesKey(data, 'pageUp')) {\n this.bodyOffset = Math.max(0, this.bodyOffset - BODY_PAGE);\n this.invalidate();\n return;\n }\n if (matchesKey(data, 'pageDown')) {\n this.bodyOffset += BODY_PAGE;\n this.invalidate();\n return;\n }\n if (this.focus === 'body') return;\n\n if (data === FILTER_KEY) {\n this.filtering = true;\n this.invalidate();\n return;\n }\n if (matchesKey(data, 'up') || matchesKey(data, 'k')) return this.move(-1);\n if (matchesKey(data, 'down') || matchesKey(data, 'j')) return this.move(1);\n\n if (data === KEY_ENTER || data === KEY_NEWLINE || matchesKey(data, 'enter')) {\n const skill = this.currentRow()?.skill;\n if (skill) this.done({ kind: 'invoke', skill });\n }\n }\n\n private handleFilterInput(data: string): void {\n if (matchesKey(data, 'escape')) {\n this.filtering = false;\n this.query = '';\n this.selected = 0;\n this.invalidate();\n return;\n }\n if (data === KEY_ENTER || data === KEY_NEWLINE) {\n this.filtering = false;\n this.invalidate();\n return;\n }\n if (data === KEY_BACKSPACE) this.query = this.query.slice(0, -1);\n // Control sequences are dropped rather than appended: an arrow key would\n // otherwise land in the query as a raw escape sequence.\n else if (data.length === 1 && data >= ' ') this.query += data;\n this.selected = 0;\n this.invalidate();\n }\n\n protected getChrome(): DoomOverlayChrome {\n const { skillCount, promptTokens, bodyTokens } = this.options.catalog;\n const sources = this.options.catalog.groups.filter((group) => group.owners.length > 0).length;\n const hints = this.filtering ? FILTER_HINTS : this.focus === 'body' ? BODY_HINTS : TREE_HINTS;\n return {\n title: TITLE,\n accent: DOOM_OVERLAY_ACCENT,\n breadcrumb: BREADCRUMB,\n // Two token figures, because they answer different questions: what the\n // catalogue costs on every request, and what reading all of it would cost.\n headerRight: `${skillCount} skills · ${sources} sources · ${formatTokens(promptTokens)} always-on · ${formatTokens(bodyTokens)} full`,\n footer: this.hintLine(hints),\n };\n }\n\n private badge(text: string, background: ThemeBg, colour: ThemeColor = 'text'): string {\n return this.theme.bg(background, this.theme.fg(colour, ` ${text} `));\n }\n\n /** Footer hints as capped keys: `[ enter ] use skill`, per the mockup. */\n private hintLine(hints: readonly (readonly [string, string])[]): string {\n return hints\n .map(([key, label]) => `${this.badge(key, 'selectedBg')}${this.theme.fg('dim', ` ${label}`)}`)\n .join(this.theme.fg('dim', ' '));\n }\n\n protected renderBody(width: number, height: number): string[] {\n if (width < MIN_WIDTH) return this.renderStacked(width, height);\n\n const treeWidth = Math.max(MIN_PANE_WIDTH, Math.floor((width - 1) * TREE_PANE_RATIO));\n const detailWidth = Math.max(1, width - treeWidth - 1);\n const treeContent = Math.max(1, treeWidth - PANE_GUTTER);\n const detailContent = Math.max(1, detailWidth - PANE_GUTTER);\n\n const left = this.treeLines(treeContent, height);\n const right = this.detailLines(detailContent, height);\n const divider = this.theme.fg('borderMuted', '│');\n return Array.from({ length: height }, (_, index) => {\n const row = `${fit(left[index] ?? '', treeContent)} ${divider} ${fit(right[index] ?? '', detailContent)}`;\n return truncateToWidth(row, width, ELLIPSIS);\n });\n }\n\n private renderStacked(width: number, height: number): string[] {\n const topHeight = Math.max(1, Math.floor((height - 1) / 2));\n const bottomHeight = Math.max(0, height - topHeight - 1);\n const top = this.treeLines(width, topHeight);\n const bottom = this.detailLines(width, bottomHeight);\n return [\n ...top.slice(0, topHeight),\n ...Array.from({ length: Math.max(0, topHeight - top.length) }, () => ''),\n this.theme.fg('borderMuted', RULE.repeat(width)),\n ...bottom.slice(0, bottomHeight),\n ];\n }\n\n private treeLines(width: number, height: number): string[] {\n const heading = this.filtering || this.query ? `${HEADING} ${FILTER_KEY}${this.query}` : HEADING;\n const lines = [this.theme.bold(this.theme.fg('accent', heading)), ''];\n const rows = this.rows();\n if (rows.length === 0) {\n lines.push(this.theme.fg('dim', EMPTY_TREE));\n return lines;\n }\n\n const budget = Math.max(1, height - lines.length);\n const indexes = this.selectable(rows);\n // No skill rows means the filter matched nothing, so nothing is highlighted.\n const selected = indexes[Math.min(this.selected, indexes.length - 1)] ?? -1;\n const start = Math.max(0, Math.min(selected - budget + 1, Math.max(0, rows.length - budget)));\n for (const [offset, row] of rows.slice(start, start + budget).entries()) {\n const isSelected = start + offset === selected;\n const marker = isSelected ? this.theme.fg('accent', SELECTION_MARKER) : ' ';\n const indent = ' '.repeat(row.depth * INDENT);\n // Three tiers rather than two: the group heading leads, the owner beneath\n // it recedes to a caption, and the skills it holds carry the reading\n // weight because they are the only rows that do anything.\n const colour: ThemeColor = row.kind === 'group' ? 'accent' : row.kind === 'owner' ? 'dim' : 'text';\n let label = this.theme.fg(colour, `${indent}${row.label}`);\n if (row.kind === 'group' || isSelected) label = this.theme.bold(label);\n // The tag is capped before it claims columns: an owner in many domains\n // carries a long `+a,b,c` hint that would otherwise leave the name with\n // no room at all and render the row as a bare count.\n const tag = row.tag ? truncateToWidth(row.tag, Math.floor(width * TAG_SHARE), ELLIPSIS) : '';\n const tagWidth = tag ? visibleWidth(tag) + 1 : 0;\n const body = fit(`${marker} ${label}`, Math.max(1, width - tagWidth));\n const line = tag ? `${body} ${this.theme.fg('dim', tag)}` : body;\n lines.push(isSelected ? this.theme.bg('selectedBg', fit(line, width)) : line);\n }\n return lines;\n }\n\n private field(label: string, value: string, colour: ThemeColor, width: number): string[] {\n const valueWidth = Math.max(1, width - LABEL_COLUMN);\n return wrap(value, valueWidth).map(\n (line, index) =>\n `${this.theme.fg('dim', fit(index === 0 ? label : '', LABEL_COLUMN))}${this.theme.fg(colour, line)}`,\n );\n }\n\n private detailLines(width: number, height: number): string[] {\n const skill = this.currentRow()?.skill;\n if (!skill) return ['', '', this.theme.fg('dim', NO_SELECTION)];\n\n const relative = path.relative(this.options.repoRoot, skill.filePath) || skill.filePath;\n const lines = [\n this.theme.bold(this.theme.fg('accent', skill.name)),\n '',\n ...this.field('description', skill.description, 'text', width),\n ...this.field('source', `${skill.group} › ${skill.owner}`, 'success', width),\n ...this.field('path', relative, 'text', width),\n ...this.field(\n 'invocable',\n skill.modelInvocable ? `model · /skill:${skill.name}` : `/skill:${skill.name} only`,\n 'success',\n width,\n ),\n ];\n\n const body = this.bodyLines(skill, width);\n const remaining = Math.max(0, height - lines.length - 2);\n // Clamped here rather than in the key handler, because how far the body can\n // scroll depends on the width it has just wrapped to.\n this.bodyOffset = Math.min(this.bodyOffset, Math.max(0, body.length - remaining));\n const shown = body.slice(this.bodyOffset, this.bodyOffset + remaining);\n const position =\n body.length > remaining\n ? `lines ${this.bodyOffset + 1}-${this.bodyOffset + shown.length} / ${body.length}`\n : 'SKILL.md';\n const focus = this.focus === 'body' ? this.theme.fg('accent', ' ◀ focused') : '';\n\n lines.push('', `${this.theme.fg('dim', position)}${focus}`);\n for (const line of shown) lines.push(this.theme.fg('dim', line));\n return lines;\n }\n}\n\nexport async function openSkillsOverlay(\n ctx: ExtensionContext,\n options: SkillsOverlayOptions,\n): Promise<SkillsOverlayResult> {\n return ctx.ui.custom<SkillsOverlayResult>(\n (tui, theme, _keybindings, done) => new SkillsOverlayComponent(tui, theme, options, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"domains.cjs","names":["MatrixPickerComponent","applyDomains"],"sources":["../../src/entries/domains.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport type { SelectItem } from '@earendil-works/pi-tui';\nimport { MatrixPickerComponent } from './components/matrixPicker.ts';\nimport { domainCompletionItems, domainCompletionPrefix, listDomainNames } from '@agimon-ai/doompi-config/domains';\nimport { type DoomHarnessContext, persistHarnessSelection, requireHarnessRoot } from '../config/harnessState.ts';\nimport { applyDomains } from '../services/matrixSwitcher.ts';\n\nconst DOMAIN_SEPARATOR = ',';\nconst INFO = 'info';\nconst NONE = '(none)';\n\nfunction splitDomains(value: string): string[] {\n return value\n .split(DOMAIN_SEPARATOR)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction currentDomains(state: DoomHarnessContext): readonly string[] {\n const { domains } = state;\n return domains.length > 0 ? domains : ['default'];\n}\n\nfunction domainSummary(repoRoot: string, state: DoomHarnessContext): string {\n const active = currentDomains(state).join(', ') || NONE;\n const available = listDomainNames(repoRoot).join(', ');\n return `Active domains: ${active}\\nAvailable domains: ${available}\\nUse /domains <name[,name...]> to switch.`;\n}\n\n/** Picker rows for the domain multi-select. */\nexport function domainItems(names: string[]): SelectItem[] {\n return names.map((name) => ({ value: name, label: name }));\n}\n\nexport default function domainsExtension(pi: ExtensionAPI): void {\n // Fires on startup and again on every reload, which makes it the one place\n // guaranteed to run after a switch. Pi re-reads settings and files on reload\n // but never the environment, so the re-read has to happen here.\n pi.on('resources_discover', (_event, ctx) => ({\n skillPaths: [...requireDoomConfigContext(ctx).harness.skillDirectories],\n }));\n\n pi.on('session_start', (_event, ctx) => {\n const state = requireDoomConfigContext(ctx).harness;\n ctx.ui.addAutocompleteProvider((current) => ({\n triggerCharacters: [','],\n async getSuggestions(lines, cursorLine, cursorCol, options) {\n const line = lines[cursorLine] ?? '';\n const prefix = domainCompletionPrefix(line.slice(0, cursorCol));\n if (prefix === undefined) return current.getSuggestions(lines, cursorLine, cursorCol, options);\n\n const repoRoot = state.root;\n if (!repoRoot) return current.getSuggestions(lines, cursorLine, cursorCol, options);\n\n const items = domainCompletionItems(listDomainNames(repoRoot), prefix);\n if (items.length === 0) return current.getSuggestions(lines, cursorLine, cursorCol, options);\n return { prefix, items };\n },\n applyCompletion(lines, cursorLine, cursorCol, item, prefix) {\n return current.applyCompletion(lines, cursorLine, cursorCol, item, prefix);\n },\n shouldTriggerFileCompletion(lines, cursorLine, cursorCol) {\n return current.shouldTriggerFileCompletion?.(lines, cursorLine, cursorCol) ?? true;\n },\n }));\n });\n\n pi.registerCommand('domains', {\n description: 'Show the selected domains and pick a different set',\n handler: async (args, ctx) => {\n const state = requireDoomConfigContext(ctx).harness;\n const repoRoot = requireHarnessRoot(state);\n\n let requested = splitDomains(args);\n // No argument opens the multi-select. Domains compose, unlike a layer\n // base, so this picker toggles with space and confirms the whole set.\n if (requested.length === 0 && ctx.mode === 'tui') {\n const active = currentDomains(state);\n const chosen = await ctx.ui.custom<string[] | undefined>(\n (_tui, theme, keybindings, done) =>\n new MatrixPickerComponent(\n {\n title: `Domains (active: ${active.join(', ') || NONE})`,\n items: domainItems(listDomainNames(repoRoot)),\n selected: [...active],\n multi: true,\n },\n theme,\n keybindings,\n done,\n ),\n );\n if (!chosen || chosen.length === 0) return;\n requested = chosen;\n }\n\n if (requested.length === 0) {\n ctx.ui.notify(domainSummary(repoRoot, state), INFO);\n return;\n }\n\n await ctx.waitForIdle();\n const updated = await applyDomains(requested, state);\n persistHarnessSelection(pi, updated);\n ctx.ui.notify(`Switched domains to: ${requested.join(', ')}`, INFO);\n await ctx.reload();\n },\n });\n}\n"],"mappings":"yWAQA,MACM,EAAO,OACP,EAAO,SAEb,SAAS,EAAa,EAAyB,CAC7C,OAAO,EACJ,MAAM,IAAiB,CACvB,IAAK,GAAS,EAAK,MAAM,CAAC,CAC1B,OAAO,QAAQ,CAGpB,SAAS,EAAe,EAA8C,CACpE,GAAM,CAAE,WAAY,EACpB,OAAO,EAAQ,OAAS,EAAI,EAAU,CAAC,UAAU,CAGnD,SAAS,EAAc,EAAkB,EAAmC,CAG1E,MAAO,mBAFQ,EAAe,EAAM,CAAC,KAAK,KAAK,EAAI,EAElB,wBAAA,EAAA,EAAA,iBADC,EAAS,CAAC,KAAK,KACgB,CAAC,4CAIpE,SAAgB,EAAY,EAA+B,CACzD,OAAO,EAAM,IAAK,IAAU,CAAE,MAAO,EAAM,MAAO,EAAM,EAAE,CAG5D,SAAwB,EAAiB,EAAwB,CAI/D,EAAG,GAAG,sBAAuB,EAAQ,KAAS,CAC5C,WAAY,CAAC,IAAA,EAAA,EAAA,0BAA4B,EAAI,CAAC,QAAQ,iBAAiB,CACxE,EAAE,CAEH,EAAG,GAAG,iBAAkB,EAAQ,IAAQ,CACtC,IAAM,GAAA,EAAA,EAAA,0BAAiC,EAAI,CAAC,QAC5C,EAAI,GAAG,wBAAyB,IAAa,CAC3C,kBAAmB,CAAC,IAAI,CACxB,MAAM,eAAe,EAAO,EAAY,EAAW,EAAS,CAE1D,IAAM,GAAA,EAAA,EAAA,yBADO,EAAM,IAAe,IACS,MAAM,EAAG,EAAU,CAAC,CAC/D,GAAI,IAAW,IAAA,GAAW,OAAO,EAAQ,eAAe,EAAO,EAAY,EAAW,EAAQ,CAE9F,IAAM,EAAW,EAAM,KACvB,GAAI,CAAC,EAAU,OAAO,EAAQ,eAAe,EAAO,EAAY,EAAW,EAAQ,CAEnF,IAAM,GAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAA8C,EAAS,CAAE,EAAO,CAEtE,OADI,EAAM,SAAW,EAAU,EAAQ,eAAe,EAAO,EAAY,EAAW,EAAQ,CACrF,CAAE,SAAQ,QAAO,EAE1B,gBAAgB,EAAO,EAAY,EAAW,EAAM,EAAQ,CAC1D,OAAO,EAAQ,gBAAgB,EAAO,EAAY,EAAW,EAAM,EAAO,EAE5E,4BAA4B,EAAO,EAAY,EAAW,CACxD,OAAO,EAAQ,8BAA8B,EAAO,EAAY,EAAU,EAAI,IAEjF,EAAE,EACH,CAEF,EAAG,gBAAgB,UAAW,CAC5B,YAAa,qDACb,QAAS,MAAO,EAAM,IAAQ,CAC5B,IAAM,GAAA,EAAA,EAAA,0BAAiC,EAAI,CAAC,QACtC,GAAA,EAAA,EAAA,oBAA8B,EAAM,CAEtC,EAAY,EAAa,EAAK,CAGlC,GAAI,EAAU,SAAW,GAAK,EAAI,OAAS,MAAO,CAChD,IAAM,EAAS,EAAe,EAAM,CAC9B,EAAS,MAAM,EAAI,GAAG,QACzB,EAAM,EAAO,EAAa,IACzB,IAAIA,EAAAA,sBACF,CACE,MAAO,oBAAoB,EAAO,KAAK,KAAK,EAAI,EAAK,GACrD,MAAO,GAAA,EAAA,EAAA,iBAA4B,EAAS,CAAC,CAC7C,SAAU,CAAC,GAAG,EAAO,CACrB,MAAO,GACR,CACD,EACA,EACA,EACD,CACJ,CACD,GAAI,CAAC,GAAU,EAAO,SAAW,EAAG,OACpC,EAAY,EAGd,GAAI,EAAU,SAAW,EAAG,CAC1B,EAAI,GAAG,OAAO,EAAc,EAAU,EAAM,CAAE,EAAK,CACnD,OAGF,MAAM,EAAI,aAAa,CAEvB,EAAA,wBAAwB,EAAI,MADNC,EAAAA,aAAa,EAAW,EAAM,CAChB,CACpC,EAAI,GAAG,OAAO,wBAAwB,EAAU,KAAK,KAAK,GAAI,EAAK,CACnE,MAAM,EAAI,QAAQ,EAErB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"domains.d.cts","names":[],"sources":["../../src/entries/domains.ts"],"mappings":";;;;;iBA+BgB,WAAA,CAAY,KAAA,aAAkB,UAAA;AAAA,iBAItB,gBAAA,CAAiB,EAAA,EAAI,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"domains.d.mts","names":[],"sources":["../../src/entries/domains.ts"],"mappings":";;;;;iBA+BgB,WAAA,CAAY,KAAA,aAAkB,UAAA;AAAA,iBAItB,gBAAA,CAAiB,EAAA,EAAI,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"domains.mjs","names":[],"sources":["../../src/entries/domains.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport type { SelectItem } from '@earendil-works/pi-tui';\nimport { MatrixPickerComponent } from './components/matrixPicker.ts';\nimport { domainCompletionItems, domainCompletionPrefix, listDomainNames } from '@agimon-ai/doompi-config/domains';\nimport { type DoomHarnessContext, persistHarnessSelection, requireHarnessRoot } from '../config/harnessState.ts';\nimport { applyDomains } from '../services/matrixSwitcher.ts';\n\nconst DOMAIN_SEPARATOR = ',';\nconst INFO = 'info';\nconst NONE = '(none)';\n\nfunction splitDomains(value: string): string[] {\n return value\n .split(DOMAIN_SEPARATOR)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction currentDomains(state: DoomHarnessContext): readonly string[] {\n const { domains } = state;\n return domains.length > 0 ? domains : ['default'];\n}\n\nfunction domainSummary(repoRoot: string, state: DoomHarnessContext): string {\n const active = currentDomains(state).join(', ') || NONE;\n const available = listDomainNames(repoRoot).join(', ');\n return `Active domains: ${active}\\nAvailable domains: ${available}\\nUse /domains <name[,name...]> to switch.`;\n}\n\n/** Picker rows for the domain multi-select. */\nexport function domainItems(names: string[]): SelectItem[] {\n return names.map((name) => ({ value: name, label: name }));\n}\n\nexport default function domainsExtension(pi: ExtensionAPI): void {\n // Fires on startup and again on every reload, which makes it the one place\n // guaranteed to run after a switch. Pi re-reads settings and files on reload\n // but never the environment, so the re-read has to happen here.\n pi.on('resources_discover', (_event, ctx) => ({\n skillPaths: [...requireDoomConfigContext(ctx).harness.skillDirectories],\n }));\n\n pi.on('session_start', (_event, ctx) => {\n const state = requireDoomConfigContext(ctx).harness;\n ctx.ui.addAutocompleteProvider((current) => ({\n triggerCharacters: [','],\n async getSuggestions(lines, cursorLine, cursorCol, options) {\n const line = lines[cursorLine] ?? '';\n const prefix = domainCompletionPrefix(line.slice(0, cursorCol));\n if (prefix === undefined) return current.getSuggestions(lines, cursorLine, cursorCol, options);\n\n const repoRoot = state.root;\n if (!repoRoot) return current.getSuggestions(lines, cursorLine, cursorCol, options);\n\n const items = domainCompletionItems(listDomainNames(repoRoot), prefix);\n if (items.length === 0) return current.getSuggestions(lines, cursorLine, cursorCol, options);\n return { prefix, items };\n },\n applyCompletion(lines, cursorLine, cursorCol, item, prefix) {\n return current.applyCompletion(lines, cursorLine, cursorCol, item, prefix);\n },\n shouldTriggerFileCompletion(lines, cursorLine, cursorCol) {\n return current.shouldTriggerFileCompletion?.(lines, cursorLine, cursorCol) ?? true;\n },\n }));\n });\n\n pi.registerCommand('domains', {\n description: 'Show the selected domains and pick a different set',\n handler: async (args, ctx) => {\n const state = requireDoomConfigContext(ctx).harness;\n const repoRoot = requireHarnessRoot(state);\n\n let requested = splitDomains(args);\n // No argument opens the multi-select. Domains compose, unlike a layer\n // base, so this picker toggles with space and confirms the whole set.\n if (requested.length === 0 && ctx.mode === 'tui') {\n const active = currentDomains(state);\n const chosen = await ctx.ui.custom<string[] | undefined>(\n (_tui, theme, keybindings, done) =>\n new MatrixPickerComponent(\n {\n title: `Domains (active: ${active.join(', ') || NONE})`,\n items: domainItems(listDomainNames(repoRoot)),\n selected: [...active],\n multi: true,\n },\n theme,\n keybindings,\n done,\n ),\n );\n if (!chosen || chosen.length === 0) return;\n requested = chosen;\n }\n\n if (requested.length === 0) {\n ctx.ui.notify(domainSummary(repoRoot, state), INFO);\n return;\n }\n\n await ctx.waitForIdle();\n const updated = await applyDomains(requested, state);\n persistHarnessSelection(pi, updated);\n ctx.ui.notify(`Switched domains to: ${requested.join(', ')}`, INFO);\n await ctx.reload();\n },\n });\n}\n"],"mappings":"+ZAQA,MACM,EAAO,OACP,EAAO,SAEb,SAAS,EAAa,EAAyB,CAC7C,OAAO,EACJ,MAAM,IAAiB,CACvB,IAAK,GAAS,EAAK,MAAM,CAAC,CAC1B,OAAO,QAAQ,CAGpB,SAAS,EAAe,EAA8C,CACpE,GAAM,CAAE,WAAY,EACpB,OAAO,EAAQ,OAAS,EAAI,EAAU,CAAC,UAAU,CAGnD,SAAS,EAAc,EAAkB,EAAmC,CAG1E,MAAO,mBAFQ,EAAe,EAAM,CAAC,KAAK,KAAK,EAAI,EAElB,uBADf,EAAgB,EAAS,CAAC,KAAK,KACgB,CAAC,4CAIpE,SAAgB,EAAY,EAA+B,CACzD,OAAO,EAAM,IAAK,IAAU,CAAE,MAAO,EAAM,MAAO,EAAM,EAAE,CAG5D,SAAwB,EAAiB,EAAwB,CAI/D,EAAG,GAAG,sBAAuB,EAAQ,KAAS,CAC5C,WAAY,CAAC,GAAG,EAAyB,EAAI,CAAC,QAAQ,iBAAiB,CACxE,EAAE,CAEH,EAAG,GAAG,iBAAkB,EAAQ,IAAQ,CACtC,IAAM,EAAQ,EAAyB,EAAI,CAAC,QAC5C,EAAI,GAAG,wBAAyB,IAAa,CAC3C,kBAAmB,CAAC,IAAI,CACxB,MAAM,eAAe,EAAO,EAAY,EAAW,EAAS,CAE1D,IAAM,EAAS,GADF,EAAM,IAAe,IACS,MAAM,EAAG,EAAU,CAAC,CAC/D,GAAI,IAAW,IAAA,GAAW,OAAO,EAAQ,eAAe,EAAO,EAAY,EAAW,EAAQ,CAE9F,IAAM,EAAW,EAAM,KACvB,GAAI,CAAC,EAAU,OAAO,EAAQ,eAAe,EAAO,EAAY,EAAW,EAAQ,CAEnF,IAAM,EAAQ,EAAsB,EAAgB,EAAS,CAAE,EAAO,CAEtE,OADI,EAAM,SAAW,EAAU,EAAQ,eAAe,EAAO,EAAY,EAAW,EAAQ,CACrF,CAAE,SAAQ,QAAO,EAE1B,gBAAgB,EAAO,EAAY,EAAW,EAAM,EAAQ,CAC1D,OAAO,EAAQ,gBAAgB,EAAO,EAAY,EAAW,EAAM,EAAO,EAE5E,4BAA4B,EAAO,EAAY,EAAW,CACxD,OAAO,EAAQ,8BAA8B,EAAO,EAAY,EAAU,EAAI,IAEjF,EAAE,EACH,CAEF,EAAG,gBAAgB,UAAW,CAC5B,YAAa,qDACb,QAAS,MAAO,EAAM,IAAQ,CAC5B,IAAM,EAAQ,EAAyB,EAAI,CAAC,QACtC,EAAW,EAAmB,EAAM,CAEtC,EAAY,EAAa,EAAK,CAGlC,GAAI,EAAU,SAAW,GAAK,EAAI,OAAS,MAAO,CAChD,IAAM,EAAS,EAAe,EAAM,CAC9B,EAAS,MAAM,EAAI,GAAG,QACzB,EAAM,EAAO,EAAa,IACzB,IAAI,EACF,CACE,MAAO,oBAAoB,EAAO,KAAK,KAAK,EAAI,EAAK,GACrD,MAAO,EAAY,EAAgB,EAAS,CAAC,CAC7C,SAAU,CAAC,GAAG,EAAO,CACrB,MAAO,GACR,CACD,EACA,EACA,EACD,CACJ,CACD,GAAI,CAAC,GAAU,EAAO,SAAW,EAAG,OACpC,EAAY,EAGd,GAAI,EAAU,SAAW,EAAG,CAC1B,EAAI,GAAG,OAAO,EAAc,EAAU,EAAM,CAAE,EAAK,CACnD,OAGF,MAAM,EAAI,aAAa,CAEvB,EAAwB,EAAI,MADN,EAAa,EAAW,EAAM,CAChB,CACpC,EAAI,GAAG,OAAO,wBAAwB,EAAU,KAAK,KAAK,GAAI,EAAK,CACnE,MAAM,EAAI,QAAQ,EAErB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"doom.cjs","names":["composeDoomSession","findSyncedRoot","cleanupRunDirectory"],"sources":["../../src/entries/doom.ts"],"sourcesContent":["import { disposeHarnessState } from '@agimon-ai/doompi-config';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n// Imported from the module rather than the barrel: Pi loads this file directly\n// and it is the first thing a synced session runs, so it pulls in nothing it\n// does not use.\nimport {\n cleanupRunDirectory,\n composeDoomSession,\n findSyncedRoot,\n registerDoomFlags,\n type ComposeOutcome,\n} from '../services/composer.ts';\n\nconst WARNING = 'warning';\nconst STALE_MESSAGE = 'doompi config changed since the last sync. Run doompi sync.';\n\n/**\n * The one entry `doom-pi sync` puts in Pi's own config.\n *\n * Everything doom-pi contributes to a plain `pi` session is loaded from here,\n * which is what keeps `.pi/settings.json` to a single stable line and lets the\n * whole matrix be recomposed on `/reload` rather than frozen at startup.\n */\nexport default async function doomExtension(pi: ExtensionAPI): Promise<void> {\n registerDoomFlags(pi);\n\n const outcome: ComposeOutcome = await composeDoomSession(pi);\n\n // Reported on session_start rather than thrown: composition problems have to\n // reach the user through the UI, and the UI does not exist yet at load time.\n pi.on('session_start', (_event, ctx) => {\n for (const problem of outcome.problems) ctx.ui.notify(problem, WARNING);\n if (outcome.stale) ctx.ui.notify(STALE_MESSAGE, WARNING);\n });\n\n pi.on('session_shutdown', async (_event, ctx) => {\n const repoRoot = findSyncedRoot(ctx.cwd);\n if (!repoRoot) return;\n // The state file first, so nothing is left pointing at a path that is\n // about to disappear, then the directory it lived in.\n disposeHarnessState();\n await cleanupRunDirectory(repoRoot);\n });\n}\n"],"mappings":"mIAaA,MAAM,EAAU,UAUhB,eAA8B,EAAc,EAAiC,CAC3E,EAAA,kBAAkB,EAAG,CAErB,IAAM,EAA0B,MAAMA,EAAAA,mBAAmB,EAAG,CAI5D,EAAG,GAAG,iBAAkB,EAAQ,IAAQ,CACtC,IAAK,IAAM,KAAW,EAAQ,SAAU,EAAI,GAAG,OAAO,EAAS,EAAQ,CACnE,EAAQ,OAAO,EAAI,GAAG,OAAO,8DAAe,EAAQ,EACxD,CAEF,EAAG,GAAG,mBAAoB,MAAO,EAAQ,IAAQ,CAC/C,IAAM,EAAWC,EAAAA,eAAe,EAAI,IAAI,CACnC,KAGL,EAAA,EAAA,sBAAqB,CACrB,MAAMC,EAAAA,oBAAoB,EAAS,GACnC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"doom.d.cts","names":[],"sources":["../../src/entries/doom.ts"],"mappings":";;;;;AACoE;;;;;iBAsBtC,aAAA,CAAc,EAAA,EAAI,YAAA,GAAe,OAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"doom.d.mts","names":[],"sources":["../../src/entries/doom.ts"],"mappings":";;;;;AACoE;;;;;iBAsBtC,aAAA,CAAc,EAAA,EAAI,YAAA,GAAe,OAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"doom.mjs","names":[],"sources":["../../src/entries/doom.ts"],"sourcesContent":["import { disposeHarnessState } from '@agimon-ai/doompi-config';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n// Imported from the module rather than the barrel: Pi loads this file directly\n// and it is the first thing a synced session runs, so it pulls in nothing it\n// does not use.\nimport {\n cleanupRunDirectory,\n composeDoomSession,\n findSyncedRoot,\n registerDoomFlags,\n type ComposeOutcome,\n} from '../services/composer.ts';\n\nconst WARNING = 'warning';\nconst STALE_MESSAGE = 'doompi config changed since the last sync. Run doompi sync.';\n\n/**\n * The one entry `doom-pi sync` puts in Pi's own config.\n *\n * Everything doom-pi contributes to a plain `pi` session is loaded from here,\n * which is what keeps `.pi/settings.json` to a single stable line and lets the\n * whole matrix be recomposed on `/reload` rather than frozen at startup.\n */\nexport default async function doomExtension(pi: ExtensionAPI): Promise<void> {\n registerDoomFlags(pi);\n\n const outcome: ComposeOutcome = await composeDoomSession(pi);\n\n // Reported on session_start rather than thrown: composition problems have to\n // reach the user through the UI, and the UI does not exist yet at load time.\n pi.on('session_start', (_event, ctx) => {\n for (const problem of outcome.problems) ctx.ui.notify(problem, WARNING);\n if (outcome.stale) ctx.ui.notify(STALE_MESSAGE, WARNING);\n });\n\n pi.on('session_shutdown', async (_event, ctx) => {\n const repoRoot = findSyncedRoot(ctx.cwd);\n if (!repoRoot) return;\n // The state file first, so nothing is left pointing at a path that is\n // about to disappear, then the directory it lived in.\n disposeHarnessState();\n await cleanupRunDirectory(repoRoot);\n });\n}\n"],"mappings":"iMAaA,MAAM,EAAU,UAUhB,eAA8B,EAAc,EAAiC,CAC3E,EAAkB,EAAG,CAErB,IAAM,EAA0B,MAAM,EAAmB,EAAG,CAI5D,EAAG,GAAG,iBAAkB,EAAQ,IAAQ,CACtC,IAAK,IAAM,KAAW,EAAQ,SAAU,EAAI,GAAG,OAAO,EAAS,EAAQ,CACnE,EAAQ,OAAO,EAAI,GAAG,OAAO,8DAAe,EAAQ,EACxD,CAEF,EAAG,GAAG,mBAAoB,MAAO,EAAQ,IAAQ,CAC/C,IAAM,EAAW,EAAe,EAAI,IAAI,CACnC,IAGL,GAAqB,CACrB,MAAM,EAAoB,EAAS,GACnC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"effort.cjs","names":["SettingsManager"],"sources":["../../src/entries/effort.ts"],"sourcesContent":["import { SettingsManager, type ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\ntype ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\nconst THINKING_LEVELS: ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];\n\nexport function parseEffortLevel(args: string): ThinkingLevel | undefined {\n const [level] = args.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n return THINKING_LEVELS.find((candidate) => candidate === level);\n}\n\nexport function effortUsage(): string {\n return `Usage: /effort <${THINKING_LEVELS.join('|')}>`;\n}\n\nexport default function effortExtension(pi: ExtensionAPI): void {\n pi.registerCommand('effort', {\n description: 'Set thinking effort and persist it as the default for future sessions',\n getArgumentCompletions: (prefix) => {\n const query = prefix.trim().toLowerCase();\n return THINKING_LEVELS.filter((level) => level.startsWith(query)).map((level) => ({\n value: level,\n label: level,\n }));\n },\n handler: async (args, ctx) => {\n const requestedLevel = parseEffortLevel(args);\n if (!requestedLevel) {\n ctx.ui.notify(`${effortUsage()}\\nCurrent effort: ${pi.getThinkingLevel()}`, 'warning');\n return;\n }\n\n pi.setThinkingLevel(requestedLevel);\n const effectiveLevel = pi.getThinkingLevel();\n\n const settings = SettingsManager.create(ctx.cwd);\n settings.setDefaultThinkingLevel(requestedLevel);\n await settings.flush();\n\n const suffix = effectiveLevel === requestedLevel ? '' : ` Current model clamps it to ${effectiveLevel}.`;\n ctx.ui.notify(`Effort set to ${requestedLevel} and saved for future sessions.${suffix}`, 'info');\n },\n });\n}\n"],"mappings":"6LAIA,MAAM,EAAmC,CAAC,MAAO,UAAW,MAAO,SAAU,OAAQ,QAAS,MAAM,CAEpG,SAAgB,EAAiB,EAAyC,CACxE,GAAM,CAAC,GAAS,EAAK,MAAM,CAAC,aAAa,CAAC,MAAM,MAAM,CAAC,OAAO,QAAQ,CACtE,OAAO,EAAgB,KAAM,GAAc,IAAc,EAAM,CAGjE,SAAgB,GAAsB,CACpC,MAAO,mBAAmB,EAAgB,KAAK,IAAI,CAAC,GAGtD,SAAwB,EAAgB,EAAwB,CAC9D,EAAG,gBAAgB,SAAU,CAC3B,YAAa,wEACb,uBAAyB,GAAW,CAClC,IAAM,EAAQ,EAAO,MAAM,CAAC,aAAa,CACzC,OAAO,EAAgB,OAAQ,GAAU,EAAM,WAAW,EAAM,CAAC,CAAC,IAAK,IAAW,CAChF,MAAO,EACP,MAAO,EACR,EAAE,EAEL,QAAS,MAAO,EAAM,IAAQ,CAC5B,IAAM,EAAiB,EAAiB,EAAK,CAC7C,GAAI,CAAC,EAAgB,CACnB,EAAI,GAAG,OAAO,GAAG,GAAa,CAAC,oBAAoB,EAAG,kBAAkB,GAAI,UAAU,CACtF,OAGF,EAAG,iBAAiB,EAAe,CACnC,IAAM,EAAiB,EAAG,kBAAkB,CAEtC,EAAWA,EAAAA,gBAAgB,OAAO,EAAI,IAAI,CAChD,EAAS,wBAAwB,EAAe,CAChD,MAAM,EAAS,OAAO,CAEtB,IAAM,EAAS,IAAmB,EAAiB,GAAK,+BAA+B,EAAe,GACtG,EAAI,GAAG,OAAO,iBAAiB,EAAe,iCAAiC,IAAU,OAAO,EAEnG,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"effort.d.cts","names":[],"sources":["../../src/entries/effort.ts"],"mappings":";;;KAEK,aAAA;AAAA,iBAIW,gBAAA,CAAiB,IAAA,WAAe,aAAA;AAAA,iBAKhC,WAAA,CAAA;AAAA,iBAIQ,eAAA,CAAgB,EAAA,EAAI,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"effort.d.mts","names":[],"sources":["../../src/entries/effort.ts"],"mappings":";;;KAEK,aAAA;AAAA,iBAIW,gBAAA,CAAiB,IAAA,WAAe,aAAA;AAAA,iBAKhC,WAAA,CAAA;AAAA,iBAIQ,eAAA,CAAgB,EAAA,EAAI,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"effort.mjs","names":[],"sources":["../../src/entries/effort.ts"],"sourcesContent":["import { SettingsManager, type ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\ntype ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\nconst THINKING_LEVELS: ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];\n\nexport function parseEffortLevel(args: string): ThinkingLevel | undefined {\n const [level] = args.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n return THINKING_LEVELS.find((candidate) => candidate === level);\n}\n\nexport function effortUsage(): string {\n return `Usage: /effort <${THINKING_LEVELS.join('|')}>`;\n}\n\nexport default function effortExtension(pi: ExtensionAPI): void {\n pi.registerCommand('effort', {\n description: 'Set thinking effort and persist it as the default for future sessions',\n getArgumentCompletions: (prefix) => {\n const query = prefix.trim().toLowerCase();\n return THINKING_LEVELS.filter((level) => level.startsWith(query)).map((level) => ({\n value: level,\n label: level,\n }));\n },\n handler: async (args, ctx) => {\n const requestedLevel = parseEffortLevel(args);\n if (!requestedLevel) {\n ctx.ui.notify(`${effortUsage()}\\nCurrent effort: ${pi.getThinkingLevel()}`, 'warning');\n return;\n }\n\n pi.setThinkingLevel(requestedLevel);\n const effectiveLevel = pi.getThinkingLevel();\n\n const settings = SettingsManager.create(ctx.cwd);\n settings.setDefaultThinkingLevel(requestedLevel);\n await settings.flush();\n\n const suffix = effectiveLevel === requestedLevel ? '' : ` Current model clamps it to ${effectiveLevel}.`;\n ctx.ui.notify(`Effort set to ${requestedLevel} and saved for future sessions.${suffix}`, 'info');\n },\n });\n}\n"],"mappings":"kEAIA,MAAM,EAAmC,CAAC,MAAO,UAAW,MAAO,SAAU,OAAQ,QAAS,MAAM,CAEpG,SAAgB,EAAiB,EAAyC,CACxE,GAAM,CAAC,GAAS,EAAK,MAAM,CAAC,aAAa,CAAC,MAAM,MAAM,CAAC,OAAO,QAAQ,CACtE,OAAO,EAAgB,KAAM,GAAc,IAAc,EAAM,CAGjE,SAAgB,GAAsB,CACpC,MAAO,mBAAmB,EAAgB,KAAK,IAAI,CAAC,GAGtD,SAAwB,EAAgB,EAAwB,CAC9D,EAAG,gBAAgB,SAAU,CAC3B,YAAa,wEACb,uBAAyB,GAAW,CAClC,IAAM,EAAQ,EAAO,MAAM,CAAC,aAAa,CACzC,OAAO,EAAgB,OAAQ,GAAU,EAAM,WAAW,EAAM,CAAC,CAAC,IAAK,IAAW,CAChF,MAAO,EACP,MAAO,EACR,EAAE,EAEL,QAAS,MAAO,EAAM,IAAQ,CAC5B,IAAM,EAAiB,EAAiB,EAAK,CAC7C,GAAI,CAAC,EAAgB,CACnB,EAAI,GAAG,OAAO,GAAG,GAAa,CAAC,oBAAoB,EAAG,kBAAkB,GAAI,UAAU,CACtF,OAGF,EAAG,iBAAiB,EAAe,CACnC,IAAM,EAAiB,EAAG,kBAAkB,CAEtC,EAAW,EAAgB,OAAO,EAAI,IAAI,CAChD,EAAS,wBAAwB,EAAe,CAChD,MAAM,EAAS,OAAO,CAEtB,IAAM,EAAS,IAAmB,EAAiB,GAAK,+BAA+B,EAAe,GACtG,EAAI,GAAG,OAAO,iBAAiB,EAAe,iCAAiC,IAAU,OAAO,EAEnG,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"majorMode.cjs","names":["createHarnessTelemetry","HARNESS_EVENT","MatrixPickerComponent","alreadyComposed","filterHookDisabledLayers","needsRelaunch","applyMajorMode"],"sources":["../../src/entries/majorMode.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport type { ExtensionAPI, ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport type { SelectItem } from '@earendil-works/pi-tui';\nimport { persistHarnessSelection, requireHarnessRoot } from '../config/harnessState.ts';\nimport { type MajorModesConfig, loadMajorModesConfig, resolveLayers } from '@agimon-ai/doompi-config/majorModes';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\nimport { alreadyComposed } from '../services/composer.ts';\nimport { filterHookDisabledLayers } from '../services/extensionAssembler.ts';\nimport { applyMajorMode, needsRelaunch } from '../services/matrixSwitcher.ts';\nimport { MatrixPickerComponent } from './components/matrixPicker.ts';\n\nconst STATUS_KEY = 'doom-major-mode';\nconst OPTION_PREFIX = /^\\[[ x]\\] /;\nconst CORE_ONLY = 'core only';\nconst MARK_ON = '[x]';\nconst MARK_OFF = '[ ]';\nconst RELAUNCH = 'Relaunch with:';\nconst MAJOR_MODE_OPTION = '--major-mode';\n\n/** Major mode names in the declaration order used by the picker. */\nexport function majorModeNames(config: MajorModesConfig): string[] {\n return Object.keys(config.majorMode);\n}\n\n/** Picker rows show the resolved layers while retaining bare major mode values. */\nexport function majorModeItems(config: MajorModesConfig, names: string[]): SelectItem[] {\n return names.map((name) => ({\n value: name,\n label: name,\n description: (config.majorMode[name] ?? []).join(', ') || CORE_ONLY,\n }));\n}\n\nexport function majorModeOptionLabel(name: string, layers: string[], current: string): string {\n return `${name === current ? MARK_ON : MARK_OFF} ${name}: ${layers.join(', ') || CORE_ONLY}`;\n}\n\nexport function optionName(option: string): string {\n return option.replace(OPTION_PREFIX, '').split(':')[0] ?? option;\n}\n\n/** Compact footer text for the selected major mode, domains, and profile. */\nexport function statusText(majorMode: string, domains: readonly string[], profile?: string): string {\n return [profile ? `*${profile}*` : undefined, `[${majorMode}]`, domains.join(',')]\n .filter((part) => Boolean(part))\n .join(':');\n}\n\nexport function colorStatus(\n theme: Theme,\n majorMode: string,\n domains: readonly string[],\n profile: string | undefined,\n pending: boolean,\n): string {\n const parts = [\n profile ? theme.fg('success', theme.bold(`*${profile}*`)) : undefined,\n theme.fg(pending ? 'warning' : 'accent', `[${majorMode}]`),\n domains.length > 0 ? theme.fg('muted', domains.join(',')) : undefined,\n ].filter((part): part is string => Boolean(part));\n return parts.join(theme.fg('dim', ':'));\n}\n\n/**\n * What a switch actually applied.\n *\n * A synced session composes its extension set on every load, so a reload picks\n * up the new layers outright. A launcher session cannot: Pi freezes the CLI\n * `--extension` list at construction, so a layer that contributes extensions\n * needs a relaunch there and only the hooks change in place.\n */\nexport function applySummary(picked: string, layers: string[], stale: boolean, composed = false): string {\n const head = `Switched to ${picked}: ${layers.join(', ') || CORE_ONLY}`;\n if (!stale || composed) return [head, 'Hooks reloaded.'].join('\\n');\n return [\n head,\n 'Hooks reloaded. Extensions are fixed at launch, so for those:',\n ` ./pi.sh ${MAJOR_MODE_OPTION} ${picked}`,\n ].join('\\n');\n}\n\nexport function majorModeSummary(picked: string, layers: string[], current: string, composed = false): string {\n const contents = `Major mode ${picked}: ${layers.join(', ') || CORE_ONLY}`;\n if (picked !== current && !composed) {\n return [contents, `${RELAUNCH}\\n ./pi.sh ${MAJOR_MODE_OPTION} ${picked}`].join('\\n');\n }\n if (picked !== current) return contents;\n return [contents, 'Already using this major mode.'].join('\\n');\n}\n\ninterface MajorModeView {\n config: MajorModesConfig;\n majorMode: string;\n active: string[];\n domains: readonly string[];\n profile?: string;\n hooks: boolean;\n}\n\nfunction currentView(ctx: ExtensionContext): MajorModeView {\n const state = requireDoomConfigContext(ctx).harness;\n const root = requireHarnessRoot(state);\n const config = loadMajorModesConfig(root);\n const resolved = resolveLayers(config, state.majorMode);\n return {\n config,\n majorMode: state.majorMode,\n active: state.layers.length === 0 ? resolved : [...state.layers],\n domains: state.domains,\n profile: state.profile,\n hooks: state.hooks,\n };\n}\n\nexport default function majorModeExtension(\n pi: ExtensionAPI,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): void {\n pi.on('session_start', (_event, ctx) => {\n try {\n const { majorMode, domains, profile } = currentView(ctx);\n ctx.ui.setStatus(STATUS_KEY, colorStatus(ctx.ui.theme, majorMode, domains, profile, false));\n } catch (error) {\n // The status line degrades to a message nobody reads, while the run keeps\n // going with whatever layers the environment happened to carry.\n void telemetry.recordWarning(HARNESS_EVENT.majorModeUnavailable, error);\n ctx.ui.setStatus(\n STATUS_KEY,\n `major mode unavailable (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n });\n\n pi.registerCommand('major-mode', {\n description: 'Pick a named major mode',\n handler: async (args, ctx) => {\n if (args.trim()) {\n ctx.ui.notify('Usage: /major-mode', 'warning');\n return;\n }\n\n const { config, majorMode, active, domains, profile, hooks } = currentView(ctx);\n const names = majorModeNames(config);\n const title = `Major mode (current: ${majorMode})`;\n const chosen =\n ctx.mode === 'tui'\n ? await ctx.ui.custom<string[] | undefined>(\n (_tui, theme, keybindings, done) =>\n new MatrixPickerComponent(\n { title, items: majorModeItems(config, names), selected: [majorMode], multi: false },\n theme,\n keybindings,\n done,\n ),\n )\n : [\n optionName(\n (await ctx.ui.select(\n title,\n names.map((name) => majorModeOptionLabel(name, config.majorMode[name] ?? [], majorMode)),\n )) ?? '',\n ),\n ];\n const picked = chosen?.[0];\n if (!picked) return;\n\n const composed = alreadyComposed();\n if (picked === majorMode) {\n ctx.ui.notify(majorModeSummary(picked, resolveLayers(config, picked), majorMode, composed), 'info');\n return;\n }\n\n const selected = filterHookDisabledLayers(resolveLayers(config, picked), hooks);\n const stale = needsRelaunch(config, active, selected);\n const updated = applyMajorMode(config, picked, requireDoomConfigContext(ctx).harness);\n persistHarnessSelection(pi, updated);\n void telemetry.recordEvent(HARNESS_EVENT.majorModeSwitched, {\n 'harness.major_mode.previous': majorMode,\n 'harness.major_mode': picked,\n 'harness.layers': selected.join(','),\n 'harness.major_mode.stale': stale,\n });\n ctx.ui.setStatus(STATUS_KEY, colorStatus(ctx.ui.theme, picked, domains, profile, stale && !composed));\n ctx.ui.notify(applySummary(picked, selected, stale, composed), 'info');\n await ctx.waitForIdle();\n await ctx.reload();\n },\n });\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"majorMode.d.cts","names":[],"sources":["../../src/entries/majorMode.ts"],"mappings":";;;;;;;iBAoBgB,cAAA,CAAe,MAAA,EAAQ,gBAAA;AAAvC;AAAA,iBAKgB,cAAA,CAAe,MAAA,EAAQ,gBAAA,EAAkB,KAAA,aAAkB,UAAA;AAAA,iBAQ3D,oBAAA,CAAqB,IAAA,UAAc,MAAA,YAAkB,OAAA;AAAA,iBAIrD,UAAA,CAAW,MAAA;;iBAKX,UAAA,CAAW,SAAA,UAAmB,OAAA,qBAA4B,OAAA;AAAA,iBAM1D,WAAA,CACd,KAAA,EAAO,KAAA,EACP,SAAA,UACA,OAAA,qBACA,OAAA,sBACA,OAAA;;;;;;;;;iBAkBc,YAAA,CAAa,MAAA,UAAgB,MAAA,YAAkB,KAAA,WAAgB,QAAA;AAAA,iBAU/D,gBAAA,CAAiB,MAAA,UAAgB,MAAA,YAAkB,OAAA,UAAiB,QAAA;AAAA,iBAiC5D,kBAAA,CACtB,EAAA,EAAI,YAAA,EACJ,SAAA,GAAW,gBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"majorMode.d.mts","names":[],"sources":["../../src/entries/majorMode.ts"],"mappings":";;;;;;;iBAoBgB,cAAA,CAAe,MAAA,EAAQ,gBAAA;AAAvC;AAAA,iBAKgB,cAAA,CAAe,MAAA,EAAQ,gBAAA,EAAkB,KAAA,aAAkB,UAAA;AAAA,iBAQ3D,oBAAA,CAAqB,IAAA,UAAc,MAAA,YAAkB,OAAA;AAAA,iBAIrD,UAAA,CAAW,MAAA;;iBAKX,UAAA,CAAW,SAAA,UAAmB,OAAA,qBAA4B,OAAA;AAAA,iBAM1D,WAAA,CACd,KAAA,EAAO,KAAA,EACP,SAAA,UACA,OAAA,qBACA,OAAA,sBACA,OAAA;;;;;;;;;iBAkBc,YAAA,CAAa,MAAA,UAAgB,MAAA,YAAkB,KAAA,WAAgB,QAAA;AAAA,iBAU/D,gBAAA,CAAiB,MAAA,UAAgB,MAAA,YAAkB,OAAA,UAAiB,QAAA;AAAA,iBAiC5D,kBAAA,CACtB,EAAA,EAAI,YAAA,EACJ,SAAA,GAAW,gBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"majorMode.mjs","names":[],"sources":["../../src/entries/majorMode.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport type { ExtensionAPI, ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport type { SelectItem } from '@earendil-works/pi-tui';\nimport { persistHarnessSelection, requireHarnessRoot } from '../config/harnessState.ts';\nimport { type MajorModesConfig, loadMajorModesConfig, resolveLayers } from '@agimon-ai/doompi-config/majorModes';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\nimport { alreadyComposed } from '../services/composer.ts';\nimport { filterHookDisabledLayers } from '../services/extensionAssembler.ts';\nimport { applyMajorMode, needsRelaunch } from '../services/matrixSwitcher.ts';\nimport { MatrixPickerComponent } from './components/matrixPicker.ts';\n\nconst STATUS_KEY = 'doom-major-mode';\nconst OPTION_PREFIX = /^\\[[ x]\\] /;\nconst CORE_ONLY = 'core only';\nconst MARK_ON = '[x]';\nconst MARK_OFF = '[ ]';\nconst RELAUNCH = 'Relaunch with:';\nconst MAJOR_MODE_OPTION = '--major-mode';\n\n/** Major mode names in the declaration order used by the picker. */\nexport function majorModeNames(config: MajorModesConfig): string[] {\n return Object.keys(config.majorMode);\n}\n\n/** Picker rows show the resolved layers while retaining bare major mode values. */\nexport function majorModeItems(config: MajorModesConfig, names: string[]): SelectItem[] {\n return names.map((name) => ({\n value: name,\n label: name,\n description: (config.majorMode[name] ?? []).join(', ') || CORE_ONLY,\n }));\n}\n\nexport function majorModeOptionLabel(name: string, layers: string[], current: string): string {\n return `${name === current ? MARK_ON : MARK_OFF} ${name}: ${layers.join(', ') || CORE_ONLY}`;\n}\n\nexport function optionName(option: string): string {\n return option.replace(OPTION_PREFIX, '').split(':')[0] ?? option;\n}\n\n/** Compact footer text for the selected major mode, domains, and profile. */\nexport function statusText(majorMode: string, domains: readonly string[], profile?: string): string {\n return [profile ? `*${profile}*` : undefined, `[${majorMode}]`, domains.join(',')]\n .filter((part) => Boolean(part))\n .join(':');\n}\n\nexport function colorStatus(\n theme: Theme,\n majorMode: string,\n domains: readonly string[],\n profile: string | undefined,\n pending: boolean,\n): string {\n const parts = [\n profile ? theme.fg('success', theme.bold(`*${profile}*`)) : undefined,\n theme.fg(pending ? 'warning' : 'accent', `[${majorMode}]`),\n domains.length > 0 ? theme.fg('muted', domains.join(',')) : undefined,\n ].filter((part): part is string => Boolean(part));\n return parts.join(theme.fg('dim', ':'));\n}\n\n/**\n * What a switch actually applied.\n *\n * A synced session composes its extension set on every load, so a reload picks\n * up the new layers outright. A launcher session cannot: Pi freezes the CLI\n * `--extension` list at construction, so a layer that contributes extensions\n * needs a relaunch there and only the hooks change in place.\n */\nexport function applySummary(picked: string, layers: string[], stale: boolean, composed = false): string {\n const head = `Switched to ${picked}: ${layers.join(', ') || CORE_ONLY}`;\n if (!stale || composed) return [head, 'Hooks reloaded.'].join('\\n');\n return [\n head,\n 'Hooks reloaded. Extensions are fixed at launch, so for those:',\n ` ./pi.sh ${MAJOR_MODE_OPTION} ${picked}`,\n ].join('\\n');\n}\n\nexport function majorModeSummary(picked: string, layers: string[], current: string, composed = false): string {\n const contents = `Major mode ${picked}: ${layers.join(', ') || CORE_ONLY}`;\n if (picked !== current && !composed) {\n return [contents, `${RELAUNCH}\\n ./pi.sh ${MAJOR_MODE_OPTION} ${picked}`].join('\\n');\n }\n if (picked !== current) return contents;\n return [contents, 'Already using this major mode.'].join('\\n');\n}\n\ninterface MajorModeView {\n config: MajorModesConfig;\n majorMode: string;\n active: string[];\n domains: readonly string[];\n profile?: string;\n hooks: boolean;\n}\n\nfunction currentView(ctx: ExtensionContext): MajorModeView {\n const state = requireDoomConfigContext(ctx).harness;\n const root = requireHarnessRoot(state);\n const config = loadMajorModesConfig(root);\n const resolved = resolveLayers(config, state.majorMode);\n return {\n config,\n majorMode: state.majorMode,\n active: state.layers.length === 0 ? resolved : [...state.layers],\n domains: state.domains,\n profile: state.profile,\n hooks: state.hooks,\n };\n}\n\nexport default function majorModeExtension(\n pi: ExtensionAPI,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): void {\n pi.on('session_start', (_event, ctx) => {\n try {\n const { majorMode, domains, profile } = currentView(ctx);\n ctx.ui.setStatus(STATUS_KEY, colorStatus(ctx.ui.theme, majorMode, domains, profile, false));\n } catch (error) {\n // The status line degrades to a message nobody reads, while the run keeps\n // going with whatever layers the environment happened to carry.\n void telemetry.recordWarning(HARNESS_EVENT.majorModeUnavailable, error);\n ctx.ui.setStatus(\n STATUS_KEY,\n `major mode unavailable (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n });\n\n pi.registerCommand('major-mode', {\n description: 'Pick a named major mode',\n handler: async (args, ctx) => {\n if (args.trim()) {\n ctx.ui.notify('Usage: /major-mode', 'warning');\n return;\n }\n\n const { config, majorMode, active, domains, profile, hooks } = currentView(ctx);\n const names = majorModeNames(config);\n const title = `Major mode (current: ${majorMode})`;\n const chosen =\n ctx.mode === 'tui'\n ? await ctx.ui.custom<string[] | undefined>(\n (_tui, theme, keybindings, done) =>\n new MatrixPickerComponent(\n { title, items: majorModeItems(config, names), selected: [majorMode], multi: false },\n theme,\n keybindings,\n done,\n ),\n )\n : [\n optionName(\n (await ctx.ui.select(\n title,\n names.map((name) => majorModeOptionLabel(name, config.majorMode[name] ?? [], majorMode)),\n )) ?? '',\n ),\n ];\n const picked = chosen?.[0];\n if (!picked) return;\n\n const composed = alreadyComposed();\n if (picked === majorMode) {\n ctx.ui.notify(majorModeSummary(picked, resolveLayers(config, picked), majorMode, composed), 'info');\n return;\n }\n\n const selected = filterHookDisabledLayers(resolveLayers(config, picked), hooks);\n const stale = needsRelaunch(config, active, selected);\n const updated = applyMajorMode(config, picked, requireDoomConfigContext(ctx).harness);\n persistHarnessSelection(pi, updated);\n void telemetry.recordEvent(HARNESS_EVENT.majorModeSwitched, {\n 'harness.major_mode.previous': majorMode,\n 'harness.major_mode': picked,\n 'harness.layers': selected.join(','),\n 'harness.major_mode.stale': stale,\n });\n ctx.ui.setStatus(STATUS_KEY, colorStatus(ctx.ui.theme, picked, domains, profile, stale && !composed));\n ctx.ui.notify(applySummary(picked, selected, stale, composed), 'info');\n await ctx.waitForIdle();\n await ctx.reload();\n },\n });\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"notifications.cjs","names":["path","ASK_USER_PROMPT_EVENT","prompt","ASK_USER_BLOCKED_EVENT"],"sources":["../../src/entries/notifications.ts"],"sourcesContent":["import path from 'node:path';\nimport type { ExtensionAPI, ExtensionContext, ExtensionUIContext } from '@earendil-works/pi-coding-agent';\nimport {\n ASK_USER_BLOCKED_EVENT,\n ASK_USER_PROMPT_EVENT,\n type AskUserBlockedEventPayload,\n type AskUserPromptEventPayload,\n} from '@juicesharp/rpiv-ask-user-question/events';\n\ninterface Notification {\n title: string;\n subtitle: string;\n body: string;\n}\n\nconst BRAILLE_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\nconst COMMAND_TIMEOUT_MS = 3_000;\nconst EXTENSION_INPUT_SOURCE = 'extension';\nconst INPUT_EVENT = 'input';\nconst MAX_BODY_LENGTH = 240;\nconst MAX_PROMPT_TITLE_LENGTH = 36;\nconst OSASCRIPT_EXPRESSION_FLAG = '-e';\nconst TITLE_FRAME_INTERVAL_MS = 80;\n\nfunction promptTitle(prompt: string): string | undefined {\n const normalized = prompt.replace(/\\s+/g, ' ').trim();\n if (!normalized) return undefined;\n return normalized.length > MAX_PROMPT_TITLE_LENGTH\n ? `${normalized.slice(0, MAX_PROMPT_TITLE_LENGTH - 1)}…`\n : normalized;\n}\n\nfunction shellTabTitle(pi: ExtensionAPI, cwd: string, prompt?: string, frame?: string): string {\n const prefix = frame ? `${frame} ` : '';\n const repository = path.basename(cwd);\n const label = pi.getSessionName() ?? prompt;\n return label ? `${prefix}π - ${label} - ${repository}` : `${prefix}π - ${repository}`;\n}\n\nfunction notificationBody(body: string): string {\n const normalized = body.replace(/\\s+/g, ' ').trim();\n return normalized.length > MAX_BODY_LENGTH ? `${normalized.slice(0, MAX_BODY_LENGTH - 1)}…` : normalized;\n}\n\nasync function execute(pi: ExtensionAPI, command: string, args: string[]): Promise<boolean> {\n try {\n const result = await pi.exec(command, args, { timeout: COMMAND_TIMEOUT_MS });\n return result.code === 0;\n } catch {\n return false;\n }\n}\n\nexport async function sendSystemNotification(\n pi: ExtensionAPI,\n notification: Notification,\n platform = process.platform,\n): Promise<void> {\n const body = notificationBody(notification.body);\n const sentToCmux = await execute(pi, 'cmux', [\n 'notify',\n '--title',\n notification.title,\n '--subtitle',\n notification.subtitle,\n '--body',\n body,\n ]);\n if (sentToCmux || platform !== 'darwin') return;\n\n await execute(pi, 'osascript', [\n OSASCRIPT_EXPRESSION_FLAG,\n 'on run argv',\n OSASCRIPT_EXPRESSION_FLAG,\n 'display notification (item 3 of argv) with title (item 1 of argv) subtitle (item 2 of argv)',\n OSASCRIPT_EXPRESSION_FLAG,\n 'end run',\n notification.title,\n notification.subtitle,\n body,\n ]);\n}\n\nfunction wrapAttentionDialogs(\n ui: ExtensionUIContext,\n shouldNotify: () => boolean,\n notify: (title: string) => void,\n): void {\n const originalConfirm = ui.confirm.bind(ui);\n ui.confirm = (title, message, options) => {\n if (shouldNotify()) notify(`${title}: ${message}`);\n return originalConfirm(title, message, options);\n };\n\n const originalSelect = ui.select.bind(ui);\n ui.select = (title, options, dialogOptions) => {\n if (shouldNotify()) notify(title);\n return originalSelect(title, options, dialogOptions);\n };\n\n const originalInput = ui.input.bind(ui);\n ui.input = (title, placeholder, options) => {\n if (shouldNotify()) notify(title);\n return originalInput(title, placeholder, options);\n };\n\n const originalEditor = ui.editor.bind(ui);\n ui.editor = (title, prefill) => {\n if (shouldNotify()) notify(title);\n return originalEditor(title, prefill);\n };\n}\n\nexport default function notifications(pi: ExtensionAPI): void {\n if (process.env.PI_SUBAGENT_CHILD) return;\n\n let agentRunning = false;\n let askUserBlocked = false;\n let firstPromptTitle: string | undefined;\n let frameIndex = 0;\n let titleTimer: ReturnType<typeof setInterval> | undefined;\n const wrappedUis = new WeakSet<ExtensionUIContext>();\n const stopTitleAnimation = (context: ExtensionContext) => {\n if (titleTimer) {\n clearInterval(titleTimer);\n titleTimer = undefined;\n }\n frameIndex = 0;\n if (context.hasUI) context.ui.setTitle(shellTabTitle(pi, context.cwd, firstPromptTitle));\n };\n const startTitleAnimation = (context: ExtensionContext) => {\n stopTitleAnimation(context);\n if (!context.hasUI) return;\n\n const renderFrame = () => {\n context.ui.setTitle(\n shellTabTitle(pi, context.cwd, firstPromptTitle, BRAILLE_FRAMES[frameIndex % BRAILLE_FRAMES.length]),\n );\n frameIndex += 1;\n };\n renderFrame();\n titleTimer = setInterval(renderFrame, TITLE_FRAME_INTERVAL_MS);\n };\n const notifyAttention = (body: string) => {\n void sendSystemNotification(pi, {\n title: 'Pi needs your input',\n subtitle: 'Approval or feedback required',\n body,\n });\n };\n\n pi.events.on(ASK_USER_PROMPT_EVENT, (payload) => {\n const prompt = payload as AskUserPromptEventPayload;\n const firstQuestion = prompt.questions[0]?.question ?? 'The agent is waiting for your feedback.';\n notifyAttention(firstQuestion);\n });\n pi.events.on(ASK_USER_BLOCKED_EVENT, (payload) => {\n askUserBlocked = (payload as AskUserBlockedEventPayload).active;\n });\n\n pi.on(INPUT_EVENT, (event, context) => {\n if (firstPromptTitle || event.source === EXTENSION_INPUT_SOURCE) return;\n\n firstPromptTitle = promptTitle(event.text);\n if (firstPromptTitle && context.hasUI) {\n context.ui.setTitle(shellTabTitle(pi, context.cwd, firstPromptTitle));\n }\n });\n\n pi.on('session_start', (_event, context) => {\n if (wrappedUis.has(context.ui)) return;\n wrappedUis.add(context.ui);\n wrapAttentionDialogs(context.ui, () => agentRunning && !askUserBlocked, notifyAttention);\n });\n\n pi.on('agent_start', (_event, context) => {\n agentRunning = true;\n startTitleAnimation(context);\n });\n\n pi.on('agent_settled', async (_event, context) => {\n agentRunning = false;\n askUserBlocked = false;\n stopTitleAnimation(context);\n if (context.hasPendingMessages()) return;\n\n await sendSystemNotification(pi, {\n title: 'Pi finished',\n subtitle: pi.getSessionName() ?? path.basename(context.cwd),\n body: 'The agent finished its work and is waiting for you.',\n });\n });\n\n pi.on('session_shutdown', (_event, context) => {\n agentRunning = false;\n askUserBlocked = false;\n stopTitleAnimation(context);\n });\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"notifications.d.cts","names":[],"sources":["../../src/entries/notifications.ts"],"mappings":";;;UASU,YAAA;EACR,KAAA;EACA,QAAA;EACA,IAAA;AAAA;AAAA,iBAyCoB,sBAAA,CACpB,EAAA,EAAI,YAAA,EACJ,YAAA,EAAc,YAAA,EACd,QAAA,GAAQ,MAAA,CAAA,QAAA,GACP,OAAA;AAAA,iBAwDqB,aAAA,CAAc,EAAA,EAAI,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"notifications.d.mts","names":[],"sources":["../../src/entries/notifications.ts"],"mappings":";;;UASU,YAAA;EACR,KAAA;EACA,QAAA;EACA,IAAA;AAAA;AAAA,iBAyCoB,sBAAA,CACpB,EAAA,EAAI,YAAA,EACJ,YAAA,EAAc,YAAA,EACd,QAAA,GAAQ,MAAA,CAAA,QAAA,GACP,OAAA;AAAA,iBAwDqB,aAAA,CAAc,EAAA,EAAI,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"notifications.mjs","names":["prompt"],"sources":["../../src/entries/notifications.ts"],"sourcesContent":["import path from 'node:path';\nimport type { ExtensionAPI, ExtensionContext, ExtensionUIContext } from '@earendil-works/pi-coding-agent';\nimport {\n ASK_USER_BLOCKED_EVENT,\n ASK_USER_PROMPT_EVENT,\n type AskUserBlockedEventPayload,\n type AskUserPromptEventPayload,\n} from '@juicesharp/rpiv-ask-user-question/events';\n\ninterface Notification {\n title: string;\n subtitle: string;\n body: string;\n}\n\nconst BRAILLE_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\nconst COMMAND_TIMEOUT_MS = 3_000;\nconst EXTENSION_INPUT_SOURCE = 'extension';\nconst INPUT_EVENT = 'input';\nconst MAX_BODY_LENGTH = 240;\nconst MAX_PROMPT_TITLE_LENGTH = 36;\nconst OSASCRIPT_EXPRESSION_FLAG = '-e';\nconst TITLE_FRAME_INTERVAL_MS = 80;\n\nfunction promptTitle(prompt: string): string | undefined {\n const normalized = prompt.replace(/\\s+/g, ' ').trim();\n if (!normalized) return undefined;\n return normalized.length > MAX_PROMPT_TITLE_LENGTH\n ? `${normalized.slice(0, MAX_PROMPT_TITLE_LENGTH - 1)}…`\n : normalized;\n}\n\nfunction shellTabTitle(pi: ExtensionAPI, cwd: string, prompt?: string, frame?: string): string {\n const prefix = frame ? `${frame} ` : '';\n const repository = path.basename(cwd);\n const label = pi.getSessionName() ?? prompt;\n return label ? `${prefix}π - ${label} - ${repository}` : `${prefix}π - ${repository}`;\n}\n\nfunction notificationBody(body: string): string {\n const normalized = body.replace(/\\s+/g, ' ').trim();\n return normalized.length > MAX_BODY_LENGTH ? `${normalized.slice(0, MAX_BODY_LENGTH - 1)}…` : normalized;\n}\n\nasync function execute(pi: ExtensionAPI, command: string, args: string[]): Promise<boolean> {\n try {\n const result = await pi.exec(command, args, { timeout: COMMAND_TIMEOUT_MS });\n return result.code === 0;\n } catch {\n return false;\n }\n}\n\nexport async function sendSystemNotification(\n pi: ExtensionAPI,\n notification: Notification,\n platform = process.platform,\n): Promise<void> {\n const body = notificationBody(notification.body);\n const sentToCmux = await execute(pi, 'cmux', [\n 'notify',\n '--title',\n notification.title,\n '--subtitle',\n notification.subtitle,\n '--body',\n body,\n ]);\n if (sentToCmux || platform !== 'darwin') return;\n\n await execute(pi, 'osascript', [\n OSASCRIPT_EXPRESSION_FLAG,\n 'on run argv',\n OSASCRIPT_EXPRESSION_FLAG,\n 'display notification (item 3 of argv) with title (item 1 of argv) subtitle (item 2 of argv)',\n OSASCRIPT_EXPRESSION_FLAG,\n 'end run',\n notification.title,\n notification.subtitle,\n body,\n ]);\n}\n\nfunction wrapAttentionDialogs(\n ui: ExtensionUIContext,\n shouldNotify: () => boolean,\n notify: (title: string) => void,\n): void {\n const originalConfirm = ui.confirm.bind(ui);\n ui.confirm = (title, message, options) => {\n if (shouldNotify()) notify(`${title}: ${message}`);\n return originalConfirm(title, message, options);\n };\n\n const originalSelect = ui.select.bind(ui);\n ui.select = (title, options, dialogOptions) => {\n if (shouldNotify()) notify(title);\n return originalSelect(title, options, dialogOptions);\n };\n\n const originalInput = ui.input.bind(ui);\n ui.input = (title, placeholder, options) => {\n if (shouldNotify()) notify(title);\n return originalInput(title, placeholder, options);\n };\n\n const originalEditor = ui.editor.bind(ui);\n ui.editor = (title, prefill) => {\n if (shouldNotify()) notify(title);\n return originalEditor(title, prefill);\n };\n}\n\nexport default function notifications(pi: ExtensionAPI): void {\n if (process.env.PI_SUBAGENT_CHILD) return;\n\n let agentRunning = false;\n let askUserBlocked = false;\n let firstPromptTitle: string | undefined;\n let frameIndex = 0;\n let titleTimer: ReturnType<typeof setInterval> | undefined;\n const wrappedUis = new WeakSet<ExtensionUIContext>();\n const stopTitleAnimation = (context: ExtensionContext) => {\n if (titleTimer) {\n clearInterval(titleTimer);\n titleTimer = undefined;\n }\n frameIndex = 0;\n if (context.hasUI) context.ui.setTitle(shellTabTitle(pi, context.cwd, firstPromptTitle));\n };\n const startTitleAnimation = (context: ExtensionContext) => {\n stopTitleAnimation(context);\n if (!context.hasUI) return;\n\n const renderFrame = () => {\n context.ui.setTitle(\n shellTabTitle(pi, context.cwd, firstPromptTitle, BRAILLE_FRAMES[frameIndex % BRAILLE_FRAMES.length]),\n );\n frameIndex += 1;\n };\n renderFrame();\n titleTimer = setInterval(renderFrame, TITLE_FRAME_INTERVAL_MS);\n };\n const notifyAttention = (body: string) => {\n void sendSystemNotification(pi, {\n title: 'Pi needs your input',\n subtitle: 'Approval or feedback required',\n body,\n });\n };\n\n pi.events.on(ASK_USER_PROMPT_EVENT, (payload) => {\n const prompt = payload as AskUserPromptEventPayload;\n const firstQuestion = prompt.questions[0]?.question ?? 'The agent is waiting for your feedback.';\n notifyAttention(firstQuestion);\n });\n pi.events.on(ASK_USER_BLOCKED_EVENT, (payload) => {\n askUserBlocked = (payload as AskUserBlockedEventPayload).active;\n });\n\n pi.on(INPUT_EVENT, (event, context) => {\n if (firstPromptTitle || event.source === EXTENSION_INPUT_SOURCE) return;\n\n firstPromptTitle = promptTitle(event.text);\n if (firstPromptTitle && context.hasUI) {\n context.ui.setTitle(shellTabTitle(pi, context.cwd, firstPromptTitle));\n }\n });\n\n pi.on('session_start', (_event, context) => {\n if (wrappedUis.has(context.ui)) return;\n wrappedUis.add(context.ui);\n wrapAttentionDialogs(context.ui, () => agentRunning && !askUserBlocked, notifyAttention);\n });\n\n pi.on('agent_start', (_event, context) => {\n agentRunning = true;\n startTitleAnimation(context);\n });\n\n pi.on('agent_settled', async (_event, context) => {\n agentRunning = false;\n askUserBlocked = false;\n stopTitleAnimation(context);\n if (context.hasPendingMessages()) return;\n\n await sendSystemNotification(pi, {\n title: 'Pi finished',\n subtitle: pi.getSessionName() ?? path.basename(context.cwd),\n body: 'The agent finished its work and is waiting for you.',\n });\n });\n\n pi.on('session_shutdown', (_event, context) => {\n agentRunning = false;\n askUserBlocked = false;\n stopTitleAnimation(context);\n });\n}\n"],"mappings":"uSAeA,MAAM,EAAiB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAI,CASzE,SAAS,EAAY,EAAoC,CACvD,IAAM,EAAa,EAAO,QAAQ,OAAQ,IAAI,CAAC,MAAM,CAChD,KACL,OAAO,EAAW,OAAS,GACvB,GAAG,EAAW,MAAM,EAAG,GAA4B,CAAC,GACpD,EAGN,SAAS,EAAc,EAAkB,EAAa,EAAiB,EAAwB,CAC7F,IAAM,EAAS,EAAQ,GAAG,EAAM,GAAK,GAC/B,EAAa,EAAK,SAAS,EAAI,CAC/B,EAAQ,EAAG,gBAAgB,EAAI,EACrC,OAAO,EAAQ,GAAG,EAAO,MAAM,EAAM,KAAK,IAAe,GAAG,EAAO,MAAM,IAG3E,SAAS,EAAiB,EAAsB,CAC9C,IAAM,EAAa,EAAK,QAAQ,OAAQ,IAAI,CAAC,MAAM,CACnD,OAAO,EAAW,OAAS,IAAkB,GAAG,EAAW,MAAM,EAAG,IAAoB,CAAC,GAAK,EAGhG,eAAe,EAAQ,EAAkB,EAAiB,EAAkC,CAC1F,GAAI,CAEF,OAAO,MADc,EAAG,KAAK,EAAS,EAAM,CAAE,QAAS,IAAoB,CAAC,EAC9D,OAAS,OACjB,CACN,MAAO,IAIX,eAAsB,EACpB,EACA,EACA,EAAW,QAAQ,SACJ,CACf,IAAM,EAAO,EAAiB,EAAa,KAAK,CAU5C,MATqB,EAAQ,EAAI,OAAQ,CAC3C,SACA,UACA,EAAa,MACb,aACA,EAAa,SACb,SACA,EACD,CAAC,EACgB,IAAa,UAE/B,MAAM,EAAQ,EAAI,YAAa,CAC7B,KACA,cACA,KACA,8FACA,KACA,UACA,EAAa,MACb,EAAa,SACb,EACD,CAAC,CAGJ,SAAS,EACP,EACA,EACA,EACM,CACN,IAAM,EAAkB,EAAG,QAAQ,KAAK,EAAG,CAC3C,EAAG,SAAW,EAAO,EAAS,KACxB,GAAc,EAAE,EAAO,GAAG,EAAM,IAAI,IAAU,CAC3C,EAAgB,EAAO,EAAS,EAAQ,EAGjD,IAAM,EAAiB,EAAG,OAAO,KAAK,EAAG,CACzC,EAAG,QAAU,EAAO,EAAS,KACvB,GAAc,EAAE,EAAO,EAAM,CAC1B,EAAe,EAAO,EAAS,EAAc,EAGtD,IAAM,EAAgB,EAAG,MAAM,KAAK,EAAG,CACvC,EAAG,OAAS,EAAO,EAAa,KAC1B,GAAc,EAAE,EAAO,EAAM,CAC1B,EAAc,EAAO,EAAa,EAAQ,EAGnD,IAAM,EAAiB,EAAG,OAAO,KAAK,EAAG,CACzC,EAAG,QAAU,EAAO,KACd,GAAc,EAAE,EAAO,EAAM,CAC1B,EAAe,EAAO,EAAQ,EAIzC,SAAwB,EAAc,EAAwB,CAC5D,GAAI,QAAQ,IAAI,kBAAmB,OAEnC,IAAI,EAAe,GACf,EAAiB,GACjB,EACA,EAAa,EACb,EACE,EAAa,IAAI,QACjB,EAAsB,GAA8B,CACxD,AAEE,KADA,cAAc,EAAW,CACZ,IAAA,IAEf,EAAa,EACT,EAAQ,OAAO,EAAQ,GAAG,SAAS,EAAc,EAAI,EAAQ,IAAK,EAAiB,CAAC,EAEpF,EAAuB,GAA8B,CAEzD,GADA,EAAmB,EAAQ,CACvB,CAAC,EAAQ,MAAO,OAEpB,IAAM,MAAoB,CACxB,EAAQ,GAAG,SACT,EAAc,EAAI,EAAQ,IAAK,EAAkB,EAAe,EAAa,EAAe,QAAQ,CACrG,CACD,GAAc,GAEhB,GAAa,CACb,EAAa,YAAY,EAAa,GAAwB,EAE1D,EAAmB,GAAiB,CACnC,EAAuB,EAAI,CAC9B,MAAO,sBACP,SAAU,gCACV,OACD,CAAC,EAGJ,EAAG,OAAO,GAAG,EAAwB,GAAY,CAG/C,EADsBA,EAAO,UAAU,IAAI,UAAY,0CACzB,EAC9B,CACF,EAAG,OAAO,GAAG,EAAyB,GAAY,CAChD,EAAkB,EAAuC,QACzD,CAEF,EAAG,GAAG,SAAc,EAAO,IAAY,CACjC,GAAoB,EAAM,SAAW,cAEzC,EAAmB,EAAY,EAAM,KAAK,CACtC,GAAoB,EAAQ,OAC9B,EAAQ,GAAG,SAAS,EAAc,EAAI,EAAQ,IAAK,EAAiB,CAAC,GAEvE,CAEF,EAAG,GAAG,iBAAkB,EAAQ,IAAY,CACtC,EAAW,IAAI,EAAQ,GAAG,GAC9B,EAAW,IAAI,EAAQ,GAAG,CAC1B,EAAqB,EAAQ,OAAU,GAAgB,CAAC,EAAgB,EAAgB,GACxF,CAEF,EAAG,GAAG,eAAgB,EAAQ,IAAY,CACxC,EAAe,GACf,EAAoB,EAAQ,EAC5B,CAEF,EAAG,GAAG,gBAAiB,MAAO,EAAQ,IAAY,CAChD,EAAe,GACf,EAAiB,GACjB,EAAmB,EAAQ,CACvB,GAAQ,oBAAoB,EAEhC,MAAM,EAAuB,EAAI,CAC/B,MAAO,cACP,SAAU,EAAG,gBAAgB,EAAI,EAAK,SAAS,EAAQ,IAAI,CAC3D,KAAM,sDACP,CAAC,EACF,CAEF,EAAG,GAAG,oBAAqB,EAAQ,IAAY,CAC7C,EAAe,GACf,EAAiB,GACjB,EAAmB,EAAQ,EAC3B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ollamaProvider.cjs","names":[],"sources":["../../src/entries/ollamaProvider.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nexport default function registerOllama(pi: ExtensionAPI): void {\n const modelArgument = process.argv.find((argument) => argument.startsWith('ollama/'));\n const model = modelArgument?.slice('ollama/'.length) ?? 'kimi-k2.6:cloud';\n pi.registerProvider('ollama', {\n name: 'Ollama',\n baseUrl: process.env.DOOMPI_OLLAMA_BASE_URL ?? 'http://localhost:11434/v1',\n apiKey: '$OLLAMA_API_KEY',\n api: 'openai-completions',\n models: [\n {\n id: model,\n name: model,\n reasoning: false,\n input: ['text', 'image'],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 262_144,\n maxTokens: 32_768,\n compat: {\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n },\n },\n ],\n });\n}\n"],"mappings":"AAEA,SAAwB,EAAe,EAAwB,CAE7D,IAAM,EADgB,QAAQ,KAAK,KAAM,GAAa,EAAS,WAAW,UAAU,CACzD,EAAE,MAAM,EAAiB,EAAI,kBACxD,EAAG,iBAAiB,SAAU,CAC5B,KAAM,SACN,QAAS,QAAQ,IAAI,wBAA0B,4BAC/C,OAAQ,kBACR,IAAK,qBACL,OAAQ,CACN,CACE,GAAI,EACJ,KAAM,EACN,UAAW,GACX,MAAO,CAAC,OAAQ,QAAQ,CACxB,KAAM,CAAE,MAAO,EAAG,OAAQ,EAAG,UAAW,EAAG,WAAY,EAAG,CAC1D,cAAe,OACf,UAAW,MACX,OAAQ,CACN,sBAAuB,GACvB,wBAAyB,GAC1B,CACF,CACF,CACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ollamaProvider.d.cts","names":[],"sources":["../../src/entries/ollamaProvider.ts"],"mappings":";;;iBAEwB,cAAA,CAAe,EAAA,EAAI,YAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ollamaProvider.d.mts","names":[],"sources":["../../src/entries/ollamaProvider.ts"],"mappings":";;;iBAEwB,cAAA,CAAe,EAAA,EAAI,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ollamaProvider.mjs","names":[],"sources":["../../src/entries/ollamaProvider.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nexport default function registerOllama(pi: ExtensionAPI): void {\n const modelArgument = process.argv.find((argument) => argument.startsWith('ollama/'));\n const model = modelArgument?.slice('ollama/'.length) ?? 'kimi-k2.6:cloud';\n pi.registerProvider('ollama', {\n name: 'Ollama',\n baseUrl: process.env.DOOMPI_OLLAMA_BASE_URL ?? 'http://localhost:11434/v1',\n apiKey: '$OLLAMA_API_KEY',\n api: 'openai-completions',\n models: [\n {\n id: model,\n name: model,\n reasoning: false,\n input: ['text', 'image'],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 262_144,\n maxTokens: 32_768,\n compat: {\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n },\n },\n ],\n });\n}\n"],"mappings":"AAEA,SAAwB,EAAe,EAAwB,CAE7D,IAAM,EADgB,QAAQ,KAAK,KAAM,GAAa,EAAS,WAAW,UAAU,CACzD,EAAE,MAAM,EAAiB,EAAI,kBACxD,EAAG,iBAAiB,SAAU,CAC5B,KAAM,SACN,QAAS,QAAQ,IAAI,wBAA0B,4BAC/C,OAAQ,kBACR,IAAK,qBACL,OAAQ,CACN,CACE,GAAI,EACJ,KAAM,EACN,UAAW,GACX,MAAO,CAAC,OAAQ,QAAQ,CACxB,KAAM,CAAE,MAAO,EAAG,OAAQ,EAAG,UAAW,EAAG,WAAY,EAAG,CAC1D,cAAe,OACf,UAAW,MACX,OAAQ,CACN,sBAAuB,GACvB,wBAAyB,GAC1B,CACF,CACF,CACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"persona.cjs","names":["createHarnessTelemetry","fs","HARNESS_EVENT"],"sources":["../../src/entries/persona.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\n\n/**\n * Appends the selected profile's persona to the system prompt.\n *\n * The harness writes the assembled persona to a file in the run directory and\n * records the path in the harness state, so agents/ stays the single source of\n * persona material and is never copied into config.\n */\nexport default function persona(pi: ExtensionAPI, telemetry: HarnessTelemetry = createHarnessTelemetry()): void {\n pi.on('before_agent_start', async (event, ctx) => {\n const { personaFile } = requireDoomConfigContext(ctx).harness;\n if (!personaFile) return undefined;\n\n try {\n const content = fs.readFileSync(personaFile, 'utf8').trim();\n return content ? { systemPrompt: `${event.systemPrompt}\\n\\n${content}` } : undefined;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n void telemetry.recordError(HARNESS_EVENT.personaReadFailed, error);\n process.stderr.write(`[pi-persona] could not read ${personaFile}: ${reason}\\n`);\n return undefined;\n }\n });\n}\n"],"mappings":"0KAYA,SAAwB,EAAQ,EAAkB,EAA8BA,EAAAA,wBAAwB,CAAQ,CAC9G,EAAG,GAAG,qBAAsB,MAAO,EAAO,IAAQ,CAChD,GAAM,CAAE,gBAAA,EAAA,EAAA,0BAAyC,EAAI,CAAC,QACjD,KAEL,GAAI,CACF,IAAM,EAAUC,EAAAA,QAAG,aAAa,EAAa,OAAO,CAAC,MAAM,CAC3D,OAAO,EAAU,CAAE,aAAc,GAAG,EAAM,aAAa,MAAM,IAAW,CAAG,IAAA,SACpE,EAAO,CACd,IAAM,EAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAChE,EAAU,YAAYC,EAAAA,cAAc,kBAAmB,EAAM,CAClE,QAAQ,OAAO,MAAM,+BAA+B,EAAY,IAAI,EAAO,IAAI,CAC/E,SAEF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"persona.d.cts","names":[],"sources":["../../src/entries/persona.ts"],"mappings":";;;;;;AAGsG;;;;;iBAS9E,OAAA,CAAQ,EAAA,EAAI,YAAA,EAAc,SAAA,GAAW,gBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"persona.d.mts","names":[],"sources":["../../src/entries/persona.ts"],"mappings":";;;;;;AAGsG;;;;;iBAS9E,OAAA,CAAQ,EAAA,EAAI,YAAA,EAAc,SAAA,GAAW,gBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"persona.mjs","names":[],"sources":["../../src/entries/persona.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\n\n/**\n * Appends the selected profile's persona to the system prompt.\n *\n * The harness writes the assembled persona to a file in the run directory and\n * records the path in the harness state, so agents/ stays the single source of\n * persona material and is never copied into config.\n */\nexport default function persona(pi: ExtensionAPI, telemetry: HarnessTelemetry = createHarnessTelemetry()): void {\n pi.on('before_agent_start', async (event, ctx) => {\n const { personaFile } = requireDoomConfigContext(ctx).harness;\n if (!personaFile) return undefined;\n\n try {\n const content = fs.readFileSync(personaFile, 'utf8').trim();\n return content ? { systemPrompt: `${event.systemPrompt}\\n\\n${content}` } : undefined;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n void telemetry.recordError(HARNESS_EVENT.personaReadFailed, error);\n process.stderr.write(`[pi-persona] could not read ${personaFile}: ${reason}\\n`);\n return undefined;\n }\n });\n}\n"],"mappings":"+KAYA,SAAwB,EAAQ,EAAkB,EAA8B,GAAwB,CAAQ,CAC9G,EAAG,GAAG,qBAAsB,MAAO,EAAO,IAAQ,CAChD,GAAM,CAAE,eAAgB,EAAyB,EAAI,CAAC,QACjD,KAEL,GAAI,CACF,IAAM,EAAU,EAAG,aAAa,EAAa,OAAO,CAAC,MAAM,CAC3D,OAAO,EAAU,CAAE,aAAc,GAAG,EAAM,aAAa,MAAM,IAAW,CAAG,IAAA,SACpE,EAAO,CACd,IAAM,EAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAChE,EAAU,YAAY,EAAc,kBAAmB,EAAM,CAClE,QAAQ,OAAO,MAAM,+BAA+B,EAAY,IAAI,EAAO,IAAI,CAC/E,SAEF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile.cjs","names":["createHarnessTelemetry","HARNESS_EVENT","MatrixPickerComponent","applyProfile"],"sources":["../../src/entries/profile.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport type { SelectItem } from '@earendil-works/pi-tui';\nimport { type AgentProfile, loadProfiles } from '@agimon-ai/doompi-config/profiles';\nimport { persistHarnessSelection, requireHarnessRoot } from '../config/harnessState.ts';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\nimport { applyProfile } from '../services/matrixSwitcher.ts';\nimport { MatrixPickerComponent } from './components/matrixPicker.ts';\n\nconst NONE = '(none)';\nconst WARNING = 'warning';\nconst INFO = 'info';\nconst PROFILE_CONFIG_PATH = '.doom/profiles.yaml';\n\n/** Rows for the single-select profile picker. */\nexport function profileItems(profiles: AgentProfile[]): SelectItem[] {\n return profiles.map((profile) => ({\n value: profile.name,\n label: profile.name,\n description: profileDescription(profile),\n }));\n}\n\nexport function profileDescription(profile: AgentProfile): string {\n const environmentKeys = Object.keys(profile.env).sort();\n return environmentKeys.length > 0 ? `${profile.persona} (env: ${environmentKeys.join(', ')})` : profile.persona;\n}\n\n/** Shown when the picked profile is already active. */\nexport function profileSummary(profile: AgentProfile): string {\n const environmentKeys = Object.keys(profile.env).sort();\n return [\n `Profile ${profile.name}`,\n `Persona: ${profile.persona}`,\n `Env: ${environmentKeys.join(', ') || NONE}`,\n 'Already loaded.',\n ].join('\\n');\n}\n\n/** Loads one profile's persona and environment defaults. */\nexport { applyProfile } from '../services/matrixSwitcher.ts';\n\nexport default function profileExtension(\n pi: ExtensionAPI,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): void {\n pi.registerCommand('profile', {\n description: 'Show profiles and load a different persona and environment',\n handler: async (_args, ctx) => {\n const state = requireDoomConfigContext(ctx).harness;\n const root = requireHarnessRoot(state);\n const current = state.profile;\n let profiles: AgentProfile[];\n try {\n profiles = loadProfiles(root);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n void telemetry.recordError(HARNESS_EVENT.profileLoadFailed, error);\n ctx.ui.notify(`Could not load ${PROFILE_CONFIG_PATH}: ${reason}`, WARNING);\n return;\n }\n\n if (profiles.length === 0) {\n ctx.ui.notify(`No profiles found in ${PROFILE_CONFIG_PATH}.`, WARNING);\n return;\n }\n\n const title = `Profile (current: ${current ?? NONE})`;\n const chosen =\n ctx.mode === 'tui'\n ? await ctx.ui.custom<string[] | undefined>(\n (_tui, theme, keybindings, done) =>\n new MatrixPickerComponent(\n { title, items: profileItems(profiles), selected: current ? [current] : [], multi: false },\n theme,\n keybindings,\n done,\n ),\n )\n : [\n await ctx.ui.select(\n title,\n profiles.map((profile) => profile.name),\n ),\n ];\n\n const picked = chosen?.[0];\n const profile = profiles.find((candidate) => candidate.name === picked);\n if (!profile) return;\n if (profile.name === current) {\n ctx.ui.notify(profileSummary(profile), INFO);\n return;\n }\n\n ctx.ui.notify(await applyProfile(profile, state), INFO);\n persistHarnessSelection(pi, { ...state, profile: profile.name });\n void telemetry.recordEvent(HARNESS_EVENT.profileApplied, {\n 'harness.profile': profile.name,\n ...(current ? { 'harness.profile.previous': current } : {}),\n });\n await ctx.waitForIdle();\n await ctx.reload();\n },\n });\n}\n"],"mappings":"+YASA,MAAM,EAAO,SACP,EAAU,UACV,EAAO,OACP,EAAsB,sBAG5B,SAAgB,EAAa,EAAwC,CACnE,OAAO,EAAS,IAAK,IAAa,CAChC,MAAO,EAAQ,KACf,MAAO,EAAQ,KACf,YAAa,EAAmB,EAAQ,CACzC,EAAE,CAGL,SAAgB,EAAmB,EAA+B,CAChE,IAAM,EAAkB,OAAO,KAAK,EAAQ,IAAI,CAAC,MAAM,CACvD,OAAO,EAAgB,OAAS,EAAI,GAAG,EAAQ,QAAQ,SAAS,EAAgB,KAAK,KAAK,CAAC,GAAK,EAAQ,QAI1G,SAAgB,EAAe,EAA+B,CAC5D,IAAM,EAAkB,OAAO,KAAK,EAAQ,IAAI,CAAC,MAAM,CACvD,MAAO,CACL,WAAW,EAAQ,OACnB,YAAY,EAAQ,UACpB,QAAQ,EAAgB,KAAK,KAAK,EAAI,IACtC,kBACD,CAAC,KAAK;EAAK,CAMd,SAAwB,EACtB,EACA,EAA8BA,EAAAA,wBAAwB,CAChD,CACN,EAAG,gBAAgB,UAAW,CAC5B,YAAa,6DACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,IAAM,GAAA,EAAA,EAAA,0BAAiC,EAAI,CAAC,QACtC,GAAA,EAAA,EAAA,oBAA0B,EAAM,CAChC,EAAU,EAAM,QAClB,EACJ,GAAI,CACF,GAAA,EAAA,EAAA,cAAwB,EAAK,OACtB,EAAO,CACd,IAAM,EAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAChE,EAAU,YAAYC,EAAAA,cAAc,kBAAmB,EAAM,CAClE,EAAI,GAAG,OAAO,kBAAkB,EAAoB,IAAI,IAAU,EAAQ,CAC1E,OAGF,GAAI,EAAS,SAAW,EAAG,CACzB,EAAI,GAAG,OAAO,wBAAwB,EAAoB,GAAI,EAAQ,CACtE,OAGF,IAAM,EAAQ,qBAAqB,GAAW,EAAK,GAmB7C,GAjBJ,EAAI,OAAS,MACT,MAAM,EAAI,GAAG,QACV,EAAM,EAAO,EAAa,IACzB,IAAIC,EAAAA,sBACF,CAAE,QAAO,MAAO,EAAa,EAAS,CAAE,SAAU,EAAU,CAAC,EAAQ,CAAG,EAAE,CAAE,MAAO,GAAO,CAC1F,EACA,EACA,EACD,CACJ,CACD,CACE,MAAM,EAAI,GAAG,OACX,EACA,EAAS,IAAK,GAAY,EAAQ,KAAK,CACxC,CACF,IAEiB,GAClB,EAAU,EAAS,KAAM,GAAc,EAAU,OAAS,EAAO,CAClE,KACL,IAAI,EAAQ,OAAS,EAAS,CAC5B,EAAI,GAAG,OAAO,EAAe,EAAQ,CAAE,EAAK,CAC5C,OAGF,EAAI,GAAG,OAAO,MAAMC,EAAAA,aAAa,EAAS,EAAM,CAAE,EAAK,CACvD,EAAA,wBAAwB,EAAI,CAAE,GAAG,EAAO,QAAS,EAAQ,KAAM,CAAC,CAC3D,EAAU,YAAYF,EAAAA,cAAc,eAAgB,CACvD,kBAAmB,EAAQ,KAC3B,GAAI,EAAU,CAAE,2BAA4B,EAAS,CAAG,EAAE,CAC3D,CAAC,CACF,MAAM,EAAI,aAAa,CACvB,MAAM,EAAI,QAAQ,GAErB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile.d.cts","names":[],"sources":["../../src/entries/profile.ts"],"mappings":";;;;;;;;iBAegB,YAAA,CAAa,QAAA,EAAU,YAAA,KAAiB,UAAA;AAAA,iBAQxC,kBAAA,CAAmB,OAAA,EAAS,YAAA;AAR5C;AAAA,iBAcgB,cAAA,CAAe,OAAA,EAAS,YAAA;AAAA,iBAahB,gBAAA,CACtB,EAAA,EAAI,YAAA,EACJ,SAAA,GAAW,gBAAA"}