@code-yeongyu/senpi 2026.7.20 → 2026.7.22

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 (495) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +1 -0
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +1 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-session.d.ts +32 -0
  7. package/dist/core/agent-session.d.ts.map +1 -1
  8. package/dist/core/agent-session.js +409 -68
  9. package/dist/core/agent-session.js.map +1 -1
  10. package/dist/core/auth-storage.js +1 -1
  11. package/dist/core/auth-storage.js.map +1 -1
  12. package/dist/core/compaction/compaction.d.ts +2 -2
  13. package/dist/core/compaction/compaction.d.ts.map +1 -1
  14. package/dist/core/compaction/compaction.js +67 -16
  15. package/dist/core/compaction/compaction.js.map +1 -1
  16. package/dist/core/compaction/stream-watchdog.d.ts +31 -0
  17. package/dist/core/compaction/stream-watchdog.d.ts.map +1 -0
  18. package/dist/core/compaction/stream-watchdog.js +78 -0
  19. package/dist/core/compaction/stream-watchdog.js.map +1 -0
  20. package/dist/core/extensions/builtin/btw/index.d.ts +3 -0
  21. package/dist/core/extensions/builtin/btw/index.d.ts.map +1 -0
  22. package/dist/core/extensions/builtin/btw/index.js +120 -0
  23. package/dist/core/extensions/builtin/btw/index.js.map +1 -0
  24. package/dist/core/extensions/builtin/btw/panel.d.ts +21 -0
  25. package/dist/core/extensions/builtin/btw/panel.d.ts.map +1 -0
  26. package/dist/core/extensions/builtin/btw/panel.js +61 -0
  27. package/dist/core/extensions/builtin/btw/panel.js.map +1 -0
  28. package/dist/core/extensions/builtin/btw/side-query.d.ts +31 -0
  29. package/dist/core/extensions/builtin/btw/side-query.d.ts.map +1 -0
  30. package/dist/core/extensions/builtin/btw/side-query.js +68 -0
  31. package/dist/core/extensions/builtin/btw/side-query.js.map +1 -0
  32. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/compaction/index.js +47 -11
  34. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  35. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  36. package/dist/core/extensions/builtin/compaction/openai-remote.js +3 -1
  37. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  38. package/dist/core/extensions/builtin/compaction/speculative.d.ts +17 -0
  39. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/compaction/speculative.js +93 -26
  41. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  42. package/dist/core/extensions/builtin/config-reload/index.d.ts +39 -0
  43. package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -0
  44. package/dist/core/extensions/builtin/config-reload/index.js +659 -0
  45. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -0
  46. package/dist/core/extensions/builtin/config-reload/log.d.ts +55 -0
  47. package/dist/core/extensions/builtin/config-reload/log.d.ts.map +1 -0
  48. package/dist/core/extensions/builtin/config-reload/log.js +128 -0
  49. package/dist/core/extensions/builtin/config-reload/log.js.map +1 -0
  50. package/dist/core/extensions/builtin/config-reload/protocol.d.ts +71 -0
  51. package/dist/core/extensions/builtin/config-reload/protocol.d.ts.map +1 -0
  52. package/dist/core/extensions/builtin/config-reload/protocol.js +83 -0
  53. package/dist/core/extensions/builtin/config-reload/protocol.js.map +1 -0
  54. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts +43 -0
  55. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -0
  56. package/dist/core/extensions/builtin/config-reload/watch-engine.js +298 -0
  57. package/dist/core/extensions/builtin/config-reload/watch-engine.js.map +1 -0
  58. package/dist/core/extensions/builtin/goal/command-registration.d.ts +2 -2
  59. package/dist/core/extensions/builtin/goal/command-registration.d.ts.map +1 -1
  60. package/dist/core/extensions/builtin/goal/command-registration.js +3 -4
  61. package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
  62. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  63. package/dist/core/extensions/builtin/goal/index.js +11 -27
  64. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  65. package/dist/core/extensions/builtin/goal/tool-registration.d.ts +2 -2
  66. package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
  67. package/dist/core/extensions/builtin/goal/tool-registration.js +2 -3
  68. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  69. package/dist/core/extensions/builtin/goal/turn-usage.d.ts +20 -0
  70. package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +1 -0
  71. package/dist/core/extensions/builtin/goal/turn-usage.js +61 -0
  72. package/dist/core/extensions/builtin/goal/turn-usage.js.map +1 -0
  73. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  74. package/dist/core/extensions/builtin/index.js +9 -0
  75. package/dist/core/extensions/builtin/index.js.map +1 -1
  76. package/dist/core/extensions/builtin/look-at/arguments.d.ts +27 -0
  77. package/dist/core/extensions/builtin/look-at/arguments.d.ts.map +1 -0
  78. package/dist/core/extensions/builtin/look-at/arguments.js +109 -0
  79. package/dist/core/extensions/builtin/look-at/arguments.js.map +1 -0
  80. package/dist/core/extensions/builtin/look-at/commands.d.ts +9 -0
  81. package/dist/core/extensions/builtin/look-at/commands.d.ts.map +1 -0
  82. package/dist/core/extensions/builtin/look-at/commands.js +102 -0
  83. package/dist/core/extensions/builtin/look-at/commands.js.map +1 -0
  84. package/dist/core/extensions/builtin/look-at/image-input.d.ts +21 -0
  85. package/dist/core/extensions/builtin/look-at/image-input.d.ts.map +1 -0
  86. package/dist/core/extensions/builtin/look-at/image-input.js +151 -0
  87. package/dist/core/extensions/builtin/look-at/image-input.js.map +1 -0
  88. package/dist/core/extensions/builtin/look-at/index.d.ts +3 -0
  89. package/dist/core/extensions/builtin/look-at/index.d.ts.map +1 -0
  90. package/dist/core/extensions/builtin/look-at/index.js +58 -0
  91. package/dist/core/extensions/builtin/look-at/index.js.map +1 -0
  92. package/dist/core/extensions/builtin/look-at/model-selector.d.ts +9 -0
  93. package/dist/core/extensions/builtin/look-at/model-selector.d.ts.map +1 -0
  94. package/dist/core/extensions/builtin/look-at/model-selector.js +77 -0
  95. package/dist/core/extensions/builtin/look-at/model-selector.js.map +1 -0
  96. package/dist/core/extensions/builtin/look-at/prompts.d.ts +5 -0
  97. package/dist/core/extensions/builtin/look-at/prompts.d.ts.map +1 -0
  98. package/dist/core/extensions/builtin/look-at/prompts.js +19 -0
  99. package/dist/core/extensions/builtin/look-at/prompts.js.map +1 -0
  100. package/dist/core/extensions/builtin/look-at/render.d.ts +26 -0
  101. package/dist/core/extensions/builtin/look-at/render.d.ts.map +1 -0
  102. package/dist/core/extensions/builtin/look-at/render.js +70 -0
  103. package/dist/core/extensions/builtin/look-at/render.js.map +1 -0
  104. package/dist/core/extensions/builtin/look-at/runner.d.ts +16 -0
  105. package/dist/core/extensions/builtin/look-at/runner.d.ts.map +1 -0
  106. package/dist/core/extensions/builtin/look-at/runner.js +108 -0
  107. package/dist/core/extensions/builtin/look-at/runner.js.map +1 -0
  108. package/dist/core/extensions/builtin/look-at/settings.d.ts +13 -0
  109. package/dist/core/extensions/builtin/look-at/settings.d.ts.map +1 -0
  110. package/dist/core/extensions/builtin/look-at/settings.js +20 -0
  111. package/dist/core/extensions/builtin/look-at/settings.js.map +1 -0
  112. package/dist/core/extensions/builtin/mcp/commands.d.ts.map +1 -1
  113. package/dist/core/extensions/builtin/mcp/commands.js +2 -0
  114. package/dist/core/extensions/builtin/mcp/commands.js.map +1 -1
  115. package/dist/core/extensions/builtin/mcp/config-schema.d.ts +6 -0
  116. package/dist/core/extensions/builtin/mcp/config-schema.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/mcp/config-schema.js +1 -0
  118. package/dist/core/extensions/builtin/mcp/config-schema.js.map +1 -1
  119. package/dist/core/extensions/builtin/mcp/config.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/mcp/config.js +9 -1
  121. package/dist/core/extensions/builtin/mcp/config.js.map +1 -1
  122. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  123. package/dist/core/extensions/builtin/mcp/service.js +22 -6
  124. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  125. package/dist/core/extensions/builtin/mcp/startup-race.d.ts +10 -0
  126. package/dist/core/extensions/builtin/mcp/startup-race.d.ts.map +1 -1
  127. package/dist/core/extensions/builtin/mcp/startup-race.js +18 -1
  128. package/dist/core/extensions/builtin/mcp/startup-race.js.map +1 -1
  129. package/dist/core/extensions/builtin/model-fallback/index.d.ts +4 -0
  130. package/dist/core/extensions/builtin/model-fallback/index.d.ts.map +1 -0
  131. package/dist/core/extensions/builtin/model-fallback/index.js +55 -0
  132. package/dist/core/extensions/builtin/model-fallback/index.js.map +1 -0
  133. package/dist/core/extensions/builtin/model-fallback/settings.d.ts +6 -0
  134. package/dist/core/extensions/builtin/model-fallback/settings.d.ts.map +1 -0
  135. package/dist/core/extensions/builtin/model-fallback/settings.js +11 -0
  136. package/dist/core/extensions/builtin/model-fallback/settings.js.map +1 -0
  137. package/dist/core/extensions/builtin/model-fallback/ui.d.ts +12 -0
  138. package/dist/core/extensions/builtin/model-fallback/ui.d.ts.map +1 -0
  139. package/dist/core/extensions/builtin/model-fallback/ui.js +72 -0
  140. package/dist/core/extensions/builtin/model-fallback/ui.js.map +1 -0
  141. package/dist/core/extensions/builtin/nested-agents-md/index.d.ts.map +1 -1
  142. package/dist/core/extensions/builtin/nested-agents-md/index.js +4 -1
  143. package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
  144. package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
  145. package/dist/core/extensions/builtin/rules/index.js +4 -1
  146. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  147. package/dist/core/extensions/builtin/terminal/output-format.d.ts +28 -0
  148. package/dist/core/extensions/builtin/terminal/output-format.d.ts.map +1 -0
  149. package/dist/core/extensions/builtin/terminal/output-format.js +74 -0
  150. package/dist/core/extensions/builtin/terminal/output-format.js.map +1 -0
  151. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +3 -0
  152. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/terminal/runtime-session.js +22 -2
  154. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  155. package/dist/core/extensions/builtin/terminal/shared.d.ts +7 -0
  156. package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
  157. package/dist/core/extensions/builtin/terminal/shared.js +14 -0
  158. package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
  159. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +5 -1
  160. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
  161. package/dist/core/extensions/builtin/terminal/tools/bash-output.js +88 -6
  162. package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
  163. package/dist/core/extensions/builtin/terminal/tools/bash.d.ts +12 -1
  164. package/dist/core/extensions/builtin/terminal/tools/bash.d.ts.map +1 -1
  165. package/dist/core/extensions/builtin/terminal/tools/bash.js +82 -8
  166. package/dist/core/extensions/builtin/terminal/tools/bash.js.map +1 -1
  167. package/dist/core/extensions/builtin/terminal/tools/render.d.ts +16 -0
  168. package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -0
  169. package/dist/core/extensions/builtin/terminal/tools/render.js +30 -0
  170. package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -0
  171. package/dist/core/extensions/builtin/terminal/tools/spawn.d.ts +2 -0
  172. package/dist/core/extensions/builtin/terminal/tools/spawn.d.ts.map +1 -1
  173. package/dist/core/extensions/builtin/terminal/tools/spawn.js +1 -1
  174. package/dist/core/extensions/builtin/terminal/tools/spawn.js.map +1 -1
  175. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
  176. package/dist/core/extensions/builtin/todotools/tools/todo.js +22 -6
  177. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
  178. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts +1 -0
  179. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts.map +1 -1
  180. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js +13 -4
  181. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js.map +1 -1
  182. package/dist/core/extensions/builtin/webfetch/webfetch/renderers.d.ts.map +1 -1
  183. package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js +17 -2
  184. package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js.map +1 -1
  185. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +8 -1
  186. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +45 -3
  188. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -1
  189. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
  190. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +13 -4
  191. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
  192. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +3 -2
  193. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
  194. package/dist/core/extensions/builtin/websearch/websearch/search.js +2 -1
  195. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
  196. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
  197. package/dist/core/extensions/builtin/websearch/websearch/tool.js +17 -1
  198. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  199. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +2 -0
  200. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
  201. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
  202. package/dist/core/extensions/runner.d.ts +6 -0
  203. package/dist/core/extensions/runner.d.ts.map +1 -1
  204. package/dist/core/extensions/runner.js +71 -3
  205. package/dist/core/extensions/runner.js.map +1 -1
  206. package/dist/core/extensions/types.d.ts +96 -10
  207. package/dist/core/extensions/types.d.ts.map +1 -1
  208. package/dist/core/extensions/types.js.map +1 -1
  209. package/dist/core/model-config-schema.d.ts +1942 -0
  210. package/dist/core/model-config-schema.d.ts.map +1 -0
  211. package/dist/core/model-config-schema.js +197 -0
  212. package/dist/core/model-config-schema.js.map +1 -0
  213. package/dist/core/model-config.d.ts +2 -578
  214. package/dist/core/model-config.d.ts.map +1 -1
  215. package/dist/core/model-config.js +1 -194
  216. package/dist/core/model-config.js.map +1 -1
  217. package/dist/core/model-resolver.d.ts.map +1 -1
  218. package/dist/core/model-resolver.js +1 -0
  219. package/dist/core/model-resolver.js.map +1 -1
  220. package/dist/core/model-runtime.d.ts.map +1 -1
  221. package/dist/core/model-runtime.js +9 -3
  222. package/dist/core/model-runtime.js.map +1 -1
  223. package/dist/core/provider-composer.d.ts +1 -0
  224. package/dist/core/provider-composer.d.ts.map +1 -1
  225. package/dist/core/provider-composer.js +3 -2
  226. package/dist/core/provider-composer.js.map +1 -1
  227. package/dist/core/provider-display-names.d.ts.map +1 -1
  228. package/dist/core/provider-display-names.js +1 -0
  229. package/dist/core/provider-display-names.js.map +1 -1
  230. package/dist/core/retry-fallback/chains.d.ts +29 -0
  231. package/dist/core/retry-fallback/chains.d.ts.map +1 -0
  232. package/dist/core/retry-fallback/chains.js +109 -0
  233. package/dist/core/retry-fallback/chains.js.map +1 -0
  234. package/dist/core/retry-fallback/controller.d.ts +77 -0
  235. package/dist/core/retry-fallback/controller.d.ts.map +1 -0
  236. package/dist/core/retry-fallback/controller.js +157 -0
  237. package/dist/core/retry-fallback/controller.js.map +1 -0
  238. package/dist/core/retry-fallback/cooldown.d.ts +21 -0
  239. package/dist/core/retry-fallback/cooldown.d.ts.map +1 -0
  240. package/dist/core/retry-fallback/cooldown.js +49 -0
  241. package/dist/core/retry-fallback/cooldown.js.map +1 -0
  242. package/dist/core/retry-fallback/log.d.ts +10 -0
  243. package/dist/core/retry-fallback/log.d.ts.map +1 -0
  244. package/dist/core/retry-fallback/log.js +128 -0
  245. package/dist/core/retry-fallback/log.js.map +1 -0
  246. package/dist/core/retry-fallback/validate.d.ts +8 -0
  247. package/dist/core/retry-fallback/validate.d.ts.map +1 -0
  248. package/dist/core/retry-fallback/validate.js +63 -0
  249. package/dist/core/retry-fallback/validate.js.map +1 -0
  250. package/dist/core/sdk.d.ts.map +1 -1
  251. package/dist/core/sdk.js +1 -0
  252. package/dist/core/sdk.js.map +1 -1
  253. package/dist/core/session-manager.d.ts +39 -3
  254. package/dist/core/session-manager.d.ts.map +1 -1
  255. package/dist/core/session-manager.js +125 -16
  256. package/dist/core/session-manager.js.map +1 -1
  257. package/dist/core/settings-manager.d.ts +33 -0
  258. package/dist/core/settings-manager.d.ts.map +1 -1
  259. package/dist/core/settings-manager.js +153 -6
  260. package/dist/core/settings-manager.js.map +1 -1
  261. package/dist/modes/interactive/components/footer.d.ts +2 -1
  262. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  263. package/dist/modes/interactive/components/footer.js +30 -20
  264. package/dist/modes/interactive/components/footer.js.map +1 -1
  265. package/dist/modes/interactive/components/todo-strike.d.ts +8 -0
  266. package/dist/modes/interactive/components/todo-strike.d.ts.map +1 -0
  267. package/dist/modes/interactive/components/todo-strike.js +35 -0
  268. package/dist/modes/interactive/components/todo-strike.js.map +1 -0
  269. package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -1
  270. package/dist/modes/interactive/components/tool-execution-renderer.js +8 -1
  271. package/dist/modes/interactive/components/tool-execution-renderer.js.map +1 -1
  272. package/dist/modes/interactive/components/tool-execution.d.ts +4 -0
  273. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  274. package/dist/modes/interactive/components/tool-execution.js +51 -2
  275. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  276. package/dist/modes/interactive/interactive-mode.d.ts +6 -0
  277. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  278. package/dist/modes/interactive/interactive-mode.js +124 -4
  279. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  280. package/dist/modes/interactive/tool-progress.d.ts +8 -0
  281. package/dist/modes/interactive/tool-progress.d.ts.map +1 -0
  282. package/dist/modes/interactive/tool-progress.js +26 -0
  283. package/dist/modes/interactive/tool-progress.js.map +1 -0
  284. package/dist/modes/interactive/tool-result-reveal.d.ts +18 -0
  285. package/dist/modes/interactive/tool-result-reveal.d.ts.map +1 -0
  286. package/dist/modes/interactive/tool-result-reveal.js +155 -0
  287. package/dist/modes/interactive/tool-result-reveal.js.map +1 -0
  288. package/dist/utils/fs-watch.d.ts +2 -2
  289. package/dist/utils/fs-watch.d.ts.map +1 -1
  290. package/dist/utils/fs-watch.js +2 -2
  291. package/dist/utils/fs-watch.js.map +1 -1
  292. package/docs/extensions.md +79 -1
  293. package/docs/mcp.md +10 -1
  294. package/docs/models.md +102 -1
  295. package/docs/providers.md +3 -1
  296. package/docs/settings.md +35 -0
  297. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +24 -0
  298. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  299. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +13 -1
  300. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  301. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +76 -8
  302. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  303. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  304. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +26 -1
  305. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  306. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  307. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +24 -2
  308. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  309. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
  310. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  311. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  312. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  313. package/node_modules/@earendil-works/pi-ai/README.md +2 -0
  314. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  315. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +68 -25
  316. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  317. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.d.ts.map +1 -1
  318. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js +33 -6
  319. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js.map +1 -1
  320. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  321. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +6 -1
  322. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  323. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  324. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +62 -52
  325. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  326. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts +19 -0
  327. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts.map +1 -0
  328. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js +50 -0
  329. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js.map +1 -0
  330. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +2 -17
  331. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  332. package/node_modules/@earendil-works/pi-ai/dist/compat.js +3 -52
  333. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  334. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  335. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
  336. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  337. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +45 -0
  338. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  339. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +45 -0
  340. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  341. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +5 -0
  342. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  343. package/node_modules/@earendil-works/pi-ai/dist/index.js +5 -0
  344. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  345. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +27 -0
  346. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -0
  347. package/node_modules/@earendil-works/pi-ai/dist/model.js +2 -0
  348. package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -0
  349. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +1178 -1072
  350. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  351. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +2 -0
  352. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  353. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.d.ts +3 -0
  354. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.d.ts.map +1 -0
  355. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.js +15 -0
  356. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.js.map +1 -0
  357. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.d.ts +64 -0
  358. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.d.ts.map +1 -0
  359. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.js +5 -0
  360. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.js.map +1 -0
  361. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  362. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
  363. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  364. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -0
  365. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  366. package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
  367. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  368. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  369. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  370. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts +1 -0
  371. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
  372. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js +1 -0
  373. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
  374. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts +8 -0
  375. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts.map +1 -1
  376. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js.map +1 -1
  377. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +0 -4
  378. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
  379. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
  380. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +12 -4
  381. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
  382. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
  383. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +20 -4
  384. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  385. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  386. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +16 -0
  387. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  388. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  389. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +1 -0
  390. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  391. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +8 -0
  392. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  393. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts +20 -0
  394. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts.map +1 -0
  395. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js +79 -0
  396. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js.map +1 -0
  397. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +2 -18
  398. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +1 -1
  399. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +4 -218
  400. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +1 -1
  401. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts +38 -0
  402. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts.map +1 -0
  403. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js +210 -0
  404. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js.map +1 -0
  405. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts +9 -0
  406. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts.map +1 -0
  407. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js +231 -0
  408. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js.map +1 -0
  409. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts +38 -0
  410. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +1 -0
  411. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js +84 -0
  412. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js.map +1 -0
  413. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts.map +1 -1
  414. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js +20 -57
  415. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js.map +1 -1
  416. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -1
  417. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +16 -99
  418. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts +1 -0
  420. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.d.ts.map +1 -1
  421. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js +1 -0
  422. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/index.js.map +1 -1
  423. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts +5 -0
  424. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts.map +1 -0
  425. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.js +6 -0
  426. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/antml/recovery-stream.js.map +1 -0
  427. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.d.ts +19 -0
  428. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.d.ts.map +1 -0
  429. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.js +185 -0
  430. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-code-mask.js.map +1 -0
  431. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts +11 -0
  432. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +1 -0
  433. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.js +24 -0
  434. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-content-lifecycle.js.map +1 -0
  435. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.d.ts +4 -0
  436. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.d.ts.map +1 -0
  437. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.js +13 -0
  438. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-diagnostics.js.map +1 -0
  439. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts +15 -0
  440. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.d.ts.map +1 -0
  441. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.js +37 -0
  442. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-event-stream.js.map +1 -0
  443. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.d.ts +4 -0
  444. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.d.ts.map +1 -0
  445. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.js +61 -0
  446. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-message-snapshot.js.map +1 -0
  447. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts +29 -0
  448. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.d.ts.map +1 -0
  449. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js +148 -0
  450. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-native-projection.js.map +1 -0
  451. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.d.ts +5 -0
  452. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.d.ts.map +1 -0
  453. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.js +36 -0
  454. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-failure.js.map +1 -0
  455. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts +15 -0
  456. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -0
  457. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js +88 -0
  458. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js.map +1 -0
  459. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.d.ts +3 -0
  460. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.d.ts.map +1 -0
  461. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js +233 -0
  462. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -0
  463. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts +23 -0
  464. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -0
  465. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js +77 -0
  466. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-text-projection.js.map +1 -0
  467. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.d.ts +5 -0
  468. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.d.ts.map +1 -0
  469. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.js +63 -0
  470. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-message-metadata.js.map +1 -0
  471. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts +13 -0
  472. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +1 -0
  473. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.js +52 -0
  474. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-thinking-projection.js.map +1 -0
  475. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts +41 -0
  476. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +1 -0
  477. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js +209 -0
  478. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper-shared.js.map +1 -0
  479. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -1
  480. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js +70 -346
  481. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
  482. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +18 -23
  483. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  484. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  485. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  486. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +5 -1
  487. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  488. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +4 -0
  489. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -0
  490. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +6 -0
  491. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -0
  492. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  493. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  494. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  495. package/package.json +6 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, lstatSync, readFileSync } from \"node:fs\";\nimport { basename, dirname, relative, resolve, sep } from \"node:path\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../../../config.ts\";\nimport { resolvePath } from \"../../../../utils/paths.ts\";\nimport { ModelConfig } from \"../../../model-config.ts\";\nimport { type Settings, SettingsManager, wasSelfWrite } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext, SessionStartEvent } from \"../../types.ts\";\nimport { type ConfigReloadLogger, createConfigReloadLogger } from \"./log.ts\";\nimport {\n\tCONFIG_WATCH_CHANGED,\n\tCONFIG_WATCH_READY,\n\tCONFIG_WATCH_REGISTER,\n\tCONFIG_WATCH_REJECTED,\n\tCONFIG_WATCH_RELOADED,\n\tCONFIG_WATCH_UNREGISTER,\n\ttype ConfigWatchRegistration,\n\tisConfigWatchRegistration,\n\tisConfigWatchUnregistration,\n\tisConfigWatchValidation,\n\tmatchesConfigWatchFilter,\n} from \"./protocol.ts\";\nimport {\n\tConfigReloadWatchEngine,\n\tcreateFsWatchEventSource,\n\ttype RealChange,\n\ttype WatchClock,\n\ttype WatchEventSource,\n\ttype WatchTarget,\n} from \"./watch-engine.ts\";\n\nconst BUILTIN_REGISTRATION_ID = \"builtin\";\nconst DEFAULT_DEBOUNCE_MS = 200;\nconst COMPACTION_RECHECK_MS = 250;\nconst CONFIG_FILE_NAMES = [\"settings.json\", \"models.json\", \"keybindings.json\"] as const;\n\ntype ConfigReloadWatchSettings = {\n\treadonly settings?: boolean;\n\treadonly models?: boolean;\n\treadonly keybindings?: boolean;\n\treadonly prompts?: boolean;\n\treadonly skills?: boolean;\n\treadonly extensions?: boolean;\n};\n\ntype ConfigReloadSettingsPatch = {\n\treadonly enabled?: boolean;\n\treadonly debounceMs?: number;\n\treadonly watch?: ConfigReloadWatchSettings;\n};\n\n/** Keep config-reload's settings schema owned by the builtin while exposing it on Settings. */\ndeclare module \"../../../settings-manager.ts\" {\n\tinterface Settings {\n\t\tconfigReload?: ConfigReloadSettingsPatch;\n\t}\n}\n\ntype ResolvedConfigReloadSettings = {\n\treadonly enabled: boolean;\n\treadonly debounceMs: number;\n\treadonly watch: Required<ConfigReloadWatchSettings>;\n};\n\ntype WatchTargetInput = Omit<WatchTarget, \"id\">;\n\ntype ActiveTarget = {\n\treadonly registrationId: string;\n\treadonly target: WatchTarget;\n\t/** Presence targets rebuild the watcher set once this missing path appears. */\n\treadonly rearmOnCreation?: string;\n};\n\ntype PendingChange = {\n\treadonly registrationId: string;\n\treadonly paths: Set<string>;\n};\n\ntype ReloadHandoff = {\n\treadonly hashesAtRequest: ReadonlyMap<string, string>;\n\treadonly requestedAt: number;\n\treadonly changes: readonly { readonly registrationId: string; readonly paths: readonly string[] }[];\n};\n\n/**\n * The builtin module is statically imported, so this survives replacement extension\n * factories during session.reload(). It closes the watcher-to-watcher race window.\n */\nlet reloadHandoff: ReloadHandoff | undefined;\n\nexport interface ConfigReloadExtensionOptions {\n\treadonly agentDir?: string;\n\treadonly subscribe?: WatchEventSource;\n\treadonly clock?: WatchClock;\n\treadonly logger?: ConfigReloadLogger;\n\t/** Test seam. Production uses the watch engine's SHA-256 implementation. */\n\treadonly hashFile?: (path: string) => string;\n}\n\n/**\n * Watch config resources and request the host's existing full reload flow.\n *\n * The optional options are test seams. Production registration uses the default\n * filesystem event source and agent directory.\n */\nexport function configReloadExtension(pi: ExtensionAPI, options: ConfigReloadExtensionOptions = {}): void {\n\tconst agentDir = resolve(options.agentDir ?? getAgentDir());\n\tconst subscribe = options.subscribe ?? createFsWatchEventSource();\n\tconst logger = options.logger ?? createConfigReloadLogger(agentDir);\n\tconst registrations = new Map<string, ConfigWatchRegistration>();\n\tconst eventUnsubscribes: Array<() => void> = [];\n\tconst pending = new Map<string, PendingChange>();\n\tlet engine: ConfigReloadWatchEngine | undefined;\n\tlet activeTargets: ActiveTarget[] = [];\n\tlet currentContext: ExtensionContext | undefined;\n\tlet started = false;\n\tlet tornDown = false;\n\tlet reloadInFlight = false;\n\tlet deferredNoticeShown = false;\n\tlet unavailableReloadLogged = false;\n\tlet compactionRecheck: ReturnType<typeof setTimeout> | undefined;\n\tlet changeChain: Promise<void> = Promise.resolve();\n\n\tconst closeWatchers = (): void => {\n\t\tengine?.close();\n\t\tengine = undefined;\n\t\tactiveTargets = [];\n\t};\n\n\tconst clearCompactionRecheck = (): void => {\n\t\tif (compactionRecheck === undefined) return;\n\t\t(options.clock ?? defaultClock).clearTimeout(compactionRecheck);\n\t\tcompactionRecheck = undefined;\n\t};\n\n\tconst cleanupEventListeners = (): void => {\n\t\tfor (const unsubscribe of eventUnsubscribes.splice(0)) {\n\t\t\tunsubscribe();\n\t\t}\n\t};\n\n\tconst rejectRegistration = (registrationId: string, errors: readonly string[]): void => {\n\t\tpi.events.emit(CONFIG_WATCH_REJECTED, {\n\t\t\tregistrationId,\n\t\t\tpaths: [],\n\t\t\terrors: [...errors],\n\t\t});\n\t\tlogger.warn(\"registration_rejected\", { registrationId, errorCount: errors.length });\n\t};\n\n\tconst handleRegistration = (payload: unknown): void => {\n\t\tif (!isConfigWatchRegistration(payload)) return;\n\t\tconst cwd = currentContext?.cwd ?? process.cwd();\n\t\tif (registrationHasRestrictedTarget(payload, cwd, agentDir)) {\n\t\t\trejectRegistration(payload.id, [\"Configuration watch target is restricted\"]);\n\t\t\treturn;\n\t\t}\n\n\t\t// A component may re-emit its unchanged registration when it receives the\n\t\t// ready event from rebuildWatchers. Rebuilding for that same payload emits\n\t\t// ready again and creates an unbounded synchronous rebuild loop.\n\t\tif (registrations.get(payload.id) === payload) return;\n\t\tregistrations.set(payload.id, payload);\n\t\tpending.delete(payload.id);\n\t\tlogger.info(\"registration_added\", { id: payload.id });\n\t\tif (started && currentContext) {\n\t\t\trebuildWatchers(currentContext);\n\t\t}\n\t};\n\n\tconst handleUnregistration = (payload: unknown): void => {\n\t\tif (!isConfigWatchUnregistration(payload)) return;\n\t\tif (!registrations.delete(payload.id)) return;\n\t\tpending.delete(payload.id);\n\t\tlogger.info(\"registration_removed\", { id: payload.id });\n\t\tif (started && currentContext) {\n\t\t\trebuildWatchers(currentContext);\n\t\t}\n\t};\n\n\tconst processChange = async (change: RealChange): Promise<void> => {\n\t\tif (reloadInFlight || !currentContext) return;\n\t\tconst groups = groupChangedPaths(change.changedPaths, activeTargets);\n\t\tconst rearmDirectoryWatch = change.created.some((path) =>\n\t\t\tactiveTargets.some((target) => target.rearmOnCreation === resolve(path)),\n\t\t);\n\t\tfor (const [registrationId, paths] of groups) {\n\t\t\tconst watchedPaths = excludeSelfWrites(paths, engine, agentDir, currentContext.cwd, logger);\n\t\t\tif (watchedPaths.length === 0) continue;\n\n\t\t\tconst errors = await validateChangedPaths(\n\t\t\t\tregistrationId,\n\t\t\t\twatchedPaths,\n\t\t\t\tregistrations,\n\t\t\t\tagentDir,\n\t\t\t\tcurrentContext.cwd,\n\t\t\t);\n\t\t\tif (errors.length > 0) {\n\t\t\t\trejectChange(currentContext, registrationId, watchedPaths, errors, logger, pi);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\taddPending(pending, registrationId, watchedPaths);\n\t\t\tconst deferred = !canRequestReload(currentContext);\n\t\t\tpi.events.emit(CONFIG_WATCH_CHANGED, {\n\t\t\t\tregistrationId,\n\t\t\t\tpaths: [...watchedPaths],\n\t\t\t\tdeferred,\n\t\t\t});\n\t\t\tlogger.info(\"change_detected\", { registrationId, paths: watchedPaths, deferred });\n\t\t}\n\t\tif (rearmDirectoryWatch) rebuildWatchers(currentContext);\n\t\tawait flushPending();\n\t};\n\n\tconst enqueueChange = (change: RealChange): void => {\n\t\tif (reloadInFlight) return;\n\t\tchangeChain = changeChain\n\t\t\t.then(() => processChange(change))\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tlogger.error(\"watcher_error\", { path: \"config reload\", message: errorMessage(error) });\n\t\t\t});\n\t};\n\n\tconst rebuildWatchers = (ctx: ExtensionContext): void => {\n\t\tcloseWatchers();\n\t\tclearCompactionRecheck();\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd, agentDir, { projectTrusted: ctx.isProjectTrusted() });\n\t\tconst settings = resolveConfigReloadSettings(settingsManager);\n\t\tif (!settings.enabled || ctx.mode === \"print\" || ctx.mode === \"json\") {\n\t\t\tpi.events.emit(CONFIG_WATCH_READY, { enabled: false });\n\t\t\treturn;\n\t\t}\n\n\t\tactiveTargets = buildWatchTargets({\n\t\t\tcwd: ctx.cwd,\n\t\t\tagentDir,\n\t\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t\t\tsettings,\n\t\t\tskillPaths: settings.watch.skills ? settingsManager.getSkillPaths() : [],\n\t\t\tregistrations,\n\t\t});\n\t\tengine = new ConfigReloadWatchEngine({\n\t\t\ttargets: activeTargets.map((entry) => entry.target),\n\t\t\tsubscribe,\n\t\t\tdebounceMs: settings.debounceMs,\n\t\t\tclock: options.clock,\n\t\t\thashFile: options.hashFile,\n\t\t\tonRealChange: enqueueChange,\n\t\t\tonError: (error, path) => {\n\t\t\t\tlogger.error(\"watcher_error\", { path, message: errorMessage(error) });\n\t\t\t},\n\t\t});\n\t\tlogger.info(\"watcher_started\", { targetCount: activeTargets.length });\n\t\tpi.events.emit(CONFIG_WATCH_READY, { enabled: true });\n\t};\n\n\tconst flushPending = async (): Promise<void> => {\n\t\tconst ctx = currentContext;\n\t\tif (!ctx || pending.size === 0 || reloadInFlight) return;\n\t\tif (!ctx.isIdle() || ctx.hasPendingMessages()) return;\n\t\tif (ctx.isCompacting?.() ?? false) {\n\t\t\tarmCompactionRecheck();\n\t\t\treturn;\n\t\t}\n\t\tclearCompactionRecheck();\n\t\tif (!ctx.requestReload) {\n\t\t\tif (!unavailableReloadLogged) {\n\t\t\t\tunavailableReloadLogged = true;\n\t\t\t\tlogger.info(\"reload_requested\", { reason: \"requestReload unavailable\", paths: [] });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst changes = pendingChanges(pending);\n\t\tconst paths = uniquePaths(changes.flatMap((change) => change.paths));\n\t\treloadInFlight = true;\n\t\ttornDown = false;\n\t\treloadHandoff = {\n\t\t\thashesAtRequest: engine?.getBaselineSnapshot() ?? new Map<string, string>(),\n\t\t\trequestedAt: Date.now(),\n\t\t\tchanges,\n\t\t};\n\t\tctx.ui.notify(`Hot-reloading: ${formatPaths(paths)}`, \"info\");\n\t\tlogger.info(\"reload_requested\", { reason: \"config changed\", paths });\n\n\t\ttry {\n\t\t\tawait ctx.requestReload();\n\t\t\tif (!tornDown) {\n\t\t\t\treloadInFlight = false;\n\t\t\t\treloadHandoff = undefined;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treloadInFlight = false;\n\t\t\treloadHandoff = undefined;\n\t\t\tlogger.error(\"watcher_error\", { path: \"reload\", message: errorMessage(error) });\n\t\t}\n\t};\n\n\tconst armCompactionRecheck = (): void => {\n\t\tif (compactionRecheck !== undefined) return;\n\t\tconst clock = options.clock ?? defaultClock;\n\t\tcompactionRecheck = clock.setTimeout(() => {\n\t\t\tcompactionRecheck = undefined;\n\t\t\tvoid flushPending();\n\t\t}, COMPACTION_RECHECK_MS);\n\t};\n\n\tconst processReloadHandoff = async (event: SessionStartEvent, ctx: ExtensionContext): Promise<void> => {\n\t\tif (event.reason !== \"reload\" || !reloadHandoff) return;\n\t\tconst handoff = reloadHandoff;\n\t\treloadHandoff = undefined;\n\t\tconst paths = uniquePaths(handoff.changes.flatMap((change) => change.paths));\n\t\tfor (const change of handoff.changes) {\n\t\t\tpi.events.emit(CONFIG_WATCH_RELOADED, {\n\t\t\t\tregistrationId: change.registrationId,\n\t\t\t\tpaths: [...change.paths],\n\t\t\t});\n\t\t}\n\t\tctx.ui.notify(`Hot-reloaded: ${formatPaths(paths)}`, \"info\");\n\t\tlogger.info(\"reload_completed\", { durationMs: Math.max(0, Date.now() - handoff.requestedAt) });\n\n\t\tconst changedPaths = compareSnapshots(handoff.hashesAtRequest, engine?.getBaselineSnapshot() ?? new Map());\n\t\tif (changedPaths.length > 0) {\n\t\t\tenqueueChange({ changedPaths, created: [], deleted: [] });\n\t\t\tawait changeChain;\n\t\t}\n\t};\n\n\teventUnsubscribes.push(pi.events.on(CONFIG_WATCH_REGISTER, handleRegistration));\n\teventUnsubscribes.push(pi.events.on(CONFIG_WATCH_UNREGISTER, handleUnregistration));\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\ttornDown = false;\n\t\tstarted = true;\n\t\tcurrentContext = ctx;\n\t\trebuildWatchers(ctx);\n\t\tawait processReloadHandoff(event, ctx);\n\t});\n\n\tpi.on(\"agent_end\", async (_event, ctx) => {\n\t\tcurrentContext = ctx;\n\t\tawait flushPending();\n\t});\n\tpi.on(\"agent_settled\", async (_event, ctx) => {\n\t\tcurrentContext = ctx;\n\t\tawait flushPending();\n\t});\n\tpi.on(\"project_trust\", () => {\n\t\tif (currentContext) rebuildWatchers(currentContext);\n\t\treturn { trusted: \"undecided\" };\n\t});\n\tpi.on(\"session_shutdown\", (event) => {\n\t\ttornDown = true;\n\t\tstarted = false;\n\t\tcurrentContext = undefined;\n\t\tcloseWatchers();\n\t\tclearCompactionRecheck();\n\t\tcleanupEventListeners();\n\t\tpending.clear();\n\t\tif (event.reason !== \"reload\") reloadHandoff = undefined;\n\t});\n\n\tfunction canRequestReload(ctx: ExtensionContext): boolean {\n\t\treturn (\n\t\t\tctx.isIdle() &&\n\t\t\t!ctx.hasPendingMessages() &&\n\t\t\t!(ctx.isCompacting?.() ?? false) &&\n\t\t\tctx.requestReload !== undefined\n\t\t);\n\t}\n\n\tfunction armDeferredNotice(ctx: ExtensionContext): void {\n\t\tif (deferredNoticeShown || pending.size === 0 || !ctx.requestReload) return;\n\t\tdeferredNoticeShown = true;\n\t\tctx.ui.notify(\"Config changed; reloading when idle\", \"info\");\n\t}\n\n\tfunction rejectChange(\n\t\tctx: ExtensionContext,\n\t\tregistrationId: string,\n\t\tpaths: readonly string[],\n\t\terrors: readonly string[],\n\t\tactiveLogger: ConfigReloadLogger,\n\t\tapi: ExtensionAPI,\n\t): void {\n\t\tctx.ui.notify(`Config change rejected: ${errors.join(\"; \")}`, \"error\");\n\t\tapi.events.emit(CONFIG_WATCH_REJECTED, { registrationId, paths: [...paths], errors: [...errors] });\n\t\tactiveLogger.warn(\"validation_rejected\", { registrationId, errorCount: errors.length });\n\t}\n\n\tfunction addPending(changes: Map<string, PendingChange>, registrationId: string, paths: readonly string[]): void {\n\t\tconst pendingChange = changes.get(registrationId) ?? { registrationId, paths: new Set<string>() };\n\t\tfor (const path of paths) pendingChange.paths.add(path);\n\t\tchanges.set(registrationId, pendingChange);\n\t\tif (!canRequestReload(currentContext!)) armDeferredNotice(currentContext!);\n\t}\n}\n\nexport default configReloadExtension;\n\nconst defaultClock: WatchClock = {\n\tsetTimeout: (callback, delayMs) => setTimeout(callback, delayMs),\n\tclearTimeout: (timer) => clearTimeout(timer),\n};\n\nfunction resolveConfigReloadSettings(settingsManager: SettingsManager): ResolvedConfigReloadSettings {\n\tconst global = readConfigReloadPatch(settingsManager.getGlobalSettings());\n\tconst project = readConfigReloadPatch(settingsManager.getProjectSettings());\n\treturn {\n\t\tenabled: project.enabled ?? global.enabled ?? true,\n\t\tdebounceMs: project.debounceMs ?? global.debounceMs ?? DEFAULT_DEBOUNCE_MS,\n\t\twatch: {\n\t\t\tsettings: project.watch?.settings ?? global.watch?.settings ?? true,\n\t\t\tmodels: project.watch?.models ?? global.watch?.models ?? true,\n\t\t\tkeybindings: project.watch?.keybindings ?? global.watch?.keybindings ?? true,\n\t\t\tprompts: project.watch?.prompts ?? global.watch?.prompts ?? true,\n\t\t\tskills: project.watch?.skills ?? global.watch?.skills ?? true,\n\t\t\textensions: project.watch?.extensions ?? global.watch?.extensions ?? true,\n\t\t},\n\t};\n}\n\nfunction readConfigReloadPatch(settings: Settings): ConfigReloadSettingsPatch {\n\tconst candidate: unknown = settings.configReload;\n\tif (!isPlainObject(candidate)) return {};\n\tconst watch = isPlainObject(candidate.watch) ? candidate.watch : undefined;\n\treturn {\n\t\tenabled: typeof candidate.enabled === \"boolean\" ? candidate.enabled : undefined,\n\t\tdebounceMs: validDebounce(candidate.debounceMs),\n\t\twatch: watch\n\t\t\t? {\n\t\t\t\t\tsettings: booleanOrUndefined(watch.settings),\n\t\t\t\t\tmodels: booleanOrUndefined(watch.models),\n\t\t\t\t\tkeybindings: booleanOrUndefined(watch.keybindings),\n\t\t\t\t\tprompts: booleanOrUndefined(watch.prompts),\n\t\t\t\t\tskills: booleanOrUndefined(watch.skills),\n\t\t\t\t\textensions: booleanOrUndefined(watch.extensions),\n\t\t\t\t}\n\t\t\t: undefined,\n\t};\n}\n\nfunction validDebounce(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn Math.floor(value);\n}\n\nfunction booleanOrUndefined(value: unknown): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction buildWatchTargets(options: {\n\treadonly cwd: string;\n\treadonly agentDir: string;\n\treadonly projectTrusted: boolean;\n\treadonly settings: ResolvedConfigReloadSettings;\n\treadonly skillPaths: readonly string[];\n\treadonly registrations: ReadonlyMap<string, ConfigWatchRegistration>;\n}): ActiveTarget[] {\n\tconst targets: ActiveTarget[] = [];\n\tconst addBuiltin = (id: string, target: WatchTargetInput, rearmOnCreation?: string): void => {\n\t\ttargets.push({ registrationId: BUILTIN_REGISTRATION_ID, target: { ...target, id }, rearmOnCreation });\n\t};\n\tconst addBuiltinDirectory = (id: string, path: string): void => {\n\t\tconst resourcePath = resolve(path);\n\t\tif (isExistingDirectory(resourcePath)) {\n\t\t\taddBuiltin(id, { kind: \"dir-recursive\", path: resourcePath });\n\t\t\treturn;\n\t\t}\n\t\tconst watchPath = nearestExistingDirectory(dirname(resourcePath));\n\t\tconst firstMissingSegment = relative(watchPath, resourcePath).split(sep)[0] || basename(resourcePath);\n\t\tconst createdPath = resolve(watchPath, firstMissingSegment);\n\t\taddBuiltin(\n\t\t\t`${id}-presence`,\n\t\t\t{\n\t\t\t\tkind: \"dir\",\n\t\t\t\tpath: watchPath,\n\t\t\t\tallowList: [firstMissingSegment],\n\t\t\t},\n\t\t\tcreatedPath,\n\t\t);\n\t};\n\tconst { cwd, agentDir, projectTrusted, settings } = options;\n\tconst projectDir = joinConfigDir(cwd);\n\n\tconst jsonAllowList = CONFIG_FILE_NAMES.filter((name) => {\n\t\tif (name === \"settings.json\") return settings.watch.settings;\n\t\tif (name === \"models.json\") return settings.watch.models;\n\t\treturn settings.watch.keybindings;\n\t});\n\tif (jsonAllowList.length > 0) {\n\t\taddBuiltin(\"builtin-global-json\", { kind: \"dir\", path: agentDir, allowList: jsonAllowList });\n\t}\n\tif (settings.watch.prompts) {\n\t\taddBuiltinDirectory(\"builtin-global-prompts\", resolve(agentDir, \"prompts\"));\n\t}\n\tif (settings.watch.extensions) {\n\t\taddBuiltinDirectory(\"builtin-global-extensions\", resolve(agentDir, \"extensions\"));\n\t}\n\tif (settings.watch.skills) {\n\t\tfor (const [index, skillPath] of options.skillPaths.entries()) {\n\t\t\tconst target = targetForSkillPath(resolvePath(skillPath, cwd, { trim: true }));\n\t\t\tif (target.kind === \"dir-recursive\") {\n\t\t\t\taddBuiltinDirectory(`builtin-skill-${index}`, target.path);\n\t\t\t} else {\n\t\t\t\taddBuiltin(`builtin-skill-${index}`, target);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (projectTrusted) {\n\t\tconst projectDirExists = isExistingDirectory(projectDir);\n\t\tconst projectWatchEnabled = Object.values(settings.watch).some(Boolean);\n\t\tif (projectWatchEnabled) {\n\t\t\taddBuiltin(\n\t\t\t\t\"builtin-project-presence\",\n\t\t\t\t{ kind: \"dir\", path: cwd, allowList: [CONFIG_DIR_NAME] },\n\t\t\t\tprojectDirExists ? undefined : projectDir,\n\t\t\t);\n\t\t}\n\t\tif (projectDirExists) {\n\t\t\tif (settings.watch.settings) {\n\t\t\t\taddBuiltin(\"builtin-project-settings\", {\n\t\t\t\t\tkind: \"dir\",\n\t\t\t\t\tpath: projectDir,\n\t\t\t\t\tallowList: [\"settings.json\"],\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (settings.watch.prompts) {\n\t\t\t\taddBuiltinDirectory(\"builtin-project-prompts\", resolve(projectDir, \"prompts\"));\n\t\t\t}\n\t\t\tif (settings.watch.skills) {\n\t\t\t\taddBuiltinDirectory(\"builtin-project-skills\", resolve(projectDir, \"skills\"));\n\t\t\t}\n\t\t\tif (settings.watch.extensions) {\n\t\t\t\taddBuiltinDirectory(\"builtin-project-extensions\", resolve(projectDir, \"extensions\"));\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const registration of options.registrations.values()) {\n\t\tfor (const [index, target] of registration.targets.entries()) {\n\t\t\tconst path = resolvePath(target.path, cwd, { trim: true });\n\t\t\tconst watchTarget = externalTargetToWatchTarget(path, target.kind, target.filterGlobs);\n\t\t\ttargets.push({\n\t\t\t\tregistrationId: registration.id,\n\t\t\t\ttarget: { ...watchTarget, id: `external-${registration.id}-${index}` },\n\t\t\t});\n\t\t}\n\t}\n\treturn targets;\n}\n\nfunction isExistingDirectory(path: string): boolean {\n\ttry {\n\t\treturn lstatSync(path).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction nearestExistingDirectory(path: string): string {\n\tlet candidate = resolve(path);\n\twhile (!isExistingDirectory(candidate)) {\n\t\tconst parent = dirname(candidate);\n\t\tif (parent === candidate) return candidate;\n\t\tcandidate = parent;\n\t}\n\treturn candidate;\n}\n\nfunction targetForSkillPath(path: string): WatchTargetInput {\n\ttry {\n\t\tif (lstatSync(path).isFile()) {\n\t\t\treturn { kind: \"dir\", path: dirname(path), allowList: [basename(path)] };\n\t\t}\n\t} catch {\n\t\t// A missing configured skill path is treated as a directory so it becomes watchable when present.\n\t}\n\treturn { kind: \"dir-recursive\", path };\n}\n\nfunction externalTargetToWatchTarget(\n\tpath: string,\n\tkind: \"file\" | \"dir\",\n\tfilterGlobs: readonly string[] | undefined,\n): WatchTargetInput {\n\tif (kind === \"file\") {\n\t\tconst name = basename(path);\n\t\treturn {\n\t\t\tkind: \"dir\",\n\t\t\tpath: dirname(path),\n\t\t\tallowList: [name],\n\t\t\tfilter: (relativePath) => relativePath === name && matchesConfigWatchFilter(relativePath, filterGlobs),\n\t\t};\n\t}\n\treturn {\n\t\tkind: \"dir-recursive\",\n\t\tpath,\n\t\t// Literal filters also declare explicitly watched dot-directories. Without\n\t\t// this, an external ancestor target filtered to \".omo\" drops its creation\n\t\t// event before the validator can inspect the new config beneath it.\n\t\tallowList: literalFilterNames(filterGlobs),\n\t\tfilter: (relativePath) => matchesConfigWatchFilter(relativePath, filterGlobs),\n\t};\n}\n\nfunction literalFilterNames(filterGlobs: readonly string[] | undefined): string[] | undefined {\n\tif (!filterGlobs) return undefined;\n\tconst literalNames = filterGlobs.filter(\n\t\t(filterGlob) => !filterGlob.includes(\"*\") && !filterGlob.includes(\"/\") && !filterGlob.includes(\"\\\\\\\\\"),\n\t);\n\treturn literalNames.length > 0 ? literalNames : undefined;\n}\n\nfunction groupChangedPaths(paths: readonly string[], targets: readonly ActiveTarget[]): Map<string, string[]> {\n\tconst groups = new Map<string, string[]>();\n\tfor (const path of paths) {\n\t\tlet matched = false;\n\t\tfor (const activeTarget of targets) {\n\t\t\tif (!targetMatchesPath(activeTarget.target, path)) continue;\n\t\t\tconst group = groups.get(activeTarget.registrationId) ?? [];\n\t\t\tif (!group.includes(path)) group.push(path);\n\t\t\tgroups.set(activeTarget.registrationId, group);\n\t\t\tmatched = true;\n\t\t}\n\t\tif (!matched) {\n\t\t\tconst group = groups.get(BUILTIN_REGISTRATION_ID) ?? [];\n\t\t\tgroup.push(path);\n\t\t\tgroups.set(BUILTIN_REGISTRATION_ID, group);\n\t\t}\n\t}\n\treturn groups;\n}\n\nfunction targetMatchesPath(target: WatchTarget, path: string): boolean {\n\tconst relativePath = relative(resolve(target.path), resolve(path));\n\tif (relativePath === \"..\" || relativePath.startsWith(`..${sep}`)) return false;\n\tif (target.kind === \"dir\" && relativePath.includes(sep)) return false;\n\tif (\n\t\ttarget.allowList &&\n\t\t!target.allowList.some((allowed) => relativePath === allowed || relativePath.startsWith(`${allowed}${sep}`))\n\t) {\n\t\treturn false;\n\t}\n\treturn target.filter?.(relativePath) ?? true;\n}\n\nfunction excludeSelfWrites(\n\tpaths: readonly string[],\n\tengine: ConfigReloadWatchEngine | undefined,\n\tagentDir: string,\n\tcwd: string,\n\tlogger: ConfigReloadLogger,\n): string[] {\n\tconst snapshot = engine?.getBaselineSnapshot();\n\treturn paths.filter((path) => {\n\t\tif (!isSettingsPath(path, agentDir, cwd)) return true;\n\t\tconst hash = snapshot?.get(path);\n\t\tif (hash === undefined || !wasSelfWrite(path, hash)) return true;\n\t\tlogger.debug(\"self_write_suppressed\", { path });\n\t\treturn false;\n\t});\n}\n\nasync function validateChangedPaths(\n\tregistrationId: string,\n\tpaths: readonly string[],\n\tregistrations: ReadonlyMap<string, ConfigWatchRegistration>,\n\tagentDir: string,\n\tcwd: string,\n): Promise<string[]> {\n\tif (registrationId === BUILTIN_REGISTRATION_ID) {\n\t\treturn validateBuiltinPaths(paths, agentDir, cwd);\n\t}\n\tconst registration = registrations.get(registrationId);\n\tif (!registration?.validate) return [];\n\ttry {\n\t\tconst result = await registration.validate(paths);\n\t\tif (!isConfigWatchValidation(result)) return [\"Configuration validator returned an invalid result\"];\n\t\treturn result.ok ? [] : result.errors;\n\t} catch (error) {\n\t\treturn [errorMessage(error)];\n\t}\n}\n\nfunction validateBuiltinPaths(paths: readonly string[], agentDir: string, cwd: string): string[] {\n\tconst errors: string[] = [];\n\tfor (const path of paths) {\n\t\tif (isSettingsPath(path, agentDir, cwd)) {\n\t\t\tconst error = validateSettingsFile(path);\n\t\t\tif (error) errors.push(error);\n\t\t\tcontinue;\n\t\t}\n\t\tif (resolve(path) === resolve(agentDir, \"models.json\")) {\n\t\t\tconst error = ModelConfig.loadSync(path).getError();\n\t\t\tif (error) errors.push(error);\n\t\t\tcontinue;\n\t\t}\n\t\tif (resolve(path) === resolve(agentDir, \"keybindings.json\")) {\n\t\t\tconst error = validateKeybindingsFile(path);\n\t\t\tif (error) errors.push(error);\n\t\t}\n\t}\n\treturn errors;\n}\n\nfunction validateSettingsFile(path: string): string | undefined {\n\tif (!existsSync(path)) return undefined;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\tif (!isPlainObject(parsed)) return \"settings.json must contain an object\";\n\t\t// Keep validation aligned with SettingsManager's loader and migrations without duplicating migration rules.\n\t\tSettingsManager.inMemory(parsed as Partial<Settings>);\n\t\treturn undefined;\n\t} catch (error) {\n\t\treturn `Invalid settings.json: ${errorMessage(error)}`;\n\t}\n}\n\nfunction validateKeybindingsFile(path: string): string | undefined {\n\tif (!existsSync(path)) return undefined;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\tif (!isPlainObject(parsed)) return \"keybindings.json must contain an object\";\n\t\tfor (const value of Object.values(parsed)) {\n\t\t\tif (typeof value === \"string\") continue;\n\t\t\tif (Array.isArray(value) && value.every((entry) => typeof entry === \"string\")) continue;\n\t\t\treturn \"keybindings.json bindings must be strings or string arrays\";\n\t\t}\n\t\treturn undefined;\n\t} catch (error) {\n\t\treturn `Invalid keybindings.json: ${errorMessage(error)}`;\n\t}\n}\n\nfunction registrationHasRestrictedTarget(\n\tregistration: ConfigWatchRegistration,\n\tcwd: string,\n\tagentDir: string,\n): boolean {\n\tconst authPath = resolve(agentDir, \"auth.json\");\n\tconst sessionsPath = resolve(agentDir, \"sessions\");\n\tconst logsPath = resolve(agentDir, \"logs\");\n\treturn registration.targets.some((target) => {\n\t\tconst path = resolvePath(target.path, cwd, { trim: true });\n\t\treturn (\n\t\t\tisWithin(path, authPath) ||\n\t\t\tisWithin(authPath, path) ||\n\t\t\tisWithin(path, sessionsPath) ||\n\t\t\tisWithin(path, logsPath)\n\t\t);\n\t});\n}\n\nfunction pendingChanges(pending: ReadonlyMap<string, PendingChange>): Array<{\n\treadonly registrationId: string;\n\treadonly paths: readonly string[];\n}> {\n\treturn [...pending.values()].map((change) => ({\n\t\tregistrationId: change.registrationId,\n\t\tpaths: [...change.paths].sort(),\n\t}));\n}\n\nfunction compareSnapshots(previous: ReadonlyMap<string, string>, next: ReadonlyMap<string, string>): string[] {\n\tconst changed = new Set<string>();\n\tfor (const [path, hash] of next) {\n\t\tif (previous.get(path) !== hash) changed.add(path);\n\t}\n\tfor (const path of previous.keys()) {\n\t\tif (!next.has(path)) changed.add(path);\n\t}\n\treturn [...changed].sort();\n}\n\nfunction uniquePaths(paths: readonly string[]): string[] {\n\treturn [...new Set(paths)].sort();\n}\n\nfunction joinConfigDir(cwd: string): string {\n\treturn resolve(cwd, CONFIG_DIR_NAME);\n}\n\nfunction isSettingsPath(path: string, agentDir: string, cwd: string): boolean {\n\treturn (\n\t\tresolve(path) === resolve(agentDir, \"settings.json\") ||\n\t\tresolve(path) === resolve(joinConfigDir(cwd), \"settings.json\")\n\t);\n}\n\nfunction isWithin(path: string, root: string): boolean {\n\treturn path === root || path.startsWith(`${root}${sep}`);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn prototype === Object.prototype || prototype === null;\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction formatPaths(paths: readonly string[]): string {\n\treturn paths.length === 0 ? \"configuration\" : paths.join(\", \");\n}\n"]}
