@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 +0,0 @@
1
- {"version":3,"file":"profile.d.mts","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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile.mjs","names":[],"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":"0bASA,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,EAA8B,GAAwB,CAChD,CACN,EAAG,gBAAgB,UAAW,CAC5B,YAAa,6DACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,IAAM,EAAQ,EAAyB,EAAI,CAAC,QACtC,EAAO,EAAmB,EAAM,CAChC,EAAU,EAAM,QAClB,EACJ,GAAI,CACF,EAAW,EAAa,EAAK,OACtB,EAAO,CACd,IAAM,EAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAChE,EAAU,YAAY,EAAc,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,IAAI,EACF,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,MAAM,EAAa,EAAS,EAAM,CAAE,EAAK,CACvD,EAAwB,EAAI,CAAE,GAAG,EAAO,QAAS,EAAQ,KAAM,CAAC,CAC3D,EAAU,YAAY,EAAc,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":"repositoryHooks.cjs","names":["toClaudeToolName","HARNESS_EVENT","fs","createHarnessTelemetry"],"sources":["../../src/entries/repositoryHooks.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport { requireDoomConfigContext, type DoomHarnessContext } from '@agimon-ai/doompi-config';\nimport { doomConfigCandidates } from '@agimon-ai/doompi-config/layeredConfig';\nimport type { ExtensionAPI, ExtensionContext, ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\nimport { parse as parseYaml } from 'yaml';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\n// Imported from the module rather than the utils barrel: Pi loads this file\n// directly, so pulling in the barrel would load module resolution helpers the\n// extension never uses.\nimport { toClaudeToolName } from '../utils/toolNames.ts';\n\nconst HOOKS_FILE = 'hooks.yaml';\nconst HOOK_SHELL = '/bin/bash';\nconst HOOK_SHELL_COMMAND_FLAG = '-c';\nconst HOOK_TERMINATION_GRACE_MS = 2_000;\nconst PROCESS_NOT_FOUND_ERROR = 'ESRCH';\n\n/** Registry event names. Each is used twice per dispatch, so drift would be silent. */\nconst HOOK_EVENT = {\n sessionStart: 'SessionStart',\n preToolUse: 'PreToolUse',\n postToolUse: 'PostToolUse',\n stop: 'Stop',\n sessionEnd: 'SessionEnd',\n} as const;\n\ninterface HookCommand {\n command: string;\n timeout?: number;\n}\n\ninterface RegistryBinding {\n matcher?: string;\n command: string;\n timeout?: number;\n skipInSubagent?: boolean;\n order?: number;\n}\n\ninterface RegistryRow extends RegistryBinding {\n event: string;\n order: number;\n position: number;\n}\n\n/** A registry row plus the group membership used to include or drop it. */\ninterface RegistryEntry extends RegistryRow {\n groupId: string;\n core: boolean;\n /** Root of the config that declared the group, exported as CLAUDE_PLUGIN_ROOT. */\n baseDirectory: string;\n}\n\ninterface HookGroup {\n matcher?: string;\n hooks?: HookCommand[];\n}\n\ninterface PluginHookConfig {\n hooks?: Record<string, HookGroup[]>;\n}\n\ninterface RegistryDocument {\n groups?: Record<string, { core?: boolean; hooks?: Array<{ event: string; pi?: RegistryBinding }> }>;\n}\n\n// Parsing the registry is the most expensive step on the tool-call path, and it\n// runs twice per tool call (once before, once after). Both caches are keyed on\n// file contents rather than mtime, so they stay correct for an in-place rewrite\n// and need no invalidation hook.\nlet cachedRegistrySource: string | undefined;\nlet cachedRegistryEntries: RegistryEntry[] = [];\nconst pluginConfigCache = new Map<string, { source: string; config: PluginHookConfig }>();\n\ninterface HookDecision {\n decision?: string;\n reason?: string;\n hookSpecificOutput?: {\n permissionDecision?: string;\n reason?: string;\n additionalContext?: string;\n };\n}\n\ninterface HookRuntime {\n repoRoot: string;\n harness: DoomHarnessContext;\n telemetry: HarnessTelemetry;\n failures: HookFailure[];\n}\n\ninterface HookFailure {\n command: string;\n message: string;\n reason: 'spawn_failed' | 'non_zero_exit' | 'timeout' | 'invalid_json' | 'registry_read' | 'plugin_config';\n}\n\ninterface HookOutcome {\n decision?: HookDecision;\n failure?: HookFailure;\n}\n\ninterface ResolvedHook {\n hook: HookCommand;\n root?: string;\n}\n\nfunction hookRuntime(ctx: ExtensionContext, telemetry: HarnessTelemetry): HookRuntime {\n const harness = requireDoomConfigContext(ctx).harness;\n return { repoRoot: harness.root ?? ctx.cwd, harness, telemetry, failures: [] };\n}\n\nfunction hookPayload(\n event: ToolCallEvent | ToolResultEvent,\n hookEventName: string,\n repoRoot: string,\n sessionId: string,\n): Record<string, unknown> {\n return {\n session_id: sessionId,\n transcript_path: '',\n cwd: repoRoot,\n hook_event_name: hookEventName,\n tool_name: toClaudeToolName(event.toolName),\n tool_input: event.input,\n ...(event.type === 'tool_result' ? { tool_response: { success: !event.isError, content: event.content } } : {}),\n };\n}\n\nasync function executeHook(\n hook: HookCommand,\n payload: Record<string, unknown>,\n runtime: HookRuntime,\n pluginRoot?: string,\n): Promise<HookOutcome> {\n const { repoRoot, telemetry } = runtime;\n return new Promise((resolve) => {\n const useProcessGroup = process.platform !== 'win32';\n // -c, not -lc. Hooks run on every tool call, and a login shell would source\n // the developer's profile each time: per-call latency plus hook behavior\n // that varies with their dotfiles. The child inherits process.env below, so\n // it keeps the PATH the launcher was started with.\n const child = spawn(HOOK_SHELL, [HOOK_SHELL_COMMAND_FLAG, hook.command], {\n cwd: repoRoot,\n env: {\n ...process.env,\n CLAUDE_PROJECT_DIR: repoRoot,\n CODEX_REPO_ROOT: repoRoot,\n ORIGINAL_REPO_PATH: process.env.ORIGINAL_REPO_PATH ?? repoRoot,\n ...(pluginRoot ? { CLAUDE_PLUGIN_ROOT: pluginRoot } : {}),\n },\n stdio: ['pipe', 'pipe', 'pipe'],\n detached: useProcessGroup,\n });\n let stdout = '';\n let stderr = '';\n let settled = false;\n let timedOut = false;\n let childExited = false;\n let timeoutExitCode: number | null = null;\n let escalationTimer: NodeJS.Timeout | undefined;\n\n const signalOwnedProcess = (signal: NodeJS.Signals): void => {\n try {\n if (useProcessGroup && child.pid !== undefined) {\n process.kill(-child.pid, signal);\n return;\n }\n child.kill(signal);\n } catch (error) {\n const code = error instanceof Error && 'code' in error ? error.code : undefined;\n if (code !== PROCESS_NOT_FOUND_ERROR) {\n process.emitWarning(`Could not signal repository hook process: ${String(error)}`);\n }\n }\n };\n\n const ownedProcessIsAlive = (): boolean => {\n if (!useProcessGroup || child.pid === undefined) return !childExited;\n try {\n process.kill(-child.pid, 0);\n return true;\n } catch (error) {\n const code = error instanceof Error && 'code' in error ? error.code : undefined;\n return code !== PROCESS_NOT_FOUND_ERROR;\n }\n };\n\n const finish = (outcome: HookOutcome = {}) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n if (escalationTimer) clearTimeout(escalationTimer);\n resolve(outcome);\n };\n\n const finishTimeout = (): void => {\n const message = `Hook timed out after ${hook.timeout ?? 10} seconds.`;\n void telemetry?.recordWarning(HARNESS_EVENT.hookFailed, message, {\n 'hook.reason': 'timeout',\n 'hook.exit_code': timeoutExitCode ?? -1,\n });\n process.stderr.write(`[pi-hook] advisory hook timed out: ${hook.command}\\n${stderr}`);\n finish({ failure: { command: hook.command, message, reason: 'timeout' } });\n };\n\n const timer = setTimeout(\n () => {\n timedOut = true;\n signalOwnedProcess('SIGTERM');\n escalationTimer = setTimeout(() => {\n if (ownedProcessIsAlive()) signalOwnedProcess('SIGKILL');\n finishTimeout();\n }, HOOK_TERMINATION_GRACE_MS);\n },\n (hook.timeout ?? 10) * 1000,\n );\n child.stdout.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.once('error', (error) => {\n if (timedOut) return;\n // A guardrail that never ran is indistinguishable from one that passed,\n // which is the whole reason these are worth reporting.\n void telemetry?.recordError(HARNESS_EVENT.hookFailed, error, {\n 'hook.reason': 'spawn_failed',\n });\n process.stderr.write(`[pi-hook] advisory hook failed: ${error.message}\\n`);\n finish({ failure: { command: hook.command, message: error.message, reason: 'spawn_failed' } });\n });\n child.once('exit', (code) => {\n childExited = true;\n timeoutExitCode = code;\n if (timedOut) return;\n if (code !== 0) {\n const message = stderr.trim() || `Advisory hook exited with code ${code ?? 'unknown'}`;\n void telemetry?.recordWarning(HARNESS_EVENT.hookFailed, message, {\n 'hook.reason': 'non_zero_exit',\n 'hook.exit_code': code ?? -1,\n });\n process.stderr.write(`[pi-hook] advisory hook failed (${code}): ${hook.command}\\n${stderr}`);\n finish({ failure: { command: hook.command, message, reason: 'non_zero_exit' } });\n return;\n }\n const jsonLine = stdout\n .trim()\n .split(/\\r?\\n/)\n .reverse()\n .find((line) => line.startsWith('{'));\n if (!jsonLine) {\n finish();\n return;\n }\n try {\n finish({ decision: JSON.parse(jsonLine) as HookDecision });\n } catch (error) {\n // The hook ran and had an opinion, and it was dropped.\n void telemetry?.recordWarning(HARNESS_EVENT.hookFailed, error, {\n 'hook.reason': 'invalid_json',\n });\n process.stderr.write(`[pi-hook] advisory hook returned invalid JSON: ${hook.command}\\n`);\n finish({\n failure: {\n command: hook.command,\n message: error instanceof Error ? error.message : String(error),\n reason: 'invalid_json',\n },\n });\n }\n });\n child.stdin.end(JSON.stringify(payload));\n });\n}\n\nfunction isDenied(decision: HookDecision | undefined): boolean {\n return decision?.decision === 'block' || decision?.hookSpecificOutput?.permissionDecision === 'deny';\n}\n\nfunction decisionReason(decision: HookDecision | undefined): string | undefined {\n return decision?.reason ?? decision?.hookSpecificOutput?.reason;\n}\n\n/**\n * Parses a plugin hook config, reusing the last parse of identical content.\n *\n * Reading the file every time is deliberate: it costs almost nothing and keeps\n * an in-place rewrite visible, which an mtime check would miss when two writes\n * land inside the same filesystem timestamp granularity.\n */\nfunction readPluginHookConfig(configPath: string): PluginHookConfig {\n const source = fs.readFileSync(configPath, 'utf8');\n const cached = pluginConfigCache.get(configPath);\n if (cached?.source === source) return cached.config;\n const config = JSON.parse(source) as PluginHookConfig;\n pluginConfigCache.set(configPath, { source, config });\n return config;\n}\n\nfunction pluginHooks(\n eventName: string,\n runtime: HookRuntime,\n toolName?: string,\n): Array<{ hook: HookCommand; root: string }> {\n const matches: Array<{ hook: HookCommand; root: string }> = [];\n for (const source of runtime.harness.pluginHooks) {\n let config: PluginHookConfig;\n try {\n config = readPluginHookConfig(source.configPath);\n } catch (error) {\n runtime.failures.push({\n command: source.configPath,\n message: error instanceof Error ? error.message : String(error),\n reason: 'plugin_config',\n });\n continue;\n }\n for (const group of config.hooks?.[eventName] ?? []) {\n if (toolName && group.matcher && !new RegExp(group.matcher).test(toClaudeToolName(toolName))) continue;\n for (const hook of group.hooks ?? []) matches.push({ hook, root: source.pluginRoot });\n }\n }\n return matches;\n}\n\n// Reads the canonical registry from .doom/hooks.yaml in the global config\n// directory and the repository, keeping only bindings that declare a `pi`\n// frontend. A repository group replaces the global group of the same id. Core\n// groups always load; the rest are gated by DOOMPI_HOOK_GROUPS, which the\n// harness sets from the resolved layers. An unset variable means every group,\n// which is the standalone default.\nfunction parseRegistry(sources: ReadonlyArray<{ baseDirectory: string; text: string }>): RegistryEntry[] {\n // Keyed on the joined contents rather than mtime, so it stays correct for an\n // in-place rewrite. Reading both files is cheap; parsing is what this skips.\n const cacheKey = sources.map((source) => `${source.baseDirectory} ${source.text}`).join(' ');\n if (cachedRegistrySource === cacheKey) return cachedRegistryEntries;\n\n const groups = new Map<string, { entries: RegistryEntry[] }>();\n let position = 0;\n for (const source of sources) {\n const document = (parseYaml(source.text) ?? {}) as RegistryDocument;\n for (const [groupId, group] of Object.entries(document.groups ?? {})) {\n const entries: RegistryEntry[] = [];\n for (const hook of group.hooks ?? []) {\n // Every declared hook advances the position, whether or not it is kept,\n // so the sort tiebreaker stays the order the file declares them in.\n position += 1;\n if (!hook.pi) continue;\n entries.push({\n ...hook.pi,\n event: hook.event,\n order: hook.pi.order ?? 0,\n position,\n groupId,\n core: group.core === true,\n baseDirectory: source.baseDirectory,\n });\n }\n groups.set(groupId, { entries });\n }\n }\n\n const entries = [...groups.values()].flatMap((group) => group.entries);\n entries.sort((left, right) => left.order - right.order || left.position - right.position);\n cachedRegistrySource = cacheKey;\n cachedRegistryEntries = entries;\n return entries;\n}\n\nfunction registryRows(runtime: HookRuntime): RegistryEntry[] {\n const { repoRoot, harness, telemetry } = runtime;\n const candidates = doomConfigCandidates(HOOKS_FILE, repoRoot);\n // Named for the error path only. A registry absent from both locations is a\n // repository with no hooks, not a failure, so only a file that exists and\n // cannot be read or parsed reaches the catch below.\n const registryPath = candidates.map((candidate) => candidate.filePath).join(' and ');\n try {\n // Group selection changes when /major-mode switches mid-session, so inclusion is\n // applied per call instead of being baked into the cached parse.\n const selected = harness.hookGroups;\n const allowed = selected === undefined ? undefined : new Set(selected);\n const sources = candidates\n .filter((candidate) => fs.existsSync(candidate.filePath))\n .map((candidate) => ({\n baseDirectory: candidate.baseDirectory,\n text: fs.readFileSync(candidate.filePath, 'utf8'),\n }));\n return parseRegistry(sources).filter((entry) => entry.core || !allowed || allowed.has(entry.groupId));\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n // This empties the registry for the whole session, so every repository hook\n // silently stops running rather than any one of them failing.\n void telemetry?.recordError(HARNESS_EVENT.hookRegistryReadFailed, error, { 'hook.registry.source': 'repository' });\n process.stderr.write(`[pi-hook] could not read ${registryPath}: ${reason}\\n`);\n runtime.failures.push({ command: registryPath, message: reason, reason: 'registry_read' });\n return [];\n }\n}\n\nfunction registryHooks(\n eventName: string,\n runtime: HookRuntime,\n toolName?: string,\n): Array<{ hook: HookCommand; root: string }> {\n return (\n registryRows(runtime)\n .filter((row) => row.event === eventName)\n .filter((row) => !(row.skipInSubagent && process.env.PI_SUBAGENT_CHILD))\n .filter((row) => !toolName || !row.matcher || new RegExp(row.matcher).test(toClaudeToolName(toolName)))\n // The declaring config's root, so a global hook can reach its own scripts\n // through CLAUDE_PLUGIN_ROOT while still running against this repository.\n .map((row) => ({ hook: { command: row.command, timeout: row.timeout }, root: row.baseDirectory }))\n );\n}\n\nasync function runHooks(\n hooks: ResolvedHook[],\n payload: Record<string, unknown>,\n runtime: HookRuntime,\n ctx: ExtensionContext,\n statusKey: string,\n statusLabel: string,\n): Promise<HookOutcome[]> {\n const outcomes: HookOutcome[] = [];\n try {\n for (const [index, resolved] of hooks.entries()) {\n if (ctx.hasUI) ctx.ui.setStatus(statusKey, `${statusLabel} (${index + 1}/${hooks.length})...`);\n outcomes.push(await executeHook(resolved.hook, payload, runtime, resolved.root));\n }\n } finally {\n if (ctx.hasUI) ctx.ui.setStatus(statusKey, undefined);\n }\n return outcomes;\n}\n\nfunction resolvedHooks(eventName: string, runtime: HookRuntime, toolName?: string): ResolvedHook[] {\n return [\n ...registryHooks(eventName, runtime, toolName).map(({ hook, root }) => ({ hook, root })),\n ...pluginHooks(eventName, runtime, toolName).map(({ hook, root }) => ({ hook, root })),\n ];\n}\n\nfunction decisionsFrom(outcomes: HookOutcome[]): HookDecision[] {\n return outcomes.flatMap((outcome) => (outcome.decision ? [outcome.decision] : []));\n}\n\nfunction additionalContextsFrom(decisions: HookDecision[]): string[] {\n return decisions\n .map((decision) => decision.hookSpecificOutput?.additionalContext)\n .filter((value): value is string => Boolean(value));\n}\n\nfunction failuresFrom(runtime: HookRuntime, outcomes: HookOutcome[]): HookFailure[] {\n return [...runtime.failures, ...outcomes.flatMap((outcome) => (outcome.failure ? [outcome.failure] : []))];\n}\n\nfunction hookFailureMessage(failures: HookFailure[]): string {\n return [\n 'One or more repository hooks did not complete, so their checks were not applied:',\n ...failures.map((failure) => `- ${failure.command}: ${failure.message}`),\n 'Options:',\n '- Inspect the hook command or configuration and rerun after correcting it.',\n '- Continue only if the missed advisory check is acceptable.',\n '- Ask the user before bypassing a hook that may enforce a guardrail.',\n ].join('\\n');\n}\n\nfunction steerHookFailures(pi: ExtensionAPI, failures: HookFailure[]): void {\n if (failures.length === 0) return;\n pi.sendMessage(\n { customType: 'repository-hook-failure', content: hookFailureMessage(failures), display: true },\n { deliverAs: 'steer' },\n );\n}\n\nexport default function repositoryHooks(\n pi: ExtensionAPI,\n hookTelemetry: HarnessTelemetry = createHarnessTelemetry(),\n): void {\n pi.on('session_start', async (_event, ctx) => {\n const runtime = hookRuntime(ctx, hookTelemetry);\n const sessionId = ctx.sessionManager.getSessionId();\n const payload = { session_id: sessionId, cwd: runtime.repoRoot };\n const outcomes = await runHooks(\n resolvedHooks(HOOK_EVENT.sessionStart, runtime),\n payload,\n runtime,\n ctx,\n `repository-hooks:${sessionId}:start`,\n 'Running session-start hooks',\n );\n steerHookFailures(pi, failuresFrom(runtime, outcomes));\n const context = additionalContextsFrom(decisionsFrom(outcomes)).join('\\n\\n');\n if (context) {\n pi.sendMessage(\n { customType: 'repository-hook-context', content: context, display: true },\n { deliverAs: 'steer' },\n );\n }\n });\n\n pi.on('tool_call', async (event, ctx) => {\n const runtime = hookRuntime(ctx, hookTelemetry);\n const payload = hookPayload(event, HOOK_EVENT.preToolUse, runtime.repoRoot, ctx.sessionManager.getSessionId());\n const outcomes = await runHooks(\n resolvedHooks(HOOK_EVENT.preToolUse, runtime, event.toolName),\n payload,\n runtime,\n ctx,\n `repository-hooks:${event.toolCallId}:pre`,\n `Running pre-tool hooks for ${event.toolName}`,\n );\n const decisions = decisionsFrom(outcomes);\n steerHookFailures(pi, failuresFrom(runtime, outcomes));\n const denied = decisions.find(isDenied);\n if (denied) return { block: true, reason: decisionReason(denied) ?? 'Blocked by repository hook' };\n const context = additionalContextsFrom(decisions).join('\\n\\n');\n if (context) return { block: true, reason: context };\n return undefined;\n });\n\n pi.on('tool_result', async (event, ctx) => {\n const runtime = hookRuntime(ctx, hookTelemetry);\n const payload = hookPayload(event, HOOK_EVENT.postToolUse, runtime.repoRoot, ctx.sessionManager.getSessionId());\n const outcomes = await runHooks(\n resolvedHooks(HOOK_EVENT.postToolUse, runtime, event.toolName),\n payload,\n runtime,\n ctx,\n `repository-hooks:${event.toolCallId}:post`,\n `Running post-tool hooks for ${event.toolName}`,\n );\n const decisions = decisionsFrom(outcomes);\n const failures = failuresFrom(runtime, outcomes);\n const messages = decisions\n .map((decision) => decision.hookSpecificOutput?.additionalContext ?? decisionReason(decision))\n .filter((value): value is string => Boolean(value));\n if (failures.length > 0) messages.push(hookFailureMessage(failures));\n if (messages.length === 0) return undefined;\n return {\n content: [...event.content, { type: 'text', text: messages.join('\\n\\n') }],\n isError: event.isError || decisions.some(isDenied),\n };\n });\n\n pi.on('agent_settled', async (_event, ctx) => {\n const runtime = hookRuntime(ctx, hookTelemetry);\n const sessionId = ctx.sessionManager.getSessionId();\n const payload = { session_id: sessionId, cwd: runtime.repoRoot };\n // skipInSubagent on the workflow-stop binding keeps subagents from closing\n // the parent's workflow step.\n await runHooks(\n resolvedHooks(HOOK_EVENT.stop, runtime),\n payload,\n runtime,\n ctx,\n `repository-hooks:${sessionId}:stop`,\n 'Running stop hooks',\n );\n });\n\n pi.on('session_shutdown', async (_event, ctx) => {\n const runtime = hookRuntime(ctx, hookTelemetry);\n const sessionId = ctx.sessionManager.getSessionId();\n const payload = { session_id: sessionId, cwd: runtime.repoRoot };\n await runHooks(\n pluginHooks(HOOK_EVENT.sessionEnd, runtime).map(({ hook, root }) => ({ hook, root })),\n payload,\n runtime,\n ctx,\n `repository-hooks:${sessionId}:end`,\n 'Running session-end hooks',\n );\n });\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"repositoryHooks.d.cts","names":[],"sources":["../../src/entries/repositoryHooks.ts"],"mappings":";;;;iBA8dwB,eAAA,CACtB,EAAA,EAAI,YAAA,EACJ,aAAA,GAAe,gBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"repositoryHooks.d.mts","names":[],"sources":["../../src/entries/repositoryHooks.ts"],"mappings":";;;;iBA8dwB,eAAA,CACtB,EAAA,EAAI,YAAA,EACJ,aAAA,GAAe,gBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"repositoryHooks.mjs","names":["parseYaml"],"sources":["../../src/entries/repositoryHooks.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport { requireDoomConfigContext, type DoomHarnessContext } from '@agimon-ai/doompi-config';\nimport { doomConfigCandidates } from '@agimon-ai/doompi-config/layeredConfig';\nimport type { ExtensionAPI, ExtensionContext, ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\nimport { parse as parseYaml } from 'yaml';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\n// Imported from the module rather than the utils barrel: Pi loads this file\n// directly, so pulling in the barrel would load module resolution helpers the\n// extension never uses.\nimport { toClaudeToolName } from '../utils/toolNames.ts';\n\nconst HOOKS_FILE = 'hooks.yaml';\nconst HOOK_SHELL = '/bin/bash';\nconst HOOK_SHELL_COMMAND_FLAG = '-c';\nconst HOOK_TERMINATION_GRACE_MS = 2_000;\nconst PROCESS_NOT_FOUND_ERROR = 'ESRCH';\n\n/** Registry event names. Each is used twice per dispatch, so drift would be silent. */\nconst HOOK_EVENT = {\n sessionStart: 'SessionStart',\n preToolUse: 'PreToolUse',\n postToolUse: 'PostToolUse',\n stop: 'Stop',\n sessionEnd: 'SessionEnd',\n} as const;\n\ninterface HookCommand {\n command: string;\n timeout?: number;\n}\n\ninterface RegistryBinding {\n matcher?: string;\n command: string;\n timeout?: number;\n skipInSubagent?: boolean;\n order?: number;\n}\n\ninterface RegistryRow extends RegistryBinding {\n event: string;\n order: number;\n position: number;\n}\n\n/** A registry row plus the group membership used to include or drop it. */\ninterface RegistryEntry extends RegistryRow {\n groupId: string;\n core: boolean;\n /** Root of the config that declared the group, exported as CLAUDE_PLUGIN_ROOT. */\n baseDirectory: string;\n}\n\ninterface HookGroup {\n matcher?: string;\n hooks?: HookCommand[];\n}\n\ninterface PluginHookConfig {\n hooks?: Record<string, HookGroup[]>;\n}\n\ninterface RegistryDocument {\n groups?: Record<string, { core?: boolean; hooks?: Array<{ event: string; pi?: RegistryBinding }> }>;\n}\n\n// Parsing the registry is the most expensive step on the tool-call path, and it\n// runs twice per tool call (once before, once after). Both caches are keyed on\n// file contents rather than mtime, so they stay correct for an in-place rewrite\n// and need no invalidation hook.\nlet cachedRegistrySource: string | undefined;\nlet cachedRegistryEntries: RegistryEntry[] = [];\nconst pluginConfigCache = new Map<string, { source: string; config: PluginHookConfig }>();\n\ninterface HookDecision {\n decision?: string;\n reason?: string;\n hookSpecificOutput?: {\n permissionDecision?: string;\n reason?: string;\n additionalContext?: string;\n };\n}\n\ninterface HookRuntime {\n repoRoot: string;\n harness: DoomHarnessContext;\n telemetry: HarnessTelemetry;\n failures: HookFailure[];\n}\n\ninterface HookFailure {\n command: string;\n message: string;\n reason: 'spawn_failed' | 'non_zero_exit' | 'timeout' | 'invalid_json' | 'registry_read' | 'plugin_config';\n}\n\ninterface HookOutcome {\n decision?: HookDecision;\n failure?: HookFailure;\n}\n\ninterface ResolvedHook {\n hook: HookCommand;\n root?: string;\n}\n\nfunction hookRuntime(ctx: ExtensionContext, telemetry: HarnessTelemetry): HookRuntime {\n const harness = requireDoomConfigContext(ctx).harness;\n return { repoRoot: harness.root ?? ctx.cwd, harness, telemetry, failures: [] };\n}\n\nfunction hookPayload(\n event: ToolCallEvent | ToolResultEvent,\n hookEventName: string,\n repoRoot: string,\n sessionId: string,\n): Record<string, unknown> {\n return {\n session_id: sessionId,\n transcript_path: '',\n cwd: repoRoot,\n hook_event_name: hookEventName,\n tool_name: toClaudeToolName(event.toolName),\n tool_input: event.input,\n ...(event.type === 'tool_result' ? { tool_response: { success: !event.isError, content: event.content } } : {}),\n };\n}\n\nasync function executeHook(\n hook: HookCommand,\n payload: Record<string, unknown>,\n runtime: HookRuntime,\n pluginRoot?: string,\n): Promise<HookOutcome> {\n const { repoRoot, telemetry } = runtime;\n return new Promise((resolve) => {\n const useProcessGroup = process.platform !== 'win32';\n // -c, not -lc. Hooks run on every tool call, and a login shell would source\n // the developer's profile each time: per-call latency plus hook behavior\n // that varies with their dotfiles. The child inherits process.env below, so\n // it keeps the PATH the launcher was started with.\n const child = spawn(HOOK_SHELL, [HOOK_SHELL_COMMAND_FLAG, hook.command], {\n cwd: repoRoot,\n env: {\n ...process.env,\n CLAUDE_PROJECT_DIR: repoRoot,\n CODEX_REPO_ROOT: repoRoot,\n ORIGINAL_REPO_PATH: process.env.ORIGINAL_REPO_PATH ?? repoRoot,\n ...(pluginRoot ? { CLAUDE_PLUGIN_ROOT: pluginRoot } : {}),\n },\n stdio: ['pipe', 'pipe', 'pipe'],\n detached: useProcessGroup,\n });\n let stdout = '';\n let stderr = '';\n let settled = false;\n let timedOut = false;\n let childExited = false;\n let timeoutExitCode: number | null = null;\n let escalationTimer: NodeJS.Timeout | undefined;\n\n const signalOwnedProcess = (signal: NodeJS.Signals): void => {\n try {\n if (useProcessGroup && child.pid !== undefined) {\n process.kill(-child.pid, signal);\n return;\n }\n child.kill(signal);\n } catch (error) {\n const code = error instanceof Error && 'code' in error ? error.code : undefined;\n if (code !== PROCESS_NOT_FOUND_ERROR) {\n process.emitWarning(`Could not signal repository hook process: ${String(error)}`);\n }\n }\n };\n\n const ownedProcessIsAlive = (): boolean => {\n if (!useProcessGroup || child.pid === undefined) return !childExited;\n try {\n process.kill(-child.pid, 0);\n return true;\n } catch (error) {\n const code = error instanceof Error && 'code' in error ? error.code : undefined;\n return code !== PROCESS_NOT_FOUND_ERROR;\n }\n };\n\n const finish = (outcome: HookOutcome = {}) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n if (escalationTimer) clearTimeout(escalationTimer);\n resolve(outcome);\n };\n\n const finishTimeout = (): void => {\n const message = `Hook timed out after ${hook.timeout ?? 10} seconds.`;\n void telemetry?.recordWarning(HARNESS_EVENT.hookFailed, message, {\n 'hook.reason': 'timeout',\n 'hook.exit_code': timeoutExitCode ?? -1,\n });\n process.stderr.write(`[pi-hook] advisory hook timed out: ${hook.command}\\n${stderr}`);\n finish({ failure: { command: hook.command, message, reason: 'timeout' } });\n };\n\n const timer = setTimeout(\n () => {\n timedOut = true;\n signalOwnedProcess('SIGTERM');\n escalationTimer = setTimeout(() => {\n if (ownedProcessIsAlive()) signalOwnedProcess('SIGKILL');\n finishTimeout();\n }, HOOK_TERMINATION_GRACE_MS);\n },\n (hook.timeout ?? 10) * 1000,\n );\n child.stdout.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.once('error', (error) => {\n if (timedOut) return;\n // A guardrail that never ran is indistinguishable from one that passed,\n // which is the whole reason these are worth reporting.\n void telemetry?.recordError(HARNESS_EVENT.hookFailed, error, {\n 'hook.reason': 'spawn_failed',\n });\n process.stderr.write(`[pi-hook] advisory hook failed: ${error.message}\\n`);\n finish({ failure: { command: hook.command, message: error.message, reason: 'spawn_failed' } });\n });\n child.once('exit', (code) => {\n childExited = true;\n timeoutExitCode = code;\n if (timedOut) return;\n if (code !== 0) {\n const message = stderr.trim() || `Advisory hook exited with code ${code ?? 'unknown'}`;\n void telemetry?.recordWarning(HARNESS_EVENT.hookFailed, message, {\n 'hook.reason': 'non_zero_exit',\n 'hook.exit_code': code ?? -1,\n });\n process.stderr.write(`[pi-hook] advisory hook failed (${code}): ${hook.command}\\n${stderr}`);\n finish({ failure: { command: hook.command, message, reason: 'non_zero_exit' } });\n return;\n }\n const jsonLine = stdout\n .trim()\n .split(/\\r?\\n/)\n .reverse()\n .find((line) => line.startsWith('{'));\n if (!jsonLine) {\n finish();\n return;\n }\n try {\n finish({ decision: JSON.parse(jsonLine) as HookDecision });\n } catch (error) {\n // The hook ran and had an opinion, and it was dropped.\n void telemetry?.recordWarning(HARNESS_EVENT.hookFailed, error, {\n 'hook.reason': 'invalid_json',\n });\n process.stderr.write(`[pi-hook] advisory hook returned invalid JSON: ${hook.command}\\n`);\n finish({\n failure: {\n command: hook.command,\n message: error instanceof Error ? error.message : String(error),\n reason: 'invalid_json',\n },\n });\n }\n });\n child.stdin.end(JSON.stringify(payload));\n });\n}\n\nfunction isDenied(decision: HookDecision | undefined): boolean {\n return decision?.decision === 'block' || decision?.hookSpecificOutput?.permissionDecision === 'deny';\n}\n\nfunction decisionReason(decision: HookDecision | undefined): string | undefined {\n return decision?.reason ?? decision?.hookSpecificOutput?.reason;\n}\n\n/**\n * Parses a plugin hook config, reusing the last parse of identical content.\n *\n * Reading the file every time is deliberate: it costs almost nothing and keeps\n * an in-place rewrite visible, which an mtime check would miss when two writes\n * land inside the same filesystem timestamp granularity.\n */\nfunction readPluginHookConfig(configPath: string): PluginHookConfig {\n const source = fs.readFileSync(configPath, 'utf8');\n const cached = pluginConfigCache.get(configPath);\n if (cached?.source === source) return cached.config;\n const config = JSON.parse(source) as PluginHookConfig;\n pluginConfigCache.set(configPath, { source, config });\n return config;\n}\n\nfunction pluginHooks(\n eventName: string,\n runtime: HookRuntime,\n toolName?: string,\n): Array<{ hook: HookCommand; root: string }> {\n const matches: Array<{ hook: HookCommand; root: string }> = [];\n for (const source of runtime.harness.pluginHooks) {\n let config: PluginHookConfig;\n try {\n config = readPluginHookConfig(source.configPath);\n } catch (error) {\n runtime.failures.push({\n command: source.configPath,\n message: error instanceof Error ? error.message : String(error),\n reason: 'plugin_config',\n });\n continue;\n }\n for (const group of config.hooks?.[eventName] ?? []) {\n if (toolName && group.matcher && !new RegExp(group.matcher).test(toClaudeToolName(toolName))) continue;\n for (const hook of group.hooks ?? []) matches.push({ hook, root: source.pluginRoot });\n }\n }\n return matches;\n}\n\n// Reads the canonical registry from .doom/hooks.yaml in the global config\n// directory and the repository, keeping only bindings that declare a `pi`\n// frontend. A repository group replaces the global group of the same id. Core\n// groups always load; the rest are gated by DOOMPI_HOOK_GROUPS, which the\n// harness sets from the resolved layers. An unset variable means every group,\n// which is the standalone default.\nfunction parseRegistry(sources: ReadonlyArray<{ baseDirectory: string; text: string }>): RegistryEntry[] {\n // Keyed on the joined contents rather than mtime, so it stays correct for an\n // in-place rewrite. Reading both files is cheap; parsing is what this skips.\n const cacheKey = sources.map((source) => `${source.baseDirectory} ${source.text}`).join(' ');\n if (cachedRegistrySource === cacheKey) return cachedRegistryEntries;\n\n const groups = new Map<string, { entries: RegistryEntry[] }>();\n let position = 0;\n for (const source of sources) {\n const document = (parseYaml(source.text) ?? {}) as RegistryDocument;\n for (const [groupId, group] of Object.entries(document.groups ?? {})) {\n const entries: RegistryEntry[] = [];\n for (const hook of group.hooks ?? []) {\n // Every declared hook advances the position, whether or not it is kept,\n // so the sort tiebreaker stays the order the file declares them in.\n position += 1;\n if (!hook.pi) continue;\n entries.push({\n ...hook.pi,\n event: hook.event,\n order: hook.pi.order ?? 0,\n position,\n groupId,\n core: group.core === true,\n baseDirectory: source.baseDirectory,\n });\n }\n groups.set(groupId, { entries });\n }\n }\n\n const entries = [...groups.values()].flatMap((group) => group.entries);\n entries.sort((left, right) => left.order - right.order || left.position - right.position);\n cachedRegistrySource = cacheKey;\n cachedRegistryEntries = entries;\n return entries;\n}\n\nfunction registryRows(runtime: HookRuntime): RegistryEntry[] {\n const { repoRoot, harness, telemetry } = runtime;\n const candidates = doomConfigCandidates(HOOKS_FILE, repoRoot);\n // Named for the error path only. A registry absent from both locations is a\n // repository with no hooks, not a failure, so only a file that exists and\n // cannot be read or parsed reaches the catch below.\n const registryPath = candidates.map((candidate) => candidate.filePath).join(' and ');\n try {\n // Group selection changes when /major-mode switches mid-session, so inclusion is\n // applied per call instead of being baked into the cached parse.\n const selected = harness.hookGroups;\n const allowed = selected === undefined ? undefined : new Set(selected);\n const sources = candidates\n .filter((candidate) => fs.existsSync(candidate.filePath))\n .map((candidate) => ({\n baseDirectory: candidate.baseDirectory,\n text: fs.readFileSync(candidate.filePath, 'utf8'),\n }));\n return parseRegistry(sources).filter((entry) => entry.core || !allowed || allowed.has(entry.groupId));\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n // This empties the registry for the whole session, so every repository hook\n // silently stops running rather than any one of them failing.\n void telemetry?.recordError(HARNESS_EVENT.hookRegistryReadFailed, error, { 'hook.registry.source': 'repository' });\n process.stderr.write(`[pi-hook] could not read ${registryPath}: ${reason}\\n`);\n runtime.failures.push({ command: registryPath, message: reason, reason: 'registry_read' });\n return [];\n }\n}\n\nfunction registryHooks(\n eventName: string,\n runtime: HookRuntime,\n toolName?: string,\n): Array<{ hook: HookCommand; root: string }> {\n return (\n registryRows(runtime)\n .filter((row) => row.event === eventName)\n .filter((row) => !(row.skipInSubagent && process.env.PI_SUBAGENT_CHILD))\n .filter((row) => !toolName || !row.matcher || new RegExp(row.matcher).test(toClaudeToolName(toolName)))\n // The declaring config's root, so a global hook can reach its own scripts\n // through CLAUDE_PLUGIN_ROOT while still running against this repository.\n .map((row) => ({ hook: { command: row.command, timeout: row.timeout }, root: row.baseDirectory }))\n );\n}\n\nasync function runHooks(\n hooks: ResolvedHook[],\n payload: Record<string, unknown>,\n runtime: HookRuntime,\n ctx: ExtensionContext,\n statusKey: string,\n statusLabel: string,\n): Promise<HookOutcome[]> {\n const outcomes: HookOutcome[] = [];\n try {\n for (const [index, resolved] of hooks.entries()) {\n if (ctx.hasUI) ctx.ui.setStatus(statusKey, `${statusLabel} (${index + 1}/${hooks.length})...`);\n outcomes.push(await executeHook(resolved.hook, payload, runtime, resolved.root));\n }\n } finally {\n if (ctx.hasUI) ctx.ui.setStatus(statusKey, undefined);\n }\n return outcomes;\n}\n\nfunction resolvedHooks(eventName: string, runtime: HookRuntime, toolName?: string): ResolvedHook[] {\n return [\n ...registryHooks(eventName, runtime, toolName).map(({ hook, root }) => ({ hook, root })),\n ...pluginHooks(eventName, runtime, toolName).map(({ hook, root }) => ({ hook, root })),\n ];\n}\n\nfunction decisionsFrom(outcomes: HookOutcome[]): HookDecision[] {\n return outcomes.flatMap((outcome) => (outcome.decision ? [outcome.decision] : []));\n}\n\nfunction additionalContextsFrom(decisions: HookDecision[]): string[] {\n return decisions\n .map((decision) => decision.hookSpecificOutput?.additionalContext)\n .filter((value): value is string => Boolean(value));\n}\n\nfunction failuresFrom(runtime: HookRuntime, outcomes: HookOutcome[]): HookFailure[] {\n return [...runtime.failures, ...outcomes.flatMap((outcome) => (outcome.failure ? [outcome.failure] : []))];\n}\n\nfunction hookFailureMessage(failures: HookFailure[]): string {\n return [\n 'One or more repository hooks did not complete, so their checks were not applied:',\n ...failures.map((failure) => `- ${failure.command}: ${failure.message}`),\n 'Options:',\n '- Inspect the hook command or configuration and rerun after correcting it.',\n '- Continue only if the missed advisory check is acceptable.',\n '- Ask the user before bypassing a hook that may enforce a guardrail.',\n ].join('\\n');\n}\n\nfunction steerHookFailures(pi: ExtensionAPI, failures: HookFailure[]): void {\n if (failures.length === 0) return;\n pi.sendMessage(\n { customType: 'repository-hook-failure', content: hookFailureMessage(failures), display: true },\n { deliverAs: 'steer' },\n );\n}\n\nexport default function repositoryHooks(\n pi: ExtensionAPI,\n hookTelemetry: HarnessTelemetry = createHarnessTelemetry(),\n): void {\n pi.on('session_start', async (_event, ctx) => {\n const runtime = hookRuntime(ctx, hookTelemetry);\n const sessionId = ctx.sessionManager.getSessionId();\n const payload = { session_id: sessionId, cwd: runtime.repoRoot };\n const outcomes = await runHooks(\n resolvedHooks(HOOK_EVENT.sessionStart, runtime),\n payload,\n runtime,\n ctx,\n `repository-hooks:${sessionId}:start`,\n 'Running session-start hooks',\n );\n steerHookFailures(pi, failuresFrom(runtime, outcomes));\n const context = additionalContextsFrom(decisionsFrom(outcomes)).join('\\n\\n');\n if (context) {\n pi.sendMessage(\n { customType: 'repository-hook-context', content: context, display: true },\n { deliverAs: 'steer' },\n );\n }\n });\n\n pi.on('tool_call', async (event, ctx) => {\n const runtime = hookRuntime(ctx, hookTelemetry);\n const payload = hookPayload(event, HOOK_EVENT.preToolUse, runtime.repoRoot, ctx.sessionManager.getSessionId());\n const outcomes = await runHooks(\n resolvedHooks(HOOK_EVENT.preToolUse, runtime, event.toolName),\n payload,\n runtime,\n ctx,\n `repository-hooks:${event.toolCallId}:pre`,\n `Running pre-tool hooks for ${event.toolName}`,\n );\n const decisions = decisionsFrom(outcomes);\n steerHookFailures(pi, failuresFrom(runtime, outcomes));\n const denied = decisions.find(isDenied);\n if (denied) return { block: true, reason: decisionReason(denied) ?? 'Blocked by repository hook' };\n const context = additionalContextsFrom(decisions).join('\\n\\n');\n if (context) return { block: true, reason: context };\n return undefined;\n });\n\n pi.on('tool_result', async (event, ctx) => {\n const runtime = hookRuntime(ctx, hookTelemetry);\n const payload = hookPayload(event, HOOK_EVENT.postToolUse, runtime.repoRoot, ctx.sessionManager.getSessionId());\n const outcomes = await runHooks(\n resolvedHooks(HOOK_EVENT.postToolUse, runtime, event.toolName),\n payload,\n runtime,\n ctx,\n `repository-hooks:${event.toolCallId}:post`,\n `Running post-tool hooks for ${event.toolName}`,\n );\n const decisions = decisionsFrom(outcomes);\n const failures = failuresFrom(runtime, outcomes);\n const messages = decisions\n .map((decision) => decision.hookSpecificOutput?.additionalContext ?? decisionReason(decision))\n .filter((value): value is string => Boolean(value));\n if (failures.length > 0) messages.push(hookFailureMessage(failures));\n if (messages.length === 0) return undefined;\n return {\n content: [...event.content, { type: 'text', text: messages.join('\\n\\n') }],\n isError: event.isError || decisions.some(isDenied),\n };\n });\n\n pi.on('agent_settled', async (_event, ctx) => {\n const runtime = hookRuntime(ctx, hookTelemetry);\n const sessionId = ctx.sessionManager.getSessionId();\n const payload = { session_id: sessionId, cwd: runtime.repoRoot };\n // skipInSubagent on the workflow-stop binding keeps subagents from closing\n // the parent's workflow step.\n await runHooks(\n resolvedHooks(HOOK_EVENT.stop, runtime),\n payload,\n runtime,\n ctx,\n `repository-hooks:${sessionId}:stop`,\n 'Running stop hooks',\n );\n });\n\n pi.on('session_shutdown', async (_event, ctx) => {\n const runtime = hookRuntime(ctx, hookTelemetry);\n const sessionId = ctx.sessionManager.getSessionId();\n const payload = { session_id: sessionId, cwd: runtime.repoRoot };\n await runHooks(\n pluginHooks(HOOK_EVENT.sessionEnd, runtime).map(({ hook, root }) => ({ hook, root })),\n payload,\n runtime,\n ctx,\n `repository-hooks:${sessionId}:end`,\n 'Running session-end hooks',\n );\n });\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.cjs","names":["provideSkillSources","openSkillsOverlay","buildSkillCatalog"],"sources":["../../src/entries/skills.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport { registerDoomLeaderContribution, type DoomLeaderContribution } from '@agimon-ai/doompi-ui/leader';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { openSkillsOverlay } from './components/skillsOverlay.ts';\nimport { requireHarnessRoot } from '../config/harnessState.ts';\nimport { buildSkillCatalog } from '../services/skillCatalog.ts';\nimport { provideSkillSources } from '../services/skillSources.ts';\n\nconst SKILLS_COMMAND = 'skills';\nconst LEADER_SOURCE = '@agimon-ai/doompi';\nconst INFO = 'info';\nconst ERROR = 'error';\n\nexport const SKILLS_LEADER_CONTRIBUTION = {\n source: LEADER_SOURCE,\n bindings: [\n {\n id: 'skills.browse',\n path: [\n // Label and order repeat the core extension group exactly; the registry\n // rejects a contribution whose shared prefix disagrees.\n { key: 'e', label: 'extension', order: 50 },\n { key: 's', label: 'skills', detail: 'browse catalog' },\n ],\n command: { name: SKILLS_COMMAND },\n },\n ],\n} satisfies DoomLeaderContribution;\n\n/**\n * Prefills the draft rather than submitting it.\n *\n * `/skill:<name>` is expanded by Pi inside `prompt()`, which only the editor's\n * own submission path reaches: `sendUserMessage` sets `expandPromptTemplates`\n * false and would deliver the literal text. Leaving the command in the editor\n * keeps the expansion and costs one keystroke.\n */\nexport function skillInvocation(name: string): string {\n return `/skill:${name} `;\n}\n\nexport default function skillsExtension(pi: ExtensionAPI): void {\n const sources = provideSkillSources(pi);\n\n registerDoomLeaderContribution(pi, SKILLS_LEADER_CONTRIBUTION);\n\n pi.registerCommand(SKILLS_COMMAND, {\n description: 'Browse the skills this session loaded, and what other domains would add',\n handler: async (_args, ctx) => {\n if (!ctx.hasUI || ctx.mode !== 'tui') {\n ctx.ui.notify('/skills requires interactive mode', ERROR);\n return;\n }\n const state = requireDoomConfigContext(ctx).harness;\n const repoRoot = requireHarnessRoot(state);\n const catalog = await buildSkillCatalog({\n repoRoot,\n activeSkillDirectories: state.skillDirectories,\n extensionSources: sources.list(),\n });\n\n const result = await openSkillsOverlay(ctx, { catalog, repoRoot });\n if (!result) return;\n const { skill } = result;\n ctx.ui.setEditorText(skillInvocation(skill.name));\n ctx.ui.notify(`Loaded ${skill.name} into the prompt. Press enter to run it.`, INFO);\n },\n });\n}\n"],"mappings":"2YAQA,MAAM,EAAiB,SAKV,EAA6B,CACxC,OAAQ,oBACR,SAAU,CACR,CACE,GAAI,gBACJ,KAAM,CAGJ,CAAE,IAAK,IAAK,MAAO,YAAa,MAAO,GAAI,CAC3C,CAAE,IAAK,IAAK,MAAO,SAAU,OAAQ,iBAAkB,CACxD,CACD,QAAS,CAAE,KAAM,EAAgB,CAClC,CACF,CACF,CAUD,SAAgB,EAAgB,EAAsB,CACpD,MAAO,UAAU,EAAK,GAGxB,SAAwB,EAAgB,EAAwB,CAC9D,IAAM,EAAUA,EAAAA,oBAAoB,EAAG,EAEvC,EAAA,EAAA,gCAA+B,EAAI,EAA2B,CAE9D,EAAG,gBAAgB,EAAgB,CACjC,YAAa,0EACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,GAAI,CAAC,EAAI,OAAS,EAAI,OAAS,MAAO,CACpC,EAAI,GAAG,OAAO,oCAAqC,QAAM,CACzD,OAEF,IAAM,GAAA,EAAA,EAAA,0BAAiC,EAAI,CAAC,QACtC,GAAA,EAAA,EAAA,oBAA8B,EAAM,CAOpC,EAAS,MAAMC,EAAAA,kBAAkB,EAAK,CAAE,QAAA,MANxBC,EAAAA,kBAAkB,CACtC,WACA,uBAAwB,EAAM,iBAC9B,iBAAkB,EAAQ,MAAM,CACjC,CAAC,CAEqD,WAAU,CAAC,CAClE,GAAI,CAAC,EAAQ,OACb,GAAM,CAAE,SAAU,EAClB,EAAI,GAAG,cAAc,EAAgB,EAAM,KAAK,CAAC,CACjD,EAAI,GAAG,OAAO,UAAU,EAAM,KAAK,0CAA2C,OAAK,EAEtF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.d.cts","names":[],"sources":["../../src/entries/skills.ts"],"mappings":";;;cAaa,0BAAA;;;;;;;;;;;;;;;;;;;;AAwBb;;;;;AAEC;iBAFe,eAAA,CAAgB,IAAA;AAAA,iBAIR,eAAA,CAAgB,EAAA,EAAI,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.d.mts","names":[],"sources":["../../src/entries/skills.ts"],"mappings":";;;cAaa,0BAAA;;;;;;;;;;;;;;;;;;;;AAwBb;;;;;AAEC;iBAFe,eAAA,CAAgB,IAAA;AAAA,iBAIR,eAAA,CAAgB,EAAA,EAAI,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.mjs","names":[],"sources":["../../src/entries/skills.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport { registerDoomLeaderContribution, type DoomLeaderContribution } from '@agimon-ai/doompi-ui/leader';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { openSkillsOverlay } from './components/skillsOverlay.ts';\nimport { requireHarnessRoot } from '../config/harnessState.ts';\nimport { buildSkillCatalog } from '../services/skillCatalog.ts';\nimport { provideSkillSources } from '../services/skillSources.ts';\n\nconst SKILLS_COMMAND = 'skills';\nconst LEADER_SOURCE = '@agimon-ai/doompi';\nconst INFO = 'info';\nconst ERROR = 'error';\n\nexport const SKILLS_LEADER_CONTRIBUTION = {\n source: LEADER_SOURCE,\n bindings: [\n {\n id: 'skills.browse',\n path: [\n // Label and order repeat the core extension group exactly; the registry\n // rejects a contribution whose shared prefix disagrees.\n { key: 'e', label: 'extension', order: 50 },\n { key: 's', label: 'skills', detail: 'browse catalog' },\n ],\n command: { name: SKILLS_COMMAND },\n },\n ],\n} satisfies DoomLeaderContribution;\n\n/**\n * Prefills the draft rather than submitting it.\n *\n * `/skill:<name>` is expanded by Pi inside `prompt()`, which only the editor's\n * own submission path reaches: `sendUserMessage` sets `expandPromptTemplates`\n * false and would deliver the literal text. Leaving the command in the editor\n * keeps the expansion and costs one keystroke.\n */\nexport function skillInvocation(name: string): string {\n return `/skill:${name} `;\n}\n\nexport default function skillsExtension(pi: ExtensionAPI): void {\n const sources = provideSkillSources(pi);\n\n registerDoomLeaderContribution(pi, SKILLS_LEADER_CONTRIBUTION);\n\n pi.registerCommand(SKILLS_COMMAND, {\n description: 'Browse the skills this session loaded, and what other domains would add',\n handler: async (_args, ctx) => {\n if (!ctx.hasUI || ctx.mode !== 'tui') {\n ctx.ui.notify('/skills requires interactive mode', ERROR);\n return;\n }\n const state = requireDoomConfigContext(ctx).harness;\n const repoRoot = requireHarnessRoot(state);\n const catalog = await buildSkillCatalog({\n repoRoot,\n activeSkillDirectories: state.skillDirectories,\n extensionSources: sources.list(),\n });\n\n const result = await openSkillsOverlay(ctx, { catalog, repoRoot });\n if (!result) return;\n const { skill } = result;\n ctx.ui.setEditorText(skillInvocation(skill.name));\n ctx.ui.notify(`Loaded ${skill.name} into the prompt. Press enter to run it.`, INFO);\n },\n });\n}\n"],"mappings":"wZAQA,MAAM,EAAiB,SAKV,EAA6B,CACxC,OAAQ,oBACR,SAAU,CACR,CACE,GAAI,gBACJ,KAAM,CAGJ,CAAE,IAAK,IAAK,MAAO,YAAa,MAAO,GAAI,CAC3C,CAAE,IAAK,IAAK,MAAO,SAAU,OAAQ,iBAAkB,CACxD,CACD,QAAS,CAAE,KAAM,EAAgB,CAClC,CACF,CACF,CAUD,SAAgB,EAAgB,EAAsB,CACpD,MAAO,UAAU,EAAK,GAGxB,SAAwB,EAAgB,EAAwB,CAC9D,IAAM,EAAU,EAAoB,EAAG,CAEvC,EAA+B,EAAI,EAA2B,CAE9D,EAAG,gBAAgB,EAAgB,CACjC,YAAa,0EACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,GAAI,CAAC,EAAI,OAAS,EAAI,OAAS,MAAO,CACpC,EAAI,GAAG,OAAO,oCAAqC,QAAM,CACzD,OAEF,IAAM,EAAQ,EAAyB,EAAI,CAAC,QACtC,EAAW,EAAmB,EAAM,CAOpC,EAAS,MAAM,EAAkB,EAAK,CAAE,QAAA,MANxB,EAAkB,CACtC,WACA,uBAAwB,EAAM,iBAC9B,iBAAkB,EAAQ,MAAM,CACjC,CAAC,CAEqD,WAAU,CAAC,CAClE,GAAI,CAAC,EAAQ,OACb,GAAM,CAAE,SAAU,EAClB,EAAI,GAAG,cAAc,EAAgB,EAAM,KAAK,CAAC,CACjD,EAAI,GAAG,OAAO,UAAU,EAAM,KAAK,0CAA2C,OAAK,EAEtF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"styleSystem.d.cts","names":[],"sources":["../../src/entries/styleSystem.ts"],"mappings":";;;;UAQU,kBAAA;EACR,SAAA;EACA,WAAA;EACA,aAAA;EACA,SAAA;AAAA;AAAA,UAGQ,iBAAA;EACR,SAAA;EACA,aAAA;EACA,cAAA;EACA,aAAA;EACA,WAAA;EACA,QAAA;IAAa,KAAA;IAAe,MAAA;EAAA;EAC5B,UAAA;AAAA;AAAA,iBAUc,SAAA,CAAU,KAAA,EAAO,eAAA,EAAiB,GAAA;AAAA,iBAkClC,uBAAA,CAAwB,SAAA,UAAmB,IAAA,WAAe,kBAAA;AAAA,iBAa1D,sBAAA,CAAuB,MAAA,WAAiB,iBAAA;AAAA,iBAsDlC,sBAAA,CACpB,SAAA,UACA,OAAA,EAAS,kBAAA,EACT,eAAA,YACC,OAAA;AAAA,iBAaa,cAAA,CACd,OAAA,EAAS,kBAAA,EACT,MAAA,EAAQ,iBAAA,EACR,eAAA;AAAA,iBAmBc,cAAA,CAAe,OAAA,EAAS,kBAAA,EAAoB,KAAA;AAAA,iBAepC,kBAAA,CACtB,EAAA,EAAI,YAAA,EACJ,SAAA,GAAW,gBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"styleSystem.d.mts","names":[],"sources":["../../src/entries/styleSystem.ts"],"mappings":";;;;UAQU,kBAAA;EACR,SAAA;EACA,WAAA;EACA,aAAA;EACA,SAAA;AAAA;AAAA,UAGQ,iBAAA;EACR,SAAA;EACA,aAAA;EACA,cAAA;EACA,aAAA;EACA,WAAA;EACA,QAAA;IAAa,KAAA;IAAe,MAAA;EAAA;EAC5B,UAAA;AAAA;AAAA,iBAUc,SAAA,CAAU,KAAA,EAAO,eAAA,EAAiB,GAAA;AAAA,iBAkClC,uBAAA,CAAwB,SAAA,UAAmB,IAAA,WAAe,kBAAA;AAAA,iBAa1D,sBAAA,CAAuB,MAAA,WAAiB,iBAAA;AAAA,iBAsDlC,sBAAA,CACpB,SAAA,UACA,OAAA,EAAS,kBAAA,EACT,eAAA,YACC,OAAA;AAAA,iBAaa,cAAA,CACd,OAAA,EAAS,kBAAA,EACT,MAAA,EAAQ,iBAAA,EACR,eAAA;AAAA,iBAmBc,cAAA,CAAe,OAAA,EAAS,kBAAA,EAAoB,KAAA;AAAA,iBAepC,kBAAA,CACtB,EAAA,EAAI,YAAA,EACJ,SAAA,GAAW,gBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"styleSystem.mjs","names":[],"sources":["../../src/entries/styleSystem.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport type { ExtensionAPI, ToolResultEvent } from '@earendil-works/pi-coding-agent';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\n\ninterface StoryRenderRequest {\n storyPath: string;\n projectPath: string;\n componentName: string;\n storyName: string;\n}\n\ninterface StyleSystemResult {\n imagePath?: string;\n storyFilePath?: string;\n componentTitle?: string;\n renderedStory?: string;\n colorScheme?: string;\n viewport?: { width: number; height: number };\n dimensions?: string;\n}\n\nconst STYLE_SYSTEM_PACKAGE = 'style-system';\nconst STYLE_SYSTEM_CONFIG_FILE = `${STYLE_SYSTEM_PACKAGE}.config.yaml`;\nconst DEFAULT_STORY_NAME = 'Playground';\nconst STORY_FILE_PATTERN = /\\.stories\\.(?:ts|tsx)$/;\nconst EXPORT_STORY_PATTERN = /export\\s+const\\s+([A-Z][A-Za-z0-9_]*)\\b/g;\nconst TOOL_TIMEOUT_MS = 120_000;\n\nexport function eventPath(event: ToolResultEvent, cwd: string): string | undefined {\n if (event.isError || (event.toolName !== 'write' && event.toolName !== 'edit')) return undefined;\n const input = event.input as { path?: unknown };\n if (typeof input.path !== 'string' || !STORY_FILE_PATTERN.test(input.path)) return undefined;\n return path.resolve(cwd, input.path);\n}\n\nfunction findStyleSystemProject(startFile: string, root: string): string | undefined {\n let directory = path.dirname(startFile);\n const resolvedRoot = path.resolve(root);\n while (directory.startsWith(resolvedRoot)) {\n if (fs.existsSync(path.join(directory, STYLE_SYSTEM_CONFIG_FILE))) {\n return path.relative(resolvedRoot, directory) || '.';\n }\n const parent = path.dirname(directory);\n if (parent === directory) break;\n directory = parent;\n }\n return undefined;\n}\n\nfunction inferComponentName(storyPath: string, content: string): string {\n const title = content.match(/title\\s*:\\s*['\"]([^'\"]+)['\"]/)?.[1]?.trim();\n if (title) return title;\n return path.basename(storyPath).replace(/\\.stories\\.(?:ts|tsx)$/, '');\n}\n\nfunction inferStoryName(content: string): string {\n if (/export\\s+const\\s+Playground\\b/.test(content)) return DEFAULT_STORY_NAME;\n const firstExportedStory = EXPORT_STORY_PATTERN.exec(content)?.[1];\n EXPORT_STORY_PATTERN.lastIndex = 0;\n return firstExportedStory ?? DEFAULT_STORY_NAME;\n}\n\nexport function inferStoryRenderRequest(storyPath: string, root: string): StoryRenderRequest | undefined {\n if (!STORY_FILE_PATTERN.test(storyPath) || !fs.existsSync(storyPath)) return undefined;\n const projectPath = findStyleSystemProject(storyPath, root);\n if (!projectPath) return undefined;\n const content = fs.readFileSync(storyPath, 'utf8');\n return {\n storyPath,\n projectPath,\n componentName: inferComponentName(storyPath, content),\n storyName: inferStoryName(content),\n };\n}\n\nexport function parseStyleSystemOutput(stdout: string): StyleSystemResult {\n const text = stdout.trim();\n if (!text) throw new Error(`${STYLE_SYSTEM_PACKAGE} returned no output`);\n return JSON.parse(text) as StyleSystemResult;\n}\n\n/* v8 ignore next 57 */\nasync function runStyleSystem(request: StoryRenderRequest, root: string): Promise<StyleSystemResult> {\n const args = [\n 'exec',\n STYLE_SYSTEM_PACKAGE,\n 'get-ui-component',\n '--component-name',\n request.componentName,\n '--app-path',\n request.projectPath,\n '--story-name',\n request.storyName,\n ];\n\n return new Promise((resolve, reject) => {\n const child = spawn('pnpm', args, {\n cwd: root,\n env: { ...process.env, LOG_LEVEL: process.env.LOG_LEVEL ?? 'info' },\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n let stdout = '';\n let stderr = '';\n const timer = setTimeout(() => child.kill('SIGTERM'), TOOL_TIMEOUT_MS);\n child.stdout.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.once('error', (error) => {\n clearTimeout(timer);\n reject(error);\n });\n child.once('exit', (code) => {\n clearTimeout(timer);\n if (code !== 0) {\n reject(new Error(stderr.trim() || `${STYLE_SYSTEM_PACKAGE} exited with code ${code ?? 'unknown'}`));\n return;\n }\n try {\n resolve(parseStyleSystemOutput(stdout));\n } catch (error) {\n reject(error);\n }\n });\n });\n}\n\nexport async function copyImageToHarnessTemp(\n imagePath: string,\n request: StoryRenderRequest,\n outputDirectory: string = fs.mkdtempSync(path.join(os.tmpdir(), 'agent-harness-style-system-')),\n): Promise<string> {\n const targetDirectory = path.join(outputDirectory, `${STYLE_SYSTEM_PACKAGE}-visuals`);\n await fs.promises.mkdir(targetDirectory, { recursive: true, mode: 0o700 });\n const baseName = path\n .basename(request.storyPath)\n .replace(/[^a-zA-Z0-9.-]/g, '-')\n .replace(/\\.stories\\./, '.');\n const targetPath = path.join(targetDirectory, `${Date.now()}-${baseName}.png`);\n await fs.promises.copyFile(imagePath, targetPath);\n await fs.promises.chmod(targetPath, 0o600);\n return targetPath;\n}\n\nexport function successMessage(\n request: StoryRenderRequest,\n result: StyleSystemResult,\n copiedImagePath: string,\n): string {\n const details = [\n `Image path: ${copiedImagePath}`,\n `Story file: ${result.storyFilePath ?? request.storyPath}`,\n `Component: ${result.componentTitle ?? request.componentName}`,\n `Story: ${result.renderedStory ?? request.storyName}`,\n result.colorScheme ? `Color scheme: ${result.colorScheme}` : undefined,\n result.dimensions ? `Dimensions: ${result.dimensions}` : undefined,\n ].filter((line): line is string => Boolean(line));\n\n return [\n 'Style-system visual generated for the story you just changed.',\n ...details,\n 'The image is saved and ready to inspect: call the read tool on the image path above to view it.',\n 'If the layout, spacing, color, overflow, or hierarchy looks wrong, adjust the UI and story, then let this hook render it again.',\n ].join('\\n');\n}\n\nexport function failureMessage(request: StoryRenderRequest, error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n return [\n `Your file change was applied, but ${STYLE_SYSTEM_PACKAGE} could not generate a visual for it.`,\n `Story file: ${request.storyPath}`,\n `Command: pnpm exec ${STYLE_SYSTEM_PACKAGE} get-ui-component --component-name ${JSON.stringify(request.componentName)} --app-path ${JSON.stringify(request.projectPath)} --story-name ${JSON.stringify(request.storyName)}`,\n `Error: ${message}`,\n 'Do not treat the UI as visually verified. Run the command above to investigate.',\n ].join('\\n');\n}\n\n/* v8 ignore next 23 */\n// Pi's extension loader resolves this default export and rejects the module\n// without it (\"Extension does not export a valid factory function\"). This must\n// stay a default export; see the pi-extension override in vibe-lint.config.yaml.\nexport default function styleSystemVisuals(\n pi: ExtensionAPI,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): void {\n pi.on('tool_result', async (event, ctx) => {\n const changedPath = eventPath(event, ctx.cwd);\n if (!changedPath) return undefined;\n\n const harness = requireDoomConfigContext(ctx).harness;\n const root = harness.root ?? ctx.cwd;\n const request = inferStoryRenderRequest(changedPath, root);\n if (!request) return undefined;\n const statusKey = `style-system:${event.toolCallId}`;\n if (ctx.hasUI) ctx.ui.setStatus(statusKey, `Rendering ${request.componentName} visual...`);\n\n try {\n const result = await runStyleSystem(request, root);\n if (!result.imagePath) throw new Error(`${STYLE_SYSTEM_PACKAGE} did not return an imagePath`);\n const copiedImagePath = await copyImageToHarnessTemp(\n result.imagePath,\n request,\n harness.temporaryDirectory ?? fs.mkdtempSync(path.join(os.tmpdir(), 'agent-harness-style-system-')),\n );\n return {\n content: [...event.content, { type: 'text' as const, text: successMessage(request, result, copiedImagePath) }],\n };\n } catch (error) {\n void telemetry.recordWarning(HARNESS_EVENT.styleSystemRenderFailed, error, {\n 'style_system.component': request.componentName,\n });\n // The tool itself succeeded; only this hook failed. Surface the reason without\n // reporting the write as failed, which would invite a retry of a change that landed.\n return {\n content: [...event.content, { type: 'text' as const, text: failureMessage(request, error) }],\n };\n } finally {\n if (ctx.hasUI) ctx.ui.setStatus(statusKey, undefined);\n }\n });\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"compatibility.d.cts","names":[],"sources":["../../src/interfaces/compatibility.ts"],"mappings":";KAAY,qBAAA;AAAA,UAEK,oBAAA;EACf,QAAA;EACA,gBAAA;EACA,QAAA,EAAU,qBAAA;EALqB;EAO/B,OAAA;EALmC;EAOnC,OAAA;EAJ+B;EAM/B,SAAA;EAPA;EASA,YAAA;EARU;EAUV,qBAAA;AAAA;AAAA,UAGe,uBAAA;EACf,OAAA,EAAS,IAAA,CAAK,oBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"compatibility.d.mts","names":[],"sources":["../../src/interfaces/compatibility.ts"],"mappings":";KAAY,qBAAA;AAAA,UAEK,oBAAA;EACf,QAAA;EACA,gBAAA;EACA,QAAA,EAAU,qBAAA;EALqB;EAO/B,OAAA;EALmC;EAOnC,OAAA;EAJ+B;EAM/B,SAAA;EAPA;EASA,YAAA;EARU;EAUV,qBAAA;AAAA;AAAA,UAGe,uBAAA;EACf,OAAA,EAAS,IAAA,CAAK,oBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"harness.d.cts","names":[],"sources":["../../src/interfaces/harness.ts"],"mappings":";KAAY,aAAA;AAAA,KACA,mBAAA;AAAA,UAEK,cAAA;EACf,QAAA;EACA,GAAA;EALuB;EAOvB,OAAA;EAN6B;EAQ7B,OAAA;EAR6B;EAU7B,SAAA;EARe;EAUf,OAAA;;EAEA,OAAA;EAXA;;;;;;EAkBA,iBAAA;EACA,iBAAA;EACA,qBAAA;EACA,MAAA,EAAQ,aAAA;EAAR;EAEA,YAAA,EAAc,mBAAA;EAAd;EAEA,IAAA;EACA,UAAA;EACA,QAAA;EACA,oBAAA;EACA,KAAA;EACA,GAAA;EACA,MAAA;EACA,MAAA;AAAA;AAAA,UAGe,iBAAA;EACf,OAAA,EAAS,IAAA,CAAK,cAAA;EACd,IAAA;EACA,OAAA;AAAA;AAAA,UAGe,gBAAA;EACf,UAAA;EACA,UAAA;AAAA;AAAA,UAGe,sBAAA;EACf,MAAA;EACA,GAAA;EACA,kBAAA;EACA,iBAAA;EACA,2BAAA;;EAEA,YAAA;IAAiB,OAAA;IAAoB,KAAA;EAAA;;EAErC,YAAA;AAAA;AAAA,UAGe,gBAAA;EACf,kBAAA;EATA;EAWA,gBAAA;EARA;EAUA,UAAA;EACA,UAAA;EACA,gBAAA;EACA,WAAA,EAAa,gBAAA;EACb,+BAAA;EACA,aAAA;EAV+B;;;;;;EAiB/B,oBAAA;EACA,OAAA,IAAW,OAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"harness.d.mts","names":[],"sources":["../../src/interfaces/harness.ts"],"mappings":";KAAY,aAAA;AAAA,KACA,mBAAA;AAAA,UAEK,cAAA;EACf,QAAA;EACA,GAAA;EALuB;EAOvB,OAAA;EAN6B;EAQ7B,OAAA;EAR6B;EAU7B,SAAA;EARe;EAUf,OAAA;;EAEA,OAAA;EAXA;;;;;;EAkBA,iBAAA;EACA,iBAAA;EACA,qBAAA;EACA,MAAA,EAAQ,aAAA;EAAR;EAEA,YAAA,EAAc,mBAAA;EAAd;EAEA,IAAA;EACA,UAAA;EACA,QAAA;EACA,oBAAA;EACA,KAAA;EACA,GAAA;EACA,MAAA;EACA,MAAA;AAAA;AAAA,UAGe,iBAAA;EACf,OAAA,EAAS,IAAA,CAAK,cAAA;EACd,IAAA;EACA,OAAA;AAAA;AAAA,UAGe,gBAAA;EACf,UAAA;EACA,UAAA;AAAA;AAAA,UAGe,sBAAA;EACf,MAAA;EACA,GAAA;EACA,kBAAA;EACA,iBAAA;EACA,2BAAA;;EAEA,YAAA;IAAiB,OAAA;IAAoB,KAAA;EAAA;;EAErC,YAAA;AAAA;AAAA,UAGe,gBAAA;EACf,kBAAA;EATA;EAWA,gBAAA;EARA;EAUA,UAAA;EACA,UAAA;EACA,gBAAA;EACA,WAAA,EAAa,gBAAA;EACb,+BAAA;EACA,aAAA;EAV+B;;;;;;EAiB/B,oBAAA;EACA,OAAA,IAAW,OAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logSinkTelemetry.cjs","names":[],"sources":["../src/logSinkTelemetry.ts"],"sourcesContent":["import type { DoomTelemetry, DoomTelemetryOptions } from '@agimon-ai/doompi-telemetry';\n\nconst SERVICE_NAME = 'doom-pi';\nconst PACKAGE_NAME = '@agimon-ai/doompi';\n\nexport const HARNESS_EVENT = {\n cliFailed: 'doom_pi.cli_failed',\n contextBuildFailed: 'doom_pi.context_build_failed',\n resourceCollectionFailed: 'doom_pi.resource_collection_failed',\n configLoadFailed: 'doom_pi.config_load_failed',\n launchFailed: 'doom_pi.launch_failed',\n compatibilityLaunchFailed: 'doom_pi.compatibility_launch_failed',\n harnessStateParseFailed: 'doom_pi.harness_state_parse_failed',\n hookFailed: 'doom_pi.hook_failed',\n hookRegistryReadFailed: 'doom_pi.hook_registry_read_failed',\n personaReadFailed: 'doom_pi.persona_read_failed',\n styleSystemRenderFailed: 'doom_pi.style_system_render_failed',\n majorModeUnavailable: 'doom_pi.major_mode_unavailable',\n profileLoadFailed: 'doom_pi.profile_load_failed',\n launchCompleted: 'doom_pi.launch_completed',\n projectTrustResolved: 'doom_pi.project_trust_resolved',\n majorModeSwitched: 'doom_pi.major_mode_switched',\n profileApplied: 'doom_pi.profile_applied',\n} as const;\n\nexport type HarnessEventName = (typeof HARNESS_EVENT)[keyof typeof HARNESS_EVENT];\nexport type HarnessEventAttributes = Record<string, string | number | boolean>;\nexport type HarnessErrorSink = (event: HarnessEventName, error: unknown, attributes?: HarnessEventAttributes) => void;\n\nexport interface HarnessFailureReporter {\n error: HarnessErrorSink;\n warn: HarnessErrorSink;\n}\n\nexport interface HarnessTelemetryOptions {\n cwd?: string;\n workspaceRoot?: string;\n env?: NodeJS.ProcessEnv;\n telemetryFactory?: NonNullable<DoomTelemetryOptions['telemetryFactory']>;\n warn?: (message: string) => void;\n /** Run startup callbacks before loading the telemetry backend. */\n deferSpans?: boolean;\n}\n\nexport interface HarnessTelemetry {\n recordError(event: HarnessEventName, error: unknown, attributes?: HarnessEventAttributes): Promise<void>;\n recordWarning(event: HarnessEventName, error: unknown, attributes?: HarnessEventAttributes): Promise<void>;\n recordEvent(event: HarnessEventName, attributes?: HarnessEventAttributes): Promise<void>;\n runInSpan<T>(name: string, attributes: HarnessEventAttributes, callback: () => Promise<T>): Promise<T>;\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport function createHarnessTelemetry(options: HarnessTelemetryOptions = {}): HarnessTelemetry {\n let telemetryPromise: Promise<DoomTelemetry> | undefined;\n const pendingEvents: Array<{ event: HarnessEventName; attributes?: HarnessEventAttributes }> = [];\n const telemetry = (): Promise<DoomTelemetry> => {\n telemetryPromise ??= import('@agimon-ai/doompi-telemetry').then(({ createDoomTelemetry }) =>\n createDoomTelemetry({\n serviceName: SERVICE_NAME,\n packageName: PACKAGE_NAME,\n cwd: options.cwd,\n workspaceRoot: options.workspaceRoot,\n env: options.env,\n telemetryFactory: options.telemetryFactory,\n warn: options.warn,\n enableLogs: true,\n enableTraces: true,\n }),\n );\n return telemetryPromise;\n };\n const drainEvents = async (loaded: DoomTelemetry): Promise<void> => {\n for (const pending of pendingEvents.splice(0)) {\n await loaded.recordEvent(pending.event, pending.attributes);\n }\n };\n return {\n recordError: async (event, error, attributes) => {\n const loaded = await telemetry();\n await drainEvents(loaded);\n await loaded.recordError(event, error, attributes);\n },\n recordWarning: async (event, error, attributes) => {\n const loaded = await telemetry();\n await drainEvents(loaded);\n await loaded.recordWarning(event, error, attributes);\n },\n recordEvent: async (event, attributes) => {\n if (options.deferSpans && !telemetryPromise) {\n pendingEvents.push({ event, attributes });\n return;\n }\n await (await telemetry()).recordEvent(event, attributes);\n },\n runInSpan: (name, attributes, callback) => {\n // The launcher opts into this path for pre-spawn preparation. Lifecycle\n // events remain buffered until flush; failures still initialize the real\n // sink immediately so diagnostics are not lost.\n if (options.deferSpans && !telemetryPromise) return callback();\n return telemetry().then((loaded) => loaded.runInSpan(name, attributes, callback));\n },\n flush: async () => {\n if (!telemetryPromise && pendingEvents.length === 0) return;\n const loaded = await telemetry();\n await drainEvents(loaded);\n await loaded.flush();\n },\n shutdown: async () => {\n if (!telemetryPromise && pendingEvents.length === 0) return;\n const loaded = await telemetry();\n await drainEvents(loaded);\n await loaded.shutdown();\n },\n };\n}\n\nexport function toFailureReporter(telemetry: HarnessTelemetry): HarnessFailureReporter {\n return {\n error: (event, error, attributes) => void telemetry.recordError(event, error, attributes),\n warn: (event, error, attributes) => void telemetry.recordWarning(event, error, attributes),\n };\n}\n"],"mappings":"mEAEA,MAGa,EAAgB,CAC3B,UAAW,qBACX,mBAAoB,+BACpB,yBAA0B,qCAC1B,iBAAkB,6BAClB,aAAc,wBACd,0BAA2B,sCAC3B,wBAAyB,qCACzB,WAAY,sBACZ,uBAAwB,oCACxB,kBAAmB,8BACnB,wBAAyB,qCACzB,qBAAsB,iCACtB,kBAAmB,8BACnB,gBAAiB,2BACjB,qBAAsB,iCACtB,kBAAmB,8BACnB,eAAgB,0BACjB,CA8BD,SAAgB,EAAuB,EAAmC,EAAE,CAAoB,CAC9F,IAAI,EACE,EAAyF,EAAE,CAC3F,OACJ,IAAqB,OAAO,+BAA+B,MAAM,CAAE,yBACjE,EAAoB,CAClB,YAAa,UACb,YAAa,oBACb,IAAK,EAAQ,IACb,cAAe,EAAQ,cACvB,IAAK,EAAQ,IACb,iBAAkB,EAAQ,iBAC1B,KAAM,EAAQ,KACd,WAAY,GACZ,aAAc,GACf,CAAC,CACH,CACM,GAEH,EAAc,KAAO,IAAyC,CAClE,IAAK,IAAM,KAAW,EAAc,OAAO,EAAE,CAC3C,MAAM,EAAO,YAAY,EAAQ,MAAO,EAAQ,WAAW,EAG/D,MAAO,CACL,YAAa,MAAO,EAAO,EAAO,IAAe,CAC/C,IAAM,EAAS,MAAM,GAAW,CAChC,MAAM,EAAY,EAAO,CACzB,MAAM,EAAO,YAAY,EAAO,EAAO,EAAW,EAEpD,cAAe,MAAO,EAAO,EAAO,IAAe,CACjD,IAAM,EAAS,MAAM,GAAW,CAChC,MAAM,EAAY,EAAO,CACzB,MAAM,EAAO,cAAc,EAAO,EAAO,EAAW,EAEtD,YAAa,MAAO,EAAO,IAAe,CACxC,GAAI,EAAQ,YAAc,CAAC,EAAkB,CAC3C,EAAc,KAAK,CAAE,QAAO,aAAY,CAAC,CACzC,OAEF,MAAO,MAAM,GAAW,EAAE,YAAY,EAAO,EAAW,EAE1D,WAAY,EAAM,EAAY,IAIxB,EAAQ,YAAc,CAAC,EAAyB,GAAU,CACvD,GAAW,CAAC,KAAM,GAAW,EAAO,UAAU,EAAM,EAAY,EAAS,CAAC,CAEnF,MAAO,SAAY,CACjB,GAAI,CAAC,GAAoB,EAAc,SAAW,EAAG,OACrD,IAAM,EAAS,MAAM,GAAW,CAChC,MAAM,EAAY,EAAO,CACzB,MAAM,EAAO,OAAO,EAEtB,SAAU,SAAY,CACpB,GAAI,CAAC,GAAoB,EAAc,SAAW,EAAG,OACrD,IAAM,EAAS,MAAM,GAAW,CAChC,MAAM,EAAY,EAAO,CACzB,MAAM,EAAO,UAAU,EAE1B,CAGH,SAAgB,EAAkB,EAAqD,CACrF,MAAO,CACL,OAAQ,EAAO,EAAO,IAAe,KAAK,EAAU,YAAY,EAAO,EAAO,EAAW,CACzF,MAAO,EAAO,EAAO,IAAe,KAAK,EAAU,cAAc,EAAO,EAAO,EAAW,CAC3F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logSinkTelemetry.d.cts","names":[],"sources":["../src/logSinkTelemetry.ts"],"mappings":";;;cAKa,aAAA;EAAA;;;;;;;;;;;;;;;;;;KAoBD,gBAAA,WAA2B,aAAA,eAA4B,aAAA;AAAA,KACvD,sBAAA,GAAyB,MAAA;AAAA,KACzB,gBAAA,IAAoB,KAAA,EAAO,gBAAA,EAAkB,KAAA,WAAgB,UAAA,GAAa,sBAAA;AAAA,UAErE,sBAAA;EACf,KAAA,EAAO,gBAAA;EACP,IAAA,EAAM,gBAAA;AAAA;AAAA,UAGS,uBAAA;EACf,GAAA;EACA,aAAA;EACA,GAAA,GAAM,MAAA,CAAO,UAAA;EACb,gBAAA,GAAmB,WAAA,CAAY,oBAAA;EAC/B,IAAA,IAAQ,OAAA;;EAER,UAAA;AAAA;AAAA,UAGe,gBAAA;EACf,WAAA,CAAY,KAAA,EAAO,gBAAA,EAAkB,KAAA,WAAgB,UAAA,GAAa,sBAAA,GAAyB,OAAA;EAC3F,aAAA,CAAc,KAAA,EAAO,gBAAA,EAAkB,KAAA,WAAgB,UAAA,GAAa,sBAAA,GAAyB,OAAA;EAC7F,WAAA,CAAY,KAAA,EAAO,gBAAA,EAAkB,UAAA,GAAa,sBAAA,GAAyB,OAAA;EAC3E,SAAA,IAAa,IAAA,UAAc,UAAA,EAAY,sBAAA,EAAwB,QAAA,QAAgB,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,CAAA;EACpG,KAAA,IAAS,OAAA;EACT,QAAA,IAAY,OAAA;AAAA;AAAA,iBAGE,sBAAA,CAAuB,OAAA,GAAS,uBAAA,GAA+B,gBAAA;AAAA,iBAgE/D,iBAAA,CAAkB,SAAA,EAAW,gBAAA,GAAmB,sBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logSinkTelemetry.d.mts","names":[],"sources":["../src/logSinkTelemetry.ts"],"mappings":";;;cAKa,aAAA;EAAA;;;;;;;;;;;;;;;;;;KAoBD,gBAAA,WAA2B,aAAA,eAA4B,aAAA;AAAA,KACvD,sBAAA,GAAyB,MAAA;AAAA,KACzB,gBAAA,IAAoB,KAAA,EAAO,gBAAA,EAAkB,KAAA,WAAgB,UAAA,GAAa,sBAAA;AAAA,UAErE,sBAAA;EACf,KAAA,EAAO,gBAAA;EACP,IAAA,EAAM,gBAAA;AAAA;AAAA,UAGS,uBAAA;EACf,GAAA;EACA,aAAA;EACA,GAAA,GAAM,MAAA,CAAO,UAAA;EACb,gBAAA,GAAmB,WAAA,CAAY,oBAAA;EAC/B,IAAA,IAAQ,OAAA;;EAER,UAAA;AAAA;AAAA,UAGe,gBAAA;EACf,WAAA,CAAY,KAAA,EAAO,gBAAA,EAAkB,KAAA,WAAgB,UAAA,GAAa,sBAAA,GAAyB,OAAA;EAC3F,aAAA,CAAc,KAAA,EAAO,gBAAA,EAAkB,KAAA,WAAgB,UAAA,GAAa,sBAAA,GAAyB,OAAA;EAC7F,WAAA,CAAY,KAAA,EAAO,gBAAA,EAAkB,UAAA,GAAa,sBAAA,GAAyB,OAAA;EAC3E,SAAA,IAAa,IAAA,UAAc,UAAA,EAAY,sBAAA,EAAwB,QAAA,QAAgB,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,CAAA;EACpG,KAAA,IAAS,OAAA;EACT,QAAA,IAAY,OAAA;AAAA;AAAA,iBAGE,sBAAA,CAAuB,OAAA,GAAS,uBAAA,GAA+B,gBAAA;AAAA,iBAgE/D,iBAAA,CAAkB,SAAA,EAAW,gBAAA,GAAmB,sBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logSinkTelemetry.mjs","names":[],"sources":["../src/logSinkTelemetry.ts"],"sourcesContent":["import type { DoomTelemetry, DoomTelemetryOptions } from '@agimon-ai/doompi-telemetry';\n\nconst SERVICE_NAME = 'doom-pi';\nconst PACKAGE_NAME = '@agimon-ai/doompi';\n\nexport const HARNESS_EVENT = {\n cliFailed: 'doom_pi.cli_failed',\n contextBuildFailed: 'doom_pi.context_build_failed',\n resourceCollectionFailed: 'doom_pi.resource_collection_failed',\n configLoadFailed: 'doom_pi.config_load_failed',\n launchFailed: 'doom_pi.launch_failed',\n compatibilityLaunchFailed: 'doom_pi.compatibility_launch_failed',\n harnessStateParseFailed: 'doom_pi.harness_state_parse_failed',\n hookFailed: 'doom_pi.hook_failed',\n hookRegistryReadFailed: 'doom_pi.hook_registry_read_failed',\n personaReadFailed: 'doom_pi.persona_read_failed',\n styleSystemRenderFailed: 'doom_pi.style_system_render_failed',\n majorModeUnavailable: 'doom_pi.major_mode_unavailable',\n profileLoadFailed: 'doom_pi.profile_load_failed',\n launchCompleted: 'doom_pi.launch_completed',\n projectTrustResolved: 'doom_pi.project_trust_resolved',\n majorModeSwitched: 'doom_pi.major_mode_switched',\n profileApplied: 'doom_pi.profile_applied',\n} as const;\n\nexport type HarnessEventName = (typeof HARNESS_EVENT)[keyof typeof HARNESS_EVENT];\nexport type HarnessEventAttributes = Record<string, string | number | boolean>;\nexport type HarnessErrorSink = (event: HarnessEventName, error: unknown, attributes?: HarnessEventAttributes) => void;\n\nexport interface HarnessFailureReporter {\n error: HarnessErrorSink;\n warn: HarnessErrorSink;\n}\n\nexport interface HarnessTelemetryOptions {\n cwd?: string;\n workspaceRoot?: string;\n env?: NodeJS.ProcessEnv;\n telemetryFactory?: NonNullable<DoomTelemetryOptions['telemetryFactory']>;\n warn?: (message: string) => void;\n /** Run startup callbacks before loading the telemetry backend. */\n deferSpans?: boolean;\n}\n\nexport interface HarnessTelemetry {\n recordError(event: HarnessEventName, error: unknown, attributes?: HarnessEventAttributes): Promise<void>;\n recordWarning(event: HarnessEventName, error: unknown, attributes?: HarnessEventAttributes): Promise<void>;\n recordEvent(event: HarnessEventName, attributes?: HarnessEventAttributes): Promise<void>;\n runInSpan<T>(name: string, attributes: HarnessEventAttributes, callback: () => Promise<T>): Promise<T>;\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport function createHarnessTelemetry(options: HarnessTelemetryOptions = {}): HarnessTelemetry {\n let telemetryPromise: Promise<DoomTelemetry> | undefined;\n const pendingEvents: Array<{ event: HarnessEventName; attributes?: HarnessEventAttributes }> = [];\n const telemetry = (): Promise<DoomTelemetry> => {\n telemetryPromise ??= import('@agimon-ai/doompi-telemetry').then(({ createDoomTelemetry }) =>\n createDoomTelemetry({\n serviceName: SERVICE_NAME,\n packageName: PACKAGE_NAME,\n cwd: options.cwd,\n workspaceRoot: options.workspaceRoot,\n env: options.env,\n telemetryFactory: options.telemetryFactory,\n warn: options.warn,\n enableLogs: true,\n enableTraces: true,\n }),\n );\n return telemetryPromise;\n };\n const drainEvents = async (loaded: DoomTelemetry): Promise<void> => {\n for (const pending of pendingEvents.splice(0)) {\n await loaded.recordEvent(pending.event, pending.attributes);\n }\n };\n return {\n recordError: async (event, error, attributes) => {\n const loaded = await telemetry();\n await drainEvents(loaded);\n await loaded.recordError(event, error, attributes);\n },\n recordWarning: async (event, error, attributes) => {\n const loaded = await telemetry();\n await drainEvents(loaded);\n await loaded.recordWarning(event, error, attributes);\n },\n recordEvent: async (event, attributes) => {\n if (options.deferSpans && !telemetryPromise) {\n pendingEvents.push({ event, attributes });\n return;\n }\n await (await telemetry()).recordEvent(event, attributes);\n },\n runInSpan: (name, attributes, callback) => {\n // The launcher opts into this path for pre-spawn preparation. Lifecycle\n // events remain buffered until flush; failures still initialize the real\n // sink immediately so diagnostics are not lost.\n if (options.deferSpans && !telemetryPromise) return callback();\n return telemetry().then((loaded) => loaded.runInSpan(name, attributes, callback));\n },\n flush: async () => {\n if (!telemetryPromise && pendingEvents.length === 0) return;\n const loaded = await telemetry();\n await drainEvents(loaded);\n await loaded.flush();\n },\n shutdown: async () => {\n if (!telemetryPromise && pendingEvents.length === 0) return;\n const loaded = await telemetry();\n await drainEvents(loaded);\n await loaded.shutdown();\n },\n };\n}\n\nexport function toFailureReporter(telemetry: HarnessTelemetry): HarnessFailureReporter {\n return {\n error: (event, error, attributes) => void telemetry.recordError(event, error, attributes),\n warn: (event, error, attributes) => void telemetry.recordWarning(event, error, attributes),\n };\n}\n"],"mappings":"AAEA,MAGa,EAAgB,CAC3B,UAAW,qBACX,mBAAoB,+BACpB,yBAA0B,qCAC1B,iBAAkB,6BAClB,aAAc,wBACd,0BAA2B,sCAC3B,wBAAyB,qCACzB,WAAY,sBACZ,uBAAwB,oCACxB,kBAAmB,8BACnB,wBAAyB,qCACzB,qBAAsB,iCACtB,kBAAmB,8BACnB,gBAAiB,2BACjB,qBAAsB,iCACtB,kBAAmB,8BACnB,eAAgB,0BACjB,CA8BD,SAAgB,EAAuB,EAAmC,EAAE,CAAoB,CAC9F,IAAI,EACE,EAAyF,EAAE,CAC3F,OACJ,IAAqB,OAAO,+BAA+B,MAAM,CAAE,yBACjE,EAAoB,CAClB,YAAa,UACb,YAAa,oBACb,IAAK,EAAQ,IACb,cAAe,EAAQ,cACvB,IAAK,EAAQ,IACb,iBAAkB,EAAQ,iBAC1B,KAAM,EAAQ,KACd,WAAY,GACZ,aAAc,GACf,CAAC,CACH,CACM,GAEH,EAAc,KAAO,IAAyC,CAClE,IAAK,IAAM,KAAW,EAAc,OAAO,EAAE,CAC3C,MAAM,EAAO,YAAY,EAAQ,MAAO,EAAQ,WAAW,EAG/D,MAAO,CACL,YAAa,MAAO,EAAO,EAAO,IAAe,CAC/C,IAAM,EAAS,MAAM,GAAW,CAChC,MAAM,EAAY,EAAO,CACzB,MAAM,EAAO,YAAY,EAAO,EAAO,EAAW,EAEpD,cAAe,MAAO,EAAO,EAAO,IAAe,CACjD,IAAM,EAAS,MAAM,GAAW,CAChC,MAAM,EAAY,EAAO,CACzB,MAAM,EAAO,cAAc,EAAO,EAAO,EAAW,EAEtD,YAAa,MAAO,EAAO,IAAe,CACxC,GAAI,EAAQ,YAAc,CAAC,EAAkB,CAC3C,EAAc,KAAK,CAAE,QAAO,aAAY,CAAC,CACzC,OAEF,MAAO,MAAM,GAAW,EAAE,YAAY,EAAO,EAAW,EAE1D,WAAY,EAAM,EAAY,IAIxB,EAAQ,YAAc,CAAC,EAAyB,GAAU,CACvD,GAAW,CAAC,KAAM,GAAW,EAAO,UAAU,EAAM,EAAY,EAAS,CAAC,CAEnF,MAAO,SAAY,CACjB,GAAI,CAAC,GAAoB,EAAc,SAAW,EAAG,OACrD,IAAM,EAAS,MAAM,GAAW,CAChC,MAAM,EAAY,EAAO,CACzB,MAAM,EAAO,OAAO,EAEtB,SAAU,SAAY,CACpB,GAAI,CAAC,GAAoB,EAAc,SAAW,EAAG,OACrD,IAAM,EAAS,MAAM,GAAW,CAChC,MAAM,EAAY,EAAO,CACzB,MAAM,EAAO,UAAU,EAE1B,CAGH,SAAgB,EAAkB,EAAqD,CACrF,MAAO,CACL,OAAQ,EAAO,EAAO,IAAe,KAAK,EAAU,YAAY,EAAO,EAAO,EAAW,CACzF,MAAO,EAAO,EAAO,IAAe,KAAK,EAAU,cAAc,EAAO,EAAO,EAAW,CAC3F"}
@@ -1,2 +0,0 @@
1
- exports.ASK_USER_BLOCKED_EVENT=`rpiv:ask-user:blocked`,exports.ASK_USER_PROMPT_EVENT=`rpiv:ask-user:prompt`;
2
- //# sourceMappingURL=events.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.cjs","names":[],"sources":["../../../../../../../../../../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.ts"],"sourcesContent":["/**\n * Public event contract for @juicesharp/rpiv-ask-user-question.\n *\n * STABILITY POLICY — applies to every event in the `rpiv:*` namespace.\n *\n * 1. Channel names are immutable. Once shipped, never rename.\n * 2. Payload changes are append-only. Listeners MUST tolerate unknown\n * fields. New fields ship as optional (`?:`).\n * 3. Breaking changes (rename, retype, remove a field; change emission\n * semantics) require a NEW channel, e.g. `rpiv:ask-user:prompt.v2`,\n * with dual-emit during a deprecation window.\n * 4. No `version` field inside payloads. Version via channel name only.\n * 5. Payloads must be JSON-safe: primitives, arrays, plain objects.\n * No Set/Map/Date/class instances — payloads must survive JSON\n * serialization when listeners forward them across process or\n * network boundaries.\n *\n * Naming: `rpiv:<package-or-tool>:<phase>`, lowercase, hyphen-separated.\n * Aligns with Pi's `\"my-extension:status\"` example and UniPi's `unipi:*`.\n */\n\nexport const ASK_USER_PROMPT_EVENT = \"rpiv:ask-user:prompt\" as const;\n\nexport interface AskUserPromptEventPayload {\n\tquestions: ReadonlyArray<AskUserPromptQuestion>;\n}\n\n/**\n * Emitted while the questionnaire is awaiting user input (TUI `ui.custom` and\n * RPC dialog walker). Cleared with `{ active: false }` in `finally` so listeners\n * can distinguish blocked-on-human from working.\n */\nexport const ASK_USER_BLOCKED_EVENT = \"rpiv:ask-user:blocked\" as const;\n\nexport interface AskUserBlockedEventPayload {\n\t/** True while input is awaited; false when the wait ends (answer, cancel, or error). */\n\tactive: boolean;\n}\n\nexport interface AskUserPromptQuestion {\n\t/** The full question text, exactly as the agent authored it. */\n\tquestion: string;\n\t/** The short chip/tag shown next to the question. */\n\theader: string;\n\t/** True iff the user may pick multiple options. Normalized from optional. */\n\tmultiSelect: boolean;\n\toptions: ReadonlyArray<AskUserPromptOption>;\n}\n\nexport interface AskUserPromptOption {\n\tlabel: string;\n\tdescription: string;\n\t/** True iff the option carries rich preview content (content not shipped). */\n\thasPreview: boolean;\n}\n"],"x_google_ignoreList":[0],"mappings":""}
@@ -1,2 +0,0 @@
1
- const e=`rpiv:ask-user:prompt`,t=`rpiv:ask-user:blocked`;export{t as ASK_USER_BLOCKED_EVENT,e as ASK_USER_PROMPT_EVENT};
2
- //# sourceMappingURL=events.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.mjs","names":[],"sources":["../../../../../../../../../../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.ts"],"sourcesContent":["/**\n * Public event contract for @juicesharp/rpiv-ask-user-question.\n *\n * STABILITY POLICY — applies to every event in the `rpiv:*` namespace.\n *\n * 1. Channel names are immutable. Once shipped, never rename.\n * 2. Payload changes are append-only. Listeners MUST tolerate unknown\n * fields. New fields ship as optional (`?:`).\n * 3. Breaking changes (rename, retype, remove a field; change emission\n * semantics) require a NEW channel, e.g. `rpiv:ask-user:prompt.v2`,\n * with dual-emit during a deprecation window.\n * 4. No `version` field inside payloads. Version via channel name only.\n * 5. Payloads must be JSON-safe: primitives, arrays, plain objects.\n * No Set/Map/Date/class instances — payloads must survive JSON\n * serialization when listeners forward them across process or\n * network boundaries.\n *\n * Naming: `rpiv:<package-or-tool>:<phase>`, lowercase, hyphen-separated.\n * Aligns with Pi's `\"my-extension:status\"` example and UniPi's `unipi:*`.\n */\n\nexport const ASK_USER_PROMPT_EVENT = \"rpiv:ask-user:prompt\" as const;\n\nexport interface AskUserPromptEventPayload {\n\tquestions: ReadonlyArray<AskUserPromptQuestion>;\n}\n\n/**\n * Emitted while the questionnaire is awaiting user input (TUI `ui.custom` and\n * RPC dialog walker). Cleared with `{ active: false }` in `finally` so listeners\n * can distinguish blocked-on-human from working.\n */\nexport const ASK_USER_BLOCKED_EVENT = \"rpiv:ask-user:blocked\" as const;\n\nexport interface AskUserBlockedEventPayload {\n\t/** True while input is awaited; false when the wait ends (answer, cancel, or error). */\n\tactive: boolean;\n}\n\nexport interface AskUserPromptQuestion {\n\t/** The full question text, exactly as the agent authored it. */\n\tquestion: string;\n\t/** The short chip/tag shown next to the question. */\n\theader: string;\n\t/** True iff the user may pick multiple options. Normalized from optional. */\n\tmultiSelect: boolean;\n\toptions: ReadonlyArray<AskUserPromptOption>;\n}\n\nexport interface AskUserPromptOption {\n\tlabel: string;\n\tdescription: string;\n\t/** True iff the option carries rich preview content (content not shipped). */\n\thasPreview: boolean;\n}\n"],"x_google_ignoreList":[0],"mappings":"AAqBA,MAAa,EAAwB,uBAWxB,EAAyB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":["SKIP_PERMISSIONS_OPTION","additionalDirectoryArgs","runInteractive","launchCodex","launchAntigravity"],"sources":["../../../src/services/compatibility/index.ts"],"sourcesContent":["import type { CompatibilityProvider } from '../../interfaces/index.ts';\nimport type { CompatibilityContext } from '../compatibilityContext.ts';\nimport { launchAntigravity } from './antigravity.ts';\nimport { CODEX_PROVIDER, launchCodex } from './codex.ts';\nimport { runInteractive } from './process.ts';\nimport { SKIP_PERMISSIONS_OPTION, additionalDirectoryArgs } from './shared.ts';\n\nexport { adaptAntigravityMcpDefinition, antigravityCompatibilityArgs, launchAntigravity } from './antigravity.ts';\nexport {\n codexCompatibilityArgs,\n codexEnvironment,\n codexPluginDirectories,\n launchCodex,\n supportsCodexManagedProfile,\n} from './codex.ts';\nexport {\n acquireDirectoryLock,\n forwardSignals,\n isFileSystemError,\n lockOwnerIsRunning,\n pathInside,\n runCaptured,\n runChecked,\n runInteractive,\n signalExitCode,\n waitForExit,\n} from './process.ts';\nexport { mcpProxyArguments } from './shared.ts';\n\nconst CLAUDE_PROVIDER = 'claude';\nconst PLUGIN_DIRECTORY_OPTION = '--plugin-dir';\nconst MCP_CONFIG_OPTION = '--mcp-config';\nconst STRICT_MCP_CONFIG_OPTION = '--strict-mcp-config';\nconst APPEND_SYSTEM_PROMPT_FILE_OPTION = '--append-system-prompt-file';\n\n/**\n * Claude needs no state sync: everything it reads is passed as an argument, so\n * a run leaves nothing behind to revert.\n */\nexport function claudeCompatibilityArgs(context: CompatibilityContext): string[] {\n const args = [SKIP_PERMISSIONS_OPTION];\n for (const plugin of context.plugins) args.push(PLUGIN_DIRECTORY_OPTION, plugin.directory);\n if (context.mcpAllowlist) args.push(MCP_CONFIG_OPTION, context.mcpConfigPath, STRICT_MCP_CONFIG_OPTION);\n if (context.personaFile) args.push(APPEND_SYSTEM_PROMPT_FILE_OPTION, context.personaFile);\n args.push(...additionalDirectoryArgs(context));\n return [...args, ...context.options.providerArgs];\n}\n\nexport async function launchCompatibility(context: CompatibilityContext): Promise<number> {\n const provider: CompatibilityProvider = context.options.provider;\n if (provider === CLAUDE_PROVIDER) {\n return runInteractive(\n CLAUDE_PROVIDER,\n claudeCompatibilityArgs(context),\n context.options.currentDirectory,\n context.environment,\n );\n }\n if (provider === CODEX_PROVIDER) return launchCodex(context);\n return launchAntigravity(context);\n}\n"],"mappings":"sLA6BM,EAAkB,SAUxB,SAAgB,EAAwB,EAAyC,CAC/E,IAAM,EAAO,CAACA,EAAAA,wBAAwB,CACtC,IAAK,IAAM,KAAU,EAAQ,QAAS,EAAK,KAAK,eAAyB,EAAO,UAAU,CAI1F,OAHI,EAAQ,cAAc,EAAK,KAAK,eAAmB,EAAQ,cAAe,sBAAyB,CACnG,EAAQ,aAAa,EAAK,KAAK,8BAAkC,EAAQ,YAAY,CACzF,EAAK,KAAK,GAAGC,EAAAA,wBAAwB,EAAQ,CAAC,CACvC,CAAC,GAAG,EAAM,GAAG,EAAQ,QAAQ,aAAa,CAGnD,eAAsB,EAAoB,EAAgD,CACxF,IAAM,EAAkC,EAAQ,QAAQ,SAUxD,OATI,IAAa,EACRC,EAAAA,eACL,EACA,EAAwB,EAAQ,CAChC,EAAQ,QAAQ,iBAChB,EAAQ,YACT,CAEC,IAAA,QAAoCC,EAAAA,YAAY,EAAQ,CACrDC,EAAAA,kBAAkB,EAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/compatibility/index.ts"],"sourcesContent":["import type { CompatibilityProvider } from '../../interfaces/index.ts';\nimport type { CompatibilityContext } from '../compatibilityContext.ts';\nimport { launchAntigravity } from './antigravity.ts';\nimport { CODEX_PROVIDER, launchCodex } from './codex.ts';\nimport { runInteractive } from './process.ts';\nimport { SKIP_PERMISSIONS_OPTION, additionalDirectoryArgs } from './shared.ts';\n\nexport { adaptAntigravityMcpDefinition, antigravityCompatibilityArgs, launchAntigravity } from './antigravity.ts';\nexport {\n codexCompatibilityArgs,\n codexEnvironment,\n codexPluginDirectories,\n launchCodex,\n supportsCodexManagedProfile,\n} from './codex.ts';\nexport {\n acquireDirectoryLock,\n forwardSignals,\n isFileSystemError,\n lockOwnerIsRunning,\n pathInside,\n runCaptured,\n runChecked,\n runInteractive,\n signalExitCode,\n waitForExit,\n} from './process.ts';\nexport { mcpProxyArguments } from './shared.ts';\n\nconst CLAUDE_PROVIDER = 'claude';\nconst PLUGIN_DIRECTORY_OPTION = '--plugin-dir';\nconst MCP_CONFIG_OPTION = '--mcp-config';\nconst STRICT_MCP_CONFIG_OPTION = '--strict-mcp-config';\nconst APPEND_SYSTEM_PROMPT_FILE_OPTION = '--append-system-prompt-file';\n\n/**\n * Claude needs no state sync: everything it reads is passed as an argument, so\n * a run leaves nothing behind to revert.\n */\nexport function claudeCompatibilityArgs(context: CompatibilityContext): string[] {\n const args = [SKIP_PERMISSIONS_OPTION];\n for (const plugin of context.plugins) args.push(PLUGIN_DIRECTORY_OPTION, plugin.directory);\n if (context.mcpAllowlist) args.push(MCP_CONFIG_OPTION, context.mcpConfigPath, STRICT_MCP_CONFIG_OPTION);\n if (context.personaFile) args.push(APPEND_SYSTEM_PROMPT_FILE_OPTION, context.personaFile);\n args.push(...additionalDirectoryArgs(context));\n return [...args, ...context.options.providerArgs];\n}\n\nexport async function launchCompatibility(context: CompatibilityContext): Promise<number> {\n const provider: CompatibilityProvider = context.options.provider;\n if (provider === CLAUDE_PROVIDER) {\n return runInteractive(\n CLAUDE_PROVIDER,\n claudeCompatibilityArgs(context),\n context.options.currentDirectory,\n context.environment,\n );\n }\n if (provider === CODEX_PROVIDER) return launchCodex(context);\n return launchAntigravity(context);\n}\n"],"mappings":"imBA6BA,MAAM,EAAkB,SAUxB,SAAgB,EAAwB,EAAyC,CAC/E,IAAM,EAAO,CAAC,EAAwB,CACtC,IAAK,IAAM,KAAU,EAAQ,QAAS,EAAK,KAAK,eAAyB,EAAO,UAAU,CAI1F,OAHI,EAAQ,cAAc,EAAK,KAAK,eAAmB,EAAQ,cAAe,sBAAyB,CACnG,EAAQ,aAAa,EAAK,KAAK,8BAAkC,EAAQ,YAAY,CACzF,EAAK,KAAK,GAAG,EAAwB,EAAQ,CAAC,CACvC,CAAC,GAAG,EAAM,GAAG,EAAQ,QAAQ,aAAa,CAGnD,eAAsB,EAAoB,EAAgD,CACxF,IAAM,EAAkC,EAAQ,QAAQ,SAUxD,OATI,IAAa,EACR,EACL,EACA,EAAwB,EAAQ,CAChC,EAAQ,QAAQ,iBAChB,EAAQ,YACT,CAEC,IAAA,QAAoC,EAAY,EAAQ,CACrD,EAAkB,EAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"compatibilityContext.cjs","names":["path","fs","PROXY_SERVER_NAME","applyMcpAllowlist","mergeMcpConfigs","os","resolveMcpAllowlist"],"sources":["../../src/services/compatibilityContext.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport {\n applyProfileEnvironment,\n buildPersonaPrompt,\n layerHookGroups,\n loadMajorModesConfig,\n resolveLayers,\n resolvePluginEntries,\n resolveProfile,\n resolveSharedSkills,\n projectHarnessEnvironment,\n type AgentProfile,\n type DomainMcpAllowlist,\n type PluginEntry,\n} from '../config/index.ts';\nimport type { CompatibilityOptions } from '../interfaces/index.ts';\nimport { PROXY_SERVER_NAME, applyMcpAllowlist, resolveMcpAllowlist } from './mcpFilter.ts';\nimport { mergeMcpConfigs } from './resourceCollector.ts';\n\ntype JsonObject = Record<string, unknown>;\n\nconst MCP_CONFIG_FILENAME = '.mcp.json';\nconst GENERATED_MCP_CONFIG_FILENAME = 'mcp.json';\nconst PROXY_CONFIG_FILENAME = 'mcp-config.yaml';\nconst PERSONA_FILENAME = 'persona.md';\nconst PRIVATE_FILE_MODE = 0o600;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst CONFIG_OPTION = '--config';\nconst TEMPORARY_DIRECTORY_PREFIX = 'doom-pi-compat-';\nconst ADDITIONAL_DIRS_ENV = 'DOOMPI_ADDITIONAL_DIRS';\nconst CLAUDE_PROJECT_DIR_ENV = 'CLAUDE_PROJECT_DIR';\nconst CODEX_REPO_ROOT_ENV = 'CODEX_REPO_ROOT';\nconst AGY_REPO_ROOT_ENV = 'AGY_REPO_ROOT';\nconst ORIGINAL_REPO_PATH_ENV = 'ORIGINAL_REPO_PATH';\n\nexport interface CompatibilityContext {\n options: CompatibilityOptions;\n environment: NodeJS.ProcessEnv;\n plugins: PluginEntry[];\n profile?: AgentProfile;\n personaFile?: string;\n mcpAllowlist?: DomainMcpAllowlist;\n mcpConfigPath: string;\n proxyConfigPath: string;\n selectedLayers: string[];\n hookGroups: string[];\n sharedSkills: boolean;\n cleanup(): Promise<void>;\n}\n\nfunction pluginMcpPaths(repoRoot: string, plugins: PluginEntry[]): string[] {\n const paths = [path.join(repoRoot, MCP_CONFIG_FILENAME)];\n for (const plugin of plugins) {\n if (plugin.mcp === false) continue;\n const configPath = path.join(plugin.directory, MCP_CONFIG_FILENAME);\n if (fs.existsSync(configPath)) paths.push(configPath);\n }\n return paths;\n}\n\nfunction resolveProxyConfigPath(config: JsonObject, repoRoot: string): string {\n const servers = (config.mcpServers ?? {}) as Record<string, JsonObject>;\n const proxy = servers[PROXY_SERVER_NAME];\n const args = Array.isArray(proxy?.args) ? proxy.args.map(String) : [];\n const configIndex = args.indexOf(CONFIG_OPTION);\n const selected = configIndex === -1 ? undefined : args[configIndex + 1];\n return selected ? path.resolve(repoRoot, selected) : path.join(repoRoot, PROXY_CONFIG_FILENAME);\n}\n\nasync function writeCompatibilityMcpConfig(\n repoRoot: string,\n plugins: PluginEntry[],\n allowlist: DomainMcpAllowlist | undefined,\n temporaryDirectory: string,\n): Promise<{ mcpConfigPath: string; proxyConfigPath: string }> {\n const config = await applyMcpAllowlist(\n mergeMcpConfigs(pluginMcpPaths(repoRoot, plugins)),\n allowlist,\n repoRoot,\n temporaryDirectory,\n );\n const mcpConfigPath = path.join(temporaryDirectory, GENERATED_MCP_CONFIG_FILENAME);\n await fs.promises.writeFile(mcpConfigPath, `${JSON.stringify(config, null, 2)}\\n`, { mode: PRIVATE_FILE_MODE });\n return { mcpConfigPath, proxyConfigPath: resolveProxyConfigPath(config, repoRoot) };\n}\n\n/** Resolves only the resources shared by Pi and compatibility frontends. */\nexport async function buildCompatibilityContext(options: CompatibilityOptions): Promise<CompatibilityContext> {\n const majorModesConfig = loadMajorModesConfig(options.repoRoot);\n const selectedLayers = resolveLayers(majorModesConfig, options.majorMode);\n const hookGroups = layerHookGroups(majorModesConfig, selectedLayers);\n const temporaryDirectory = await fs.promises.mkdtemp(path.join(os.tmpdir(), TEMPORARY_DIRECTORY_PREFIX));\n await fs.promises.chmod(temporaryDirectory, PRIVATE_DIRECTORY_MODE);\n\n try {\n const profile = options.profile ? resolveProfile(options.repoRoot, options.profile) : undefined;\n const plugins = resolvePluginEntries(options.repoRoot, options.domains, []);\n const mcpAllowlist = resolveMcpAllowlist(options.repoRoot, options.domains);\n const mcp = await writeCompatibilityMcpConfig(options.repoRoot, plugins, mcpAllowlist, temporaryDirectory);\n const environment = { ...process.env };\n environment.NX_DAEMON ??= 'false';\n const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n const personaPrompt = profile?.persona ? buildPersonaPrompt(profile.personaRoot, profile.persona) : undefined;\n let personaFile: string | undefined;\n\n if (personaPrompt) {\n personaFile = path.join(temporaryDirectory, PERSONA_FILENAME);\n await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n }\n\n // Projection only, with no state file: Claude, Codex and Antigravity read\n // an environment and never the store.\n projectHarnessEnvironment(\n {\n root: options.repoRoot,\n majorMode: options.majorMode,\n temporaryDirectory,\n domains: options.domains,\n layers: selectedLayers,\n profile: profile?.name,\n profileEnvironment,\n hookGroups,\n mcpConfigPath: mcp.mcpConfigPath,\n personaFile,\n additionalDirectories: options.additionalDirectories,\n hooks: true,\n },\n environment,\n );\n environment[ADDITIONAL_DIRS_ENV] = options.additionalDirectories.join(path.delimiter);\n environment[CLAUDE_PROJECT_DIR_ENV] = options.repoRoot;\n environment[CODEX_REPO_ROOT_ENV] = options.repoRoot;\n environment[AGY_REPO_ROOT_ENV] = options.repoRoot;\n environment[ORIGINAL_REPO_PATH_ENV] ||= options.repoRoot;\n\n return {\n options,\n environment,\n plugins,\n profile,\n personaFile,\n mcpAllowlist,\n mcpConfigPath: mcp.mcpConfigPath,\n proxyConfigPath: mcp.proxyConfigPath,\n selectedLayers,\n hookGroups,\n sharedSkills: resolveSharedSkills(options.repoRoot, options.domains),\n cleanup: () => fs.promises.rm(temporaryDirectory, { recursive: true, force: true }),\n };\n } catch (error) {\n await fs.promises.rm(temporaryDirectory, { recursive: true, force: true });\n throw error;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"compatibilityContext.mjs","names":[],"sources":["../../src/services/compatibilityContext.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport {\n applyProfileEnvironment,\n buildPersonaPrompt,\n layerHookGroups,\n loadMajorModesConfig,\n resolveLayers,\n resolvePluginEntries,\n resolveProfile,\n resolveSharedSkills,\n projectHarnessEnvironment,\n type AgentProfile,\n type DomainMcpAllowlist,\n type PluginEntry,\n} from '../config/index.ts';\nimport type { CompatibilityOptions } from '../interfaces/index.ts';\nimport { PROXY_SERVER_NAME, applyMcpAllowlist, resolveMcpAllowlist } from './mcpFilter.ts';\nimport { mergeMcpConfigs } from './resourceCollector.ts';\n\ntype JsonObject = Record<string, unknown>;\n\nconst MCP_CONFIG_FILENAME = '.mcp.json';\nconst GENERATED_MCP_CONFIG_FILENAME = 'mcp.json';\nconst PROXY_CONFIG_FILENAME = 'mcp-config.yaml';\nconst PERSONA_FILENAME = 'persona.md';\nconst PRIVATE_FILE_MODE = 0o600;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst CONFIG_OPTION = '--config';\nconst TEMPORARY_DIRECTORY_PREFIX = 'doom-pi-compat-';\nconst ADDITIONAL_DIRS_ENV = 'DOOMPI_ADDITIONAL_DIRS';\nconst CLAUDE_PROJECT_DIR_ENV = 'CLAUDE_PROJECT_DIR';\nconst CODEX_REPO_ROOT_ENV = 'CODEX_REPO_ROOT';\nconst AGY_REPO_ROOT_ENV = 'AGY_REPO_ROOT';\nconst ORIGINAL_REPO_PATH_ENV = 'ORIGINAL_REPO_PATH';\n\nexport interface CompatibilityContext {\n options: CompatibilityOptions;\n environment: NodeJS.ProcessEnv;\n plugins: PluginEntry[];\n profile?: AgentProfile;\n personaFile?: string;\n mcpAllowlist?: DomainMcpAllowlist;\n mcpConfigPath: string;\n proxyConfigPath: string;\n selectedLayers: string[];\n hookGroups: string[];\n sharedSkills: boolean;\n cleanup(): Promise<void>;\n}\n\nfunction pluginMcpPaths(repoRoot: string, plugins: PluginEntry[]): string[] {\n const paths = [path.join(repoRoot, MCP_CONFIG_FILENAME)];\n for (const plugin of plugins) {\n if (plugin.mcp === false) continue;\n const configPath = path.join(plugin.directory, MCP_CONFIG_FILENAME);\n if (fs.existsSync(configPath)) paths.push(configPath);\n }\n return paths;\n}\n\nfunction resolveProxyConfigPath(config: JsonObject, repoRoot: string): string {\n const servers = (config.mcpServers ?? {}) as Record<string, JsonObject>;\n const proxy = servers[PROXY_SERVER_NAME];\n const args = Array.isArray(proxy?.args) ? proxy.args.map(String) : [];\n const configIndex = args.indexOf(CONFIG_OPTION);\n const selected = configIndex === -1 ? undefined : args[configIndex + 1];\n return selected ? path.resolve(repoRoot, selected) : path.join(repoRoot, PROXY_CONFIG_FILENAME);\n}\n\nasync function writeCompatibilityMcpConfig(\n repoRoot: string,\n plugins: PluginEntry[],\n allowlist: DomainMcpAllowlist | undefined,\n temporaryDirectory: string,\n): Promise<{ mcpConfigPath: string; proxyConfigPath: string }> {\n const config = await applyMcpAllowlist(\n mergeMcpConfigs(pluginMcpPaths(repoRoot, plugins)),\n allowlist,\n repoRoot,\n temporaryDirectory,\n );\n const mcpConfigPath = path.join(temporaryDirectory, GENERATED_MCP_CONFIG_FILENAME);\n await fs.promises.writeFile(mcpConfigPath, `${JSON.stringify(config, null, 2)}\\n`, { mode: PRIVATE_FILE_MODE });\n return { mcpConfigPath, proxyConfigPath: resolveProxyConfigPath(config, repoRoot) };\n}\n\n/** Resolves only the resources shared by Pi and compatibility frontends. */\nexport async function buildCompatibilityContext(options: CompatibilityOptions): Promise<CompatibilityContext> {\n const majorModesConfig = loadMajorModesConfig(options.repoRoot);\n const selectedLayers = resolveLayers(majorModesConfig, options.majorMode);\n const hookGroups = layerHookGroups(majorModesConfig, selectedLayers);\n const temporaryDirectory = await fs.promises.mkdtemp(path.join(os.tmpdir(), TEMPORARY_DIRECTORY_PREFIX));\n await fs.promises.chmod(temporaryDirectory, PRIVATE_DIRECTORY_MODE);\n\n try {\n const profile = options.profile ? resolveProfile(options.repoRoot, options.profile) : undefined;\n const plugins = resolvePluginEntries(options.repoRoot, options.domains, []);\n const mcpAllowlist = resolveMcpAllowlist(options.repoRoot, options.domains);\n const mcp = await writeCompatibilityMcpConfig(options.repoRoot, plugins, mcpAllowlist, temporaryDirectory);\n const environment = { ...process.env };\n environment.NX_DAEMON ??= 'false';\n const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n const personaPrompt = profile?.persona ? buildPersonaPrompt(profile.personaRoot, profile.persona) : undefined;\n let personaFile: string | undefined;\n\n if (personaPrompt) {\n personaFile = path.join(temporaryDirectory, PERSONA_FILENAME);\n await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n }\n\n // Projection only, with no state file: Claude, Codex and Antigravity read\n // an environment and never the store.\n projectHarnessEnvironment(\n {\n root: options.repoRoot,\n majorMode: options.majorMode,\n temporaryDirectory,\n domains: options.domains,\n layers: selectedLayers,\n profile: profile?.name,\n profileEnvironment,\n hookGroups,\n mcpConfigPath: mcp.mcpConfigPath,\n personaFile,\n additionalDirectories: options.additionalDirectories,\n hooks: true,\n },\n environment,\n );\n environment[ADDITIONAL_DIRS_ENV] = options.additionalDirectories.join(path.delimiter);\n environment[CLAUDE_PROJECT_DIR_ENV] = options.repoRoot;\n environment[CODEX_REPO_ROOT_ENV] = options.repoRoot;\n environment[AGY_REPO_ROOT_ENV] = options.repoRoot;\n environment[ORIGINAL_REPO_PATH_ENV] ||= options.repoRoot;\n\n return {\n options,\n environment,\n plugins,\n profile,\n personaFile,\n mcpAllowlist,\n mcpConfigPath: mcp.mcpConfigPath,\n proxyConfigPath: mcp.proxyConfigPath,\n selectedLayers,\n hookGroups,\n sharedSkills: resolveSharedSkills(options.repoRoot, options.domains),\n cleanup: () => fs.promises.rm(temporaryDirectory, { recursive: true, force: true }),\n };\n } catch (error) {\n await fs.promises.rm(temporaryDirectory, { recursive: true, force: true });\n throw error;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"composer.cjs","names":["fs","path","syncStatePath","findRepositoryRoot","readHarnessState","getHarnessState","applyDomains","applyProfile","runDirectory","createMapResolvers","CONTEXT_PACKAGES","PERSONA_ENTRY","selectWorkflowExtensionForProcess","assembleChildExtensions","assembleExtensions","extensionSetKey","readSyncState","computeInputsHash"],"sources":["../../src/services/composer.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { loadMajorModesConfig, type MajorModesConfig } from '@agimon-ai/doompi-config/majorModes';\nimport { resolveProfile } from '@agimon-ai/doompi-config/profiles';\nimport { parseArgs, type ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport {\n createHarnessSession,\n getHarnessState,\n loadHarnessState,\n readHarnessState,\n updateHarnessState,\n type HarnessState,\n} from '../config/harnessState.ts';\nimport type { HarnessPreset } from '../interfaces/index.ts';\nimport { findRepositoryRoot } from '../utils/index.ts';\nimport { CONTEXT_PACKAGES, PERSONA_ENTRY, assembleChildExtensions, assembleExtensions } from './extensionAssembler.ts';\nimport { extensionSetKey } from './extensionCompiler.ts';\nimport { configurePreset } from './harnessContext.ts';\nimport { applyDomains, applyMajorMode, applyProfile } from './matrixSwitcher.ts';\nimport { selectWorkflowExtensionForProcess } from './resourceCollector.ts';\nimport {\n computeInputsHash,\n createMapResolvers,\n readSyncState,\n runDirectory,\n syncStatePath,\n type SyncState,\n} from './syncState.ts';\n\n/**\n * The runtime half of `doom-pi sync`.\n *\n * Pi's own config carries a single entry, the doom-pi extension, and this is\n * what that entry runs: hydrate the harness environment, apply the startup\n * flags, then load the extension set the matrix selects. It runs again on every\n * `/reload`, which is what lets `/major-mode` swap the set without a restart,\n * since Pi rebuilds its extension runner from whatever a reload produced.\n */\n\n/** Marks a process whose extensions this module composed. */\nexport const COMPOSED_ENV = 'DOOMPI_COMPOSED';\n/** Set by the launcher when it passes one precomposed aggregate to Pi. */\nexport const EXTERNAL_EXTENSIONS_ENV = 'DOOMPI_EXTENSIONS_PROVIDED';\n/** Survives reload, where argv is re-read but the startup flags must not be. */\nexport const MUTE_ENV = 'DOOMPI_MUTE';\nconst ENABLED_FLAG = '1';\nconst SUBAGENT_AGENT_DIRS_ENV = 'PI_SUBAGENT_EXTRA_AGENT_DIRS';\nconst SUBAGENT_SKILL_DIRS_ENV = 'PI_SUBAGENT_EXTRA_SKILL_DIRS';\nconst DOMAIN_SEPARATOR = ',';\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst NOT_SYNCED = 'doompi is configured for Pi but this repository was never synced. Run doompi sync.';\n\nexport const DOOM_FLAGS = {\n majorMode: 'major-mode',\n domains: 'domains',\n profile: 'profile',\n mute: 'mute',\n} as const;\n\n/** Removed flag, reported rather than ignored when a synced session passes it. */\nexport const REMOVED_LAYER_FLAG = 'layer';\n\nexport interface StartupFlags {\n majorMode?: string;\n domains?: string[];\n profile?: string;\n mute: boolean;\n /** True when the caller passed the removed `--layer` flag. */\n removedLayer: boolean;\n}\n\nexport interface ComposeOutcome {\n /** Everything that went wrong, reported once the session can show messages. */\n problems: string[];\n /** Config changed since the last sync, which is a prompt to re-sync. */\n stale: boolean;\n loaded: string[];\n}\n\nfunction message(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** True when this process already applied the command line, so a reload does not. */\nexport function alreadyComposed(environment: NodeJS.ProcessEnv = process.env): boolean {\n return environment[COMPOSED_ENV] === ENABLED_FLAG;\n}\n\nfunction realPath(target: string): string {\n try {\n return fs.realpathSync(target);\n } catch {\n return path.resolve(target);\n }\n}\n\n/**\n * True when this process was handed the doom extension set on the command line.\n *\n * The launcher and detached Doom Team children both pass the composed list as\n * `--extension` arguments, and Pi merges those with whatever project settings\n * declare. Composing again here would load every extension twice, which Pi\n * reports as each tool and flag conflicting with itself.\n *\n * Matching against the synced paths rather than the mere presence of\n * `--extension` keeps an unrelated one-off, `pi -e ./debug.ts`, from silently\n * costing the user their whole setup.\n */\nexport function extensionsProvidedExternally(argv: string[], resolved: Record<string, string>): boolean {\n const { extensions } = parseArgs(argv);\n if (!extensions || extensions.length === 0) return false;\n const composed = new Set(Object.values(resolved).map(realPath));\n return extensions.some((entry) => composed.has(realPath(entry)));\n}\n\n/**\n * Finds the repository whose synced state applies to this session.\n *\n * Pi only reads `.pi/settings.json` from its own working directory, so that is\n * the first place to look; walking up covers a session started in a\n * subdirectory with the extension configured globally.\n */\nexport function findSyncedRoot(cwd: string): string | undefined {\n if (fs.existsSync(syncStatePath(cwd))) return cwd;\n try {\n const root = findRepositoryRoot(cwd);\n return fs.existsSync(syncStatePath(root)) ? root : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Opens this process's session from what sync pinned.\n *\n * The synced record is decoded underneath the live environment, so an inherited\n * value still wins: a launcher run, a nested session, or a CI override is more\n * specific than anything sync wrote. The result becomes the session's state\n * file, which is the authority from here on; the environment it publishes is\n * for the bash hooks and the packages that can only read one.\n */\nexport async function startSyncedSession(\n state: SyncState,\n repoRoot: string,\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<HarnessState> {\n const directory = await prepareRunDirectory(repoRoot);\n const harness: HarnessState = {\n ...readHarnessState({ ...state.env, ...environment }),\n // Recorded separately because no variable carries them.\n ...state.fileState,\n temporaryDirectory: directory,\n };\n createHarnessSession(harness, { directory, environment });\n // The profile's own defaults, which the launcher applies at spawn. They are\n // recorded as a map rather than as variables so /profile can tell which ones\n // it owns when it swaps them out later.\n for (const [key, value] of Object.entries(harness.profileEnvironment)) {\n if (environment[key] === undefined) environment[key] = value;\n }\n return harness;\n}\n\n/**\n * Reads the doom flags off the command line.\n *\n * Pi collects unrecognized flags for extensions but hands their values back\n * only after every extension has loaded, which is too late to decide what to\n * load. Parsing argv with Pi's own parser keeps the value rules identical.\n */\nexport function readStartupFlags(argv: string[]): StartupFlags {\n const { unknownFlags } = parseArgs(argv);\n const text = (name: string): string | undefined => {\n const value = unknownFlags.get(name);\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n };\n const domains = text(DOOM_FLAGS.domains);\n return {\n majorMode: text(DOOM_FLAGS.majorMode),\n domains: domains\n ?.split(DOMAIN_SEPARATOR)\n .map((name) => name.trim())\n .filter(Boolean),\n profile: text(DOOM_FLAGS.profile),\n mute: unknownFlags.get(DOOM_FLAGS.mute) !== undefined,\n removedLayer: unknownFlags.get(REMOVED_LAYER_FLAG) !== undefined,\n };\n}\n\n/** Registers the flags so Pi accepts them and lists them in `pi --help`. */\nexport function registerDoomFlags(pi: Pick<ExtensionAPI, 'registerFlag'>): void {\n pi.registerFlag(DOOM_FLAGS.majorMode, {\n type: 'string',\n description: 'Named major mode from .doom/modes.yaml',\n });\n pi.registerFlag(DOOM_FLAGS.domains, { type: 'string', description: 'Comma-separated content domains' });\n pi.registerFlag(DOOM_FLAGS.profile, { type: 'string', description: 'Persona and env from .doom/profiles.yaml' });\n pi.registerFlag(DOOM_FLAGS.mute, { type: 'boolean', description: 'Disable the notification extension' });\n}\n\n/**\n * Applies the startup flags through the same switchers the slash commands use.\n *\n * A bad value is collected rather than thrown: a factory that throws takes the\n * whole doom setup down with it, which is far worse than one unapplied flag.\n */\nexport async function applyStartupFlags(\n flags: StartupFlags,\n majorModesConfig: MajorModesConfig,\n repoRoot: string,\n problems: string[],\n): Promise<void> {\n // Reported rather than ignored: Pi hands unrecognized flags to extensions, so\n // a stale `--layer dev` would otherwise start a session on the wrong mode\n // without saying anything.\n if (flags.removedLayer) problems.push(`--${REMOVED_LAYER_FLAG} was replaced by --${DOOM_FLAGS.majorMode}`);\n if (flags.majorMode) {\n try {\n applyMajorMode(majorModesConfig, flags.majorMode, getHarnessState());\n } catch (error) {\n problems.push(`--${DOOM_FLAGS.majorMode} ${flags.majorMode}: ${message(error)}`);\n }\n }\n if (flags.domains && flags.domains.length > 0) {\n try {\n await applyDomains(flags.domains, getHarnessState());\n } catch (error) {\n problems.push(`--domains ${flags.domains.join(DOMAIN_SEPARATOR)}: ${message(error)}`);\n }\n }\n if (flags.profile) {\n try {\n await applyProfile(resolveProfile(repoRoot, flags.profile), getHarnessState());\n } catch (error) {\n problems.push(`--profile ${flags.profile}: ${message(error)}`);\n }\n }\n}\n\n/**\n * Points harness state at a per-process directory before anything writes there.\n *\n * The synced directory is a baseline that every session reads; live switches\n * materialize into this one instead, so a second session in the same repository\n * cannot overwrite what the first is using.\n */\nexport async function prepareRunDirectory(\n repoRoot: string,\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<string> {\n const directory = runDirectory(repoRoot);\n await fs.promises.mkdir(directory, { mode: PRIVATE_DIRECTORY_MODE, recursive: true });\n // Through the store rather than the environment: the state file is the\n // authority, and a switcher reading a stale directory would write a live\n // session's resources into the wrong place.\n updateHarnessState({ temporaryDirectory: directory }, environment);\n return directory;\n}\n\n/** Removes this session's scratch directory. */\nexport async function cleanupRunDirectory(repoRoot: string): Promise<void> {\n await fs.promises.rm(runDirectory(repoRoot), { recursive: true, force: true });\n}\n\n/**\n * Builds the ordered list of extensions to load for the current state.\n *\n * Returns them in Pi load order. `assembleExtensions` produces the order the\n * launcher passes to Pi, where the last element becomes the first `--extension`\n * argument, so reversing here keeps that rule stated in exactly one place.\n */\nexport async function composeLoadOrder(\n state: SyncState,\n harness: HarnessState = getHarnessState(),\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<string[]> {\n const repoRoot = harness.root ?? state.root;\n const resolvers = createMapResolvers(state.resolved, state.compiled);\n // Resolved from the sync map rather than generated: doom-mcp reads the\n // repository and plugin layers itself, and the environment the launcher wrote\n // already tells it which plugins and allowlist this session selected.\n const mcpEntry = harness.mcp ? resolvers.optionalPackageEntry(CONTEXT_PACKAGES.mcp) : undefined;\n const context = {\n agents: harness.agents,\n // Exiting when the agent settles is a launcher decision with no synced\n // equivalent: a session started by hand is meant to stay open.\n autoStop: false,\n preset: state.selection.preset,\n mcpEntry,\n personaEntry: resolvers.ownEntry(PERSONA_ENTRY),\n workflowExtension: selectWorkflowExtensionForProcess(\n resolvers.optionalPackageEntry(CONTEXT_PACKAGES.workflow),\n resolvers.optionalPackageEntry(CONTEXT_PACKAGES.dispatcherWorkflow),\n environment,\n ),\n layers: [...harness.layers],\n majorModesConfig: loadMajorModesConfig(repoRoot),\n resolvers,\n };\n\n // A state field, so it goes through the store: Doom Team reads it from the\n // environment the store publishes when it builds a child's spawn snapshot.\n updateHarnessState(\n { childExtensions: assembleChildExtensions({ ...context, agents: false, mute: true }) },\n environment,\n );\n if (harness.agents) {\n environment[SUBAGENT_AGENT_DIRS_ENV] = harness.agentDirectories.join(path.delimiter);\n environment[SUBAGENT_SKILL_DIRS_ENV] = harness.skillDirectories.join(path.delimiter);\n }\n const entries = [...assembleExtensions({ ...context, mute: environment[MUTE_ENV] === ENABLED_FLAG })].reverse();\n const bundle = state.bundles?.[extensionSetKey(entries)];\n return bundle ? [bundle] : entries;\n}\n\n/**\n * Imports each extension and hands it the same Pi API this module received.\n *\n * Every Pi extension entry is a factory of the same shape, so one extension can\n * activate the rest. Failures are per entry: one unloadable module must not\n * cost the session everything after it in the order.\n */\nexport async function loadComposedExtensions(\n pi: ExtensionAPI,\n entries: string[],\n problems: string[],\n): Promise<string[]> {\n const loaded: string[] = [];\n for (const entry of entries) {\n try {\n const module = (await import(pathToFileURL(entry).href)) as { default?: unknown };\n if (typeof module.default !== 'function') {\n problems.push(`${entry}: does not export an extension factory`);\n continue;\n }\n await (module.default as (api: ExtensionAPI) => void | Promise<void>)(pi);\n loaded.push(entry);\n } catch (error) {\n problems.push(`${entry}: ${message(error)}`);\n }\n }\n return loaded;\n}\n\nexport interface ComposeOptions {\n cwd?: string;\n argv?: string[];\n environment?: NodeJS.ProcessEnv;\n}\n\n/**\n * Runs the whole synced startup for one Pi session.\n *\n * Never throws: whatever fails is reported through the outcome so the session\n * still starts and can say what is wrong.\n */\nexport async function composeDoomSession(pi: ExtensionAPI, options: ComposeOptions = {}): Promise<ComposeOutcome> {\n const environment = options.environment ?? process.env;\n const problems: string[] = [];\n const repoRoot = findSyncedRoot(options.cwd ?? process.cwd());\n if (!repoRoot) return { problems: [NOT_SYNCED], stale: false, loaded: [] };\n\n let state: SyncState | undefined;\n try {\n state = readSyncState(repoRoot);\n } catch (error) {\n return { problems: [message(error)], stale: false, loaded: [] };\n }\n if (!state) return { problems: [NOT_SYNCED], stale: false, loaded: [] };\n\n const argv = options.argv ?? process.argv.slice(2);\n // The launcher and Doom Team children compose the set themselves and pass it\n // in, so this entry has nothing left to do but stay out of the way.\n if (\n environment[EXTERNAL_EXTENSIONS_ENV] === ENABLED_FLAG ||\n extensionsProvidedExternally(argv, { ...state.resolved, ...state.bundles })\n ) {\n return { problems: [], stale: false, loaded: [] };\n }\n\n configurePreset({ preset: state.selection.preset as HarnessPreset, piArgs: [] }, environment);\n\n // Only the first load opens a session. A reload finds the pointer this set\n // and reads the file back, which is what carries a live /domains or /profile\n // switch across the reload instead of resetting it to what sync pinned.\n if (!alreadyComposed(environment)) {\n environment[COMPOSED_ENV] = ENABLED_FLAG;\n await startSyncedSession(state, repoRoot, environment);\n const flags = readStartupFlags(argv);\n if (flags.mute) environment[MUTE_ENV] = ENABLED_FLAG;\n await applyStartupFlags(flags, loadMajorModesConfig(repoRoot), repoRoot, problems);\n }\n\n let entries: string[];\n try {\n // Read back through the store rather than from this process: the startup\n // flags may have switched the layer or the domains a moment ago, and the\n // environment being managed is not always this process's own.\n entries = await composeLoadOrder(state, loadHarnessState(environment).state, environment);\n } catch (error) {\n return { problems: [...problems, message(error)], stale: false, loaded: [] };\n }\n\n const loaded = await loadComposedExtensions(pi, entries, problems);\n return { problems, stale: computeInputsHash(repoRoot, state.selection) !== state.inputsHash, loaded };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"composer.d.cts","names":[],"sources":["../../src/services/composer.ts"],"mappings":";;;;;;;;AAyCA;;;;;AAEA;;;cAFa,YAAA;;cAEA,uBAAA;;cAEA,QAAA;AAAA,cAQA,UAAA;EAAA;;;;;;cAQA,kBAAA;AAAA,UAEI,YAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,IAAA;EAN6B;EAQ7B,YAAA;AAAA;AAAA,UAGe,cAAA;EATA;EAWf,QAAA;;EAEA,KAAA;EACA,MAAA;AAAA;;iBAQc,eAAA,CAAgB,WAAA,GAAa,MAAA,CAAO,UAAA;;;;AAbpD;;;;;;;;;iBAqCgB,4BAAA,CAA6B,IAAA,YAAgB,QAAA,EAAU,MAAA;;;;;;;;iBAcvD,cAAA,CAAe,GAAA;AAd/B;;;;;;;;;AAAA,iBAiCsB,kBAAA,CACpB,KAAA,EAAO,SAAA,EACP,QAAA,UACA,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA,CAAQ,YAAA;;;;;AAJX;;;iBA6BgB,gBAAA,CAAiB,IAAA,aAAiB,YAAA;;iBAoBlC,iBAAA,CAAkB,EAAA,EAAI,IAAA,CAAK,YAAA;;;;;;;iBAgBrB,iBAAA,CACpB,KAAA,EAAO,YAAA,EACP,gBAAA,EAAkB,gBAAA,EAClB,QAAA,UACA,QAAA,aACC,OAAA;;;;;;;AAzCH;iBA4EsB,mBAAA,CACpB,QAAA,UACA,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA;;iBAWmB,mBAAA,CAAoB,QAAA,WAAmB,OAAA;;AAtE7D;;;;;;iBAiFsB,gBAAA,CACpB,KAAA,EAAO,SAAA,EACP,OAAA,GAAS,YAAA,EACT,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA;;;AArEH;;;;;iBAoHsB,sBAAA,CACpB,EAAA,EAAI,YAAA,EACJ,OAAA,YACA,QAAA,aACC,OAAA;AAAA,UAkBc,cAAA;EACf,GAAA;EACA,IAAA;EACA,WAAA,GAAc,MAAA,CAAO,UAAA;AAAA;;;;;;;iBASD,kBAAA,CAAmB,EAAA,EAAI,YAAA,EAAc,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,cAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"composer.d.mts","names":[],"sources":["../../src/services/composer.ts"],"mappings":";;;;;;;;AAyCA;;;;;AAEA;;;cAFa,YAAA;;cAEA,uBAAA;;cAEA,QAAA;AAAA,cAQA,UAAA;EAAA;;;;;;cAQA,kBAAA;AAAA,UAEI,YAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,IAAA;EAN6B;EAQ7B,YAAA;AAAA;AAAA,UAGe,cAAA;EATA;EAWf,QAAA;;EAEA,KAAA;EACA,MAAA;AAAA;;iBAQc,eAAA,CAAgB,WAAA,GAAa,MAAA,CAAO,UAAA;;;;AAbpD;;;;;;;;;iBAqCgB,4BAAA,CAA6B,IAAA,YAAgB,QAAA,EAAU,MAAA;;;;;;;;iBAcvD,cAAA,CAAe,GAAA;AAd/B;;;;;;;;;AAAA,iBAiCsB,kBAAA,CACpB,KAAA,EAAO,SAAA,EACP,QAAA,UACA,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA,CAAQ,YAAA;;;;;AAJX;;;iBA6BgB,gBAAA,CAAiB,IAAA,aAAiB,YAAA;;iBAoBlC,iBAAA,CAAkB,EAAA,EAAI,IAAA,CAAK,YAAA;;;;;;;iBAgBrB,iBAAA,CACpB,KAAA,EAAO,YAAA,EACP,gBAAA,EAAkB,gBAAA,EAClB,QAAA,UACA,QAAA,aACC,OAAA;;;;;;;AAzCH;iBA4EsB,mBAAA,CACpB,QAAA,UACA,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA;;iBAWmB,mBAAA,CAAoB,QAAA,WAAmB,OAAA;;AAtE7D;;;;;;iBAiFsB,gBAAA,CACpB,KAAA,EAAO,SAAA,EACP,OAAA,GAAS,YAAA,EACT,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA;;;AArEH;;;;;iBAoHsB,sBAAA,CACpB,EAAA,EAAI,YAAA,EACJ,OAAA,YACA,QAAA,aACC,OAAA;AAAA,UAkBc,cAAA;EACf,GAAA;EACA,IAAA;EACA,WAAA,GAAc,MAAA,CAAO,UAAA;AAAA;;;;;;;iBASD,kBAAA,CAAmB,EAAA,EAAI,YAAA,EAAc,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,cAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"composer.mjs","names":[],"sources":["../../src/services/composer.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { loadMajorModesConfig, type MajorModesConfig } from '@agimon-ai/doompi-config/majorModes';\nimport { resolveProfile } from '@agimon-ai/doompi-config/profiles';\nimport { parseArgs, type ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport {\n createHarnessSession,\n getHarnessState,\n loadHarnessState,\n readHarnessState,\n updateHarnessState,\n type HarnessState,\n} from '../config/harnessState.ts';\nimport type { HarnessPreset } from '../interfaces/index.ts';\nimport { findRepositoryRoot } from '../utils/index.ts';\nimport { CONTEXT_PACKAGES, PERSONA_ENTRY, assembleChildExtensions, assembleExtensions } from './extensionAssembler.ts';\nimport { extensionSetKey } from './extensionCompiler.ts';\nimport { configurePreset } from './harnessContext.ts';\nimport { applyDomains, applyMajorMode, applyProfile } from './matrixSwitcher.ts';\nimport { selectWorkflowExtensionForProcess } from './resourceCollector.ts';\nimport {\n computeInputsHash,\n createMapResolvers,\n readSyncState,\n runDirectory,\n syncStatePath,\n type SyncState,\n} from './syncState.ts';\n\n/**\n * The runtime half of `doom-pi sync`.\n *\n * Pi's own config carries a single entry, the doom-pi extension, and this is\n * what that entry runs: hydrate the harness environment, apply the startup\n * flags, then load the extension set the matrix selects. It runs again on every\n * `/reload`, which is what lets `/major-mode` swap the set without a restart,\n * since Pi rebuilds its extension runner from whatever a reload produced.\n */\n\n/** Marks a process whose extensions this module composed. */\nexport const COMPOSED_ENV = 'DOOMPI_COMPOSED';\n/** Set by the launcher when it passes one precomposed aggregate to Pi. */\nexport const EXTERNAL_EXTENSIONS_ENV = 'DOOMPI_EXTENSIONS_PROVIDED';\n/** Survives reload, where argv is re-read but the startup flags must not be. */\nexport const MUTE_ENV = 'DOOMPI_MUTE';\nconst ENABLED_FLAG = '1';\nconst SUBAGENT_AGENT_DIRS_ENV = 'PI_SUBAGENT_EXTRA_AGENT_DIRS';\nconst SUBAGENT_SKILL_DIRS_ENV = 'PI_SUBAGENT_EXTRA_SKILL_DIRS';\nconst DOMAIN_SEPARATOR = ',';\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst NOT_SYNCED = 'doompi is configured for Pi but this repository was never synced. Run doompi sync.';\n\nexport const DOOM_FLAGS = {\n majorMode: 'major-mode',\n domains: 'domains',\n profile: 'profile',\n mute: 'mute',\n} as const;\n\n/** Removed flag, reported rather than ignored when a synced session passes it. */\nexport const REMOVED_LAYER_FLAG = 'layer';\n\nexport interface StartupFlags {\n majorMode?: string;\n domains?: string[];\n profile?: string;\n mute: boolean;\n /** True when the caller passed the removed `--layer` flag. */\n removedLayer: boolean;\n}\n\nexport interface ComposeOutcome {\n /** Everything that went wrong, reported once the session can show messages. */\n problems: string[];\n /** Config changed since the last sync, which is a prompt to re-sync. */\n stale: boolean;\n loaded: string[];\n}\n\nfunction message(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** True when this process already applied the command line, so a reload does not. */\nexport function alreadyComposed(environment: NodeJS.ProcessEnv = process.env): boolean {\n return environment[COMPOSED_ENV] === ENABLED_FLAG;\n}\n\nfunction realPath(target: string): string {\n try {\n return fs.realpathSync(target);\n } catch {\n return path.resolve(target);\n }\n}\n\n/**\n * True when this process was handed the doom extension set on the command line.\n *\n * The launcher and detached Doom Team children both pass the composed list as\n * `--extension` arguments, and Pi merges those with whatever project settings\n * declare. Composing again here would load every extension twice, which Pi\n * reports as each tool and flag conflicting with itself.\n *\n * Matching against the synced paths rather than the mere presence of\n * `--extension` keeps an unrelated one-off, `pi -e ./debug.ts`, from silently\n * costing the user their whole setup.\n */\nexport function extensionsProvidedExternally(argv: string[], resolved: Record<string, string>): boolean {\n const { extensions } = parseArgs(argv);\n if (!extensions || extensions.length === 0) return false;\n const composed = new Set(Object.values(resolved).map(realPath));\n return extensions.some((entry) => composed.has(realPath(entry)));\n}\n\n/**\n * Finds the repository whose synced state applies to this session.\n *\n * Pi only reads `.pi/settings.json` from its own working directory, so that is\n * the first place to look; walking up covers a session started in a\n * subdirectory with the extension configured globally.\n */\nexport function findSyncedRoot(cwd: string): string | undefined {\n if (fs.existsSync(syncStatePath(cwd))) return cwd;\n try {\n const root = findRepositoryRoot(cwd);\n return fs.existsSync(syncStatePath(root)) ? root : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Opens this process's session from what sync pinned.\n *\n * The synced record is decoded underneath the live environment, so an inherited\n * value still wins: a launcher run, a nested session, or a CI override is more\n * specific than anything sync wrote. The result becomes the session's state\n * file, which is the authority from here on; the environment it publishes is\n * for the bash hooks and the packages that can only read one.\n */\nexport async function startSyncedSession(\n state: SyncState,\n repoRoot: string,\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<HarnessState> {\n const directory = await prepareRunDirectory(repoRoot);\n const harness: HarnessState = {\n ...readHarnessState({ ...state.env, ...environment }),\n // Recorded separately because no variable carries them.\n ...state.fileState,\n temporaryDirectory: directory,\n };\n createHarnessSession(harness, { directory, environment });\n // The profile's own defaults, which the launcher applies at spawn. They are\n // recorded as a map rather than as variables so /profile can tell which ones\n // it owns when it swaps them out later.\n for (const [key, value] of Object.entries(harness.profileEnvironment)) {\n if (environment[key] === undefined) environment[key] = value;\n }\n return harness;\n}\n\n/**\n * Reads the doom flags off the command line.\n *\n * Pi collects unrecognized flags for extensions but hands their values back\n * only after every extension has loaded, which is too late to decide what to\n * load. Parsing argv with Pi's own parser keeps the value rules identical.\n */\nexport function readStartupFlags(argv: string[]): StartupFlags {\n const { unknownFlags } = parseArgs(argv);\n const text = (name: string): string | undefined => {\n const value = unknownFlags.get(name);\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n };\n const domains = text(DOOM_FLAGS.domains);\n return {\n majorMode: text(DOOM_FLAGS.majorMode),\n domains: domains\n ?.split(DOMAIN_SEPARATOR)\n .map((name) => name.trim())\n .filter(Boolean),\n profile: text(DOOM_FLAGS.profile),\n mute: unknownFlags.get(DOOM_FLAGS.mute) !== undefined,\n removedLayer: unknownFlags.get(REMOVED_LAYER_FLAG) !== undefined,\n };\n}\n\n/** Registers the flags so Pi accepts them and lists them in `pi --help`. */\nexport function registerDoomFlags(pi: Pick<ExtensionAPI, 'registerFlag'>): void {\n pi.registerFlag(DOOM_FLAGS.majorMode, {\n type: 'string',\n description: 'Named major mode from .doom/modes.yaml',\n });\n pi.registerFlag(DOOM_FLAGS.domains, { type: 'string', description: 'Comma-separated content domains' });\n pi.registerFlag(DOOM_FLAGS.profile, { type: 'string', description: 'Persona and env from .doom/profiles.yaml' });\n pi.registerFlag(DOOM_FLAGS.mute, { type: 'boolean', description: 'Disable the notification extension' });\n}\n\n/**\n * Applies the startup flags through the same switchers the slash commands use.\n *\n * A bad value is collected rather than thrown: a factory that throws takes the\n * whole doom setup down with it, which is far worse than one unapplied flag.\n */\nexport async function applyStartupFlags(\n flags: StartupFlags,\n majorModesConfig: MajorModesConfig,\n repoRoot: string,\n problems: string[],\n): Promise<void> {\n // Reported rather than ignored: Pi hands unrecognized flags to extensions, so\n // a stale `--layer dev` would otherwise start a session on the wrong mode\n // without saying anything.\n if (flags.removedLayer) problems.push(`--${REMOVED_LAYER_FLAG} was replaced by --${DOOM_FLAGS.majorMode}`);\n if (flags.majorMode) {\n try {\n applyMajorMode(majorModesConfig, flags.majorMode, getHarnessState());\n } catch (error) {\n problems.push(`--${DOOM_FLAGS.majorMode} ${flags.majorMode}: ${message(error)}`);\n }\n }\n if (flags.domains && flags.domains.length > 0) {\n try {\n await applyDomains(flags.domains, getHarnessState());\n } catch (error) {\n problems.push(`--domains ${flags.domains.join(DOMAIN_SEPARATOR)}: ${message(error)}`);\n }\n }\n if (flags.profile) {\n try {\n await applyProfile(resolveProfile(repoRoot, flags.profile), getHarnessState());\n } catch (error) {\n problems.push(`--profile ${flags.profile}: ${message(error)}`);\n }\n }\n}\n\n/**\n * Points harness state at a per-process directory before anything writes there.\n *\n * The synced directory is a baseline that every session reads; live switches\n * materialize into this one instead, so a second session in the same repository\n * cannot overwrite what the first is using.\n */\nexport async function prepareRunDirectory(\n repoRoot: string,\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<string> {\n const directory = runDirectory(repoRoot);\n await fs.promises.mkdir(directory, { mode: PRIVATE_DIRECTORY_MODE, recursive: true });\n // Through the store rather than the environment: the state file is the\n // authority, and a switcher reading a stale directory would write a live\n // session's resources into the wrong place.\n updateHarnessState({ temporaryDirectory: directory }, environment);\n return directory;\n}\n\n/** Removes this session's scratch directory. */\nexport async function cleanupRunDirectory(repoRoot: string): Promise<void> {\n await fs.promises.rm(runDirectory(repoRoot), { recursive: true, force: true });\n}\n\n/**\n * Builds the ordered list of extensions to load for the current state.\n *\n * Returns them in Pi load order. `assembleExtensions` produces the order the\n * launcher passes to Pi, where the last element becomes the first `--extension`\n * argument, so reversing here keeps that rule stated in exactly one place.\n */\nexport async function composeLoadOrder(\n state: SyncState,\n harness: HarnessState = getHarnessState(),\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<string[]> {\n const repoRoot = harness.root ?? state.root;\n const resolvers = createMapResolvers(state.resolved, state.compiled);\n // Resolved from the sync map rather than generated: doom-mcp reads the\n // repository and plugin layers itself, and the environment the launcher wrote\n // already tells it which plugins and allowlist this session selected.\n const mcpEntry = harness.mcp ? resolvers.optionalPackageEntry(CONTEXT_PACKAGES.mcp) : undefined;\n const context = {\n agents: harness.agents,\n // Exiting when the agent settles is a launcher decision with no synced\n // equivalent: a session started by hand is meant to stay open.\n autoStop: false,\n preset: state.selection.preset,\n mcpEntry,\n personaEntry: resolvers.ownEntry(PERSONA_ENTRY),\n workflowExtension: selectWorkflowExtensionForProcess(\n resolvers.optionalPackageEntry(CONTEXT_PACKAGES.workflow),\n resolvers.optionalPackageEntry(CONTEXT_PACKAGES.dispatcherWorkflow),\n environment,\n ),\n layers: [...harness.layers],\n majorModesConfig: loadMajorModesConfig(repoRoot),\n resolvers,\n };\n\n // A state field, so it goes through the store: Doom Team reads it from the\n // environment the store publishes when it builds a child's spawn snapshot.\n updateHarnessState(\n { childExtensions: assembleChildExtensions({ ...context, agents: false, mute: true }) },\n environment,\n );\n if (harness.agents) {\n environment[SUBAGENT_AGENT_DIRS_ENV] = harness.agentDirectories.join(path.delimiter);\n environment[SUBAGENT_SKILL_DIRS_ENV] = harness.skillDirectories.join(path.delimiter);\n }\n const entries = [...assembleExtensions({ ...context, mute: environment[MUTE_ENV] === ENABLED_FLAG })].reverse();\n const bundle = state.bundles?.[extensionSetKey(entries)];\n return bundle ? [bundle] : entries;\n}\n\n/**\n * Imports each extension and hands it the same Pi API this module received.\n *\n * Every Pi extension entry is a factory of the same shape, so one extension can\n * activate the rest. Failures are per entry: one unloadable module must not\n * cost the session everything after it in the order.\n */\nexport async function loadComposedExtensions(\n pi: ExtensionAPI,\n entries: string[],\n problems: string[],\n): Promise<string[]> {\n const loaded: string[] = [];\n for (const entry of entries) {\n try {\n const module = (await import(pathToFileURL(entry).href)) as { default?: unknown };\n if (typeof module.default !== 'function') {\n problems.push(`${entry}: does not export an extension factory`);\n continue;\n }\n await (module.default as (api: ExtensionAPI) => void | Promise<void>)(pi);\n loaded.push(entry);\n } catch (error) {\n problems.push(`${entry}: ${message(error)}`);\n }\n }\n return loaded;\n}\n\nexport interface ComposeOptions {\n cwd?: string;\n argv?: string[];\n environment?: NodeJS.ProcessEnv;\n}\n\n/**\n * Runs the whole synced startup for one Pi session.\n *\n * Never throws: whatever fails is reported through the outcome so the session\n * still starts and can say what is wrong.\n */\nexport async function composeDoomSession(pi: ExtensionAPI, options: ComposeOptions = {}): Promise<ComposeOutcome> {\n const environment = options.environment ?? process.env;\n const problems: string[] = [];\n const repoRoot = findSyncedRoot(options.cwd ?? process.cwd());\n if (!repoRoot) return { problems: [NOT_SYNCED], stale: false, loaded: [] };\n\n let state: SyncState | undefined;\n try {\n state = readSyncState(repoRoot);\n } catch (error) {\n return { problems: [message(error)], stale: false, loaded: [] };\n }\n if (!state) return { problems: [NOT_SYNCED], stale: false, loaded: [] };\n\n const argv = options.argv ?? process.argv.slice(2);\n // The launcher and Doom Team children compose the set themselves and pass it\n // in, so this entry has nothing left to do but stay out of the way.\n if (\n environment[EXTERNAL_EXTENSIONS_ENV] === ENABLED_FLAG ||\n extensionsProvidedExternally(argv, { ...state.resolved, ...state.bundles })\n ) {\n return { problems: [], stale: false, loaded: [] };\n }\n\n configurePreset({ preset: state.selection.preset as HarnessPreset, piArgs: [] }, environment);\n\n // Only the first load opens a session. A reload finds the pointer this set\n // and reads the file back, which is what carries a live /domains or /profile\n // switch across the reload instead of resetting it to what sync pinned.\n if (!alreadyComposed(environment)) {\n environment[COMPOSED_ENV] = ENABLED_FLAG;\n await startSyncedSession(state, repoRoot, environment);\n const flags = readStartupFlags(argv);\n if (flags.mute) environment[MUTE_ENV] = ENABLED_FLAG;\n await applyStartupFlags(flags, loadMajorModesConfig(repoRoot), repoRoot, problems);\n }\n\n let entries: string[];\n try {\n // Read back through the store rather than from this process: the startup\n // flags may have switched the layer or the domains a moment ago, and the\n // environment being managed is not always this process's own.\n entries = await composeLoadOrder(state, loadHarnessState(environment).state, environment);\n } catch (error) {\n return { problems: [...problems, message(error)], stale: false, loaded: [] };\n }\n\n const loaded = await loadComposedExtensions(pi, entries, problems);\n return { problems, stale: computeInputsHash(repoRoot, state.selection) !== state.inputsHash, loaded };\n}\n"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../utils/moduleResolution.cjs`);require(`../utils/index.cjs`);let n=require(`node:path`);n=e.__toESM(n,1);let r=require(`node:module`),i=require(`node:fs`);i=e.__toESM(i,1);let a=require(`node:crypto`),o=require(`node:url`);const s=[`.ts`,`.mts`,`.cts`],c=`.mjs`,l=`\0doompi-extension-set`,u={"@mariozechner/pi-coding-agent":`@earendil-works/pi-coding-agent`,"@mariozechner/pi-tui":`@earendil-works/pi-tui`,"@mariozechner/pi-ai":`@earendil-works/pi-ai`,"@sinclair/typebox":`typebox`};function d(e){return s.some(t=>e.endsWith(t))}function f(e){for(let[t,n]of Object.entries(u)){if(e===t)return n;if(e.startsWith(`${t}/`))return`${n}${e.slice(t.length)}`}return e}function p(e){let t=i.default.readFileSync(e);return(0,a.createHash)(`sha256`).update(`v3`).update(e).update(t).digest(`hex`).slice(0,16)}function m(e,t){let r=n.default.basename(e).replace(/\.[cm]?ts$/,``);return`${n.default.basename(n.default.dirname(e))}-${r}.${t}${c}`}const h=new Set([`@earendil-works/pi-coding-agent`,`@earendil-works/pi-tui`,`@earendil-works/pi-ai`]);function g(e){let n=t.optionalPackageEntry(`@earendil-works/pi-coding-agent`);if(n)try{return(0,r.createRequire)(n).resolve(e)}catch{return}}const _=new Set([`@parcel/watcher`,`@napi-rs/keyring`,`better-sqlite3`,`canvas`,`fsevents`,`isolated-vm`,`keytar`,`node-pty`,`onnxruntime-node`,`playwright`,`playwright-core`,`puppeteer`,`sharp`]),v=new Set(r.builtinModules.flatMap(e=>[e,`node:${e}`]));function y(e){return e.trim().replace(/[^a-zA-Z0-9._-]+/g,`-`).replace(/^[-.]+|[-.]+$/g,``)||`doom-set`}function b(e){let t=e.startsWith(`@`)?e.indexOf(`/`,e.indexOf(`/`)+1):e.indexOf(`/`);return t===-1?e:e.slice(0,t)}function x(e){let t=e.split(n.default.sep).join(`/`),r=t.lastIndexOf(`/node_modules/`);if(r===-1)return;let i=t.slice(r+14).split(`/`),a=i.lastIndexOf(`node_modules`),o=a===-1?i:i.slice(a+1);return o[0]?.startsWith(`@`)?o.slice(0,2).join(`/`):o[0]}function S(){return{name:`doom-external-absolute`,async resolveId(e,r,i){if(e.startsWith(`.`)||n.default.isAbsolute(e)||e.startsWith(`node:`))return null;let a=f(e),o=b(a);if(o&&h.has(o)){let e=t.optionalPackageEntry(a);if(e)return{id:e,external:!0}}let s=await this.resolve(a,r,i);return!s||d(s.id)?null:{id:s.id,external:!0}}}}function C(e){try{let t=i.default.statSync(e);return t.isFile()?{path:e,size:t.size,mtimeMs:t.mtimeMs}:void 0}catch{return}}function w(e,t){return e.version!==`v4`||JSON.stringify(e.entries)!==JSON.stringify(t)||!i.default.existsSync(e.output)?!1:e.inputs.every(e=>{let t=C(e.path);return t?.size===e.size&&t.mtimeMs===e.mtimeMs})}function T(e){try{let t=JSON.parse(i.default.readFileSync(e,`utf8`));return t&&Array.isArray(t.entries)&&Array.isArray(t.inputs)?t:void 0}catch{return}}function E(e,t){let n=`${e}.${process.pid}.${Date.now()}.tmp`;i.default.writeFileSync(n,t);try{i.default.renameSync(n,e)}catch(t){if(i.default.rmSync(n,{force:!0}),!i.default.existsSync(e))throw t}}function D(e){return(0,a.createHash)(`sha256`).update(`v4`).update(JSON.stringify(e.map(e=>n.default.resolve(e)))).digest(`hex`).slice(0,16)}function O(e){let t=e.map(e=>`() => import(${JSON.stringify(k(e))})`),n=e.map(e=>JSON.stringify(e));return[`const loaders = [${t.join(`,`)}];`,`const names = [${n.join(`,`)}];`,`function report(index, error) {`,` const detail = error instanceof Error ? error.message : String(error);`," process.stderr.write(`[doompi] ${names[index]}: ${detail}\\n`);",`}`,`export default async function doompiExtensionSet(pi) {`,` const loaded = await Promise.all(loaders.map(async (load, index) => {`,` try {`,` return await load();`,` } catch (error) {`,` report(index, error);`,` return undefined;`,` }`,` }));`,` for (let index = 0; index < loaded.length; index += 1) {`,` const extension = loaded[index];`,` if (!extension) continue;`,` try {`,` if (typeof extension.default !== 'function') throw new Error('does not export an extension factory');`,` await extension.default(pi);`,` } catch (error) {`,` report(index, error);`,` }`,` }`,`}`].join(`
2
- `)}function k(e){return n.default.resolve(e).split(n.default.sep).join(`/`)}function A(e){return{name:`doom-set-external`,async resolveId(r,i,a){if(r===l)return null;if(v.has(r)||r.startsWith(`node:`))return{id:r,external:!0};if(n.default.isAbsolute(r)){let t=x(r);return t&&(h.has(t)||_.has(t))?(e.add(r),{id:r,external:!0}):null}if(r.startsWith(`.`))return null;let o=f(r),s=b(o);if(s&&h.has(s)){let n=t.optionalPackageEntry(o);if(n)return e.add(n),{id:n,external:!0}}if(s===`typebox`){let t=g(o);if(t)return e.add(t),{id:t,external:!1}}if(s&&_.has(s)){let t=await this.resolve(o,i,a);if(t)return e.add(t.id),{id:t.id,external:!0}}return null}}}function j(e){return{name:`doom-set-inputs`,load(t){return n.default.isAbsolute(t)&&i.default.existsSync(t)&&e.add(t),null}}}function M(e,t,n){t.code===`UNRESOLVED_IMPORT`&&n(`error`,t)}function N(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function P(e,t){if(Array.isArray(e)){for(let n of e)P(n,t);return}if(!N(e))return;let n=e.object,r=e.property;if(e.type===`MemberExpression`&&e.computed===!1&&typeof e.start==`number`&&typeof e.end==`number`&&N(n)&&n.type===`MetaProperty`&&N(n.meta)&&n.meta.name===`import`&&N(n.property)&&n.property.name===`meta`&&N(r)&&r.name===`url`){t.push({start:e.start,end:e.end});return}for(let n of Object.values(e))P(n,t)}function F(){return{name:`doom-original-import-meta-url`,transform(e,t){if(!n.default.isAbsolute(t)||!e.includes(`import.meta.url`))return null;let r=n.default.extname(t).toLowerCase(),i=r===`.tsx`?`tsx`:r===`.jsx`?`jsx`:d(t)?`ts`:`js`,a=[];if(P(this.parse(e,{lang:i}),a),a.length===0)return null;let s=JSON.stringify((0,o.pathToFileURL)(t).href),c=e;for(let e of a.sort((e,t)=>t.start-e.start))c=`${c.slice(0,e.start)}${s}${c.slice(e.end)}`;return c}}}async function I(e,t,r={}){if(e.length===0)throw Error(`Cannot compile an empty extension set`);let o=e.map(e=>n.default.resolve(e)),s=n.default.join(t,`sets`);i.default.mkdirSync(s,{recursive:!0});let u=D(o),d=n.default.resolve(r.outputDirectory??s),f=y(r.outputName??`doom-set`);i.default.mkdirSync(d,{recursive:!0});let p=(0,a.createHash)(`sha256`).update(d).update(f).digest(`hex`).slice(0,16),m=n.default.join(s,`${u}.${p}.json`),h=T(m);if(h&&w(h,o))return h.output;let g=new Set(o),_=O(o),{rolldown:v}=await import(`rolldown`),b=await v({input:l,platform:`node`,plugins:[{name:`doom-set-entry`,resolveId(e){return e===l?e:null},load(e){return e===l?_:null}},A(g),F(),j(g)],onLog:M}),x;try{let e=(await b.generate({format:`esm`,sourcemap:!1,minify:!0,codeSplitting:!1})).output.find(e=>e.type===`chunk`);if(!e||e.type!==`chunk`)throw Error(`Rolldown produced no extension bundle`);x=e.code}finally{await b.close()}let S=(0,a.createHash)(`sha256`).update(`v4`).update(x).digest(`hex`).slice(0,16),k=n.default.join(d,`${f}.${S}${c}`);i.default.existsSync(k)||E(k,x);let N=[...g].map(C).filter(e=>e!==void 0).sort((e,t)=>e.path.localeCompare(t.path));return E(m,`${JSON.stringify({version:`v4`,entries:o,output:k,inputs:N},null,2)}\n`),k}async function L(e,t){if(!d(e))return e;let r=n.default.join(t,m(e,p(e)));if(i.default.existsSync(r))return r;let{rolldown:a}=await import(`rolldown`),o=await a({input:e,platform:`node`,plugins:[S(),F()],onLog:M});try{await o.write({file:r,format:`esm`,sourcemap:!1,minify:!0,codeSplitting:!1})}finally{await o.close()}return r}async function R(e,t){i.default.mkdirSync(t,{recursive:!0});let n={};for(let[r,i]of Object.entries(e))try{n[r]=await L(i,t)}catch{n[r]=i}return n}exports.compileExtensionSet=I,exports.compileResolvedEntries=R,exports.extensionSetKey=D;
3
- //# sourceMappingURL=extensionCompiler.cjs.map