@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollamaProvider.d.cts","names":[],"sources":["../../../src/extensions/entries/ollamaProvider.ts"],"mappings":";;;iBAEwB,cAAA,CAAe,EAAA,EAAI,YAAA"}
@@ -0,0 +1,7 @@
1
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+
3
+ //#region src/extensions/entries/ollamaProvider.d.ts
4
+ declare function registerOllama(pi: ExtensionAPI): void;
5
+ //#endregion
6
+ export { registerOllama };
7
+ //# sourceMappingURL=ollamaProvider.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollamaProvider.d.mts","names":[],"sources":["../../../src/extensions/entries/ollamaProvider.ts"],"mappings":";;;iBAEwB,cAAA,CAAe,EAAA,EAAI,YAAA"}
@@ -0,0 +1,2 @@
1
+ function e(e){let t=process.argv.find(e=>e.startsWith(`ollama/`))?.slice(7)??`kimi-k2.6:cloud`;e.registerProvider(`ollama`,{name:`Ollama`,baseUrl:process.env.DOOMPI_OLLAMA_BASE_URL??`http://localhost:11434/v1`,apiKey:`$OLLAMA_API_KEY`,api:`openai-completions`,models:[{id:t,name:t,reasoning:!1,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:262144,maxTokens:32768,compat:{supportsDeveloperRole:!1,supportsReasoningEffort:!1}}]})}export{e as default};
2
+ //# sourceMappingURL=ollamaProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollamaProvider.mjs","names":[],"sources":["../../../src/extensions/entries/ollamaProvider.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nexport default function registerOllama(pi: ExtensionAPI): void {\n const modelArgument = process.argv.find((argument) => argument.startsWith('ollama/'));\n const model = modelArgument?.slice('ollama/'.length) ?? 'kimi-k2.6:cloud';\n pi.registerProvider('ollama', {\n name: 'Ollama',\n baseUrl: process.env.DOOMPI_OLLAMA_BASE_URL ?? 'http://localhost:11434/v1',\n apiKey: '$OLLAMA_API_KEY',\n api: 'openai-completions',\n models: [\n {\n id: model,\n name: model,\n reasoning: false,\n input: ['text', 'image'],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 262_144,\n maxTokens: 32_768,\n compat: {\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n },\n },\n ],\n });\n}\n"],"mappings":"AAEA,SAAwB,EAAe,EAAwB,CAE7D,IAAM,EADgB,QAAQ,KAAK,KAAM,GAAa,EAAS,WAAW,UAAU,CACzD,EAAE,MAAM,EAAiB,EAAI,kBACxD,EAAG,iBAAiB,SAAU,CAC5B,KAAM,SACN,QAAS,QAAQ,IAAI,wBAA0B,4BAC/C,OAAQ,kBACR,IAAK,qBACL,OAAQ,CACN,CACE,GAAI,EACJ,KAAM,EACN,UAAW,GACX,MAAO,CAAC,OAAQ,QAAQ,CACxB,KAAM,CAAE,MAAO,EAAG,OAAQ,EAAG,UAAW,EAAG,WAAY,EAAG,CAC1D,cAAe,OACf,UAAW,MACX,OAAQ,CACN,sBAAuB,GACvB,wBAAyB,GAC1B,CACF,CACF,CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`../../adapters/telemetry/logSinkTelemetry.cjs`);let n=require(`node:fs`);n=e.__toESM(n,1);let r=require(`@agimon-ai/doompi-config/piContext`);function i(e,i=t.createHarnessTelemetry()){e.on(`before_agent_start`,async(e,a)=>{let{personaFile:o}=(0,r.requireDoomConfigContext)(a).harness;if(o)try{let t=(await n.default.promises.readFile(o,`utf8`)).trim();return t?{systemPrompt:`${e.systemPrompt}\n\n${t}`}:void 0}catch(e){let n=e instanceof Error?e.message:String(e);i.recordError(t.HARNESS_EVENT.personaReadFailed,e),process.stderr.write(`[pi-persona] could not read ${o}: ${n}\n`);return}})}exports.default=i;
2
+ //# sourceMappingURL=persona.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.cjs","names":["createHarnessTelemetry","fs","HARNESS_EVENT"],"sources":["../../../src/extensions/entries/persona.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n type HarnessTelemetry,\n} from '../../adapters/telemetry/logSinkTelemetry.ts';\n\n/**\n * Appends the selected profile's persona to the system prompt.\n *\n * The harness writes the assembled persona to a file in the run directory and\n * records the path in the harness state, so agents/ stays the single source of\n * persona material and is never copied into config.\n */\nexport default function persona(pi: ExtensionAPI, telemetry: HarnessTelemetry = createHarnessTelemetry()): void {\n pi.on('before_agent_start', async (event, ctx) => {\n const { personaFile } = requireDoomConfigContext(ctx).harness;\n if (!personaFile) return undefined;\n\n try {\n const content = (await fs.promises.readFile(personaFile, 'utf8')).trim();\n return content ? { systemPrompt: `${event.systemPrompt}\\n\\n${content}` } : undefined;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n void telemetry.recordError(HARNESS_EVENT.personaReadFailed, error);\n process.stderr.write(`[pi-persona] could not read ${personaFile}: ${reason}\\n`);\n return undefined;\n }\n });\n}\n"],"mappings":"iNAgBA,SAAwB,EAAQ,EAAkB,EAA8BA,EAAAA,wBAAwB,CAAQ,CAC9G,EAAG,GAAG,qBAAsB,MAAO,EAAO,IAAQ,CAChD,GAAM,CAAE,gBAAA,EAAA,EAAA,0BAAyC,EAAI,CAAC,QACjD,KAEL,GAAI,CACF,IAAM,GAAW,MAAMC,EAAAA,QAAG,SAAS,SAAS,EAAa,OAAO,EAAE,MAAM,CACxE,OAAO,EAAU,CAAE,aAAc,GAAG,EAAM,aAAa,MAAM,IAAW,CAAG,IAAA,SACpE,EAAO,CACd,IAAM,EAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAChE,EAAU,YAAYC,EAAAA,cAAc,kBAAmB,EAAM,CAClE,QAAQ,OAAO,MAAM,+BAA+B,EAAY,IAAI,EAAO,IAAI,CAC/E,SAEF"}
@@ -0,0 +1,15 @@
1
+ import { HarnessTelemetry } from "../../adapters/telemetry/logSinkTelemetry.cjs";
2
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
3
+
4
+ //#region src/extensions/entries/persona.d.ts
5
+ /**
6
+ * Appends the selected profile's persona to the system prompt.
7
+ *
8
+ * The harness writes the assembled persona to a file in the run directory and
9
+ * records the path in the harness state, so agents/ stays the single source of
10
+ * persona material and is never copied into config.
11
+ */
12
+ declare function persona(pi: ExtensionAPI, telemetry?: HarnessTelemetry): void;
13
+ //#endregion
14
+ export { persona };
15
+ //# sourceMappingURL=persona.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.d.cts","names":[],"sources":["../../../src/extensions/entries/persona.ts"],"mappings":";;;;;;AAOsD;;;;;iBAS9B,OAAA,CAAQ,EAAA,EAAI,YAAA,EAAc,SAAA,GAAW,gBAAA"}
@@ -0,0 +1,15 @@
1
+ import { HarnessTelemetry } from "../../adapters/telemetry/logSinkTelemetry.mjs";
2
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
3
+
4
+ //#region src/extensions/entries/persona.d.ts
5
+ /**
6
+ * Appends the selected profile's persona to the system prompt.
7
+ *
8
+ * The harness writes the assembled persona to a file in the run directory and
9
+ * records the path in the harness state, so agents/ stays the single source of
10
+ * persona material and is never copied into config.
11
+ */
12
+ declare function persona(pi: ExtensionAPI, telemetry?: HarnessTelemetry): void;
13
+ //#endregion
14
+ export { persona };
15
+ //# sourceMappingURL=persona.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.d.mts","names":[],"sources":["../../../src/extensions/entries/persona.ts"],"mappings":";;;;;;AAOsD;;;;;iBAS9B,OAAA,CAAQ,EAAA,EAAI,YAAA,EAAc,SAAA,GAAW,gBAAA"}
@@ -0,0 +1,2 @@
1
+ import{HARNESS_EVENT as e,createHarnessTelemetry as t}from"../../adapters/telemetry/logSinkTelemetry.mjs";import n from"node:fs";import{requireDoomConfigContext as r}from"@agimon-ai/doompi-config/piContext";function i(i,a=t()){i.on(`before_agent_start`,async(t,i)=>{let{personaFile:o}=r(i).harness;if(o)try{let e=(await n.promises.readFile(o,`utf8`)).trim();return e?{systemPrompt:`${t.systemPrompt}\n\n${e}`}:void 0}catch(t){let n=t instanceof Error?t.message:String(t);a.recordError(e.personaReadFailed,t),process.stderr.write(`[pi-persona] could not read ${o}: ${n}\n`);return}})}export{i as default};
2
+ //# sourceMappingURL=persona.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.mjs","names":[],"sources":["../../../src/extensions/entries/persona.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n type HarnessTelemetry,\n} from '../../adapters/telemetry/logSinkTelemetry.ts';\n\n/**\n * Appends the selected profile's persona to the system prompt.\n *\n * The harness writes the assembled persona to a file in the run directory and\n * records the path in the harness state, so agents/ stays the single source of\n * persona material and is never copied into config.\n */\nexport default function persona(pi: ExtensionAPI, telemetry: HarnessTelemetry = createHarnessTelemetry()): void {\n pi.on('before_agent_start', async (event, ctx) => {\n const { personaFile } = requireDoomConfigContext(ctx).harness;\n if (!personaFile) return undefined;\n\n try {\n const content = (await fs.promises.readFile(personaFile, 'utf8')).trim();\n return content ? { systemPrompt: `${event.systemPrompt}\\n\\n${content}` } : undefined;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n void telemetry.recordError(HARNESS_EVENT.personaReadFailed, error);\n process.stderr.write(`[pi-persona] could not read ${personaFile}: ${reason}\\n`);\n return undefined;\n }\n });\n}\n"],"mappings":"+MAgBA,SAAwB,EAAQ,EAAkB,EAA8B,GAAwB,CAAQ,CAC9G,EAAG,GAAG,qBAAsB,MAAO,EAAO,IAAQ,CAChD,GAAM,CAAE,eAAgB,EAAyB,EAAI,CAAC,QACjD,KAEL,GAAI,CACF,IAAM,GAAW,MAAM,EAAG,SAAS,SAAS,EAAa,OAAO,EAAE,MAAM,CACxE,OAAO,EAAU,CAAE,aAAc,GAAG,EAAM,aAAa,MAAM,IAAW,CAAG,IAAA,SACpE,EAAO,CACd,IAAM,EAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAChE,EAAU,YAAY,EAAc,kBAAmB,EAAM,CAClE,QAAQ,OAAO,MAAM,+BAA+B,EAAY,IAAI,EAAO,IAAI,CAC/E,SAEF"}
@@ -0,0 +1,3 @@
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../adapters/telemetry/logSinkTelemetry.cjs`);let t=require(`@agimon-ai/doompi-config/piContext`);const n=`(none)`,r=`warning`,i=`info`,a=`.doom/profiles.yaml`;function o(e){return e.map(e=>({value:e.name,label:e.name,description:s(e)}))}function s(e){let t=Object.keys(e.env).sort();return t.length>0?`${e.persona} (env: ${t.join(`, `)})`:e.persona}function c(e){let t=Object.keys(e.env).sort();return[`Profile ${e.name}`,`Persona: ${e.persona}`,`Env: ${t.join(`, `)||n}`,`Already loaded.`].join(`
2
+ `)}async function l(e,t){let{applyProfile:n}=await Promise.resolve().then(()=>require(`../../adapters/matrixSwitcher.cjs`));return n(e,t)}function u(s,l=e.createHarnessTelemetry()){let u,d,f,p,m=()=>u??=Promise.resolve().then(()=>require(`../../adapters/config/harnessState.cjs`)),h=()=>d??=Promise.resolve().then(()=>require(`../../adapters/matrixSwitcher.cjs`)),g=()=>f??=Promise.resolve().then(()=>require(`./components/matrixPicker.cjs`)),_=()=>p??=import(`@agimon-ai/doompi-config/profiles`);s.registerCommand(`profile`,{description:`Show profiles and load a different persona and environment`,handler:async(u,d)=>{let f=(0,t.requireDoomConfigContext)(d).harness,[{requireHarnessRoot:p},{loadProfiles:v}]=await Promise.all([m(),_()]),y=p(f),b=f.profile,x;try{x=v(y)}catch(t){let n=t instanceof Error?t.message:String(t);l.recordError(e.HARNESS_EVENT.profileLoadFailed,t),d.ui.notify(`Could not load ${a}: ${n}`,r);return}if(x.length===0){d.ui.notify(`No profiles found in ${a}.`,r);return}let S=`Profile (current: ${b??n})`,C=(d.mode===`tui`?await g().then(({MatrixPickerComponent:e})=>d.ui.custom((t,n,r,i)=>new e({title:S,items:o(x),selected:b?[b]:[],multi:!1},n,r,i))):[await d.ui.select(S,x.map(e=>e.name))])?.[0],w=x.find(e=>e.name===C);if(!w)return;if(w.name===b){d.ui.notify(c(w),i);return}let{applyProfile:T}=await h();d.ui.notify(await T(w,f),i);let{persistHarnessSelection:E}=await m();E(s,{...f,profile:w.name}),l.recordEvent(e.HARNESS_EVENT.profileApplied,{"harness.profile":w.name,...b?{"harness.profile.previous":b}:{}}),await d.waitForIdle(),await d.reload()}})}exports.applyProfile=l,exports.default=u,exports.profileDescription=s,exports.profileItems=o,exports.profileSummary=c;
3
+ //# sourceMappingURL=profile.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.cjs","names":["createHarnessTelemetry","HARNESS_EVENT"],"sources":["../../../src/extensions/entries/profile.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { AgentProfile } from '@agimon-ai/doompi-config/profiles';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport type { SelectItem } from '@earendil-works/pi-tui';\nimport type { DoomHarnessContext } from '../../adapters/config/harnessState.ts';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n type HarnessTelemetry,\n} from '../../adapters/telemetry/logSinkTelemetry.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 async function applyProfile(profile: AgentProfile, state: DoomHarnessContext): Promise<string> {\n const { applyProfile: apply } = await import('../../adapters/matrixSwitcher.ts');\n return apply(profile, state);\n}\n\nexport default function profileExtension(\n pi: ExtensionAPI,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): void {\n let harnessStatePromise: Promise<typeof import('../../adapters/config/harnessState.ts')> | undefined;\n let matrixSwitcherPromise: Promise<typeof import('../../adapters/matrixSwitcher.ts')> | undefined;\n let pickerPromise: Promise<typeof import('./components/matrixPicker.ts')> | undefined;\n let profilesPromise: Promise<typeof import('@agimon-ai/doompi-config/profiles')> | undefined;\n\n const loadHarnessState = () => (harnessStatePromise ??= import('../../adapters/config/harnessState.ts'));\n const loadMatrixSwitcher = () => (matrixSwitcherPromise ??= import('../../adapters/matrixSwitcher.ts'));\n const loadPicker = () => (pickerPromise ??= import('./components/matrixPicker.ts'));\n const loadProfiles = () => (profilesPromise ??= import('@agimon-ai/doompi-config/profiles'));\n\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 [{ requireHarnessRoot }, { loadProfiles: readProfiles }] = await Promise.all([\n loadHarnessState(),\n loadProfiles(),\n ]);\n const root = requireHarnessRoot(state);\n const current = state.profile;\n let profiles: AgentProfile[];\n try {\n profiles = readProfiles(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 loadPicker().then(({ MatrixPickerComponent }) =>\n 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 : [\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 const { applyProfile: apply } = await loadMatrixSwitcher();\n ctx.ui.notify(await apply(profile, state), INFO);\n const { persistHarnessSelection } = await loadHarnessState();\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":"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"}
@@ -0,0 +1,18 @@
1
+ import { HarnessTelemetry } from "../../adapters/telemetry/logSinkTelemetry.cjs";
2
+ import { DoomHarnessContext } from "../../adapters/config/harnessState.cjs";
3
+ import { AgentProfile } from "@agimon-ai/doompi-config/profiles";
4
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
5
+ import { SelectItem } from "@earendil-works/pi-tui";
6
+
7
+ //#region src/extensions/entries/profile.d.ts
8
+ /** Rows for the single-select profile picker. */
9
+ declare function profileItems(profiles: AgentProfile[]): SelectItem[];
10
+ declare function profileDescription(profile: AgentProfile): string;
11
+ /** Shown when the picked profile is already active. */
12
+ declare function profileSummary(profile: AgentProfile): string;
13
+ /** Loads one profile's persona and environment defaults. */
14
+ declare function applyProfile(profile: AgentProfile, state: DoomHarnessContext): Promise<string>;
15
+ declare function profileExtension(pi: ExtensionAPI, telemetry?: HarnessTelemetry): void;
16
+ //#endregion
17
+ export { applyProfile, profileDescription, profileExtension, profileItems, profileSummary };
18
+ //# sourceMappingURL=profile.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.cts","names":[],"sources":["../../../src/extensions/entries/profile.ts"],"mappings":";;;;;;;;iBAiBgB,YAAA,CAAa,QAAA,EAAU,YAAA,KAAiB,UAAA;AAAA,iBAQxC,kBAAA,CAAmB,OAAA,EAAS,YAAA;;iBAM5B,cAAA,CAAe,OAAA,EAAS,YAAA;;iBAWlB,YAAA,CAAa,OAAA,EAAS,YAAA,EAAc,KAAA,EAAO,kBAAA,GAAqB,OAAA;AAAA,iBAK9D,gBAAA,CACtB,EAAA,EAAI,YAAA,EACJ,SAAA,GAAW,gBAAA"}
@@ -0,0 +1,18 @@
1
+ import { HarnessTelemetry } from "../../adapters/telemetry/logSinkTelemetry.mjs";
2
+ import { DoomHarnessContext } from "../../adapters/config/harnessState.mjs";
3
+ import { AgentProfile } from "@agimon-ai/doompi-config/profiles";
4
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
5
+ import { SelectItem } from "@earendil-works/pi-tui";
6
+
7
+ //#region src/extensions/entries/profile.d.ts
8
+ /** Rows for the single-select profile picker. */
9
+ declare function profileItems(profiles: AgentProfile[]): SelectItem[];
10
+ declare function profileDescription(profile: AgentProfile): string;
11
+ /** Shown when the picked profile is already active. */
12
+ declare function profileSummary(profile: AgentProfile): string;
13
+ /** Loads one profile's persona and environment defaults. */
14
+ declare function applyProfile(profile: AgentProfile, state: DoomHarnessContext): Promise<string>;
15
+ declare function profileExtension(pi: ExtensionAPI, telemetry?: HarnessTelemetry): void;
16
+ //#endregion
17
+ export { applyProfile, profileDescription, profileExtension, profileItems, profileSummary };
18
+ //# sourceMappingURL=profile.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.mts","names":[],"sources":["../../../src/extensions/entries/profile.ts"],"mappings":";;;;;;;;iBAiBgB,YAAA,CAAa,QAAA,EAAU,YAAA,KAAiB,UAAA;AAAA,iBAQxC,kBAAA,CAAmB,OAAA,EAAS,YAAA;;iBAM5B,cAAA,CAAe,OAAA,EAAS,YAAA;;iBAWlB,YAAA,CAAa,OAAA,EAAS,YAAA,EAAc,KAAA,EAAO,kBAAA,GAAqB,OAAA;AAAA,iBAK9D,gBAAA,CACtB,EAAA,EAAI,YAAA,EACJ,SAAA,GAAW,gBAAA"}
@@ -0,0 +1,3 @@
1
+ import{HARNESS_EVENT as e,createHarnessTelemetry as t}from"../../adapters/telemetry/logSinkTelemetry.mjs";import{requireDoomConfigContext as n}from"@agimon-ai/doompi-config/piContext";const r=`(none)`,i=`warning`,a=`info`,o=`.doom/profiles.yaml`;function s(e){return e.map(e=>({value:e.name,label:e.name,description:c(e)}))}function c(e){let t=Object.keys(e.env).sort();return t.length>0?`${e.persona} (env: ${t.join(`, `)})`:e.persona}function l(e){let t=Object.keys(e.env).sort();return[`Profile ${e.name}`,`Persona: ${e.persona}`,`Env: ${t.join(`, `)||r}`,`Already loaded.`].join(`
2
+ `)}async function u(e,t){let{applyProfile:n}=await import(`../../adapters/matrixSwitcher.mjs`);return n(e,t)}function d(c,u=t()){let d,f,p,m,h=()=>d??=import(`../../adapters/config/harnessState.mjs`),g=()=>f??=import(`../../adapters/matrixSwitcher.mjs`),_=()=>p??=import(`./components/matrixPicker.mjs`),v=()=>m??=import(`@agimon-ai/doompi-config/profiles`);c.registerCommand(`profile`,{description:`Show profiles and load a different persona and environment`,handler:async(t,d)=>{let f=n(d).harness,[{requireHarnessRoot:p},{loadProfiles:m}]=await Promise.all([h(),v()]),y=p(f),b=f.profile,x;try{x=m(y)}catch(t){let n=t instanceof Error?t.message:String(t);u.recordError(e.profileLoadFailed,t),d.ui.notify(`Could not load ${o}: ${n}`,i);return}if(x.length===0){d.ui.notify(`No profiles found in ${o}.`,i);return}let S=`Profile (current: ${b??r})`,C=(d.mode===`tui`?await _().then(({MatrixPickerComponent:e})=>d.ui.custom((t,n,r,i)=>new e({title:S,items:s(x),selected:b?[b]:[],multi:!1},n,r,i))):[await d.ui.select(S,x.map(e=>e.name))])?.[0],w=x.find(e=>e.name===C);if(!w)return;if(w.name===b){d.ui.notify(l(w),a);return}let{applyProfile:T}=await g();d.ui.notify(await T(w,f),a);let{persistHarnessSelection:E}=await h();E(c,{...f,profile:w.name}),u.recordEvent(e.profileApplied,{"harness.profile":w.name,...b?{"harness.profile.previous":b}:{}}),await d.waitForIdle(),await d.reload()}})}export{u as applyProfile,d as default,c as profileDescription,s as profileItems,l as profileSummary};
3
+ //# sourceMappingURL=profile.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.mjs","names":[],"sources":["../../../src/extensions/entries/profile.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { AgentProfile } from '@agimon-ai/doompi-config/profiles';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport type { SelectItem } from '@earendil-works/pi-tui';\nimport type { DoomHarnessContext } from '../../adapters/config/harnessState.ts';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n type HarnessTelemetry,\n} from '../../adapters/telemetry/logSinkTelemetry.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 async function applyProfile(profile: AgentProfile, state: DoomHarnessContext): Promise<string> {\n const { applyProfile: apply } = await import('../../adapters/matrixSwitcher.ts');\n return apply(profile, state);\n}\n\nexport default function profileExtension(\n pi: ExtensionAPI,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): void {\n let harnessStatePromise: Promise<typeof import('../../adapters/config/harnessState.ts')> | undefined;\n let matrixSwitcherPromise: Promise<typeof import('../../adapters/matrixSwitcher.ts')> | undefined;\n let pickerPromise: Promise<typeof import('./components/matrixPicker.ts')> | undefined;\n let profilesPromise: Promise<typeof import('@agimon-ai/doompi-config/profiles')> | undefined;\n\n const loadHarnessState = () => (harnessStatePromise ??= import('../../adapters/config/harnessState.ts'));\n const loadMatrixSwitcher = () => (matrixSwitcherPromise ??= import('../../adapters/matrixSwitcher.ts'));\n const loadPicker = () => (pickerPromise ??= import('./components/matrixPicker.ts'));\n const loadProfiles = () => (profilesPromise ??= import('@agimon-ai/doompi-config/profiles'));\n\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 [{ requireHarnessRoot }, { loadProfiles: readProfiles }] = await Promise.all([\n loadHarnessState(),\n loadProfiles(),\n ]);\n const root = requireHarnessRoot(state);\n const current = state.profile;\n let profiles: AgentProfile[];\n try {\n profiles = readProfiles(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 loadPicker().then(({ MatrixPickerComponent }) =>\n 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 : [\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 const { applyProfile: apply } = await loadMatrixSwitcher();\n ctx.ui.notify(await apply(profile, state), INFO);\n const { persistHarnessSelection } = await loadHarnessState();\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":"wLAWA,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,CAId,eAAsB,EAAa,EAAuB,EAA4C,CACpG,GAAM,CAAE,aAAc,GAAU,MAAM,OAAO,qCAC7C,OAAO,EAAM,EAAS,EAAM,CAG9B,SAAwB,EACtB,EACA,EAA8B,GAAwB,CAChD,CACN,IAAI,EACA,EACA,EACA,EAEE,MAA0B,IAAwB,OAAO,0CACzD,MAA4B,IAA0B,OAAO,qCAC7D,MAAoB,IAAkB,OAAO,iCAC7C,MAAsB,IAAoB,OAAO,qCAEvD,EAAG,gBAAgB,UAAW,CAC5B,YAAa,6DACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,IAAM,EAAQ,EAAyB,EAAI,CAAC,QACtC,CAAC,CAAE,sBAAsB,CAAE,aAAc,IAAkB,MAAM,QAAQ,IAAI,CACjF,GAAkB,CAClB,GAAc,CACf,CAAC,CACI,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,GAqB7C,GAnBJ,EAAI,OAAS,MACT,MAAM,GAAY,CAAC,MAAM,CAAE,2BACzB,EAAI,GAAG,QACJ,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,CACF,CACD,CACE,MAAM,EAAI,GAAG,OACX,EACA,EAAS,IAAK,GAAY,EAAQ,KAAK,CACxC,CACF,IAEiB,GAClB,EAAU,EAAS,KAAM,GAAc,EAAU,OAAS,EAAO,CACvE,GAAI,CAAC,EAAS,OACd,GAAI,EAAQ,OAAS,EAAS,CAC5B,EAAI,GAAG,OAAO,EAAe,EAAQ,CAAE,EAAK,CAC5C,OAGF,GAAM,CAAE,aAAc,GAAU,MAAM,GAAoB,CAC1D,EAAI,GAAG,OAAO,MAAM,EAAM,EAAS,EAAM,CAAE,EAAK,CAChD,GAAM,CAAE,2BAA4B,MAAM,GAAkB,CAC5D,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,EAErB,CAAC"}
@@ -0,0 +1,9 @@
1
+ const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`../../services/tools/toolNames.cjs`),n=require(`../../adapters/telemetry/logSinkTelemetry.cjs`);let r=require(`node:fs`);r=e.__toESM(r,1);let i=require(`@agimon-ai/doompi-config/piContext`),a=require(`node:child_process`),o=require(`yaml`),s=require(`@agimon-ai/doompi-config/layeredConfig`);const c=`ESRCH`,l={sessionStart:`SessionStart`,preToolUse:`PreToolUse`,postToolUse:`PostToolUse`,stop:`Stop`,sessionEnd:`SessionEnd`};let u,d=[];const f=new Map;function p(e,t){let n=(0,i.requireDoomConfigContext)(e).harness;return{repoRoot:n.root??e.cwd,harness:n,telemetry:t,failures:[]}}function m(e,n,r,i){return{session_id:i,transcript_path:``,cwd:r,hook_event_name:n,tool_name:t.toClaudeToolName(e.toolName),tool_input:e.input,...e.type===`tool_result`?{tool_response:{success:!e.isError,content:e.content}}:{}}}async function h(e,t,r,i){let{repoRoot:o,telemetry:s}=r;return new Promise(r=>{let l=process.platform!==`win32`,u=(0,a.spawn)(`/bin/bash`,[`-c`,e.command],{cwd:o,env:{...process.env,CLAUDE_PROJECT_DIR:o,CODEX_REPO_ROOT:o,ORIGINAL_REPO_PATH:process.env.ORIGINAL_REPO_PATH??o,...i?{CLAUDE_PLUGIN_ROOT:i}:{}},stdio:[`pipe`,`pipe`,`pipe`],detached:l}),d=``,f=``,p=!1,m=!1,h=!1,g=null,_,v=e=>{try{if(l&&u.pid!==void 0){process.kill(-u.pid,e);return}u.kill(e)}catch(e){(e instanceof Error&&`code`in e?e.code:void 0)!==c&&process.emitWarning(`Could not signal repository hook process: ${String(e)}`)}},y=()=>{if(!l||u.pid===void 0)return!h;try{return process.kill(-u.pid,0),!0}catch(e){return(e instanceof Error&&`code`in e?e.code:void 0)!==c}},b=(e={})=>{p||(p=!0,clearTimeout(S),_&&clearTimeout(_),r(e))},x=()=>{let t=`Hook timed out after ${e.timeout??10} seconds.`;s?.recordWarning(n.HARNESS_EVENT.hookFailed,t,{"hook.reason":`timeout`,"hook.exit_code":g??-1}),process.stderr.write(`[pi-hook] advisory hook timed out: ${e.command}\n${f}`),b({failure:{command:e.command,message:t,reason:`timeout`}})},S=setTimeout(()=>{m=!0,v(`SIGTERM`),_=setTimeout(()=>{y()&&v(`SIGKILL`),x()},2e3)},(e.timeout??10)*1e3);u.stdout.on(`data`,e=>{d+=e.toString()}),u.stderr.on(`data`,e=>{f+=e.toString()}),u.once(`error`,t=>{m||(s?.recordError(n.HARNESS_EVENT.hookFailed,t,{"hook.reason":`spawn_failed`}),process.stderr.write(`[pi-hook] advisory hook failed: ${t.message}\n`),b({failure:{command:e.command,message:t.message,reason:`spawn_failed`}}))}),u.once(`exit`,t=>{if(h=!0,g=t,m)return;if(t!==0){let r=f.trim()||`Advisory hook exited with code ${t??`unknown`}`;s?.recordWarning(n.HARNESS_EVENT.hookFailed,r,{"hook.reason":`non_zero_exit`,"hook.exit_code":t??-1}),process.stderr.write(`[pi-hook] advisory hook failed (${t}): ${e.command}\n${f}`),b({failure:{command:e.command,message:r,reason:`non_zero_exit`}});return}let r=d.trim().split(/\r?\n/).reverse().find(e=>e.startsWith(`{`));if(!r){b();return}try{b({decision:JSON.parse(r)})}catch(t){s?.recordWarning(n.HARNESS_EVENT.hookFailed,t,{"hook.reason":`invalid_json`}),process.stderr.write(`[pi-hook] advisory hook returned invalid JSON: ${e.command}\n`),b({failure:{command:e.command,message:t instanceof Error?t.message:String(t),reason:`invalid_json`}})}}),u.stdin.end(JSON.stringify(t))})}function g(e){return e?.decision===`block`||e?.hookSpecificOutput?.permissionDecision===`deny`}function _(e){return e?.reason??e?.hookSpecificOutput?.reason}async function v(e){let t=await r.default.promises.readFile(e,`utf8`),n=f.get(e);if(n?.source===t)return n.config;let i=JSON.parse(t);return f.set(e,{source:t,config:i}),i}async function y(e,n,r){let i=[];for(let a of n.harness.pluginHooks){let o;try{o=await v(a.configPath)}catch(e){n.failures.push({command:a.configPath,message:e instanceof Error?e.message:String(e),reason:`plugin_config`});continue}for(let n of o.hooks?.[e]??[])if(!(r&&n.matcher&&!new RegExp(n.matcher).test(t.toClaudeToolName(r))))for(let e of n.hooks??[])i.push({hook:e,root:a.pluginRoot})}return i}function b(e){let t=e.map(e=>`${e.baseDirectory} ${e.text}`).join(` `);if(u===t)return d;let n=new Map,r=0;for(let t of e){let e=(0,o.parse)(t.text)??{};for(let[i,a]of Object.entries(e.groups??{})){let e=[];for(let n of a.hooks??[])r+=1,n.pi&&e.push({...n.pi,event:n.event,order:n.pi.order??0,position:r,groupId:i,core:a.core===!0,baseDirectory:t.baseDirectory});n.set(i,{entries:e})}}let i=[...n.values()].flatMap(e=>e.entries);return i.sort((e,t)=>e.order-t.order||e.position-t.position),u=t,d=i,i}async function x(e){let{repoRoot:t,harness:i,telemetry:a}=e,o=(0,s.doomConfigCandidates)(`hooks.yaml`,t),c=o.map(e=>e.filePath).join(` and `);try{let e=i.hookGroups,t=e===void 0?void 0:new Set(e);return b((await Promise.all(o.map(async e=>{try{return{baseDirectory:e.baseDirectory,text:await r.default.promises.readFile(e.filePath,`utf8`)}}catch(e){if(e.code===`ENOENT`)return;throw e}}))).filter(e=>e!==void 0)).filter(e=>e.core||!t||t.has(e.groupId))}catch(t){let r=t instanceof Error?t.message:String(t);return a?.recordError(n.HARNESS_EVENT.hookRegistryReadFailed,t,{"hook.registry.source":`repository`}),process.stderr.write(`[pi-hook] could not read ${c}: ${r}\n`),e.failures.push({command:c,message:r,reason:`registry_read`}),[]}}async function S(e,n,r){return(await x(n)).filter(t=>t.event===e).filter(e=>!(e.skipInSubagent&&process.env.PI_SUBAGENT_CHILD)).filter(e=>!r||!e.matcher||new RegExp(e.matcher).test(t.toClaudeToolName(r))).map(e=>({hook:{command:e.command,timeout:e.timeout},root:e.baseDirectory}))}async function C(e,t,n,r,i,a){let o=[];try{for(let[s,c]of e.entries())r.hasUI&&r.ui.setStatus(i,`${a} (${s+1}/${e.length})...`),o.push(await h(c.hook,t,n,c.root))}finally{r.hasUI&&r.ui.setStatus(i,void 0)}return o}async function w(e,t,n){let[r,i]=await Promise.all([S(e,t,n),y(e,t,n)]);return[...r.map(({hook:e,root:t})=>({hook:e,root:t})),...i.map(({hook:e,root:t})=>({hook:e,root:t}))]}function T(e){return e.flatMap(e=>e.decision?[e.decision]:[])}function E(e){return e.map(e=>e.hookSpecificOutput?.additionalContext).filter(e=>!!e)}function D(e,t){return[...e.failures,...t.flatMap(e=>e.failure?[e.failure]:[])]}function O(e){return[`One or more repository hooks did not complete, so their checks were not applied:`,...e.map(e=>`- ${e.command}: ${e.message}`),`Options:`,`- Inspect the hook command or configuration and rerun after correcting it.`,`- Continue only if the missed advisory check is acceptable.`,`- Ask the user before bypassing a hook that may enforce a guardrail.`].join(`
2
+ `)}function k(e,t){t.length!==0&&e.sendMessage({customType:`repository-hook-failure`,content:O(t),display:!0},{deliverAs:`steer`})}function A(e,t=n.createHarnessTelemetry()){e.on(`session_start`,async(n,r)=>{let i=p(r,t),a=r.sessionManager.getSessionId(),o={session_id:a,cwd:i.repoRoot},s=await C(await w(l.sessionStart,i),o,i,r,`repository-hooks:${a}:start`,`Running session-start hooks`);k(e,D(i,s));let c=E(T(s)).join(`
3
+
4
+ `);c&&e.sendMessage({customType:`repository-hook-context`,content:c,display:!0},{deliverAs:`steer`})}),e.on(`tool_call`,async(n,r)=>{let i=p(r,t),a=m(n,l.preToolUse,i.repoRoot,r.sessionManager.getSessionId()),o=await C(await w(l.preToolUse,i,n.toolName),a,i,r,`repository-hooks:${n.toolCallId}:pre`,`Running pre-tool hooks for ${n.toolName}`),s=T(o);k(e,D(i,o));let c=s.find(g);if(c)return{block:!0,reason:_(c)??`Blocked by repository hook`};let u=E(s).join(`
5
+
6
+ `);if(u)return{block:!0,reason:u}}),e.on(`tool_result`,async(e,n)=>{let r=p(n,t),i=m(e,l.postToolUse,r.repoRoot,n.sessionManager.getSessionId()),a=await C(await w(l.postToolUse,r,e.toolName),i,r,n,`repository-hooks:${e.toolCallId}:post`,`Running post-tool hooks for ${e.toolName}`),o=T(a),s=D(r,a),c=o.map(e=>e.hookSpecificOutput?.additionalContext??_(e)).filter(e=>!!e);if(s.length>0&&c.push(O(s)),c.length!==0)return{content:[...e.content,{type:`text`,text:c.join(`
7
+
8
+ `)}],isError:e.isError||o.some(g)}}),e.on(`agent_settled`,async(e,n)=>{let r=p(n,t),i=n.sessionManager.getSessionId(),a={session_id:i,cwd:r.repoRoot};await C(await w(l.stop,r),a,r,n,`repository-hooks:${i}:stop`,`Running stop hooks`)}),e.on(`session_shutdown`,async(e,n)=>{let r=p(n,t),i=n.sessionManager.getSessionId(),a={session_id:i,cwd:r.repoRoot};await C((await y(l.sessionEnd,r)).map(({hook:e,root:t})=>({hook:e,root:t})),a,r,n,`repository-hooks:${i}:end`,`Running session-end hooks`)})}exports.default=A;
9
+ //# sourceMappingURL=repositoryHooks.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryHooks.cjs","names":["toClaudeToolName","HARNESS_EVENT","fs","createHarnessTelemetry"],"sources":["../../../src/extensions/entries/repositoryHooks.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport { doomConfigCandidates } from '@agimon-ai/doompi-config/layeredConfig';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { DoomHarnessContext } from '@agimon-ai/doompi-config/types';\nimport type { ExtensionAPI, ExtensionContext, ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\nimport { parse as parseYaml } from 'yaml';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n type HarnessTelemetry,\n} from '../../adapters/telemetry/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 '../../services/tools/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 */\nasync function readPluginHookConfig(configPath: string): Promise<PluginHookConfig> {\n const source = await fs.promises.readFile(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\nasync function pluginHooks(\n eventName: string,\n runtime: HookRuntime,\n toolName?: string,\n): Promise<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 = await 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\nasync function registryRows(runtime: HookRuntime): Promise<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 /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 = (\n await Promise.all(\n candidates.map(async (candidate) => {\n try {\n return {\n baseDirectory: candidate.baseDirectory,\n text: await fs.promises.readFile(candidate.filePath, 'utf8'),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw error;\n }\n }),\n )\n ).filter((source): source is { baseDirectory: string; text: string } => source !== undefined);\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\nasync function registryHooks(\n eventName: string,\n runtime: HookRuntime,\n toolName?: string,\n): Promise<Array<{ hook: HookCommand; root: string }>> {\n return (\n (await 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\nasync function resolvedHooks(eventName: string, runtime: HookRuntime, toolName?: string): Promise<ResolvedHook[]> {\n const [registry, plugins] = await Promise.all([\n registryHooks(eventName, runtime, toolName),\n pluginHooks(eventName, runtime, toolName),\n ]);\n return [...registry.map(({ hook, root }) => ({ hook, root })), ...plugins.map(({ hook, root }) => ({ hook, root }))];\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 await 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 await 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 await 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 await 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 (await 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":"uWAiBA,MAIM,EAA0B,QAG1B,EAAa,CACjB,aAAc,eACd,WAAY,aACZ,YAAa,cACb,KAAM,OACN,WAAY,aACb,CA8CD,IAAI,EACA,EAAyC,EAAE,CAC/C,MAAM,EAAoB,IAAI,IAmC9B,SAAS,EAAY,EAAuB,EAA0C,CACpF,IAAM,GAAA,EAAA,EAAA,0BAAmC,EAAI,CAAC,QAC9C,MAAO,CAAE,SAAU,EAAQ,MAAQ,EAAI,IAAK,UAAS,YAAW,SAAU,EAAE,CAAE,CAGhF,SAAS,EACP,EACA,EACA,EACA,EACyB,CACzB,MAAO,CACL,WAAY,EACZ,gBAAiB,GACjB,IAAK,EACL,gBAAiB,EACjB,UAAWA,EAAAA,iBAAiB,EAAM,SAAS,CAC3C,WAAY,EAAM,MAClB,GAAI,EAAM,OAAS,cAAgB,CAAE,cAAe,CAAE,QAAS,CAAC,EAAM,QAAS,QAAS,EAAM,QAAS,CAAE,CAAG,EAAE,CAC/G,CAGH,eAAe,EACb,EACA,EACA,EACA,EACsB,CACtB,GAAM,CAAE,WAAU,aAAc,EAChC,OAAO,IAAI,QAAS,GAAY,CAC9B,IAAM,EAAkB,QAAQ,WAAa,QAKvC,GAAA,EAAA,EAAA,OAAc,YAAY,CAAC,KAAyB,EAAK,QAAQ,CAAE,CACvE,IAAK,EACL,IAAK,CACH,GAAG,QAAQ,IACX,mBAAoB,EACpB,gBAAiB,EACjB,mBAAoB,QAAQ,IAAI,oBAAsB,EACtD,GAAI,EAAa,CAAE,mBAAoB,EAAY,CAAG,EAAE,CACzD,CACD,MAAO,CAAC,OAAQ,OAAQ,OAAO,CAC/B,SAAU,EACX,CAAC,CACE,EAAS,GACT,EAAS,GACT,EAAU,GACV,EAAW,GACX,EAAc,GACd,EAAiC,KACjC,EAEE,EAAsB,GAAiC,CAC3D,GAAI,CACF,GAAI,GAAmB,EAAM,MAAQ,IAAA,GAAW,CAC9C,QAAQ,KAAK,CAAC,EAAM,IAAK,EAAO,CAChC,OAEF,EAAM,KAAK,EAAO,OACX,EAAO,EACD,aAAiB,OAAS,SAAU,EAAQ,EAAM,KAAO,IAAA,MACzD,GACX,QAAQ,YAAY,6CAA6C,OAAO,EAAM,GAAG,GAKjF,MAAqC,CACzC,GAAI,CAAC,GAAmB,EAAM,MAAQ,IAAA,GAAW,MAAO,CAAC,EACzD,GAAI,CAEF,OADA,QAAQ,KAAK,CAAC,EAAM,IAAK,EAAE,CACpB,SACA,EAAO,CAEd,OADa,aAAiB,OAAS,SAAU,EAAQ,EAAM,KAAO,IAAA,MACtD,IAId,GAAU,EAAuB,EAAE,GAAK,CACxC,IACJ,EAAU,GACV,aAAa,EAAM,CACf,GAAiB,aAAa,EAAgB,CAClD,EAAQ,EAAQ,GAGZ,MAA4B,CAChC,IAAM,EAAU,wBAAwB,EAAK,SAAW,GAAG,WACtD,GAAW,cAAcC,EAAAA,cAAc,WAAY,EAAS,CAC/D,cAAe,UACf,iBAAkB,GAAmB,GACtC,CAAC,CACF,QAAQ,OAAO,MAAM,sCAAsC,EAAK,QAAQ,IAAI,IAAS,CACrF,EAAO,CAAE,QAAS,CAAE,QAAS,EAAK,QAAS,UAAS,OAAQ,UAAW,CAAE,CAAC,EAGtE,EAAQ,eACN,CACJ,EAAW,GACX,EAAmB,UAAU,CAC7B,EAAkB,eAAiB,CAC7B,GAAqB,EAAE,EAAmB,UAAU,CACxD,GAAe,EACd,IAA0B,GAE9B,EAAK,SAAW,IAAM,IACxB,CACD,EAAM,OAAO,GAAG,OAAS,GAAkB,CACzC,GAAU,EAAM,UAAU,EAC1B,CACF,EAAM,OAAO,GAAG,OAAS,GAAkB,CACzC,GAAU,EAAM,UAAU,EAC1B,CACF,EAAM,KAAK,QAAU,GAAU,CACzB,IAGC,GAAW,YAAYA,EAAAA,cAAc,WAAY,EAAO,CAC3D,cAAe,eAChB,CAAC,CACF,QAAQ,OAAO,MAAM,mCAAmC,EAAM,QAAQ,IAAI,CAC1E,EAAO,CAAE,QAAS,CAAE,QAAS,EAAK,QAAS,QAAS,EAAM,QAAS,OAAQ,eAAgB,CAAE,CAAC,GAC9F,CACF,EAAM,KAAK,OAAS,GAAS,CAG3B,GAFA,EAAc,GACd,EAAkB,EACd,EAAU,OACd,GAAI,IAAS,EAAG,CACd,IAAM,EAAU,EAAO,MAAM,EAAI,kCAAkC,GAAQ,YACtE,GAAW,cAAcA,EAAAA,cAAc,WAAY,EAAS,CAC/D,cAAe,gBACf,iBAAkB,GAAQ,GAC3B,CAAC,CACF,QAAQ,OAAO,MAAM,mCAAmC,EAAK,KAAK,EAAK,QAAQ,IAAI,IAAS,CAC5F,EAAO,CAAE,QAAS,CAAE,QAAS,EAAK,QAAS,UAAS,OAAQ,gBAAiB,CAAE,CAAC,CAChF,OAEF,IAAM,EAAW,EACd,MAAM,CACN,MAAM,QAAQ,CACd,SAAS,CACT,KAAM,GAAS,EAAK,WAAW,IAAI,CAAC,CACvC,GAAI,CAAC,EAAU,CACb,GAAQ,CACR,OAEF,GAAI,CACF,EAAO,CAAE,SAAU,KAAK,MAAM,EAAS,CAAkB,CAAC,OACnD,EAAO,CAET,GAAW,cAAcA,EAAAA,cAAc,WAAY,EAAO,CAC7D,cAAe,eAChB,CAAC,CACF,QAAQ,OAAO,MAAM,kDAAkD,EAAK,QAAQ,IAAI,CACxF,EAAO,CACL,QAAS,CACP,QAAS,EAAK,QACd,QAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAC/D,OAAQ,eACT,CACF,CAAC,GAEJ,CACF,EAAM,MAAM,IAAI,KAAK,UAAU,EAAQ,CAAC,EACxC,CAGJ,SAAS,EAAS,EAA6C,CAC7D,OAAO,GAAU,WAAa,SAAW,GAAU,oBAAoB,qBAAuB,OAGhG,SAAS,EAAe,EAAwD,CAC9E,OAAO,GAAU,QAAU,GAAU,oBAAoB,OAU3D,eAAe,EAAqB,EAA+C,CACjF,IAAM,EAAS,MAAMC,EAAAA,QAAG,SAAS,SAAS,EAAY,OAAO,CACvD,EAAS,EAAkB,IAAI,EAAW,CAChD,GAAI,GAAQ,SAAW,EAAQ,OAAO,EAAO,OAC7C,IAAM,EAAS,KAAK,MAAM,EAAO,CAEjC,OADA,EAAkB,IAAI,EAAY,CAAE,SAAQ,SAAQ,CAAC,CAC9C,EAGT,eAAe,EACb,EACA,EACA,EACqD,CACrD,IAAM,EAAsD,EAAE,CAC9D,IAAK,IAAM,KAAU,EAAQ,QAAQ,YAAa,CAChD,IAAI,EACJ,GAAI,CACF,EAAS,MAAM,EAAqB,EAAO,WAAW,OAC/C,EAAO,CACd,EAAQ,SAAS,KAAK,CACpB,QAAS,EAAO,WAChB,QAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAC/D,OAAQ,gBACT,CAAC,CACF,SAEF,IAAK,IAAM,KAAS,EAAO,QAAQ,IAAc,EAAE,CAC7C,QAAY,EAAM,SAAW,CAAC,IAAI,OAAO,EAAM,QAAQ,CAAC,KAAKF,EAAAA,iBAAiB,EAAS,CAAC,EAC5F,IAAK,IAAM,KAAQ,EAAM,OAAS,EAAE,CAAE,EAAQ,KAAK,CAAE,OAAM,KAAM,EAAO,WAAY,CAAC,CAGzF,OAAO,EAST,SAAS,EAAc,EAAkF,CAGvG,IAAM,EAAW,EAAQ,IAAK,GAAW,GAAG,EAAO,cAAc,GAAG,EAAO,OAAO,CAAC,KAAK,IAAI,CAC5F,GAAI,IAAyB,EAAU,OAAO,EAE9C,IAAM,EAAS,IAAI,IACf,EAAW,EACf,IAAK,IAAM,KAAU,EAAS,CAC5B,IAAM,GAAA,EAAA,EAAA,OAAsB,EAAO,KAAK,EAAI,EAAE,CAC9C,IAAK,GAAM,CAAC,EAAS,KAAU,OAAO,QAAQ,EAAS,QAAU,EAAE,CAAC,CAAE,CACpE,IAAM,EAA2B,EAAE,CACnC,IAAK,IAAM,KAAQ,EAAM,OAAS,EAAE,CAGlC,GAAY,EACP,EAAK,IACV,EAAQ,KAAK,CACX,GAAG,EAAK,GACR,MAAO,EAAK,MACZ,MAAO,EAAK,GAAG,OAAS,EACxB,WACA,UACA,KAAM,EAAM,OAAS,GACrB,cAAe,EAAO,cACvB,CAAC,CAEJ,EAAO,IAAI,EAAS,CAAE,UAAS,CAAC,EAIpC,IAAM,EAAU,CAAC,GAAG,EAAO,QAAQ,CAAC,CAAC,QAAS,GAAU,EAAM,QAAQ,CAItE,OAHA,EAAQ,MAAM,EAAM,IAAU,EAAK,MAAQ,EAAM,OAAS,EAAK,SAAW,EAAM,SAAS,CACzF,EAAuB,EACvB,EAAwB,EACjB,EAGT,eAAe,EAAa,EAAgD,CAC1E,GAAM,CAAE,WAAU,UAAS,aAAc,EACnC,GAAA,EAAA,EAAA,sBAAkC,aAAY,EAAS,CAIvD,EAAe,EAAW,IAAK,GAAc,EAAU,SAAS,CAAC,KAAK,QAAQ,CACpF,GAAI,CAGF,IAAM,EAAW,EAAQ,WACnB,EAAU,IAAa,IAAA,GAAY,IAAA,GAAY,IAAI,IAAI,EAAS,CAgBtE,OAAO,GAdL,MAAM,QAAQ,IACZ,EAAW,IAAI,KAAO,IAAc,CAClC,GAAI,CACF,MAAO,CACL,cAAe,EAAU,cACzB,KAAM,MAAME,EAAAA,QAAG,SAAS,SAAS,EAAU,SAAU,OAAO,CAC7D,OACM,EAAO,CACd,GAAK,EAAgC,OAAS,SAAU,OACxD,MAAM,IAER,CACH,EACD,OAAQ,GAA8D,IAAW,IAAA,GACvD,CAAC,CAAC,OAAQ,GAAU,EAAM,MAAQ,CAAC,GAAW,EAAQ,IAAI,EAAM,QAAQ,CAAC,OAC9F,EAAO,CACd,IAAM,EAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAMrE,OAHK,GAAW,YAAYD,EAAAA,cAAc,uBAAwB,EAAO,CAAE,uBAAwB,aAAc,CAAC,CAClH,QAAQ,OAAO,MAAM,4BAA4B,EAAa,IAAI,EAAO,IAAI,CAC7E,EAAQ,SAAS,KAAK,CAAE,QAAS,EAAc,QAAS,EAAQ,OAAQ,gBAAiB,CAAC,CACnF,EAAE,EAIb,eAAe,EACb,EACA,EACA,EACqD,CACrD,OACG,MAAM,EAAa,EAAQ,EACzB,OAAQ,GAAQ,EAAI,QAAU,EAAU,CACxC,OAAQ,GAAQ,EAAE,EAAI,gBAAkB,QAAQ,IAAI,mBAAmB,CACvE,OAAQ,GAAQ,CAAC,GAAY,CAAC,EAAI,SAAW,IAAI,OAAO,EAAI,QAAQ,CAAC,KAAKD,EAAAA,iBAAiB,EAAS,CAAC,CAAC,CAGtG,IAAK,IAAS,CAAE,KAAM,CAAE,QAAS,EAAI,QAAS,QAAS,EAAI,QAAS,CAAE,KAAM,EAAI,cAAe,EAAE,CAIxG,eAAe,EACb,EACA,EACA,EACA,EACA,EACA,EACwB,CACxB,IAAM,EAA0B,EAAE,CAClC,GAAI,CACF,IAAK,GAAM,CAAC,EAAO,KAAa,EAAM,SAAS,CACzC,EAAI,OAAO,EAAI,GAAG,UAAU,EAAW,GAAG,EAAY,IAAI,EAAQ,EAAE,GAAG,EAAM,OAAO,MAAM,CAC9F,EAAS,KAAK,MAAM,EAAY,EAAS,KAAM,EAAS,EAAS,EAAS,KAAK,CAAC,QAE1E,CACJ,EAAI,OAAO,EAAI,GAAG,UAAU,EAAW,IAAA,GAAU,CAEvD,OAAO,EAGT,eAAe,EAAc,EAAmB,EAAsB,EAA4C,CAChH,GAAM,CAAC,EAAU,GAAW,MAAM,QAAQ,IAAI,CAC5C,EAAc,EAAW,EAAS,EAAS,CAC3C,EAAY,EAAW,EAAS,EAAS,CAC1C,CAAC,CACF,MAAO,CAAC,GAAG,EAAS,KAAK,CAAE,OAAM,WAAY,CAAE,OAAM,OAAM,EAAE,CAAE,GAAG,EAAQ,KAAK,CAAE,OAAM,WAAY,CAAE,OAAM,OAAM,EAAE,CAAC,CAGtH,SAAS,EAAc,EAAyC,CAC9D,OAAO,EAAS,QAAS,GAAa,EAAQ,SAAW,CAAC,EAAQ,SAAS,CAAG,EAAE,CAAE,CAGpF,SAAS,EAAuB,EAAqC,CACnE,OAAO,EACJ,IAAK,GAAa,EAAS,oBAAoB,kBAAkB,CACjE,OAAQ,GAA2B,EAAQ,EAAO,CAGvD,SAAS,EAAa,EAAsB,EAAwC,CAClF,MAAO,CAAC,GAAG,EAAQ,SAAU,GAAG,EAAS,QAAS,GAAa,EAAQ,QAAU,CAAC,EAAQ,QAAQ,CAAG,EAAE,CAAE,CAAC,CAG5G,SAAS,EAAmB,EAAiC,CAC3D,MAAO,CACL,mFACA,GAAG,EAAS,IAAK,GAAY,KAAK,EAAQ,QAAQ,IAAI,EAAQ,UAAU,CACxE,WACA,6EACA,8DACA,uEACD,CAAC,KAAK;EAAK,CAGd,SAAS,EAAkB,EAAkB,EAA+B,CACtE,EAAS,SAAW,GACxB,EAAG,YACD,CAAE,WAAY,0BAA2B,QAAS,EAAmB,EAAS,CAAE,QAAS,GAAM,CAC/F,CAAE,UAAW,QAAS,CACvB,CAGH,SAAwB,EACtB,EACA,EAAkCG,EAAAA,wBAAwB,CACpD,CACN,EAAG,GAAG,gBAAiB,MAAO,EAAQ,IAAQ,CAC5C,IAAM,EAAU,EAAY,EAAK,EAAc,CACzC,EAAY,EAAI,eAAe,cAAc,CAC7C,EAAU,CAAE,WAAY,EAAW,IAAK,EAAQ,SAAU,CAC1D,EAAW,MAAM,EACrB,MAAM,EAAc,EAAW,aAAc,EAAQ,CACrD,EACA,EACA,EACA,oBAAoB,EAAU,QAC9B,8BACD,CACD,EAAkB,EAAI,EAAa,EAAS,EAAS,CAAC,CACtD,IAAM,EAAU,EAAuB,EAAc,EAAS,CAAC,CAAC,KAAK;;EAAO,CACxE,GACF,EAAG,YACD,CAAE,WAAY,0BAA2B,QAAS,EAAS,QAAS,GAAM,CAC1E,CAAE,UAAW,QAAS,CACvB,EAEH,CAEF,EAAG,GAAG,YAAa,MAAO,EAAO,IAAQ,CACvC,IAAM,EAAU,EAAY,EAAK,EAAc,CACzC,EAAU,EAAY,EAAO,EAAW,WAAY,EAAQ,SAAU,EAAI,eAAe,cAAc,CAAC,CACxG,EAAW,MAAM,EACrB,MAAM,EAAc,EAAW,WAAY,EAAS,EAAM,SAAS,CACnE,EACA,EACA,EACA,oBAAoB,EAAM,WAAW,MACrC,8BAA8B,EAAM,WACrC,CACK,EAAY,EAAc,EAAS,CACzC,EAAkB,EAAI,EAAa,EAAS,EAAS,CAAC,CACtD,IAAM,EAAS,EAAU,KAAK,EAAS,CACvC,GAAI,EAAQ,MAAO,CAAE,MAAO,GAAM,OAAQ,EAAe,EAAO,EAAI,6BAA8B,CAClG,IAAM,EAAU,EAAuB,EAAU,CAAC,KAAK;;EAAO,CAC9D,GAAI,EAAS,MAAO,CAAE,MAAO,GAAM,OAAQ,EAAS,EAEpD,CAEF,EAAG,GAAG,cAAe,MAAO,EAAO,IAAQ,CACzC,IAAM,EAAU,EAAY,EAAK,EAAc,CACzC,EAAU,EAAY,EAAO,EAAW,YAAa,EAAQ,SAAU,EAAI,eAAe,cAAc,CAAC,CACzG,EAAW,MAAM,EACrB,MAAM,EAAc,EAAW,YAAa,EAAS,EAAM,SAAS,CACpE,EACA,EACA,EACA,oBAAoB,EAAM,WAAW,OACrC,+BAA+B,EAAM,WACtC,CACK,EAAY,EAAc,EAAS,CACnC,EAAW,EAAa,EAAS,EAAS,CAC1C,EAAW,EACd,IAAK,GAAa,EAAS,oBAAoB,mBAAqB,EAAe,EAAS,CAAC,CAC7F,OAAQ,GAA2B,EAAQ,EAAO,CACrD,GAAI,EAAS,OAAS,GAAG,EAAS,KAAK,EAAmB,EAAS,CAAC,CAChE,EAAS,SAAW,EACxB,MAAO,CACL,QAAS,CAAC,GAAG,EAAM,QAAS,CAAE,KAAM,OAAQ,KAAM,EAAS,KAAK;;EAAO,CAAE,CAAC,CAC1E,QAAS,EAAM,SAAW,EAAU,KAAK,EAAS,CACnD,EACD,CAEF,EAAG,GAAG,gBAAiB,MAAO,EAAQ,IAAQ,CAC5C,IAAM,EAAU,EAAY,EAAK,EAAc,CACzC,EAAY,EAAI,eAAe,cAAc,CAC7C,EAAU,CAAE,WAAY,EAAW,IAAK,EAAQ,SAAU,CAGhE,MAAM,EACJ,MAAM,EAAc,EAAW,KAAM,EAAQ,CAC7C,EACA,EACA,EACA,oBAAoB,EAAU,OAC9B,qBACD,EACD,CAEF,EAAG,GAAG,mBAAoB,MAAO,EAAQ,IAAQ,CAC/C,IAAM,EAAU,EAAY,EAAK,EAAc,CACzC,EAAY,EAAI,eAAe,cAAc,CAC7C,EAAU,CAAE,WAAY,EAAW,IAAK,EAAQ,SAAU,CAChE,MAAM,GACH,MAAM,EAAY,EAAW,WAAY,EAAQ,EAAE,KAAK,CAAE,OAAM,WAAY,CAAE,OAAM,OAAM,EAAE,CAC7F,EACA,EACA,EACA,oBAAoB,EAAU,MAC9B,4BACD,EACD"}
@@ -0,0 +1,8 @@
1
+ import { HarnessTelemetry } from "../../adapters/telemetry/logSinkTelemetry.cjs";
2
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
3
+
4
+ //#region src/extensions/entries/repositoryHooks.d.ts
5
+ declare function repositoryHooks(pi: ExtensionAPI, hookTelemetry?: HarnessTelemetry): void;
6
+ //#endregion
7
+ export { repositoryHooks };
8
+ //# sourceMappingURL=repositoryHooks.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryHooks.d.cts","names":[],"sources":["../../../src/extensions/entries/repositoryHooks.ts"],"mappings":";;;;iBA6ewB,eAAA,CACtB,EAAA,EAAI,YAAA,EACJ,aAAA,GAAe,gBAAA"}
@@ -0,0 +1,8 @@
1
+ import { HarnessTelemetry } from "../../adapters/telemetry/logSinkTelemetry.mjs";
2
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
3
+
4
+ //#region src/extensions/entries/repositoryHooks.d.ts
5
+ declare function repositoryHooks(pi: ExtensionAPI, hookTelemetry?: HarnessTelemetry): void;
6
+ //#endregion
7
+ export { repositoryHooks };
8
+ //# sourceMappingURL=repositoryHooks.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryHooks.d.mts","names":[],"sources":["../../../src/extensions/entries/repositoryHooks.ts"],"mappings":";;;;iBA6ewB,eAAA,CACtB,EAAA,EAAI,YAAA,EACJ,aAAA,GAAe,gBAAA"}
@@ -0,0 +1,9 @@
1
+ import{toClaudeToolName as e}from"../../services/tools/toolNames.mjs";import{HARNESS_EVENT as t,createHarnessTelemetry as n}from"../../adapters/telemetry/logSinkTelemetry.mjs";import r from"node:fs";import{requireDoomConfigContext as i}from"@agimon-ai/doompi-config/piContext";import{spawn as a}from"node:child_process";import{parse as o}from"yaml";import{doomConfigCandidates as s}from"@agimon-ai/doompi-config/layeredConfig";const c=`ESRCH`,l={sessionStart:`SessionStart`,preToolUse:`PreToolUse`,postToolUse:`PostToolUse`,stop:`Stop`,sessionEnd:`SessionEnd`};let u,d=[];const f=new Map;function p(e,t){let n=i(e).harness;return{repoRoot:n.root??e.cwd,harness:n,telemetry:t,failures:[]}}function m(t,n,r,i){return{session_id:i,transcript_path:``,cwd:r,hook_event_name:n,tool_name:e(t.toolName),tool_input:t.input,...t.type===`tool_result`?{tool_response:{success:!t.isError,content:t.content}}:{}}}async function h(e,n,r,i){let{repoRoot:o,telemetry:s}=r;return new Promise(r=>{let l=process.platform!==`win32`,u=a(`/bin/bash`,[`-c`,e.command],{cwd:o,env:{...process.env,CLAUDE_PROJECT_DIR:o,CODEX_REPO_ROOT:o,ORIGINAL_REPO_PATH:process.env.ORIGINAL_REPO_PATH??o,...i?{CLAUDE_PLUGIN_ROOT:i}:{}},stdio:[`pipe`,`pipe`,`pipe`],detached:l}),d=``,f=``,p=!1,m=!1,h=!1,g=null,_,v=e=>{try{if(l&&u.pid!==void 0){process.kill(-u.pid,e);return}u.kill(e)}catch(e){(e instanceof Error&&`code`in e?e.code:void 0)!==c&&process.emitWarning(`Could not signal repository hook process: ${String(e)}`)}},y=()=>{if(!l||u.pid===void 0)return!h;try{return process.kill(-u.pid,0),!0}catch(e){return(e instanceof Error&&`code`in e?e.code:void 0)!==c}},b=(e={})=>{p||(p=!0,clearTimeout(S),_&&clearTimeout(_),r(e))},x=()=>{let n=`Hook timed out after ${e.timeout??10} seconds.`;s?.recordWarning(t.hookFailed,n,{"hook.reason":`timeout`,"hook.exit_code":g??-1}),process.stderr.write(`[pi-hook] advisory hook timed out: ${e.command}\n${f}`),b({failure:{command:e.command,message:n,reason:`timeout`}})},S=setTimeout(()=>{m=!0,v(`SIGTERM`),_=setTimeout(()=>{y()&&v(`SIGKILL`),x()},2e3)},(e.timeout??10)*1e3);u.stdout.on(`data`,e=>{d+=e.toString()}),u.stderr.on(`data`,e=>{f+=e.toString()}),u.once(`error`,n=>{m||(s?.recordError(t.hookFailed,n,{"hook.reason":`spawn_failed`}),process.stderr.write(`[pi-hook] advisory hook failed: ${n.message}\n`),b({failure:{command:e.command,message:n.message,reason:`spawn_failed`}}))}),u.once(`exit`,n=>{if(h=!0,g=n,m)return;if(n!==0){let r=f.trim()||`Advisory hook exited with code ${n??`unknown`}`;s?.recordWarning(t.hookFailed,r,{"hook.reason":`non_zero_exit`,"hook.exit_code":n??-1}),process.stderr.write(`[pi-hook] advisory hook failed (${n}): ${e.command}\n${f}`),b({failure:{command:e.command,message:r,reason:`non_zero_exit`}});return}let r=d.trim().split(/\r?\n/).reverse().find(e=>e.startsWith(`{`));if(!r){b();return}try{b({decision:JSON.parse(r)})}catch(n){s?.recordWarning(t.hookFailed,n,{"hook.reason":`invalid_json`}),process.stderr.write(`[pi-hook] advisory hook returned invalid JSON: ${e.command}\n`),b({failure:{command:e.command,message:n instanceof Error?n.message:String(n),reason:`invalid_json`}})}}),u.stdin.end(JSON.stringify(n))})}function g(e){return e?.decision===`block`||e?.hookSpecificOutput?.permissionDecision===`deny`}function _(e){return e?.reason??e?.hookSpecificOutput?.reason}async function v(e){let t=await r.promises.readFile(e,`utf8`),n=f.get(e);if(n?.source===t)return n.config;let i=JSON.parse(t);return f.set(e,{source:t,config:i}),i}async function y(t,n,r){let i=[];for(let a of n.harness.pluginHooks){let o;try{o=await v(a.configPath)}catch(e){n.failures.push({command:a.configPath,message:e instanceof Error?e.message:String(e),reason:`plugin_config`});continue}for(let n of o.hooks?.[t]??[])if(!(r&&n.matcher&&!new RegExp(n.matcher).test(e(r))))for(let e of n.hooks??[])i.push({hook:e,root:a.pluginRoot})}return i}function b(e){let t=e.map(e=>`${e.baseDirectory} ${e.text}`).join(` `);if(u===t)return d;let n=new Map,r=0;for(let t of e){let e=o(t.text)??{};for(let[i,a]of Object.entries(e.groups??{})){let e=[];for(let n of a.hooks??[])r+=1,n.pi&&e.push({...n.pi,event:n.event,order:n.pi.order??0,position:r,groupId:i,core:a.core===!0,baseDirectory:t.baseDirectory});n.set(i,{entries:e})}}let i=[...n.values()].flatMap(e=>e.entries);return i.sort((e,t)=>e.order-t.order||e.position-t.position),u=t,d=i,i}async function x(e){let{repoRoot:n,harness:i,telemetry:a}=e,o=s(`hooks.yaml`,n),c=o.map(e=>e.filePath).join(` and `);try{let e=i.hookGroups,t=e===void 0?void 0:new Set(e);return b((await Promise.all(o.map(async e=>{try{return{baseDirectory:e.baseDirectory,text:await r.promises.readFile(e.filePath,`utf8`)}}catch(e){if(e.code===`ENOENT`)return;throw e}}))).filter(e=>e!==void 0)).filter(e=>e.core||!t||t.has(e.groupId))}catch(n){let r=n instanceof Error?n.message:String(n);return a?.recordError(t.hookRegistryReadFailed,n,{"hook.registry.source":`repository`}),process.stderr.write(`[pi-hook] could not read ${c}: ${r}\n`),e.failures.push({command:c,message:r,reason:`registry_read`}),[]}}async function S(t,n,r){return(await x(n)).filter(e=>e.event===t).filter(e=>!(e.skipInSubagent&&process.env.PI_SUBAGENT_CHILD)).filter(t=>!r||!t.matcher||new RegExp(t.matcher).test(e(r))).map(e=>({hook:{command:e.command,timeout:e.timeout},root:e.baseDirectory}))}async function C(e,t,n,r,i,a){let o=[];try{for(let[s,c]of e.entries())r.hasUI&&r.ui.setStatus(i,`${a} (${s+1}/${e.length})...`),o.push(await h(c.hook,t,n,c.root))}finally{r.hasUI&&r.ui.setStatus(i,void 0)}return o}async function w(e,t,n){let[r,i]=await Promise.all([S(e,t,n),y(e,t,n)]);return[...r.map(({hook:e,root:t})=>({hook:e,root:t})),...i.map(({hook:e,root:t})=>({hook:e,root:t}))]}function T(e){return e.flatMap(e=>e.decision?[e.decision]:[])}function E(e){return e.map(e=>e.hookSpecificOutput?.additionalContext).filter(e=>!!e)}function D(e,t){return[...e.failures,...t.flatMap(e=>e.failure?[e.failure]:[])]}function O(e){return[`One or more repository hooks did not complete, so their checks were not applied:`,...e.map(e=>`- ${e.command}: ${e.message}`),`Options:`,`- Inspect the hook command or configuration and rerun after correcting it.`,`- Continue only if the missed advisory check is acceptable.`,`- Ask the user before bypassing a hook that may enforce a guardrail.`].join(`
2
+ `)}function k(e,t){t.length!==0&&e.sendMessage({customType:`repository-hook-failure`,content:O(t),display:!0},{deliverAs:`steer`})}function A(e,t=n()){e.on(`session_start`,async(n,r)=>{let i=p(r,t),a=r.sessionManager.getSessionId(),o={session_id:a,cwd:i.repoRoot},s=await C(await w(l.sessionStart,i),o,i,r,`repository-hooks:${a}:start`,`Running session-start hooks`);k(e,D(i,s));let c=E(T(s)).join(`
3
+
4
+ `);c&&e.sendMessage({customType:`repository-hook-context`,content:c,display:!0},{deliverAs:`steer`})}),e.on(`tool_call`,async(n,r)=>{let i=p(r,t),a=m(n,l.preToolUse,i.repoRoot,r.sessionManager.getSessionId()),o=await C(await w(l.preToolUse,i,n.toolName),a,i,r,`repository-hooks:${n.toolCallId}:pre`,`Running pre-tool hooks for ${n.toolName}`),s=T(o);k(e,D(i,o));let c=s.find(g);if(c)return{block:!0,reason:_(c)??`Blocked by repository hook`};let u=E(s).join(`
5
+
6
+ `);if(u)return{block:!0,reason:u}}),e.on(`tool_result`,async(e,n)=>{let r=p(n,t),i=m(e,l.postToolUse,r.repoRoot,n.sessionManager.getSessionId()),a=await C(await w(l.postToolUse,r,e.toolName),i,r,n,`repository-hooks:${e.toolCallId}:post`,`Running post-tool hooks for ${e.toolName}`),o=T(a),s=D(r,a),c=o.map(e=>e.hookSpecificOutput?.additionalContext??_(e)).filter(e=>!!e);if(s.length>0&&c.push(O(s)),c.length!==0)return{content:[...e.content,{type:`text`,text:c.join(`
7
+
8
+ `)}],isError:e.isError||o.some(g)}}),e.on(`agent_settled`,async(e,n)=>{let r=p(n,t),i=n.sessionManager.getSessionId(),a={session_id:i,cwd:r.repoRoot};await C(await w(l.stop,r),a,r,n,`repository-hooks:${i}:stop`,`Running stop hooks`)}),e.on(`session_shutdown`,async(e,n)=>{let r=p(n,t),i=n.sessionManager.getSessionId(),a={session_id:i,cwd:r.repoRoot};await C((await y(l.sessionEnd,r)).map(({hook:e,root:t})=>({hook:e,root:t})),a,r,n,`repository-hooks:${i}:end`,`Running session-end hooks`)})}export{A as default};
9
+ //# sourceMappingURL=repositoryHooks.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryHooks.mjs","names":["parseYaml"],"sources":["../../../src/extensions/entries/repositoryHooks.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport { doomConfigCandidates } from '@agimon-ai/doompi-config/layeredConfig';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { DoomHarnessContext } from '@agimon-ai/doompi-config/types';\nimport type { ExtensionAPI, ExtensionContext, ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\nimport { parse as parseYaml } from 'yaml';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n type HarnessTelemetry,\n} from '../../adapters/telemetry/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 '../../services/tools/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 */\nasync function readPluginHookConfig(configPath: string): Promise<PluginHookConfig> {\n const source = await fs.promises.readFile(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\nasync function pluginHooks(\n eventName: string,\n runtime: HookRuntime,\n toolName?: string,\n): Promise<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 = await 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\nasync function registryRows(runtime: HookRuntime): Promise<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 /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 = (\n await Promise.all(\n candidates.map(async (candidate) => {\n try {\n return {\n baseDirectory: candidate.baseDirectory,\n text: await fs.promises.readFile(candidate.filePath, 'utf8'),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw error;\n }\n }),\n )\n ).filter((source): source is { baseDirectory: string; text: string } => source !== undefined);\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\nasync function registryHooks(\n eventName: string,\n runtime: HookRuntime,\n toolName?: string,\n): Promise<Array<{ hook: HookCommand; root: string }>> {\n return (\n (await 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\nasync function resolvedHooks(eventName: string, runtime: HookRuntime, toolName?: string): Promise<ResolvedHook[]> {\n const [registry, plugins] = await Promise.all([\n registryHooks(eventName, runtime, toolName),\n pluginHooks(eventName, runtime, toolName),\n ]);\n return [...registry.map(({ hook, root }) => ({ hook, root })), ...plugins.map(({ hook, root }) => ({ hook, root }))];\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 await 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 await 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 await 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 await 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 (await 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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"}
@@ -0,0 +1,27 @@
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);let e=require(`node:worker_threads`);const t=[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`];function n(){let e=0,n,r=()=>{n&&clearInterval(n),n=void 0,e=0};return{set(e,t){r(),t(e)},start(i,a){r();let o=()=>{a(`${t[e%t.length]} ${i}`),e+=1};o(),n=setInterval(o,80)},stop(e,t){r(),t(e)},dispose(e,t){r(),t(e)}}}function r(){let r=n(),i,a,o,s=()=>{o=void 0,!(!i||!a)&&r[i.action](i.title,a)};try{let n=new e.Worker(`
2
+ const { writeSync } = require('node:fs');
3
+ const { parentPort, workerData } = require('node:worker_threads');
4
+ let frameIndex = 0;
5
+ let timer;
6
+ const writeTitle = (title) => writeSync(1, '\\u001b]0;' + title + '\\u0007');
7
+ const stop = () => {
8
+ if (timer) clearInterval(timer);
9
+ timer = undefined;
10
+ frameIndex = 0;
11
+ };
12
+ parentPort.on('message', (command) => {
13
+ stop();
14
+ if (command.action === 'start') {
15
+ const render = () => {
16
+ writeTitle(workerData.frames[frameIndex % workerData.frames.length] + ' ' + command.title);
17
+ frameIndex += 1;
18
+ };
19
+ render();
20
+ timer = setInterval(render, workerData.intervalMs);
21
+ return;
22
+ }
23
+ writeTitle(command.title);
24
+ if (command.action === 'dispose') parentPort.close();
25
+ });
26
+ `,{eval:!0,workerData:{frames:t,intervalMs:80}});n.unref(),n.once(`error`,s),n.once(`exit`,e=>{e!==0&&o===n&&s()}),o=n}catch{o=void 0}let c=(e,t)=>{if(i=e,a=t,!o){r[e.action](e.title,t);return}try{o.postMessage(e)}catch{s()}};return{set:(e,t)=>c({action:`set`,title:e},t),start:(e,t)=>c({action:`start`,title:e},t),stop:(e,t)=>c({action:`stop`,title:e},t),dispose:(e,t)=>c({action:`dispose`,title:e},t)}}exports.createWorkerTitleController=r;
27
+ //# sourceMappingURL=shellTitleController.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellTitleController.cjs","names":["Worker"],"sources":["../../../src/extensions/entries/shellTitleController.ts"],"sourcesContent":["import { Worker } from 'node:worker_threads';\n\nconst BRAILLE_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\nconst TITLE_FRAME_INTERVAL_MS = 80;\nconst TITLE_WORKER_SOURCE = `\nconst { writeSync } = require('node:fs');\nconst { parentPort, workerData } = require('node:worker_threads');\nlet frameIndex = 0;\nlet timer;\nconst writeTitle = (title) => writeSync(1, '\\\\u001b]0;' + title + '\\\\u0007');\nconst stop = () => {\n if (timer) clearInterval(timer);\n timer = undefined;\n frameIndex = 0;\n};\nparentPort.on('message', (command) => {\n stop();\n if (command.action === 'start') {\n const render = () => {\n writeTitle(workerData.frames[frameIndex % workerData.frames.length] + ' ' + command.title);\n frameIndex += 1;\n };\n render();\n timer = setInterval(render, workerData.intervalMs);\n return;\n }\n writeTitle(command.title);\n if (command.action === 'dispose') parentPort.close();\n});\n`;\n\ntype WriteTitle = (title: string) => void;\ntype TitleCommand = { action: 'dispose' | 'set' | 'start' | 'stop'; title: string };\n\nexport interface ShellTitleController {\n set(title: string, write: WriteTitle): void;\n start(title: string, write: WriteTitle): void;\n stop(title: string, write: WriteTitle): void;\n dispose(title: string, write: WriteTitle): void;\n}\n\nexport function createMainThreadTitleController(): ShellTitleController {\n let frameIndex = 0;\n let timer: ReturnType<typeof setInterval> | undefined;\n const stopAnimation = () => {\n if (timer) clearInterval(timer);\n timer = undefined;\n frameIndex = 0;\n };\n\n return {\n set(title, write) {\n stopAnimation();\n write(title);\n },\n start(title, write) {\n stopAnimation();\n const render = () => {\n write(`${BRAILLE_FRAMES[frameIndex % BRAILLE_FRAMES.length]} ${title}`);\n frameIndex += 1;\n };\n render();\n timer = setInterval(render, TITLE_FRAME_INTERVAL_MS);\n },\n stop(title, write) {\n stopAnimation();\n write(title);\n },\n dispose(title, write) {\n stopAnimation();\n write(title);\n },\n };\n}\n\nexport function createWorkerTitleController(): ShellTitleController {\n const fallback = createMainThreadTitleController();\n let lastCommand: TitleCommand | undefined;\n let lastWrite: WriteTitle | undefined;\n let worker: Worker | undefined;\n\n const fallBack = () => {\n worker = undefined;\n if (!lastCommand || !lastWrite) return;\n fallback[lastCommand.action](lastCommand.title, lastWrite);\n };\n\n try {\n const titleWorker = new Worker(TITLE_WORKER_SOURCE, {\n eval: true,\n workerData: { frames: BRAILLE_FRAMES, intervalMs: TITLE_FRAME_INTERVAL_MS },\n });\n titleWorker.unref();\n titleWorker.once('error', fallBack);\n titleWorker.once('exit', (code) => {\n if (code !== 0 && worker === titleWorker) fallBack();\n });\n worker = titleWorker;\n } catch {\n worker = undefined;\n }\n\n const dispatch = (command: TitleCommand, write: WriteTitle) => {\n lastCommand = command;\n lastWrite = write;\n if (!worker) {\n fallback[command.action](command.title, write);\n return;\n }\n try {\n worker.postMessage(command);\n } catch {\n fallBack();\n }\n };\n\n return {\n set: (title, write) => dispatch({ action: 'set', title }, write),\n start: (title, write) => dispatch({ action: 'start', title }, write),\n stop: (title, write) => dispatch({ action: 'stop', title }, write),\n dispose: (title, write) => dispatch({ action: 'dispose', title }, write),\n };\n}\n"],"mappings":"qFAEA,MAAM,EAAiB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAI,CAuCzE,SAAgB,GAAwD,CACtE,IAAI,EAAa,EACb,EACE,MAAsB,CACtB,GAAO,cAAc,EAAM,CAC/B,EAAQ,IAAA,GACR,EAAa,GAGf,MAAO,CACL,IAAI,EAAO,EAAO,CAChB,GAAe,CACf,EAAM,EAAM,EAEd,MAAM,EAAO,EAAO,CAClB,GAAe,CACf,IAAM,MAAe,CACnB,EAAM,GAAG,EAAe,EAAa,EAAe,QAAQ,GAAG,IAAQ,CACvE,GAAc,GAEhB,GAAQ,CACR,EAAQ,YAAY,EAAQ,GAAwB,EAEtD,KAAK,EAAO,EAAO,CACjB,GAAe,CACf,EAAM,EAAM,EAEd,QAAQ,EAAO,EAAO,CACpB,GAAe,CACf,EAAM,EAAM,EAEf,CAGH,SAAgB,GAAoD,CAClE,IAAM,EAAW,GAAiC,CAC9C,EACA,EACA,EAEE,MAAiB,CACrB,EAAS,IAAA,GACL,GAAC,GAAe,CAAC,IACrB,EAAS,EAAY,QAAQ,EAAY,MAAO,EAAU,EAG5D,GAAI,CACF,IAAM,EAAc,IAAIA,EAAAA,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;EAAqB,CAClD,KAAM,GACN,WAAY,CAAE,OAAQ,EAAgB,WAAY,GAAyB,CAC5E,CAAC,CACF,EAAY,OAAO,CACnB,EAAY,KAAK,QAAS,EAAS,CACnC,EAAY,KAAK,OAAS,GAAS,CAC7B,IAAS,GAAK,IAAW,GAAa,GAAU,EACpD,CACF,EAAS,OACH,CACN,EAAS,IAAA,GAGX,IAAM,GAAY,EAAuB,IAAsB,CAG7D,GAFA,EAAc,EACd,EAAY,EACR,CAAC,EAAQ,CACX,EAAS,EAAQ,QAAQ,EAAQ,MAAO,EAAM,CAC9C,OAEF,GAAI,CACF,EAAO,YAAY,EAAQ,MACrB,CACN,GAAU,GAId,MAAO,CACL,KAAM,EAAO,IAAU,EAAS,CAAE,OAAQ,MAAO,QAAO,CAAE,EAAM,CAChE,OAAQ,EAAO,IAAU,EAAS,CAAE,OAAQ,QAAS,QAAO,CAAE,EAAM,CACpE,MAAO,EAAO,IAAU,EAAS,CAAE,OAAQ,OAAQ,QAAO,CAAE,EAAM,CAClE,SAAU,EAAO,IAAU,EAAS,CAAE,OAAQ,UAAW,QAAO,CAAE,EAAM,CACzE"}
@@ -0,0 +1,11 @@
1
+ //#region src/extensions/entries/shellTitleController.d.ts
2
+ type WriteTitle = (title: string) => void;
3
+ interface ShellTitleController {
4
+ set(title: string, write: WriteTitle): void;
5
+ start(title: string, write: WriteTitle): void;
6
+ stop(title: string, write: WriteTitle): void;
7
+ dispose(title: string, write: WriteTitle): void;
8
+ }
9
+ //#endregion
10
+ export { ShellTitleController };
11
+ //# sourceMappingURL=shellTitleController.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellTitleController.d.cts","names":[],"sources":["../../../src/extensions/entries/shellTitleController.ts"],"mappings":";KA+BK,UAAA,IAAc,KAAA;AAAA,UAGF,oBAAA;EACf,GAAA,CAAI,KAAA,UAAe,KAAA,EAAO,UAAA;EAC1B,KAAA,CAAM,KAAA,UAAe,KAAA,EAAO,UAAA;EAC5B,IAAA,CAAK,KAAA,UAAe,KAAA,EAAO,UAAA;EAC3B,OAAA,CAAQ,KAAA,UAAe,KAAA,EAAO,UAAA;AAAA"}
@@ -0,0 +1,11 @@
1
+ //#region src/extensions/entries/shellTitleController.d.ts
2
+ type WriteTitle = (title: string) => void;
3
+ interface ShellTitleController {
4
+ set(title: string, write: WriteTitle): void;
5
+ start(title: string, write: WriteTitle): void;
6
+ stop(title: string, write: WriteTitle): void;
7
+ dispose(title: string, write: WriteTitle): void;
8
+ }
9
+ //#endregion
10
+ export { ShellTitleController };
11
+ //# sourceMappingURL=shellTitleController.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellTitleController.d.mts","names":[],"sources":["../../../src/extensions/entries/shellTitleController.ts"],"mappings":";KA+BK,UAAA,IAAc,KAAA;AAAA,UAGF,oBAAA;EACf,GAAA,CAAI,KAAA,UAAe,KAAA,EAAO,UAAA;EAC1B,KAAA,CAAM,KAAA,UAAe,KAAA,EAAO,UAAA;EAC5B,IAAA,CAAK,KAAA,UAAe,KAAA,EAAO,UAAA;EAC3B,OAAA,CAAQ,KAAA,UAAe,KAAA,EAAO,UAAA;AAAA"}
@@ -0,0 +1,27 @@
1
+ import{Worker as e}from"node:worker_threads";const t=[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`];function n(){let e=0,n,r=()=>{n&&clearInterval(n),n=void 0,e=0};return{set(e,t){r(),t(e)},start(i,a){r();let o=()=>{a(`${t[e%t.length]} ${i}`),e+=1};o(),n=setInterval(o,80)},stop(e,t){r(),t(e)},dispose(e,t){r(),t(e)}}}function r(){let r=n(),i,a,o,s=()=>{o=void 0,!(!i||!a)&&r[i.action](i.title,a)};try{let n=new e(`
2
+ const { writeSync } = require('node:fs');
3
+ const { parentPort, workerData } = require('node:worker_threads');
4
+ let frameIndex = 0;
5
+ let timer;
6
+ const writeTitle = (title) => writeSync(1, '\\u001b]0;' + title + '\\u0007');
7
+ const stop = () => {
8
+ if (timer) clearInterval(timer);
9
+ timer = undefined;
10
+ frameIndex = 0;
11
+ };
12
+ parentPort.on('message', (command) => {
13
+ stop();
14
+ if (command.action === 'start') {
15
+ const render = () => {
16
+ writeTitle(workerData.frames[frameIndex % workerData.frames.length] + ' ' + command.title);
17
+ frameIndex += 1;
18
+ };
19
+ render();
20
+ timer = setInterval(render, workerData.intervalMs);
21
+ return;
22
+ }
23
+ writeTitle(command.title);
24
+ if (command.action === 'dispose') parentPort.close();
25
+ });
26
+ `,{eval:!0,workerData:{frames:t,intervalMs:80}});n.unref(),n.once(`error`,s),n.once(`exit`,e=>{e!==0&&o===n&&s()}),o=n}catch{o=void 0}let c=(e,t)=>{if(i=e,a=t,!o){r[e.action](e.title,t);return}try{o.postMessage(e)}catch{s()}};return{set:(e,t)=>c({action:`set`,title:e},t),start:(e,t)=>c({action:`start`,title:e},t),stop:(e,t)=>c({action:`stop`,title:e},t),dispose:(e,t)=>c({action:`dispose`,title:e},t)}}export{r as createWorkerTitleController};
27
+ //# sourceMappingURL=shellTitleController.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellTitleController.mjs","names":[],"sources":["../../../src/extensions/entries/shellTitleController.ts"],"sourcesContent":["import { Worker } from 'node:worker_threads';\n\nconst BRAILLE_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\nconst TITLE_FRAME_INTERVAL_MS = 80;\nconst TITLE_WORKER_SOURCE = `\nconst { writeSync } = require('node:fs');\nconst { parentPort, workerData } = require('node:worker_threads');\nlet frameIndex = 0;\nlet timer;\nconst writeTitle = (title) => writeSync(1, '\\\\u001b]0;' + title + '\\\\u0007');\nconst stop = () => {\n if (timer) clearInterval(timer);\n timer = undefined;\n frameIndex = 0;\n};\nparentPort.on('message', (command) => {\n stop();\n if (command.action === 'start') {\n const render = () => {\n writeTitle(workerData.frames[frameIndex % workerData.frames.length] + ' ' + command.title);\n frameIndex += 1;\n };\n render();\n timer = setInterval(render, workerData.intervalMs);\n return;\n }\n writeTitle(command.title);\n if (command.action === 'dispose') parentPort.close();\n});\n`;\n\ntype WriteTitle = (title: string) => void;\ntype TitleCommand = { action: 'dispose' | 'set' | 'start' | 'stop'; title: string };\n\nexport interface ShellTitleController {\n set(title: string, write: WriteTitle): void;\n start(title: string, write: WriteTitle): void;\n stop(title: string, write: WriteTitle): void;\n dispose(title: string, write: WriteTitle): void;\n}\n\nexport function createMainThreadTitleController(): ShellTitleController {\n let frameIndex = 0;\n let timer: ReturnType<typeof setInterval> | undefined;\n const stopAnimation = () => {\n if (timer) clearInterval(timer);\n timer = undefined;\n frameIndex = 0;\n };\n\n return {\n set(title, write) {\n stopAnimation();\n write(title);\n },\n start(title, write) {\n stopAnimation();\n const render = () => {\n write(`${BRAILLE_FRAMES[frameIndex % BRAILLE_FRAMES.length]} ${title}`);\n frameIndex += 1;\n };\n render();\n timer = setInterval(render, TITLE_FRAME_INTERVAL_MS);\n },\n stop(title, write) {\n stopAnimation();\n write(title);\n },\n dispose(title, write) {\n stopAnimation();\n write(title);\n },\n };\n}\n\nexport function createWorkerTitleController(): ShellTitleController {\n const fallback = createMainThreadTitleController();\n let lastCommand: TitleCommand | undefined;\n let lastWrite: WriteTitle | undefined;\n let worker: Worker | undefined;\n\n const fallBack = () => {\n worker = undefined;\n if (!lastCommand || !lastWrite) return;\n fallback[lastCommand.action](lastCommand.title, lastWrite);\n };\n\n try {\n const titleWorker = new Worker(TITLE_WORKER_SOURCE, {\n eval: true,\n workerData: { frames: BRAILLE_FRAMES, intervalMs: TITLE_FRAME_INTERVAL_MS },\n });\n titleWorker.unref();\n titleWorker.once('error', fallBack);\n titleWorker.once('exit', (code) => {\n if (code !== 0 && worker === titleWorker) fallBack();\n });\n worker = titleWorker;\n } catch {\n worker = undefined;\n }\n\n const dispatch = (command: TitleCommand, write: WriteTitle) => {\n lastCommand = command;\n lastWrite = write;\n if (!worker) {\n fallback[command.action](command.title, write);\n return;\n }\n try {\n worker.postMessage(command);\n } catch {\n fallBack();\n }\n };\n\n return {\n set: (title, write) => dispatch({ action: 'set', title }, write),\n start: (title, write) => dispatch({ action: 'start', title }, write),\n stop: (title, write) => dispatch({ action: 'stop', title }, write),\n dispose: (title, write) => dispatch({ action: 'dispose', title }, write),\n };\n}\n"],"mappings":"6CAEA,MAAM,EAAiB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAI,CAuCzE,SAAgB,GAAwD,CACtE,IAAI,EAAa,EACb,EACE,MAAsB,CACtB,GAAO,cAAc,EAAM,CAC/B,EAAQ,IAAA,GACR,EAAa,GAGf,MAAO,CACL,IAAI,EAAO,EAAO,CAChB,GAAe,CACf,EAAM,EAAM,EAEd,MAAM,EAAO,EAAO,CAClB,GAAe,CACf,IAAM,MAAe,CACnB,EAAM,GAAG,EAAe,EAAa,EAAe,QAAQ,GAAG,IAAQ,CACvE,GAAc,GAEhB,GAAQ,CACR,EAAQ,YAAY,EAAQ,GAAwB,EAEtD,KAAK,EAAO,EAAO,CACjB,GAAe,CACf,EAAM,EAAM,EAEd,QAAQ,EAAO,EAAO,CACpB,GAAe,CACf,EAAM,EAAM,EAEf,CAGH,SAAgB,GAAoD,CAClE,IAAM,EAAW,GAAiC,CAC9C,EACA,EACA,EAEE,MAAiB,CACrB,EAAS,IAAA,GACL,GAAC,GAAe,CAAC,IACrB,EAAS,EAAY,QAAQ,EAAY,MAAO,EAAU,EAG5D,GAAI,CACF,IAAM,EAAc,IAAI,EAAO;;;;;;;;;;;;;;;;;;;;;;;;;EAAqB,CAClD,KAAM,GACN,WAAY,CAAE,OAAQ,EAAgB,WAAY,GAAyB,CAC5E,CAAC,CACF,EAAY,OAAO,CACnB,EAAY,KAAK,QAAS,EAAS,CACnC,EAAY,KAAK,OAAS,GAAS,CAC7B,IAAS,GAAK,IAAW,GAAa,GAAU,EACpD,CACF,EAAS,OACH,CACN,EAAS,IAAA,GAGX,IAAM,GAAY,EAAuB,IAAsB,CAG7D,GAFA,EAAc,EACd,EAAY,EACR,CAAC,EAAQ,CACX,EAAS,EAAQ,QAAQ,EAAQ,MAAO,EAAM,CAC9C,OAEF,GAAI,CACF,EAAO,YAAY,EAAQ,MACrB,CACN,GAAU,GAId,MAAO,CACL,KAAM,EAAO,IAAU,EAAS,CAAE,OAAQ,MAAO,QAAO,CAAE,EAAM,CAChE,OAAQ,EAAO,IAAU,EAAS,CAAE,OAAQ,QAAS,QAAO,CAAE,EAAM,CACpE,MAAO,EAAO,IAAU,EAAS,CAAE,OAAQ,OAAQ,QAAO,CAAE,EAAM,CAClE,SAAU,EAAO,IAAU,EAAS,CAAE,OAAQ,UAAW,QAAO,CAAE,EAAM,CACzE"}
@@ -0,0 +1,4 @@
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../adapters/helpSkills.cjs`),t=require(`../../adapters/skillSources.cjs`);let n=require(`@agimon-ai/doompi-config/piContext`),r=require(`@agimon-ai/doompi-ui/leader`);const i=`skills`,a=`/skill:`,o=`warning`,s={source:`@agimon-ai/doompi`,bindings:[{id:`skills.browse`,path:[{key:`e`,label:`extension`,order:50},{key:`s`,label:`skills`,detail:`browse catalog`}],command:{name:i}}]};function c(e){return`${a}${e} `}function l(e){return typeof e.getCommands==`function`?e.getCommands().filter(e=>e.source===`skill`&&e.name.startsWith(`skill:`)).map(e=>e.name.slice(6)):[]}function u(e,t){return{skills:[],diagnostics:[`${e}: ${t instanceof Error?t.message:String(t)}`]}}function d(d){let f=t.provideSkillSources(d),p=e.createActiveHelpSkillView(d),m,h,g,_,v=0,y,b=``,x=()=>m??=Promise.resolve().then(()=>require(`../../adapters/deferredSkills.cjs`)),S=()=>h??=Promise.resolve().then(()=>require(`../../adapters/config/harnessState.cjs`)),C=()=>g??=Promise.resolve().then(()=>require(`../../adapters/skillCatalog.cjs`)),w=()=>_??=Promise.resolve().then(()=>require(`./components/skillsOverlay.cjs`)),T=async e=>{let t=await e.ready;return y===e?t:void 0};(0,r.registerDoomLeaderContribution)(d,s),d.on(`session_start`,(e,t)=>{let r=(0,n.requireDoomConfigContext)(t).harness;y={id:++v,ready:x().then(({DeferredSkillLoader:e})=>new e({cwd:t.cwd,skillPaths:r.skillDirectories}).start()).catch(e=>u(t.cwd,e)),diagnosticsShown:!1},b=``}),d.on(`input`,async e=>{if(!e.text.startsWith(a))return{action:`continue`};let t=y;if(!t)return{action:`continue`};let n=await T(t);if(!n)return{action:`continue`};let r=p.merge({normalSkills:[],deferredSkills:n.skills,normalSkillNames:l(d)}),{expandDeferredSkillCommand:i}=await x(),o=i(e.text,r.additionalSkills);return o===e.text?{action:`continue`}:{action:`transform`,text:o,images:e.images}}),d.on(`before_agent_start`,async(e,t)=>{let n=y;if(!n)return;let r=await T(n);if(!r)return;!n.diagnosticsShown&&r.diagnostics.length>0&&(n.diagnosticsShown=!0,t.ui.notify(`Skill discovery:\n${r.diagnostics.join(`
2
+ `)}`,o));let i=p.merge({normalSkills:e.systemPromptOptions.skills??[],deferredSkills:r.skills});if(i.diagnosticKey!==b&&(b=i.diagnosticKey,i.diagnostics.length>0&&t.ui.notify(`Package Help:\n${i.diagnostics.join(`
3
+ `)}`,o)),i.additionalSkills.length===0)return;let{buildPromptWithDeferredSkills:a}=await x();return{systemPrompt:a(e.systemPrompt,e.systemPromptOptions,[...i.additionalSkills])}}),d.registerCommand(i,{description:`Browse the skills this session loaded, and what other domains would add`,handler:async(e,t)=>{if(!t.hasUI||t.mode!==`tui`){t.ui.notify(`/skills requires interactive mode`,`error`);return}let r=(0,n.requireDoomConfigContext)(t).harness,[{requireHarnessRoot:i},{buildSkillCatalog:a},{openSkillsOverlay:o}]=await Promise.all([S(),C(),w()]),s=i(r),l=y,u=l?await T(l):void 0,d=p.merge({normalSkills:t.getSystemPromptOptions().skills??[],deferredSkills:u?.skills??[]}),m=await o(t,{catalog:await a({repoRoot:s,activeSkillDirectories:r.skillDirectories,extensionSources:f.list(),helpSkills:d.helpSkills,helpDiagnostics:d.diagnostics}),repoRoot:s});if(!m)return;let{skill:h}=m;t.ui.setEditorText(c(h.name)),t.ui.notify(`Loaded ${h.name} into the prompt. Press enter to run it.`,`info`)}}),d.on(`session_shutdown`,()=>{p.dispose()})}exports.SKILLS_LEADER_CONTRIBUTION=s,exports.default=d,exports.skillInvocation=c;
4
+ //# sourceMappingURL=skills.cjs.map