@@ -0,0 +1,55 @@
1
+ export type ConfigReloadLogLevel = "debug" | "info" | "warn" | "error";
2
+ export type ConfigReloadLogEvent = "watcher_started" | "change_detected" | "self_write_suppressed" | "reload_requested" | "reload_completed" | "validation_rejected" | "registration_rejected" | "watcher_error" | "registration_added" | "registration_removed";
3
+ export interface ConfigReloadLogDetails {
4
+ watcher_started: {
5
+ targetCount: number;
6
+ };
7
+ change_detected: {
8
+ registrationId: string;
9
+ paths: readonly string[];
10
+ deferred: boolean;
11
+ };
12
+ self_write_suppressed: {
13
+ path: string;
14
+ };
15
+ reload_requested: {
16
+ reason: string;
17
+ paths: readonly string[];
18
+ };
19
+ reload_completed: {
20
+ durationMs: number;
21
+ };
22
+ validation_rejected: {
23
+ registrationId: string;
24
+ errorCount: number;
25
+ };
26
+ registration_rejected: {
27
+ registrationId: string;
28
+ errorCount: number;
29
+ };
30
+ watcher_error: {
31
+ path: string;
32
+ message: string;
33
+ };
34
+ registration_added: {
35
+ id: string;
36
+ };
37
+ registration_removed: {
38
+ id: string;
39
+ };
40
+ }
41
+ export interface ConfigReloadLogStatus {
42
+ written: boolean;
43
+ disabled: boolean;
44
+ }
45
+ export interface ConfigReloadLogger {
46
+ debug<Event extends ConfigReloadLogEvent>(event: Event, details: ConfigReloadLogDetails[Event]): ConfigReloadLogStatus;
47
+ info<Event extends ConfigReloadLogEvent>(event: Event, details: ConfigReloadLogDetails[Event]): ConfigReloadLogStatus;
48
+ warn<Event extends ConfigReloadLogEvent>(event: Event, details: ConfigReloadLogDetails[Event]): ConfigReloadLogStatus;
49
+ error<Event extends ConfigReloadLogEvent>(event: Event, details: ConfigReloadLogDetails[Event]): ConfigReloadLogStatus;
50
+ }
51
+ export interface ConfigReloadLoggerOptions {
52
+ maxBytes?: number;
53
+ }
54
+ export declare function createConfigReloadLogger(agentDir: string, options?: ConfigReloadLoggerOptions): ConfigReloadLogger;
55
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/log.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvE,MAAM,MAAM,oBAAoB,GAC7B,iBAAiB,GACjB,iBAAiB,GACjB,uBAAuB,GACvB,kBAAkB,GAClB,kBAAkB,GAClB,qBAAqB,GACrB,uBAAuB,GACvB,eAAe,GACf,oBAAoB,GACpB,sBAAsB,CAAC;AAE1B,MAAM,WAAW,sBAAsB;IACtC,eAAe,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,eAAe,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IACzF,qBAAqB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,gBAAgB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAC/D,gBAAgB,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,mBAAmB,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,qBAAqB,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,kBAAkB,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,oBAAoB,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,CAAC,KAAK,SAAS,oBAAoB,EACvC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,sBAAsB,CAAC,KAAK,CAAC,GACpC,qBAAqB,CAAC;IACzB,IAAI,CAAC,KAAK,SAAS,oBAAoB,EACtC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,sBAAsB,CAAC,KAAK,CAAC,GACpC,qBAAqB,CAAC;IACzB,IAAI,CAAC,KAAK,SAAS,oBAAoB,EACtC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,sBAAsB,CAAC,KAAK,CAAC,GACpC,qBAAqB,CAAC;IACzB,KAAK,CAAC,KAAK,SAAS,oBAAoB,EACvC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,sBAAsB,CAAC,KAAK,CAAC,GACpC,qBAAqB,CAAC;CACzB;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,yBAA8B,GACrC,kBAAkB,CA0BpB"}
@@ -0,0 +1,128 @@
1
+ import { chmodSync, closeSync, mkdirSync, openSync, renameSync, rmSync, statSync, writeSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ const DEFAULT_MAX_BYTES = 5 * 1024 * 1024;
4
+ const MAX_TEXT_LENGTH = 200;
5
+ const SENSITIVE_PATH = /(^|[/\\])(?:auth\.json|credentials?(?:\.[^/\\]+)?)$/i;
6
+ const SENSITIVE_TEXT = /((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;
7
+ export function createConfigReloadLogger(agentDir, options = {}) {
8
+ const filePath = join(agentDir, "logs", "config-reload.log");
9
+ const maxBytes = validMaxBytes(options.maxBytes);
10
+ let disabled = false;
11
+ function log(level, event, details) {
12
+ if (disabled)
13
+ return { written: false, disabled: true };
14
+ try {
15
+ writeLine(filePath, JSON.stringify(formatEntry(level, event, details)), maxBytes);
16
+ return { written: true, disabled: false };
17
+ }
18
+ catch {
19
+ disabled = true;
20
+ return { written: false, disabled: true };
21
+ }
22
+ }
23
+ return {
24
+ debug: (event, details) => log("debug", event, details),
25
+ info: (event, details) => log("info", event, details),
26
+ warn: (event, details) => log("warn", event, details),
27
+ error: (event, details) => log("error", event, details),
28
+ };
29
+ }
30
+ function validMaxBytes(value) {
31
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : DEFAULT_MAX_BYTES;
32
+ }
33
+ function formatEntry(level, event, details) {
34
+ const entry = {
35
+ ts: new Date().toISOString(),
36
+ level,
37
+ event,
38
+ };
39
+ switch (event) {
40
+ case "watcher_started": {
41
+ const eventDetails = details;
42
+ entry.targetCount = finiteNumber(eventDetails.targetCount);
43
+ break;
44
+ }
45
+ case "change_detected": {
46
+ const eventDetails = details;
47
+ entry.registrationId = safeText(eventDetails.registrationId);
48
+ entry.paths = safePaths(eventDetails.paths);
49
+ entry.deferred = eventDetails.deferred === true;
50
+ break;
51
+ }
52
+ case "self_write_suppressed":
53
+ addSafePath(entry, details.path);
54
+ break;
55
+ case "reload_requested": {
56
+ const eventDetails = details;
57
+ entry.reason = safeText(eventDetails.reason);
58
+ entry.paths = safePaths(eventDetails.paths);
59
+ break;
60
+ }
61
+ case "reload_completed":
62
+ entry.durationMs = finiteNumber(details.durationMs);
63
+ break;
64
+ case "validation_rejected":
65
+ case "registration_rejected": {
66
+ const eventDetails = details;
67
+ entry.registrationId = safeText(eventDetails.registrationId);
68
+ entry.errorCount = finiteNumber(eventDetails.errorCount);
69
+ break;
70
+ }
71
+ case "watcher_error": {
72
+ const eventDetails = details;
73
+ addSafePath(entry, eventDetails.path);
74
+ entry.message = safeText(eventDetails.message);
75
+ break;
76
+ }
77
+ case "registration_added":
78
+ case "registration_removed":
79
+ entry.id = safeText(details.id);
80
+ break;
81
+ }
82
+ return entry;
83
+ }
84
+ function finiteNumber(value) {
85
+ return Number.isFinite(value) ? value : 0;
86
+ }
87
+ function addSafePath(entry, path) {
88
+ if (!SENSITIVE_PATH.test(path))
89
+ entry.path = safeText(path);
90
+ }
91
+ function safePaths(paths) {
92
+ return paths.filter((path) => !SENSITIVE_PATH.test(path)).map(safeText);
93
+ }
94
+ function safeText(value) {
95
+ const redacted = value.replace(SENSITIVE_TEXT, "$1[redacted]");
96
+ return redacted.length <= MAX_TEXT_LENGTH ? redacted : `${redacted.slice(0, MAX_TEXT_LENGTH - 3)}...`;
97
+ }
98
+ function writeLine(filePath, line, maxBytes) {
99
+ mkdirSync(dirname(filePath), { recursive: true, mode: 0o700 });
100
+ const text = `${line}\n`;
101
+ if (fileExceedsCap(filePath, Buffer.byteLength(text), maxBytes)) {
102
+ rmSync(`${filePath}.1`, { force: true });
103
+ renameSync(filePath, `${filePath}.1`);
104
+ chmodSync(`${filePath}.1`, 0o600);
105
+ }
106
+ const descriptor = openSync(filePath, "a", 0o600);
107
+ try {
108
+ writeSync(descriptor, text);
109
+ }
110
+ finally {
111
+ closeSync(descriptor);
112
+ }
113
+ chmodSync(filePath, 0o600);
114
+ }
115
+ function fileExceedsCap(filePath, incomingBytes, maxBytes) {
116
+ try {
117
+ return statSync(filePath).size + incomingBytes > maxBytes;
118
+ }
119
+ catch (error) {
120
+ if (isMissingFileError(error))
121
+ return false;
122
+ throw error;
123
+ }
124
+ }
125
+ function isMissingFileError(error) {
126
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
127
+ }
128
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/log.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmodSync, closeSync, mkdirSync, openSync, renameSync, rmSync, statSync, writeSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nconst DEFAULT_MAX_BYTES = 5 * 1024 * 1024;\nconst MAX_TEXT_LENGTH = 200;\nconst SENSITIVE_PATH = /(^|[/\\\\])(?:auth\\.json|credentials?(?:\\.[^/\\\\]+)?)$/i;\nconst SENSITIVE_TEXT =\n\t/((?:authorization\\s*[:=]\\s*(?:bearer|basic)\\s+)|(?:bearer\\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\\s&,\"'}\\]]+/gi;\n\nexport type ConfigReloadLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type ConfigReloadLogEvent =\n\t| \"watcher_started\"\n\t| \"change_detected\"\n\t| \"self_write_suppressed\"\n\t| \"reload_requested\"\n\t| \"reload_completed\"\n\t| \"validation_rejected\"\n\t| \"registration_rejected\"\n\t| \"watcher_error\"\n\t| \"registration_added\"\n\t| \"registration_removed\";\n\nexport interface ConfigReloadLogDetails {\n\twatcher_started: { targetCount: number };\n\tchange_detected: { registrationId: string; paths: readonly string[]; deferred: boolean };\n\tself_write_suppressed: { path: string };\n\treload_requested: { reason: string; paths: readonly string[] };\n\treload_completed: { durationMs: number };\n\tvalidation_rejected: { registrationId: string; errorCount: number };\n\tregistration_rejected: { registrationId: string; errorCount: number };\n\twatcher_error: { path: string; message: string };\n\tregistration_added: { id: string };\n\tregistration_removed: { id: string };\n}\n\nexport interface ConfigReloadLogStatus {\n\twritten: boolean;\n\tdisabled: boolean;\n}\n\nexport interface ConfigReloadLogger {\n\tdebug<Event extends ConfigReloadLogEvent>(\n\t\tevent: Event,\n\t\tdetails: ConfigReloadLogDetails[Event],\n\t): ConfigReloadLogStatus;\n\tinfo<Event extends ConfigReloadLogEvent>(\n\t\tevent: Event,\n\t\tdetails: ConfigReloadLogDetails[Event],\n\t): ConfigReloadLogStatus;\n\twarn<Event extends ConfigReloadLogEvent>(\n\t\tevent: Event,\n\t\tdetails: ConfigReloadLogDetails[Event],\n\t): ConfigReloadLogStatus;\n\terror<Event extends ConfigReloadLogEvent>(\n\t\tevent: Event,\n\t\tdetails: ConfigReloadLogDetails[Event],\n\t): ConfigReloadLogStatus;\n}\n\nexport interface ConfigReloadLoggerOptions {\n\tmaxBytes?: number;\n}\n\nexport function createConfigReloadLogger(\n\tagentDir: string,\n\toptions: ConfigReloadLoggerOptions = {},\n): ConfigReloadLogger {\n\tconst filePath = join(agentDir, \"logs\", \"config-reload.log\");\n\tconst maxBytes = validMaxBytes(options.maxBytes);\n\tlet disabled = false;\n\n\tfunction log<Event extends ConfigReloadLogEvent>(\n\t\tlevel: ConfigReloadLogLevel,\n\t\tevent: Event,\n\t\tdetails: ConfigReloadLogDetails[Event],\n\t): ConfigReloadLogStatus {\n\t\tif (disabled) return { written: false, disabled: true };\n\t\ttry {\n\t\t\twriteLine(filePath, JSON.stringify(formatEntry(level, event, details)), maxBytes);\n\t\t\treturn { written: true, disabled: false };\n\t\t} catch {\n\t\t\tdisabled = true;\n\t\t\treturn { written: false, disabled: true };\n\t\t}\n\t}\n\n\treturn {\n\t\tdebug: (event, details) => log(\"debug\", event, details),\n\t\tinfo: (event, details) => log(\"info\", event, details),\n\t\twarn: (event, details) => log(\"warn\", event, details),\n\t\terror: (event, details) => log(\"error\", event, details),\n\t};\n}\n\nfunction validMaxBytes(value: number | undefined): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value > 0 ? Math.floor(value) : DEFAULT_MAX_BYTES;\n}\n\nfunction formatEntry<Event extends ConfigReloadLogEvent>(\n\tlevel: ConfigReloadLogLevel,\n\tevent: Event,\n\tdetails: ConfigReloadLogDetails[Event],\n): Record<string, unknown> {\n\tconst entry: Record<string, unknown> = {\n\t\tts: new Date().toISOString(),\n\t\tlevel,\n\t\tevent,\n\t};\n\n\tswitch (event) {\n\t\tcase \"watcher_started\": {\n\t\t\tconst eventDetails = details as ConfigReloadLogDetails[\"watcher_started\"];\n\t\t\tentry.targetCount = finiteNumber(eventDetails.targetCount);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"change_detected\": {\n\t\t\tconst eventDetails = details as ConfigReloadLogDetails[\"change_detected\"];\n\t\t\tentry.registrationId = safeText(eventDetails.registrationId);\n\t\t\tentry.paths = safePaths(eventDetails.paths);\n\t\t\tentry.deferred = eventDetails.deferred === true;\n\t\t\tbreak;\n\t\t}\n\t\tcase \"self_write_suppressed\":\n\t\t\taddSafePath(entry, (details as ConfigReloadLogDetails[\"self_write_suppressed\"]).path);\n\t\t\tbreak;\n\t\tcase \"reload_requested\": {\n\t\t\tconst eventDetails = details as ConfigReloadLogDetails[\"reload_requested\"];\n\t\t\tentry.reason = safeText(eventDetails.reason);\n\t\t\tentry.paths = safePaths(eventDetails.paths);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"reload_completed\":\n\t\t\tentry.durationMs = finiteNumber((details as ConfigReloadLogDetails[\"reload_completed\"]).durationMs);\n\t\t\tbreak;\n\t\tcase \"validation_rejected\":\n\t\tcase \"registration_rejected\": {\n\t\t\tconst eventDetails = details as ConfigReloadLogDetails[\"validation_rejected\"];\n\t\t\tentry.registrationId = safeText(eventDetails.registrationId);\n\t\t\tentry.errorCount = finiteNumber(eventDetails.errorCount);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"watcher_error\": {\n\t\t\tconst eventDetails = details as ConfigReloadLogDetails[\"watcher_error\"];\n\t\t\taddSafePath(entry, eventDetails.path);\n\t\t\tentry.message = safeText(eventDetails.message);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"registration_added\":\n\t\tcase \"registration_removed\":\n\t\t\tentry.id = safeText((details as ConfigReloadLogDetails[\"registration_added\"]).id);\n\t\t\tbreak;\n\t}\n\n\treturn entry;\n}\n\nfunction finiteNumber(value: number): number {\n\treturn Number.isFinite(value) ? value : 0;\n}\n\nfunction addSafePath(entry: Record<string, unknown>, path: string): void {\n\tif (!SENSITIVE_PATH.test(path)) entry.path = safeText(path);\n}\n\nfunction safePaths(paths: readonly string[]): string[] {\n\treturn paths.filter((path) => !SENSITIVE_PATH.test(path)).map(safeText);\n}\n\nfunction safeText(value: string): string {\n\tconst redacted = value.replace(SENSITIVE_TEXT, \"$1[redacted]\");\n\treturn redacted.length <= MAX_TEXT_LENGTH ? redacted : `${redacted.slice(0, MAX_TEXT_LENGTH - 3)}...`;\n}\n\nfunction writeLine(filePath: string, line: string, maxBytes: number): void {\n\tmkdirSync(dirname(filePath), { recursive: true, mode: 0o700 });\n\tconst text = `${line}\\n`;\n\tif (fileExceedsCap(filePath, Buffer.byteLength(text), maxBytes)) {\n\t\trmSync(`${filePath}.1`, { force: true });\n\t\trenameSync(filePath, `${filePath}.1`);\n\t\tchmodSync(`${filePath}.1`, 0o600);\n\t}\n\tconst descriptor = openSync(filePath, \"a\", 0o600);\n\ttry {\n\t\twriteSync(descriptor, text);\n\t} finally {\n\t\tcloseSync(descriptor);\n\t}\n\tchmodSync(filePath, 0o600);\n}\n\nfunction fileExceedsCap(filePath: string, incomingBytes: number, maxBytes: number): boolean {\n\ttry {\n\t\treturn statSync(filePath).size + incomingBytes > maxBytes;\n\t} catch (error) {\n\t\tif (isMissingFileError(error)) return false;\n\t\tthrow error;\n\t}\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n"]}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * In-process wire contract for config-watch extensions.
3
+ *
4
+ * Event emitters are intentionally untyped, so consumers must use these guards
5
+ * before accepting a payload from `pi.events`.
6
+ */
7
+ export declare const configWatchChannels: {
8
+ readonly register: "config-watch:register";
9
+ readonly unregister: "config-watch:unregister";
10
+ readonly ready: "config-watch:ready";
11
+ readonly changed: "config-watch:changed";
12
+ readonly reloaded: "config-watch:reloaded";
13
+ readonly rejected: "config-watch:rejected";
14
+ };
15
+ export declare const CONFIG_WATCH_REGISTER: "config-watch:register";
16
+ export declare const CONFIG_WATCH_UNREGISTER: "config-watch:unregister";
17
+ export declare const CONFIG_WATCH_READY: "config-watch:ready";
18
+ export declare const CONFIG_WATCH_CHANGED: "config-watch:changed";
19
+ export declare const CONFIG_WATCH_RELOADED: "config-watch:reloaded";
20
+ export declare const CONFIG_WATCH_REJECTED: "config-watch:rejected";
21
+ export type ConfigWatchTargetKind = "file" | "dir";
22
+ export interface ConfigWatchTarget {
23
+ path: string;
24
+ kind: ConfigWatchTargetKind;
25
+ filterGlobs?: string[];
26
+ }
27
+ export type ConfigWatchValidation = {
28
+ ok: true;
29
+ } | {
30
+ ok: false;
31
+ errors: string[];
32
+ };
33
+ export interface ConfigWatchRegistration {
34
+ /** Registration IDs are unique; a later registration with the same ID replaces this one. */
35
+ id: string;
36
+ displayName: string;
37
+ targets: ConfigWatchTarget[];
38
+ validate?: (changedPaths: readonly string[]) => Promise<ConfigWatchValidation> | ConfigWatchValidation;
39
+ }
40
+ export interface ConfigWatchUnregistration {
41
+ id: string;
42
+ }
43
+ export interface ConfigWatchChanged {
44
+ registrationId: string;
45
+ paths: string[];
46
+ deferred: boolean;
47
+ }
48
+ export interface ConfigWatchReloaded {
49
+ registrationId: string;
50
+ paths: string[];
51
+ }
52
+ export interface ConfigWatchRejected {
53
+ registrationId: string;
54
+ paths: string[];
55
+ errors: string[];
56
+ }
57
+ export declare function isConfigWatchTarget(value: unknown): value is ConfigWatchTarget;
58
+ export declare function isConfigWatchRegistration(value: unknown): value is ConfigWatchRegistration;
59
+ export declare function isConfigWatchValidation(value: unknown): value is ConfigWatchValidation;
60
+ export declare function isConfigWatchUnregistration(value: unknown): value is ConfigWatchUnregistration;
61
+ export declare function isConfigWatchChanged(value: unknown): value is ConfigWatchChanged;
62
+ export declare function isConfigWatchReloaded(value: unknown): value is ConfigWatchReloaded;
63
+ export declare function isConfigWatchRejected(value: unknown): value is ConfigWatchRejected;
64
+ /**
65
+ * Matches plain file names, path suffixes, and a leading-star suffix pattern.
66
+ * This intentionally does not implement a full glob language.
67
+ */
68
+ export declare function matchesConfigWatchFilter(path: string, filterGlobs: readonly string[] | undefined): boolean;
69
+ /** Returns registrations keyed by ID, with later duplicate registrations taking precedence. */
70
+ export declare function resolveConfigWatchRegistrations(registrations: Iterable<ConfigWatchRegistration>): ConfigWatchRegistration[];
71
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;aAC/B,QAAQ,EAAE,uBAAuB;aACjC,UAAU,EAAE,yBAAyB;aACrC,KAAK,EAAE,oBAAoB;aAC3B,OAAO,EAAE,sBAAsB;aAC/B,QAAQ,EAAE,uBAAuB;aACjC,QAAQ,EAAE,uBAAuB;CACxB,CAAC;AAEX,eAAO,MAAM,qBAAqB,yBAA+B,CAAC;AAClE,eAAO,MAAM,uBAAuB,2BAAiC,CAAC;AACtE,eAAO,MAAM,kBAAkB,sBAA4B,CAAC;AAC5D,eAAO,MAAM,oBAAoB,wBAA8B,CAAC;AAChE,eAAO,MAAM,qBAAqB,yBAA+B,CAAC;AAClE,eAAO,MAAM,qBAAqB,yBAA+B,CAAC;AAElE,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,KAAK,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,qBAAqB,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,qBAAqB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEnF,MAAM,WAAW,uBAAuB;IACvC,4FAA4F;IAC5F,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,qBAAqB,CAAC,GAAG,qBAAqB,CAAC;CACvG;AAED,MAAM,WAAW,yBAAyB;IACzC,EAAE,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,kBAAkB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAUD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAO9E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,uBAAuB,CAS1F;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAGtF;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,yBAAyB,CAE9F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAOhF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAOlF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAS1G;AAED,+FAA+F;AAC/F,wBAAgB,+BAA+B,CAC9C,aAAa,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAC9C,uBAAuB,EAAE,CAE3B"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * In-process wire contract for config-watch extensions.
3
+ *
4
+ * Event emitters are intentionally untyped, so consumers must use these guards
5
+ * before accepting a payload from `pi.events`.
6
+ */
7
+ export const configWatchChannels = {
8
+ register: "config-watch:register",
9
+ unregister: "config-watch:unregister",
10
+ ready: "config-watch:ready",
11
+ changed: "config-watch:changed",
12
+ reloaded: "config-watch:reloaded",
13
+ rejected: "config-watch:rejected",
14
+ };
15
+ export const CONFIG_WATCH_REGISTER = configWatchChannels.register;
16
+ export const CONFIG_WATCH_UNREGISTER = configWatchChannels.unregister;
17
+ export const CONFIG_WATCH_READY = configWatchChannels.ready;
18
+ export const CONFIG_WATCH_CHANGED = configWatchChannels.changed;
19
+ export const CONFIG_WATCH_RELOADED = configWatchChannels.reloaded;
20
+ export const CONFIG_WATCH_REJECTED = configWatchChannels.rejected;
21
+ function isRecord(value) {
22
+ return typeof value === "object" && value !== null && !Array.isArray(value);
23
+ }
24
+ function isStringArray(value) {
25
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string");
26
+ }
27
+ export function isConfigWatchTarget(value) {
28
+ return (isRecord(value) &&
29
+ typeof value.path === "string" &&
30
+ (value.kind === "file" || value.kind === "dir") &&
31
+ (value.filterGlobs === undefined || isStringArray(value.filterGlobs)));
32
+ }
33
+ export function isConfigWatchRegistration(value) {
34
+ return (isRecord(value) &&
35
+ typeof value.id === "string" &&
36
+ typeof value.displayName === "string" &&
37
+ Array.isArray(value.targets) &&
38
+ value.targets.every(isConfigWatchTarget) &&
39
+ (value.validate === undefined || typeof value.validate === "function"));
40
+ }
41
+ export function isConfigWatchValidation(value) {
42
+ if (!isRecord(value) || typeof value.ok !== "boolean")
43
+ return false;
44
+ return value.ok || isStringArray(value.errors);
45
+ }
46
+ export function isConfigWatchUnregistration(value) {
47
+ return isRecord(value) && typeof value.id === "string";
48
+ }
49
+ export function isConfigWatchChanged(value) {
50
+ return (isRecord(value) &&
51
+ typeof value.registrationId === "string" &&
52
+ isStringArray(value.paths) &&
53
+ typeof value.deferred === "boolean");
54
+ }
55
+ export function isConfigWatchReloaded(value) {
56
+ return isRecord(value) && typeof value.registrationId === "string" && isStringArray(value.paths);
57
+ }
58
+ export function isConfigWatchRejected(value) {
59
+ return (isRecord(value) &&
60
+ typeof value.registrationId === "string" &&
61
+ isStringArray(value.paths) &&
62
+ isStringArray(value.errors));
63
+ }
64
+ /**
65
+ * Matches plain file names, path suffixes, and a leading-star suffix pattern.
66
+ * This intentionally does not implement a full glob language.
67
+ */
68
+ export function matchesConfigWatchFilter(path, filterGlobs) {
69
+ if (filterGlobs === undefined || filterGlobs.length === 0)
70
+ return true;
71
+ const normalizedPath = path.replaceAll("\\", "/");
72
+ const basename = normalizedPath.slice(normalizedPath.lastIndexOf("/") + 1);
73
+ return filterGlobs.some((filterGlob) => {
74
+ if (filterGlob.startsWith("*"))
75
+ return normalizedPath.endsWith(filterGlob.slice(1));
76
+ return basename === filterGlob || normalizedPath.endsWith(`/${filterGlob}`);
77
+ });
78
+ }
79
+ /** Returns registrations keyed by ID, with later duplicate registrations taking precedence. */
80
+ export function resolveConfigWatchRegistrations(registrations) {
81
+ return [...new Map([...registrations].map((registration) => [registration.id, registration])).values()];
82
+ }
83
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAClC,QAAQ,EAAE,uBAAuB;IACjC,UAAU,EAAE,yBAAyB;IACrC,KAAK,EAAE,oBAAoB;IAC3B,OAAO,EAAE,sBAAsB;IAC/B,QAAQ,EAAE,uBAAuB;IACjC,QAAQ,EAAE,uBAAuB;CACxB,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC,QAAQ,CAAC;AAClE,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC,UAAU,CAAC;AACtE,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,KAAK,CAAC;AAC5D,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,OAAO,CAAC;AAChE,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC,QAAQ,CAAC;AAClE,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC,QAAQ,CAAC;AAyClE,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IACjD,OAAO,CACN,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAC/C,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CACrE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACvD,OAAO,CACN,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC;QACxC,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,CACtE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACrD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACpE,OAAO,KAAK,CAAC,EAAE,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACzD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IAClD,OAAO,CACN,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;QACxC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1B,OAAO,KAAK,CAAC,QAAQ,KAAK,SAAS,CACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IACnD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IACnD,OAAO,CACN,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;QACxC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1B,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAC3B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,WAA0C;IAChG,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvE,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3E,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;QACtC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,OAAO,QAAQ,KAAK,UAAU,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,+BAA+B,CAC9C,aAAgD;IAEhD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACzG,CAAC","sourcesContent":["/**\n * In-process wire contract for config-watch extensions.\n *\n * Event emitters are intentionally untyped, so consumers must use these guards\n * before accepting a payload from `pi.events`.\n */\nexport const configWatchChannels = {\n\tregister: \"config-watch:register\",\n\tunregister: \"config-watch:unregister\",\n\tready: \"config-watch:ready\",\n\tchanged: \"config-watch:changed\",\n\treloaded: \"config-watch:reloaded\",\n\trejected: \"config-watch:rejected\",\n} as const;\n\nexport const CONFIG_WATCH_REGISTER = configWatchChannels.register;\nexport const CONFIG_WATCH_UNREGISTER = configWatchChannels.unregister;\nexport const CONFIG_WATCH_READY = configWatchChannels.ready;\nexport const CONFIG_WATCH_CHANGED = configWatchChannels.changed;\nexport const CONFIG_WATCH_RELOADED = configWatchChannels.reloaded;\nexport const CONFIG_WATCH_REJECTED = configWatchChannels.rejected;\n\nexport type ConfigWatchTargetKind = \"file\" | \"dir\";\n\nexport interface ConfigWatchTarget {\n\tpath: string;\n\tkind: ConfigWatchTargetKind;\n\tfilterGlobs?: string[];\n}\n\nexport type ConfigWatchValidation = { ok: true } | { ok: false; errors: string[] };\n\nexport interface ConfigWatchRegistration {\n\t/** Registration IDs are unique; a later registration with the same ID replaces this one. */\n\tid: string;\n\tdisplayName: string;\n\ttargets: ConfigWatchTarget[];\n\tvalidate?: (changedPaths: readonly string[]) => Promise<ConfigWatchValidation> | ConfigWatchValidation;\n}\n\nexport interface ConfigWatchUnregistration {\n\tid: string;\n}\n\nexport interface ConfigWatchChanged {\n\tregistrationId: string;\n\tpaths: string[];\n\tdeferred: boolean;\n}\n\nexport interface ConfigWatchReloaded {\n\tregistrationId: string;\n\tpaths: string[];\n}\n\nexport interface ConfigWatchRejected {\n\tregistrationId: string;\n\tpaths: string[];\n\terrors: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n\treturn Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nexport function isConfigWatchTarget(value: unknown): value is ConfigWatchTarget {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.path === \"string\" &&\n\t\t(value.kind === \"file\" || value.kind === \"dir\") &&\n\t\t(value.filterGlobs === undefined || isStringArray(value.filterGlobs))\n\t);\n}\n\nexport function isConfigWatchRegistration(value: unknown): value is ConfigWatchRegistration {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.displayName === \"string\" &&\n\t\tArray.isArray(value.targets) &&\n\t\tvalue.targets.every(isConfigWatchTarget) &&\n\t\t(value.validate === undefined || typeof value.validate === \"function\")\n\t);\n}\n\nexport function isConfigWatchValidation(value: unknown): value is ConfigWatchValidation {\n\tif (!isRecord(value) || typeof value.ok !== \"boolean\") return false;\n\treturn value.ok || isStringArray(value.errors);\n}\n\nexport function isConfigWatchUnregistration(value: unknown): value is ConfigWatchUnregistration {\n\treturn isRecord(value) && typeof value.id === \"string\";\n}\n\nexport function isConfigWatchChanged(value: unknown): value is ConfigWatchChanged {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.registrationId === \"string\" &&\n\t\tisStringArray(value.paths) &&\n\t\ttypeof value.deferred === \"boolean\"\n\t);\n}\n\nexport function isConfigWatchReloaded(value: unknown): value is ConfigWatchReloaded {\n\treturn isRecord(value) && typeof value.registrationId === \"string\" && isStringArray(value.paths);\n}\n\nexport function isConfigWatchRejected(value: unknown): value is ConfigWatchRejected {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.registrationId === \"string\" &&\n\t\tisStringArray(value.paths) &&\n\t\tisStringArray(value.errors)\n\t);\n}\n\n/**\n * Matches plain file names, path suffixes, and a leading-star suffix pattern.\n * This intentionally does not implement a full glob language.\n */\nexport function matchesConfigWatchFilter(path: string, filterGlobs: readonly string[] | undefined): boolean {\n\tif (filterGlobs === undefined || filterGlobs.length === 0) return true;\n\n\tconst normalizedPath = path.replaceAll(\"\\\\\", \"/\");\n\tconst basename = normalizedPath.slice(normalizedPath.lastIndexOf(\"/\") + 1);\n\treturn filterGlobs.some((filterGlob) => {\n\t\tif (filterGlob.startsWith(\"*\")) return normalizedPath.endsWith(filterGlob.slice(1));\n\t\treturn basename === filterGlob || normalizedPath.endsWith(`/${filterGlob}`);\n\t});\n}\n\n/** Returns registrations keyed by ID, with later duplicate registrations taking precedence. */\nexport function resolveConfigWatchRegistrations(\n\tregistrations: Iterable<ConfigWatchRegistration>,\n): ConfigWatchRegistration[] {\n\treturn [...new Map([...registrations].map((registration) => [registration.id, registration])).values()];\n}\n"]}
@@ -0,0 +1,43 @@
1
+ export type WatchTarget = {
2
+ readonly id: string;
3
+ readonly kind: "dir" | "dir-recursive";
4
+ readonly path: string;
5
+ readonly allowList?: readonly string[];
6
+ readonly filter?: (relPath: string) => boolean;
7
+ };
8
+ export type WatchEventListener = (eventType: string, filename: string | null) => void;
9
+ export type WatchEventSource = (path: string, listener: WatchEventListener, options?: {
10
+ readonly recursive: boolean;
11
+ }) => () => void;
12
+ export type WatchClock = {
13
+ setTimeout(callback: () => void, delayMs: number): ReturnType<typeof setTimeout>;
14
+ clearTimeout(timer: ReturnType<typeof setTimeout>): void;
15
+ };
16
+ export type RealChange = {
17
+ readonly changedPaths: readonly string[];
18
+ readonly created: readonly string[];
19
+ readonly deleted: readonly string[];
20
+ };
21
+ export type ConfigReloadWatchEngineOptions = {
22
+ readonly targets: readonly WatchTarget[];
23
+ readonly subscribe: WatchEventSource;
24
+ readonly onRealChange: (change: RealChange) => void;
25
+ readonly onError?: (error: unknown, path: string) => void;
26
+ readonly debounceMs?: number;
27
+ readonly clock?: WatchClock;
28
+ /** Test seam. Production callers use SHA-256 of file bytes. */
29
+ readonly hashFile?: (path: string) => string;
30
+ };
31
+ /**
32
+ * Hash-gates filesystem events. Targets are directories by design: watching a
33
+ * file directly breaks when editors atomically rename a replacement over it.
34
+ */
35
+ export declare class ConfigReloadWatchEngine {
36
+ #private;
37
+ constructor(options: ConfigReloadWatchEngineOptions);
38
+ close(): void;
39
+ getBaselineSnapshot(): ReadonlyMap<string, string>;
40
+ }
41
+ /** Production event source. Tests inject a deterministic source instead. */
42
+ export declare function createFsWatchEventSource(onError?: (error: unknown, path: string) => void): WatchEventSource;
43
+ //# sourceMappingURL=watch-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-engine.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/watch-engine.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,eAAe,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AAEtF,MAAM,MAAM,gBAAgB,GAAG,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,KACrC,MAAM,IAAI,CAAC;AAEhB,MAAM,MAAM,UAAU,GAAG;IACxB,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IACjF,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C,CAAC;AAqBF;;;GAGG;AACH,qBAAa,uBAAuB;;IAanC,YAAY,OAAO,EAAE,8BAA8B,EAgClD;IAED,KAAK,IAAI,IAAI,CAgBZ;IAED,mBAAmB,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAQjD;CAkOD;AAED,4EAA4E;AAC5E,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAe,GAAG,gBAAgB,CAUrH"}