@code-yeongyu/senpi 2026.6.14 → 2026.6.16

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 (317) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/dist/core/compaction/compaction.d.ts.map +1 -1
  3. package/dist/core/compaction/compaction.js +5 -0
  4. package/dist/core/compaction/compaction.js.map +1 -1
  5. package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
  6. package/dist/core/extensions/builtin/bash-timeout/index.js +3 -1
  7. package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
  8. package/dist/core/extensions/builtin/bash-timeout/timeout.js +2 -2
  9. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  10. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  11. package/dist/core/extensions/builtin/compaction/speculative.js +24 -12
  12. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  13. package/dist/core/extensions/builtin/goal/command.d.ts +14 -0
  14. package/dist/core/extensions/builtin/goal/command.d.ts.map +1 -0
  15. package/dist/core/extensions/builtin/goal/command.js +16 -0
  16. package/dist/core/extensions/builtin/goal/command.js.map +1 -0
  17. package/dist/core/extensions/builtin/goal/continuation.d.ts +4 -0
  18. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -0
  19. package/dist/core/extensions/builtin/goal/continuation.js +7 -0
  20. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -0
  21. package/dist/core/extensions/builtin/goal/errors.d.ts +13 -0
  22. package/dist/core/extensions/builtin/goal/errors.d.ts.map +1 -0
  23. package/dist/core/extensions/builtin/goal/errors.js +25 -0
  24. package/dist/core/extensions/builtin/goal/errors.js.map +1 -0
  25. package/dist/core/extensions/builtin/goal/format.d.ts +8 -0
  26. package/dist/core/extensions/builtin/goal/format.d.ts.map +1 -0
  27. package/dist/core/extensions/builtin/goal/format.js +71 -0
  28. package/dist/core/extensions/builtin/goal/format.js.map +1 -0
  29. package/dist/core/extensions/builtin/goal/index.d.ts +3 -0
  30. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -0
  31. package/dist/core/extensions/builtin/goal/index.js +322 -0
  32. package/dist/core/extensions/builtin/goal/index.js.map +1 -0
  33. package/dist/core/extensions/builtin/goal/prompt.d.ts +3 -0
  34. package/dist/core/extensions/builtin/goal/prompt.d.ts.map +1 -0
  35. package/dist/core/extensions/builtin/goal/prompt.js +34 -0
  36. package/dist/core/extensions/builtin/goal/prompt.js.map +1 -0
  37. package/dist/core/extensions/builtin/goal/store.d.ts +9 -0
  38. package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -0
  39. package/dist/core/extensions/builtin/goal/store.js +173 -0
  40. package/dist/core/extensions/builtin/goal/store.js.map +1 -0
  41. package/dist/core/extensions/builtin/goal/types.d.ts +50 -0
  42. package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -0
  43. package/dist/core/extensions/builtin/goal/types.js +6 -0
  44. package/dist/core/extensions/builtin/goal/types.js.map +1 -0
  45. package/dist/core/extensions/builtin/goal/ui.d.ts +6 -0
  46. package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -0
  47. package/dist/core/extensions/builtin/goal/ui.js +20 -0
  48. package/dist/core/extensions/builtin/goal/ui.js.map +1 -0
  49. package/dist/core/extensions/builtin/goal/validation.d.ts +3 -0
  50. package/dist/core/extensions/builtin/goal/validation.d.ts.map +1 -0
  51. package/dist/core/extensions/builtin/goal/validation.js +13 -0
  52. package/dist/core/extensions/builtin/goal/validation.js.map +1 -0
  53. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/index.js +10 -2
  55. package/dist/core/extensions/builtin/index.js.map +1 -1
  56. package/dist/core/extensions/builtin/nested-agents-md/core/containment.d.ts +10 -0
  57. package/dist/core/extensions/builtin/nested-agents-md/core/containment.d.ts.map +1 -0
  58. package/dist/core/extensions/builtin/nested-agents-md/core/containment.js +23 -0
  59. package/dist/core/extensions/builtin/nested-agents-md/core/containment.js.map +1 -0
  60. package/dist/core/extensions/builtin/nested-agents-md/core/errors.d.ts +5 -0
  61. package/dist/core/extensions/builtin/nested-agents-md/core/errors.d.ts.map +1 -0
  62. package/dist/core/extensions/builtin/nested-agents-md/core/errors.js +9 -0
  63. package/dist/core/extensions/builtin/nested-agents-md/core/errors.js.map +1 -0
  64. package/dist/core/extensions/builtin/nested-agents-md/core/find-agents-md-up.d.ts +7 -0
  65. package/dist/core/extensions/builtin/nested-agents-md/core/find-agents-md-up.d.ts.map +1 -0
  66. package/dist/core/extensions/builtin/nested-agents-md/core/find-agents-md-up.js +44 -0
  67. package/dist/core/extensions/builtin/nested-agents-md/core/find-agents-md-up.js.map +1 -0
  68. package/dist/core/extensions/builtin/nested-agents-md/core/format.d.ts +7 -0
  69. package/dist/core/extensions/builtin/nested-agents-md/core/format.d.ts.map +1 -0
  70. package/dist/core/extensions/builtin/nested-agents-md/core/format.js +7 -0
  71. package/dist/core/extensions/builtin/nested-agents-md/core/format.js.map +1 -0
  72. package/dist/core/extensions/builtin/nested-agents-md/core/inject-directory-context.d.ts +11 -0
  73. package/dist/core/extensions/builtin/nested-agents-md/core/inject-directory-context.d.ts.map +1 -0
  74. package/dist/core/extensions/builtin/nested-agents-md/core/inject-directory-context.js +77 -0
  75. package/dist/core/extensions/builtin/nested-agents-md/core/inject-directory-context.js.map +1 -0
  76. package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.d.ts +11 -0
  77. package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.d.ts.map +1 -0
  78. package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.js +33 -0
  79. package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.js.map +1 -0
  80. package/dist/core/extensions/builtin/nested-agents-md/core/session-key.d.ts +8 -0
  81. package/dist/core/extensions/builtin/nested-agents-md/core/session-key.d.ts.map +1 -0
  82. package/dist/core/extensions/builtin/nested-agents-md/core/session-key.js +8 -0
  83. package/dist/core/extensions/builtin/nested-agents-md/core/session-key.js.map +1 -0
  84. package/dist/core/extensions/builtin/nested-agents-md/core/truncate.d.ts +8 -0
  85. package/dist/core/extensions/builtin/nested-agents-md/core/truncate.d.ts.map +1 -0
  86. package/dist/core/extensions/builtin/nested-agents-md/core/truncate.js +26 -0
  87. package/dist/core/extensions/builtin/nested-agents-md/core/truncate.js.map +1 -0
  88. package/dist/core/extensions/builtin/nested-agents-md/core/types.d.ts +25 -0
  89. package/dist/core/extensions/builtin/nested-agents-md/core/types.d.ts.map +1 -0
  90. package/dist/core/extensions/builtin/nested-agents-md/core/types.js +4 -0
  91. package/dist/core/extensions/builtin/nested-agents-md/core/types.js.map +1 -0
  92. package/dist/core/extensions/builtin/nested-agents-md/index.d.ts +3 -0
  93. package/dist/core/extensions/builtin/nested-agents-md/index.d.ts.map +1 -0
  94. package/dist/core/extensions/builtin/nested-agents-md/index.js +102 -0
  95. package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -0
  96. package/dist/core/extensions/builtin/nested-agents-md/ui/reporter.d.ts +32 -0
  97. package/dist/core/extensions/builtin/nested-agents-md/ui/reporter.d.ts.map +1 -0
  98. package/dist/core/extensions/builtin/nested-agents-md/ui/reporter.js +66 -0
  99. package/dist/core/extensions/builtin/nested-agents-md/ui/reporter.js.map +1 -0
  100. package/dist/core/extensions/builtin/prompt-preset/presets.js +2 -2
  101. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  102. package/dist/core/extensions/builtin/rules/commands.d.ts +4 -0
  103. package/dist/core/extensions/builtin/rules/commands.d.ts.map +1 -0
  104. package/dist/core/extensions/builtin/rules/commands.js +87 -0
  105. package/dist/core/extensions/builtin/rules/commands.js.map +1 -0
  106. package/dist/core/extensions/builtin/rules/index.d.ts +3 -0
  107. package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -0
  108. package/dist/core/extensions/builtin/rules/index.js +127 -0
  109. package/dist/core/extensions/builtin/rules/index.js.map +1 -0
  110. package/dist/core/extensions/builtin/rules/rules/cache.d.ts +10 -0
  111. package/dist/core/extensions/builtin/rules/rules/cache.d.ts.map +1 -0
  112. package/dist/core/extensions/builtin/rules/rules/cache.js +51 -0
  113. package/dist/core/extensions/builtin/rules/rules/cache.js.map +1 -0
  114. package/dist/core/extensions/builtin/rules/rules/constants.d.ts +57 -0
  115. package/dist/core/extensions/builtin/rules/rules/constants.d.ts.map +1 -0
  116. package/dist/core/extensions/builtin/rules/rules/constants.js +96 -0
  117. package/dist/core/extensions/builtin/rules/rules/constants.js.map +1 -0
  118. package/dist/core/extensions/builtin/rules/rules/engine.d.ts +67 -0
  119. package/dist/core/extensions/builtin/rules/rules/engine.d.ts.map +1 -0
  120. package/dist/core/extensions/builtin/rules/rules/engine.js +443 -0
  121. package/dist/core/extensions/builtin/rules/rules/engine.js.map +1 -0
  122. package/dist/core/extensions/builtin/rules/rules/errors.d.ts +7 -0
  123. package/dist/core/extensions/builtin/rules/rules/errors.d.ts.map +1 -0
  124. package/dist/core/extensions/builtin/rules/rules/errors.js +13 -0
  125. package/dist/core/extensions/builtin/rules/rules/errors.js.map +1 -0
  126. package/dist/core/extensions/builtin/rules/rules/finder.d.ts +27 -0
  127. package/dist/core/extensions/builtin/rules/rules/finder.d.ts.map +1 -0
  128. package/dist/core/extensions/builtin/rules/rules/finder.js +241 -0
  129. package/dist/core/extensions/builtin/rules/rules/finder.js.map +1 -0
  130. package/dist/core/extensions/builtin/rules/rules/formatter.d.ts +8 -0
  131. package/dist/core/extensions/builtin/rules/rules/formatter.d.ts.map +1 -0
  132. package/dist/core/extensions/builtin/rules/rules/formatter.js +44 -0
  133. package/dist/core/extensions/builtin/rules/rules/formatter.js.map +1 -0
  134. package/dist/core/extensions/builtin/rules/rules/matcher.d.ts +25 -0
  135. package/dist/core/extensions/builtin/rules/rules/matcher.d.ts.map +1 -0
  136. package/dist/core/extensions/builtin/rules/rules/matcher.js +107 -0
  137. package/dist/core/extensions/builtin/rules/rules/matcher.js.map +1 -0
  138. package/dist/core/extensions/builtin/rules/rules/ordering.d.ts +4 -0
  139. package/dist/core/extensions/builtin/rules/rules/ordering.d.ts.map +1 -0
  140. package/dist/core/extensions/builtin/rules/rules/ordering.js +28 -0
  141. package/dist/core/extensions/builtin/rules/rules/ordering.js.map +1 -0
  142. package/dist/core/extensions/builtin/rules/rules/parser.d.ts +4 -0
  143. package/dist/core/extensions/builtin/rules/rules/parser.d.ts.map +1 -0
  144. package/dist/core/extensions/builtin/rules/rules/parser.js +290 -0
  145. package/dist/core/extensions/builtin/rules/rules/parser.js.map +1 -0
  146. package/dist/core/extensions/builtin/rules/rules/project-root.d.ts +2 -0
  147. package/dist/core/extensions/builtin/rules/rules/project-root.d.ts.map +1 -0
  148. package/dist/core/extensions/builtin/rules/rules/project-root.js +24 -0
  149. package/dist/core/extensions/builtin/rules/rules/project-root.js.map +1 -0
  150. package/dist/core/extensions/builtin/rules/rules/scanner.d.ts +14 -0
  151. package/dist/core/extensions/builtin/rules/rules/scanner.d.ts.map +1 -0
  152. package/dist/core/extensions/builtin/rules/rules/scanner.js +96 -0
  153. package/dist/core/extensions/builtin/rules/rules/scanner.js.map +1 -0
  154. package/dist/core/extensions/builtin/rules/rules/tool-paths.d.ts +4 -0
  155. package/dist/core/extensions/builtin/rules/rules/tool-paths.d.ts.map +1 -0
  156. package/dist/core/extensions/builtin/rules/rules/tool-paths.js +37 -0
  157. package/dist/core/extensions/builtin/rules/rules/tool-paths.js.map +1 -0
  158. package/dist/core/extensions/builtin/rules/rules/truncator.d.ts +18 -0
  159. package/dist/core/extensions/builtin/rules/rules/truncator.d.ts.map +1 -0
  160. package/dist/core/extensions/builtin/rules/rules/truncator.js +46 -0
  161. package/dist/core/extensions/builtin/rules/rules/truncator.js.map +1 -0
  162. package/dist/core/extensions/builtin/rules/rules/types.d.ts +124 -0
  163. package/dist/core/extensions/builtin/rules/rules/types.d.ts.map +1 -0
  164. package/dist/core/extensions/builtin/rules/rules/types.js +9 -0
  165. package/dist/core/extensions/builtin/rules/rules/types.js.map +1 -0
  166. package/dist/core/extensions/builtin/rules/ui/dynamic-border.d.ts +8 -0
  167. package/dist/core/extensions/builtin/rules/ui/dynamic-border.d.ts.map +1 -0
  168. package/dist/core/extensions/builtin/rules/ui/dynamic-border.js +10 -0
  169. package/dist/core/extensions/builtin/rules/ui/dynamic-border.js.map +1 -0
  170. package/dist/core/extensions/builtin/rules/ui/rules-banner.d.ts +22 -0
  171. package/dist/core/extensions/builtin/rules/ui/rules-banner.d.ts.map +1 -0
  172. package/dist/core/extensions/builtin/rules/ui/rules-banner.js +51 -0
  173. package/dist/core/extensions/builtin/rules/ui/rules-banner.js.map +1 -0
  174. package/dist/core/extensions/builtin/webfetch/index.d.ts +10 -0
  175. package/dist/core/extensions/builtin/webfetch/index.d.ts.map +1 -0
  176. package/dist/core/extensions/builtin/webfetch/index.js +53 -0
  177. package/dist/core/extensions/builtin/webfetch/index.js.map +1 -0
  178. package/dist/core/extensions/builtin/webfetch/webfetch/content.d.ts +4 -0
  179. package/dist/core/extensions/builtin/webfetch/webfetch/content.d.ts.map +1 -0
  180. package/dist/core/extensions/builtin/webfetch/webfetch/content.js +60 -0
  181. package/dist/core/extensions/builtin/webfetch/webfetch/content.js.map +1 -0
  182. package/dist/core/extensions/builtin/webfetch/webfetch/errors.d.ts +13 -0
  183. package/dist/core/extensions/builtin/webfetch/webfetch/errors.d.ts.map +1 -0
  184. package/dist/core/extensions/builtin/webfetch/webfetch/errors.js +25 -0
  185. package/dist/core/extensions/builtin/webfetch/webfetch/errors.js.map +1 -0
  186. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts +24 -0
  187. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts.map +1 -0
  188. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js +148 -0
  189. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js.map +1 -0
  190. package/dist/core/extensions/builtin/webfetch/webfetch/renderers.d.ts +15 -0
  191. package/dist/core/extensions/builtin/webfetch/webfetch/renderers.d.ts.map +1 -0
  192. package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js +110 -0
  193. package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js.map +1 -0
  194. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +28 -0
  195. package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts.map +1 -0
  196. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +79 -0
  197. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -0
  198. package/dist/core/extensions/builtin/websearch/index.d.ts +3 -0
  199. package/dist/core/extensions/builtin/websearch/index.d.ts.map +1 -0
  200. package/dist/core/extensions/builtin/websearch/index.js +76 -0
  201. package/dist/core/extensions/builtin/websearch/index.js.map +1 -0
  202. package/dist/core/extensions/builtin/websearch/websearch/config.d.ts +12 -0
  203. package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -0
  204. package/dist/core/extensions/builtin/websearch/websearch/config.js +245 -0
  205. package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -0
  206. package/dist/core/extensions/builtin/websearch/websearch/native.d.ts +19 -0
  207. package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -0
  208. package/dist/core/extensions/builtin/websearch/websearch/native.js +65 -0
  209. package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -0
  210. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.d.ts +5 -0
  211. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.d.ts.map +1 -0
  212. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js +58 -0
  213. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js.map +1 -0
  214. package/dist/core/extensions/builtin/websearch/websearch/providers.d.ts +4 -0
  215. package/dist/core/extensions/builtin/websearch/websearch/providers.d.ts.map +1 -0
  216. package/dist/core/extensions/builtin/websearch/websearch/providers.js +464 -0
  217. package/dist/core/extensions/builtin/websearch/websearch/providers.js.map +1 -0
  218. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts +26 -0
  219. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -0
  220. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +66 -0
  221. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -0
  222. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +9 -0
  223. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -0
  224. package/dist/core/extensions/builtin/websearch/websearch/search.js +261 -0
  225. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -0
  226. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts +18 -0
  227. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -0
  228. package/dist/core/extensions/builtin/websearch/websearch/tool.js +88 -0
  229. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -0
  230. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +115 -0
  231. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -0
  232. package/dist/core/extensions/builtin/websearch/websearch/types.js +2 -0
  233. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -0
  234. package/dist/core/extensions/runner.d.ts.map +1 -1
  235. package/dist/core/extensions/runner.js +8 -1
  236. package/dist/core/extensions/runner.js.map +1 -1
  237. package/dist/core/tools/bash.d.ts.map +1 -1
  238. package/dist/core/tools/bash.js +4 -0
  239. package/dist/core/tools/bash.js.map +1 -1
  240. package/dist/main.d.ts +5 -0
  241. package/dist/main.d.ts.map +1 -1
  242. package/dist/main.js +8 -4
  243. package/dist/main.js.map +1 -1
  244. package/dist/modes/interactive/components/diff.d.ts +14 -0
  245. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  246. package/dist/modes/interactive/components/diff.js +65 -1
  247. package/dist/modes/interactive/components/diff.js.map +1 -1
  248. package/dist/modes/interactive/components/session-selector.d.ts +0 -1
  249. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  250. package/dist/modes/interactive/components/session-selector.js +0 -4
  251. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  252. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  253. package/dist/modes/interactive/components/tree-selector.js +87 -12
  254. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  255. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  256. package/dist/modes/interactive/interactive-mode.js +6 -17
  257. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  258. package/dist/utils/child-process.d.ts +7 -4
  259. package/dist/utils/child-process.d.ts.map +1 -1
  260. package/dist/utils/child-process.js +23 -5
  261. package/dist/utils/child-process.js.map +1 -1
  262. package/docs/containerization.md +36 -36
  263. package/docs/extensions.md +4 -4
  264. package/docs/index.md +1 -1
  265. package/docs/security.md +13 -13
  266. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  267. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  268. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  269. package/examples/extensions/gondolin/package-lock.json +2 -2
  270. package/examples/extensions/gondolin/package.json +1 -1
  271. package/examples/extensions/question.ts +39 -18
  272. package/examples/extensions/questionnaire.ts +49 -28
  273. package/examples/extensions/sandbox/package-lock.json +2 -2
  274. package/examples/extensions/sandbox/package.json +1 -1
  275. package/examples/extensions/with-deps/package-lock.json +2 -2
  276. package/examples/extensions/with-deps/package.json +1 -1
  277. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
  278. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +5 -0
  279. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
  280. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  281. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  282. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +140 -47
  283. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  284. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +169 -122
  285. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  286. package/node_modules/@earendil-works/pi-ai/dist/models.js +4 -1
  287. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  288. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  289. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +18 -1
  290. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  291. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js +2 -1
  292. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
  293. package/node_modules/@earendil-works/pi-ai/dist/providers/google.js +2 -1
  294. package/node_modules/@earendil-works/pi-ai/dist/providers/google.js.map +1 -1
  295. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  296. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +20 -2
  297. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
  298. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +2 -0
  299. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  300. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  301. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-choice-fallback.d.ts +5 -0
  302. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-choice-fallback.d.ts.map +1 -0
  303. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-choice-fallback.js +41 -0
  304. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-choice-fallback.js.map +1 -0
  305. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  306. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  307. package/node_modules/@earendil-works/pi-tui/dist/tui.js +14 -1
  308. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  309. package/node_modules/@earendil-works/pi-tui/dist/utils.js +1 -1
  310. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  311. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  312. package/npm-shrinkwrap.json +45 -12
  313. package/package.json +8 -4
  314. package/dist/core/extensions/builtin/kimi-web-search/index.d.ts +0 -3
  315. package/dist/core/extensions/builtin/kimi-web-search/index.d.ts.map +0 -1
  316. package/dist/core/extensions/builtin/kimi-web-search/index.js +0 -208
  317. package/dist/core/extensions/builtin/kimi-web-search/index.js.map +0 -1
@@ -0,0 +1,8 @@
1
+ export interface TruncationResult {
2
+ result: string;
3
+ truncated: boolean;
4
+ originalBytes: number;
5
+ resultBytes: number;
6
+ }
7
+ export declare function truncateBytes(content: string, maxBytes: number): TruncationResult;
8
+ //# sourceMappingURL=truncate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/truncate.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAwBjF"}
@@ -0,0 +1,26 @@
1
+ const REPLACEMENT_CHAR = "\uFFFD";
2
+ const TEXT_ENCODER = new TextEncoder();
3
+ export function truncateBytes(content, maxBytes) {
4
+ const bytes = TEXT_ENCODER.encode(content);
5
+ if (bytes.byteLength <= maxBytes) {
6
+ return {
7
+ result: content,
8
+ truncated: false,
9
+ originalBytes: bytes.byteLength,
10
+ resultBytes: bytes.byteLength,
11
+ };
12
+ }
13
+ const decoder = new TextDecoder("utf-8", { fatal: false });
14
+ let decoded = decoder.decode(bytes.subarray(0, maxBytes));
15
+ while (decoded.endsWith(REPLACEMENT_CHAR)) {
16
+ decoded = decoded.slice(0, -1);
17
+ }
18
+ const finalBytes = TEXT_ENCODER.encode(decoded).byteLength;
19
+ return {
20
+ result: decoded,
21
+ truncated: true,
22
+ originalBytes: bytes.byteLength,
23
+ resultBytes: finalBytes,
24
+ };
25
+ }
26
+ //# sourceMappingURL=truncate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/truncate.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAClC,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC;AASvC,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,QAAgB;IAC9D,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;QAClC,OAAO;YACN,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,KAAK,CAAC,UAAU;YAC/B,WAAW,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC3C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IAC3D,OAAO;QACN,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,KAAK,CAAC,UAAU;QAC/B,WAAW,EAAE,UAAU;KACvB,CAAC;AACH,CAAC","sourcesContent":["const REPLACEMENT_CHAR = \"\\uFFFD\";\nconst TEXT_ENCODER = new TextEncoder();\n\nexport interface TruncationResult {\n\tresult: string;\n\ttruncated: boolean;\n\toriginalBytes: number;\n\tresultBytes: number;\n}\n\nexport function truncateBytes(content: string, maxBytes: number): TruncationResult {\n\tconst bytes = TEXT_ENCODER.encode(content);\n\tif (bytes.byteLength <= maxBytes) {\n\t\treturn {\n\t\t\tresult: content,\n\t\t\ttruncated: false,\n\t\t\toriginalBytes: bytes.byteLength,\n\t\t\tresultBytes: bytes.byteLength,\n\t\t};\n\t}\n\n\tconst decoder = new TextDecoder(\"utf-8\", { fatal: false });\n\tlet decoded = decoder.decode(bytes.subarray(0, maxBytes));\n\twhile (decoded.endsWith(REPLACEMENT_CHAR)) {\n\t\tdecoded = decoded.slice(0, -1);\n\t}\n\n\tconst finalBytes = TEXT_ENCODER.encode(decoded).byteLength;\n\treturn {\n\t\tresult: decoded,\n\t\ttruncated: true,\n\t\toriginalBytes: bytes.byteLength,\n\t\tresultBytes: finalBytes,\n\t};\n}\n"]}
@@ -0,0 +1,25 @@
1
+ export declare const DEFAULT_FILE_NAMES: readonly ["AGENTS.md"];
2
+ export declare const DEFAULT_MAX_BYTES_PER_FILE: number;
3
+ export declare const DEFAULT_MAX_BYTES_PER_READ: number;
4
+ export interface InjectedFileInfo {
5
+ absolutePath: string;
6
+ directory: string;
7
+ truncated: boolean;
8
+ originalBytes: number;
9
+ injectedBytes: number;
10
+ }
11
+ export interface InjectionFileError {
12
+ path: string;
13
+ error: Error;
14
+ }
15
+ export interface InjectionResult {
16
+ injectedText: string;
17
+ injectedFiles: InjectedFileInfo[];
18
+ errors: InjectionFileError[];
19
+ }
20
+ export interface InjectionConfig {
21
+ fileNames: readonly string[];
22
+ maxBytesPerFile: number;
23
+ maxBytesPerRead: number;
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,YAAI,WAAW,CAAU,CAAC;AACzD,eAAO,MAAM,0BAA0B,QAAY,CAAC;AACpD,eAAO,MAAM,0BAA0B,QAAa,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACxB"}
@@ -0,0 +1,4 @@
1
+ export const DEFAULT_FILE_NAMES = ["AGENTS.md"];
2
+ export const DEFAULT_MAX_BYTES_PER_FILE = 32 * 1024;
3
+ export const DEFAULT_MAX_BYTES_PER_READ = 128 * 1024;
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,WAAW,CAAU,CAAC;AACzD,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,IAAI,CAAC;AACpD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,GAAG,IAAI,CAAC","sourcesContent":["export const DEFAULT_FILE_NAMES = [\"AGENTS.md\"] as const;\nexport const DEFAULT_MAX_BYTES_PER_FILE = 32 * 1024;\nexport const DEFAULT_MAX_BYTES_PER_READ = 128 * 1024;\n\nexport interface InjectedFileInfo {\n\tabsolutePath: string;\n\tdirectory: string;\n\ttruncated: boolean;\n\toriginalBytes: number;\n\tinjectedBytes: number;\n}\n\nexport interface InjectionFileError {\n\tpath: string;\n\terror: Error;\n}\n\nexport interface InjectionResult {\n\tinjectedText: string;\n\tinjectedFiles: InjectedFileInfo[];\n\terrors: InjectionFileError[];\n}\n\nexport interface InjectionConfig {\n\tfileNames: readonly string[];\n\tmaxBytesPerFile: number;\n\tmaxBytesPerRead: number;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ExtensionAPI } from "../../types.ts";
2
+ export default function nestedAgentsMd(pi: ExtensionAPI): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/nested-agents-md/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAkBnD,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAoG7D"}
@@ -0,0 +1,102 @@
1
+ import { isReadToolResult } from "../../types.js";
2
+ import { injectDirectoryContext } from "./core/inject-directory-context.js";
3
+ import { InjectionCache } from "./core/injection-cache.js";
4
+ import { getSessionKey } from "./core/session-key.js";
5
+ import { buildDebugRecord, clearStatus, clearWidget, updateStatus, updateWidget, } from "./ui/reporter.js";
6
+ const FLAG_DISABLE = "no-nested-agents";
7
+ const COMMAND_TOGGLE = "nested-agents";
8
+ const ENTRY_TYPE_DEBUG = "nested-agents-md:debug";
9
+ export default function nestedAgentsMd(pi) {
10
+ pi.registerFlag(FLAG_DISABLE, {
11
+ description: "Disable nested AGENTS.md context injection.",
12
+ type: "boolean",
13
+ default: false,
14
+ });
15
+ const cache = new InjectionCache();
16
+ const filesPerSession = new Map();
17
+ const errorsPerSession = new Map();
18
+ // Widget visibility is extension-scoped because command registration currently has no session-local state hook.
19
+ let widgetVisible = false;
20
+ let disabled = false;
21
+ pi.on("session_start", async (_event, ctx) => {
22
+ disabled = pi.getFlag(FLAG_DISABLE) === true;
23
+ if (disabled) {
24
+ clearStatus(ctx);
25
+ clearWidget(ctx);
26
+ }
27
+ });
28
+ pi.on("tool_result", async (event, ctx) => {
29
+ if (disabled)
30
+ return undefined;
31
+ if (!isReadToolResult(event) || event.isError)
32
+ return undefined;
33
+ const filePath = event.input["path"];
34
+ if (typeof filePath !== "string" || filePath.length === 0)
35
+ return undefined;
36
+ const hasText = event.content.some((block) => block.type === "text");
37
+ if (!hasText)
38
+ return undefined;
39
+ const sessionKey = getSessionKey(ctx);
40
+ const result = await injectDirectoryContext({
41
+ filePath,
42
+ rootDir: ctx.cwd,
43
+ cache,
44
+ sessionKey,
45
+ });
46
+ const errorsRecorded = errorsPerSession.get(sessionKey) === true;
47
+ const hasErrors = errorsRecorded || result.errors.length > 0;
48
+ if (result.errors.length > 0)
49
+ errorsPerSession.set(sessionKey, true);
50
+ if (!result.injectedText) {
51
+ updateStatus(ctx, cache, sessionKey, hasErrors);
52
+ return undefined;
53
+ }
54
+ let metaMap = filesPerSession.get(sessionKey);
55
+ if (!metaMap) {
56
+ metaMap = new Map();
57
+ filesPerSession.set(sessionKey, metaMap);
58
+ }
59
+ for (const file of result.injectedFiles) {
60
+ metaMap.set(file.absolutePath, {
61
+ absolutePath: file.absolutePath,
62
+ truncated: file.truncated,
63
+ });
64
+ }
65
+ updateStatus(ctx, cache, sessionKey, hasErrors);
66
+ if (widgetVisible)
67
+ updateWidget(ctx, true, [...metaMap.values()]);
68
+ const textBlock = { type: "text", text: result.injectedText };
69
+ return { content: [...event.content, textBlock] };
70
+ });
71
+ pi.on("session_compact", async (_event, ctx) => {
72
+ const sessionKey = getSessionKey(ctx);
73
+ cache.clearSession(sessionKey);
74
+ filesPerSession.delete(sessionKey);
75
+ errorsPerSession.delete(sessionKey);
76
+ updateStatus(ctx, cache, sessionKey, false);
77
+ if (widgetVisible)
78
+ updateWidget(ctx, true, []);
79
+ });
80
+ pi.on("session_shutdown", async (_event, ctx) => {
81
+ const sessionKey = getSessionKey(ctx);
82
+ cache.clearSession(sessionKey);
83
+ filesPerSession.delete(sessionKey);
84
+ errorsPerSession.delete(sessionKey);
85
+ });
86
+ pi.registerCommand(COMMAND_TOGGLE, {
87
+ description: "Toggle the nested AGENTS.md context widget and dump cache state.",
88
+ handler: async (_args, ctx) => {
89
+ if (disabled) {
90
+ ctx.ui.notify("nested-agents-md is disabled via --no-nested-agents", "info");
91
+ return;
92
+ }
93
+ widgetVisible = !widgetVisible;
94
+ const sessionKey = getSessionKey(ctx);
95
+ const files = [...(filesPerSession.get(sessionKey)?.values() ?? [])];
96
+ updateWidget(ctx, widgetVisible, files);
97
+ pi.appendEntry(ENTRY_TYPE_DEBUG, buildDebugRecord({ cache, sessionKey, files }));
98
+ ctx.ui.notify(widgetVisible ? "Nested AGENTS.md context widget shown" : "Nested AGENTS.md context widget hidden", "info");
99
+ },
100
+ });
101
+ }
102
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/nested-agents-md/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TextContent } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.ts\";\nimport { isReadToolResult } from \"../../types.ts\";\nimport { injectDirectoryContext } from \"./core/inject-directory-context.ts\";\nimport { InjectionCache } from \"./core/injection-cache.ts\";\nimport { getSessionKey } from \"./core/session-key.ts\";\nimport {\n\tbuildDebugRecord,\n\tclearStatus,\n\tclearWidget,\n\ttype InjectedFileMeta,\n\tupdateStatus,\n\tupdateWidget,\n} from \"./ui/reporter.ts\";\n\nconst FLAG_DISABLE = \"no-nested-agents\";\nconst COMMAND_TOGGLE = \"nested-agents\";\nconst ENTRY_TYPE_DEBUG = \"nested-agents-md:debug\";\n\nexport default function nestedAgentsMd(pi: ExtensionAPI): void {\n\tpi.registerFlag(FLAG_DISABLE, {\n\t\tdescription: \"Disable nested AGENTS.md context injection.\",\n\t\ttype: \"boolean\",\n\t\tdefault: false,\n\t});\n\n\tconst cache = new InjectionCache();\n\tconst filesPerSession = new Map<string, Map<string, InjectedFileMeta>>();\n\tconst errorsPerSession = new Map<string, boolean>();\n\t// Widget visibility is extension-scoped because command registration currently has no session-local state hook.\n\tlet widgetVisible = false;\n\tlet disabled = false;\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tdisabled = pi.getFlag(FLAG_DISABLE) === true;\n\t\tif (disabled) {\n\t\t\tclearStatus(ctx);\n\t\t\tclearWidget(ctx);\n\t\t}\n\t});\n\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tif (disabled) return undefined;\n\t\tif (!isReadToolResult(event) || event.isError) return undefined;\n\t\tconst filePath = event.input[\"path\"];\n\t\tif (typeof filePath !== \"string\" || filePath.length === 0) return undefined;\n\t\tconst hasText = event.content.some((block) => block.type === \"text\");\n\t\tif (!hasText) return undefined;\n\n\t\tconst sessionKey = getSessionKey(ctx);\n\t\tconst result = await injectDirectoryContext({\n\t\t\tfilePath,\n\t\t\trootDir: ctx.cwd,\n\t\t\tcache,\n\t\t\tsessionKey,\n\t\t});\n\n\t\tconst errorsRecorded = errorsPerSession.get(sessionKey) === true;\n\t\tconst hasErrors = errorsRecorded || result.errors.length > 0;\n\t\tif (result.errors.length > 0) errorsPerSession.set(sessionKey, true);\n\n\t\tif (!result.injectedText) {\n\t\t\tupdateStatus(ctx, cache, sessionKey, hasErrors);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlet metaMap = filesPerSession.get(sessionKey);\n\t\tif (!metaMap) {\n\t\t\tmetaMap = new Map();\n\t\t\tfilesPerSession.set(sessionKey, metaMap);\n\t\t}\n\t\tfor (const file of result.injectedFiles) {\n\t\t\tmetaMap.set(file.absolutePath, {\n\t\t\t\tabsolutePath: file.absolutePath,\n\t\t\t\ttruncated: file.truncated,\n\t\t\t});\n\t\t}\n\n\t\tupdateStatus(ctx, cache, sessionKey, hasErrors);\n\t\tif (widgetVisible) updateWidget(ctx, true, [...metaMap.values()]);\n\n\t\tconst textBlock: TextContent = { type: \"text\", text: result.injectedText };\n\t\treturn { content: [...event.content, textBlock] };\n\t});\n\n\tpi.on(\"session_compact\", async (_event, ctx) => {\n\t\tconst sessionKey = getSessionKey(ctx);\n\t\tcache.clearSession(sessionKey);\n\t\tfilesPerSession.delete(sessionKey);\n\t\terrorsPerSession.delete(sessionKey);\n\t\tupdateStatus(ctx, cache, sessionKey, false);\n\t\tif (widgetVisible) updateWidget(ctx, true, []);\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tconst sessionKey = getSessionKey(ctx);\n\t\tcache.clearSession(sessionKey);\n\t\tfilesPerSession.delete(sessionKey);\n\t\terrorsPerSession.delete(sessionKey);\n\t});\n\n\tpi.registerCommand(COMMAND_TOGGLE, {\n\t\tdescription: \"Toggle the nested AGENTS.md context widget and dump cache state.\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (disabled) {\n\t\t\t\tctx.ui.notify(\"nested-agents-md is disabled via --no-nested-agents\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twidgetVisible = !widgetVisible;\n\t\t\tconst sessionKey = getSessionKey(ctx);\n\t\t\tconst files = [...(filesPerSession.get(sessionKey)?.values() ?? [])];\n\t\t\tupdateWidget(ctx, widgetVisible, files);\n\t\t\tpi.appendEntry(ENTRY_TYPE_DEBUG, buildDebugRecord({ cache, sessionKey, files }));\n\t\t\tctx.ui.notify(\n\t\t\t\twidgetVisible ? \"Nested AGENTS.md context widget shown\" : \"Nested AGENTS.md context widget hidden\",\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t},\n\t});\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import type { InjectionCache } from "../core/injection-cache.ts";
2
+ export declare const STATUS_KEY = "ext:nested-agents:status";
3
+ export declare const WIDGET_KEY = "ext:nested-agents:widget";
4
+ export interface ThemeFn {
5
+ fg(color: string, text: string): string;
6
+ }
7
+ export interface UiSurface {
8
+ hasUI: boolean;
9
+ cwd: string;
10
+ ui?: {
11
+ theme?: ThemeFn;
12
+ setStatus?(key: string, text: string | undefined): void;
13
+ setWidget?(key: string, lines: string[] | undefined, options?: {
14
+ placement?: "aboveEditor" | "belowEditor";
15
+ }): void;
16
+ notify?(message: string, level?: "info" | "warn" | "warning" | "error"): void;
17
+ };
18
+ }
19
+ export interface InjectedFileMeta {
20
+ absolutePath: string;
21
+ truncated: boolean;
22
+ }
23
+ export declare function updateStatus(ctx: UiSurface, cache: InjectionCache, sessionKey: string, hasErrors: boolean): void;
24
+ export declare function clearStatus(ctx: UiSurface): void;
25
+ export declare function updateWidget(ctx: UiSurface, visible: boolean, files: InjectedFileMeta[]): void;
26
+ export declare function clearWidget(ctx: UiSurface): void;
27
+ export declare function buildDebugRecord(input: {
28
+ cache: InjectionCache;
29
+ sessionKey: string;
30
+ files: InjectedFileMeta[];
31
+ }): Record<string, unknown>;
32
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/ui/reporter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,eAAO,MAAM,UAAU,6BAA6B,CAAC;AACrD,eAAO,MAAM,UAAU,6BAA6B,CAAC;AAErD,MAAM,WAAW,OAAO;IACvB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE;QACJ,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,SAAS,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;QACxD,SAAS,CAAC,CACT,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAC3B,OAAO,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,CAAA;SAAE,GACrD,IAAI,CAAC;QACR,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;KAC9E,CAAC;CACF;AAED,MAAM,WAAW,gBAAgB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAWhH;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAGhD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAc9F;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAGhD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACvC,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC1B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAU1B"}
@@ -0,0 +1,66 @@
1
+ import { isAbsolute, relative } from "node:path";
2
+ export const STATUS_KEY = "ext:nested-agents:status";
3
+ export const WIDGET_KEY = "ext:nested-agents:widget";
4
+ export function updateStatus(ctx, cache, sessionKey, hasErrors) {
5
+ if (!ctx.hasUI || !ctx.ui?.setStatus)
6
+ return;
7
+ const count = cache.getCacheSize(sessionKey);
8
+ if (count === 0) {
9
+ ctx.ui.setStatus(STATUS_KEY, undefined);
10
+ return;
11
+ }
12
+ const theme = ctx.ui.theme ?? identityTheme;
13
+ let text = theme.fg("dim", `🤖 ${count}`);
14
+ if (hasErrors)
15
+ text += theme.fg("warning", " ⚠️");
16
+ ctx.ui.setStatus(STATUS_KEY, text);
17
+ }
18
+ export function clearStatus(ctx) {
19
+ if (!ctx.hasUI || !ctx.ui?.setStatus)
20
+ return;
21
+ ctx.ui.setStatus(STATUS_KEY, undefined);
22
+ }
23
+ export function updateWidget(ctx, visible, files) {
24
+ if (!ctx.hasUI || !ctx.ui?.setWidget)
25
+ return;
26
+ if (!visible || files.length === 0) {
27
+ ctx.ui.setWidget(WIDGET_KEY, undefined);
28
+ return;
29
+ }
30
+ const theme = ctx.ui.theme ?? identityTheme;
31
+ const lines = [theme.fg("accent", "Nested Context:")];
32
+ for (const file of files) {
33
+ const display = displayPath(ctx.cwd, file.absolutePath);
34
+ const text = file.truncated ? ` ${display} (truncated)` : ` ${display}`;
35
+ lines.push(theme.fg(file.truncated ? "warning" : "dim", text));
36
+ }
37
+ ctx.ui.setWidget(WIDGET_KEY, lines, { placement: "aboveEditor" });
38
+ }
39
+ export function clearWidget(ctx) {
40
+ if (!ctx.hasUI || !ctx.ui?.setWidget)
41
+ return;
42
+ ctx.ui.setWidget(WIDGET_KEY, undefined);
43
+ }
44
+ export function buildDebugRecord(input) {
45
+ return {
46
+ sessionKey: input.sessionKey,
47
+ cacheSize: input.cache.getCacheSize(input.sessionKey),
48
+ injectedDirectories: input.cache.listInjected(input.sessionKey),
49
+ injectedFiles: input.files.map((f) => ({
50
+ path: f.absolutePath,
51
+ truncated: f.truncated,
52
+ })),
53
+ };
54
+ }
55
+ function displayPath(cwd, absolutePath) {
56
+ if (!isAbsolute(absolutePath))
57
+ return absolutePath;
58
+ const rel = relative(cwd, absolutePath);
59
+ if (rel === "" || rel === ".." || rel.startsWith("../") || isAbsolute(rel))
60
+ return absolutePath;
61
+ return rel;
62
+ }
63
+ const identityTheme = {
64
+ fg: (_color, text) => text,
65
+ };
66
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/ui/reporter.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute, relative } from \"node:path\";\nimport type { InjectionCache } from \"../core/injection-cache.ts\";\n\nexport const STATUS_KEY = \"ext:nested-agents:status\";\nexport const WIDGET_KEY = \"ext:nested-agents:widget\";\n\nexport interface ThemeFn {\n\tfg(color: string, text: string): string;\n}\n\nexport interface UiSurface {\n\thasUI: boolean;\n\tcwd: string;\n\tui?: {\n\t\ttheme?: ThemeFn;\n\t\tsetStatus?(key: string, text: string | undefined): void;\n\t\tsetWidget?(\n\t\t\tkey: string,\n\t\t\tlines: string[] | undefined,\n\t\t\toptions?: { placement?: \"aboveEditor\" | \"belowEditor\" },\n\t\t): void;\n\t\tnotify?(message: string, level?: \"info\" | \"warn\" | \"warning\" | \"error\"): void;\n\t};\n}\n\nexport interface InjectedFileMeta {\n\tabsolutePath: string;\n\ttruncated: boolean;\n}\n\nexport function updateStatus(ctx: UiSurface, cache: InjectionCache, sessionKey: string, hasErrors: boolean): void {\n\tif (!ctx.hasUI || !ctx.ui?.setStatus) return;\n\tconst count = cache.getCacheSize(sessionKey);\n\tif (count === 0) {\n\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\treturn;\n\t}\n\tconst theme = ctx.ui.theme ?? identityTheme;\n\tlet text = theme.fg(\"dim\", `🤖 ${count}`);\n\tif (hasErrors) text += theme.fg(\"warning\", \" ⚠️\");\n\tctx.ui.setStatus(STATUS_KEY, text);\n}\n\nexport function clearStatus(ctx: UiSurface): void {\n\tif (!ctx.hasUI || !ctx.ui?.setStatus) return;\n\tctx.ui.setStatus(STATUS_KEY, undefined);\n}\n\nexport function updateWidget(ctx: UiSurface, visible: boolean, files: InjectedFileMeta[]): void {\n\tif (!ctx.hasUI || !ctx.ui?.setWidget) return;\n\tif (!visible || files.length === 0) {\n\t\tctx.ui.setWidget(WIDGET_KEY, undefined);\n\t\treturn;\n\t}\n\tconst theme = ctx.ui.theme ?? identityTheme;\n\tconst lines = [theme.fg(\"accent\", \"Nested Context:\")];\n\tfor (const file of files) {\n\t\tconst display = displayPath(ctx.cwd, file.absolutePath);\n\t\tconst text = file.truncated ? ` ${display} (truncated)` : ` ${display}`;\n\t\tlines.push(theme.fg(file.truncated ? \"warning\" : \"dim\", text));\n\t}\n\tctx.ui.setWidget(WIDGET_KEY, lines, { placement: \"aboveEditor\" });\n}\n\nexport function clearWidget(ctx: UiSurface): void {\n\tif (!ctx.hasUI || !ctx.ui?.setWidget) return;\n\tctx.ui.setWidget(WIDGET_KEY, undefined);\n}\n\nexport function buildDebugRecord(input: {\n\tcache: InjectionCache;\n\tsessionKey: string;\n\tfiles: InjectedFileMeta[];\n}): Record<string, unknown> {\n\treturn {\n\t\tsessionKey: input.sessionKey,\n\t\tcacheSize: input.cache.getCacheSize(input.sessionKey),\n\t\tinjectedDirectories: input.cache.listInjected(input.sessionKey),\n\t\tinjectedFiles: input.files.map((f) => ({\n\t\t\tpath: f.absolutePath,\n\t\t\ttruncated: f.truncated,\n\t\t})),\n\t};\n}\n\nfunction displayPath(cwd: string, absolutePath: string): string {\n\tif (!isAbsolute(absolutePath)) return absolutePath;\n\tconst rel = relative(cwd, absolutePath);\n\tif (rel === \"\" || rel === \"..\" || rel.startsWith(\"../\") || isAbsolute(rel)) return absolutePath;\n\treturn rel;\n}\n\nconst identityTheme: ThemeFn = {\n\tfg: (_color: string, text: string) => text,\n};\n"]}
@@ -29,13 +29,13 @@ function extractGpt5Version(modelId) {
29
29
  return undefined;
30
30
  }
31
31
  function hasKimiK26Signal(value) {
32
- return /(?:^|[/@._-])kimi-k2(?:[._-]|p)6(?:$|[/@._-])/.test(normalizeModelId(value));
32
+ return /(?:^|[/@._-])kimi-k2(?:[._-]|p)6(?:$|[/@._:-])/.test(normalizeModelId(value));
33
33
  }
34
34
  function isKimiK26Model(model) {
35
35
  return hasKimiK26Signal(model.id) || (model.name !== undefined && hasKimiK26Signal(model.name));
36
36
  }
37
37
  function hasKimiK27Signal(value) {
38
- return /(?:^|[/@._-])kimi-k2(?:[._-]|p)7(?:$|[/@._-])/.test(normalizeModelId(value));
38
+ return /(?:^|[/@._-])kimi-k2(?:[._-]|p)7(?:$|[/@._:-])/.test(normalizeModelId(value));
39
39
  }
40
40
  function isKimiK27Model(model) {
41
41
  return hasKimiK27Signal(model.id) || (model.name !== undefined && hasKimiK27Signal(model.name));
@@ -1 +1 @@
1
- {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/prompt-preset/presets.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { BuildDynamicSystemPromptOptions } from \"../../../dynamic-prompt/build.ts\";\nimport { buildClaudeOpus45Prompt } from \"./claude-opus-4-5.ts\";\nimport { buildClaudeOpus46Prompt } from \"./claude-opus-4-6.ts\";\nimport { buildClaudeOpus47Prompt } from \"./claude-opus-4-7.ts\";\nimport { buildGpt52Prompt } from \"./gpt-5.2.ts\";\nimport { buildGpt53CodexPrompt } from \"./gpt-5.3-codex.ts\";\nimport { buildGpt54Prompt } from \"./gpt-5.4.ts\";\nimport { buildGpt55Prompt } from \"./gpt-5.5.ts\";\nimport { buildGpt5Prompt } from \"./gpt-5.ts\";\nimport { buildKimiK26Prompt } from \"./kimi-k2-6.ts\";\nimport { buildKimiK27Prompt } from \"./kimi-k2-7.ts\";\nimport { type PromptPresetName, type PromptPresetSettings, parsePromptPreset } from \"./settings.ts\";\n\nexport type { PromptPresetSettings } from \"./settings.ts\";\n\ntype ResolvedPresetName = Exclude<PromptPresetName, \"auto\">;\ntype ModelWithPromptPresetMetadata = Pick<Model<Api>, \"id\" | \"provider\"> & {\n\tname?: string;\n\tpromptPreset?: string;\n};\n\nexport interface ResolvedPromptPreset {\n\tname: ResolvedPresetName;\n\tprompt: string;\n}\n\nfunction normalizeModelId(modelId: string): string {\n\treturn modelId.toLowerCase().replace(/\\s+/g, \"-\");\n}\n\ntype Gpt5Version = \"gpt-5.2\" | \"gpt-5.3-codex\" | \"gpt-5.4\" | \"gpt-5.5\";\n\nfunction extractGpt5Version(modelId: string): Gpt5Version | undefined {\n\tconst normalized = normalizeModelId(modelId);\n\tif (normalized.includes(\"gpt-5.5\")) {\n\t\treturn \"gpt-5.5\";\n\t}\n\tif (normalized.includes(\"gpt-5.4\")) {\n\t\treturn \"gpt-5.4\";\n\t}\n\tif (normalized.includes(\"gpt-5.3\")) {\n\t\treturn \"gpt-5.3-codex\";\n\t}\n\tif (normalized.includes(\"gpt-5.2\")) {\n\t\treturn \"gpt-5.2\";\n\t}\n\treturn undefined;\n}\n\nfunction hasKimiK26Signal(value: string): boolean {\n\treturn /(?:^|[/@._-])kimi-k2(?:[._-]|p)6(?:$|[/@._-])/.test(normalizeModelId(value));\n}\n\nfunction isKimiK26Model(model: ModelWithPromptPresetMetadata): boolean {\n\treturn hasKimiK26Signal(model.id) || (model.name !== undefined && hasKimiK26Signal(model.name));\n}\n\nfunction hasKimiK27Signal(value: string): boolean {\n\treturn /(?:^|[/@._-])kimi-k2(?:[._-]|p)7(?:$|[/@._-])/.test(normalizeModelId(value));\n}\n\nfunction isKimiK27Model(model: ModelWithPromptPresetMetadata): boolean {\n\treturn hasKimiK27Signal(model.id) || (model.name !== undefined && hasKimiK27Signal(model.name));\n}\n\ntype ClaudeOpusVersion = \"claude-opus-4-7\" | \"claude-opus-4-6\" | \"claude-opus-4-5\";\n\nfunction extractClaudeOpusVersion(modelId: string): ClaudeOpusVersion | undefined {\n\tconst normalized = normalizeModelId(modelId);\n\tif (normalized.includes(\"opus-4-7\")) {\n\t\treturn \"claude-opus-4-7\";\n\t}\n\tif (normalized.includes(\"opus-4-6\")) {\n\t\treturn \"claude-opus-4-6\";\n\t}\n\tif (normalized.includes(\"opus-4-5\") || normalized.includes(\"opus-4.5\")) {\n\t\treturn \"claude-opus-4-5\";\n\t}\n\treturn undefined;\n}\n\nexport function resolvePresetName(\n\tmodel: ModelWithPromptPresetMetadata,\n\tsettings: PromptPresetSettings,\n): ResolvedPresetName | undefined {\n\tif (settings.promptPreset !== \"auto\") {\n\t\treturn settings.promptPreset;\n\t}\n\n\tconst modelPromptPreset = parsePromptPreset(model.promptPreset);\n\tif (modelPromptPreset && modelPromptPreset !== \"auto\") {\n\t\treturn modelPromptPreset;\n\t}\n\n\tconst gpt5Version = extractGpt5Version(model.id);\n\tif (gpt5Version) {\n\t\treturn gpt5Version;\n\t}\n\tif (isKimiK27Model(model)) {\n\t\treturn \"kimi-k2-7\";\n\t}\n\tif (isKimiK26Model(model)) {\n\t\treturn \"kimi-k2-6\";\n\t}\n\tconst claudeVersion = extractClaudeOpusVersion(model.id);\n\tif (claudeVersion) {\n\t\treturn claudeVersion;\n\t}\n\treturn undefined;\n}\n\nfunction buildPreset(name: ResolvedPresetName, options: BuildDynamicSystemPromptOptions): ResolvedPromptPreset {\n\tswitch (name) {\n\t\tcase \"gpt-5.5\":\n\t\t\treturn { name, prompt: buildGpt55Prompt(options) };\n\t\tcase \"gpt-5.4\":\n\t\t\treturn { name, prompt: buildGpt54Prompt(options) };\n\t\tcase \"gpt-5.3-codex\":\n\t\t\treturn { name, prompt: buildGpt53CodexPrompt(options) };\n\t\tcase \"gpt-5.2\":\n\t\t\treturn { name, prompt: buildGpt52Prompt(options) };\n\t\tcase \"gpt-5\":\n\t\t\treturn { name, prompt: buildGpt5Prompt(options) };\n\t\tcase \"kimi-k2-7\":\n\t\t\treturn { name, prompt: buildKimiK27Prompt(options) };\n\t\tcase \"kimi-k2-6\":\n\t\t\treturn { name, prompt: buildKimiK26Prompt(options) };\n\t\tcase \"claude-opus-4-7\":\n\t\t\treturn { name, prompt: buildClaudeOpus47Prompt(options) };\n\t\tcase \"claude-opus-4-6\":\n\t\t\treturn { name, prompt: buildClaudeOpus46Prompt(options) };\n\t\tcase \"claude-opus-4-5\":\n\t\t\treturn { name, prompt: buildClaudeOpus45Prompt(options) };\n\t}\n}\n\nfunction withDefaults(options: Partial<BuildDynamicSystemPromptOptions> = {}): BuildDynamicSystemPromptOptions {\n\treturn {\n\t\tcwd: options.cwd ?? \"\",\n\t\tselectedTools: options.selectedTools ?? [],\n\t\ttoolSnippets: options.toolSnippets ?? {},\n\t\tpromptGuidelines: options.promptGuidelines ?? [],\n\t\tcontextFiles: options.contextFiles ?? [],\n\t\tskills: options.skills ?? [],\n\t};\n}\n\nexport function resolvePreset(\n\tmodel: ModelWithPromptPresetMetadata,\n\tsettings: PromptPresetSettings,\n\toptions?: Partial<BuildDynamicSystemPromptOptions>,\n): ResolvedPromptPreset | undefined {\n\tconst name = resolvePresetName(model, settings);\n\tif (!name) {\n\t\treturn undefined;\n\t}\n\treturn buildPreset(name, withDefaults(options));\n}\n"]}
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/prompt-preset/presets.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { BuildDynamicSystemPromptOptions } from \"../../../dynamic-prompt/build.ts\";\nimport { buildClaudeOpus45Prompt } from \"./claude-opus-4-5.ts\";\nimport { buildClaudeOpus46Prompt } from \"./claude-opus-4-6.ts\";\nimport { buildClaudeOpus47Prompt } from \"./claude-opus-4-7.ts\";\nimport { buildGpt52Prompt } from \"./gpt-5.2.ts\";\nimport { buildGpt53CodexPrompt } from \"./gpt-5.3-codex.ts\";\nimport { buildGpt54Prompt } from \"./gpt-5.4.ts\";\nimport { buildGpt55Prompt } from \"./gpt-5.5.ts\";\nimport { buildGpt5Prompt } from \"./gpt-5.ts\";\nimport { buildKimiK26Prompt } from \"./kimi-k2-6.ts\";\nimport { buildKimiK27Prompt } from \"./kimi-k2-7.ts\";\nimport { type PromptPresetName, type PromptPresetSettings, parsePromptPreset } from \"./settings.ts\";\n\nexport type { PromptPresetSettings } from \"./settings.ts\";\n\ntype ResolvedPresetName = Exclude<PromptPresetName, \"auto\">;\ntype ModelWithPromptPresetMetadata = Pick<Model<Api>, \"id\" | \"provider\"> & {\n\tname?: string;\n\tpromptPreset?: string;\n};\n\nexport interface ResolvedPromptPreset {\n\tname: ResolvedPresetName;\n\tprompt: string;\n}\n\nfunction normalizeModelId(modelId: string): string {\n\treturn modelId.toLowerCase().replace(/\\s+/g, \"-\");\n}\n\ntype Gpt5Version = \"gpt-5.2\" | \"gpt-5.3-codex\" | \"gpt-5.4\" | \"gpt-5.5\";\n\nfunction extractGpt5Version(modelId: string): Gpt5Version | undefined {\n\tconst normalized = normalizeModelId(modelId);\n\tif (normalized.includes(\"gpt-5.5\")) {\n\t\treturn \"gpt-5.5\";\n\t}\n\tif (normalized.includes(\"gpt-5.4\")) {\n\t\treturn \"gpt-5.4\";\n\t}\n\tif (normalized.includes(\"gpt-5.3\")) {\n\t\treturn \"gpt-5.3-codex\";\n\t}\n\tif (normalized.includes(\"gpt-5.2\")) {\n\t\treturn \"gpt-5.2\";\n\t}\n\treturn undefined;\n}\n\nfunction hasKimiK26Signal(value: string): boolean {\n\treturn /(?:^|[/@._-])kimi-k2(?:[._-]|p)6(?:$|[/@._:-])/.test(normalizeModelId(value));\n}\n\nfunction isKimiK26Model(model: ModelWithPromptPresetMetadata): boolean {\n\treturn hasKimiK26Signal(model.id) || (model.name !== undefined && hasKimiK26Signal(model.name));\n}\n\nfunction hasKimiK27Signal(value: string): boolean {\n\treturn /(?:^|[/@._-])kimi-k2(?:[._-]|p)7(?:$|[/@._:-])/.test(normalizeModelId(value));\n}\n\nfunction isKimiK27Model(model: ModelWithPromptPresetMetadata): boolean {\n\treturn hasKimiK27Signal(model.id) || (model.name !== undefined && hasKimiK27Signal(model.name));\n}\n\ntype ClaudeOpusVersion = \"claude-opus-4-7\" | \"claude-opus-4-6\" | \"claude-opus-4-5\";\n\nfunction extractClaudeOpusVersion(modelId: string): ClaudeOpusVersion | undefined {\n\tconst normalized = normalizeModelId(modelId);\n\tif (normalized.includes(\"opus-4-7\")) {\n\t\treturn \"claude-opus-4-7\";\n\t}\n\tif (normalized.includes(\"opus-4-6\")) {\n\t\treturn \"claude-opus-4-6\";\n\t}\n\tif (normalized.includes(\"opus-4-5\") || normalized.includes(\"opus-4.5\")) {\n\t\treturn \"claude-opus-4-5\";\n\t}\n\treturn undefined;\n}\n\nexport function resolvePresetName(\n\tmodel: ModelWithPromptPresetMetadata,\n\tsettings: PromptPresetSettings,\n): ResolvedPresetName | undefined {\n\tif (settings.promptPreset !== \"auto\") {\n\t\treturn settings.promptPreset;\n\t}\n\n\tconst modelPromptPreset = parsePromptPreset(model.promptPreset);\n\tif (modelPromptPreset && modelPromptPreset !== \"auto\") {\n\t\treturn modelPromptPreset;\n\t}\n\n\tconst gpt5Version = extractGpt5Version(model.id);\n\tif (gpt5Version) {\n\t\treturn gpt5Version;\n\t}\n\tif (isKimiK27Model(model)) {\n\t\treturn \"kimi-k2-7\";\n\t}\n\tif (isKimiK26Model(model)) {\n\t\treturn \"kimi-k2-6\";\n\t}\n\tconst claudeVersion = extractClaudeOpusVersion(model.id);\n\tif (claudeVersion) {\n\t\treturn claudeVersion;\n\t}\n\treturn undefined;\n}\n\nfunction buildPreset(name: ResolvedPresetName, options: BuildDynamicSystemPromptOptions): ResolvedPromptPreset {\n\tswitch (name) {\n\t\tcase \"gpt-5.5\":\n\t\t\treturn { name, prompt: buildGpt55Prompt(options) };\n\t\tcase \"gpt-5.4\":\n\t\t\treturn { name, prompt: buildGpt54Prompt(options) };\n\t\tcase \"gpt-5.3-codex\":\n\t\t\treturn { name, prompt: buildGpt53CodexPrompt(options) };\n\t\tcase \"gpt-5.2\":\n\t\t\treturn { name, prompt: buildGpt52Prompt(options) };\n\t\tcase \"gpt-5\":\n\t\t\treturn { name, prompt: buildGpt5Prompt(options) };\n\t\tcase \"kimi-k2-7\":\n\t\t\treturn { name, prompt: buildKimiK27Prompt(options) };\n\t\tcase \"kimi-k2-6\":\n\t\t\treturn { name, prompt: buildKimiK26Prompt(options) };\n\t\tcase \"claude-opus-4-7\":\n\t\t\treturn { name, prompt: buildClaudeOpus47Prompt(options) };\n\t\tcase \"claude-opus-4-6\":\n\t\t\treturn { name, prompt: buildClaudeOpus46Prompt(options) };\n\t\tcase \"claude-opus-4-5\":\n\t\t\treturn { name, prompt: buildClaudeOpus45Prompt(options) };\n\t}\n}\n\nfunction withDefaults(options: Partial<BuildDynamicSystemPromptOptions> = {}): BuildDynamicSystemPromptOptions {\n\treturn {\n\t\tcwd: options.cwd ?? \"\",\n\t\tselectedTools: options.selectedTools ?? [],\n\t\ttoolSnippets: options.toolSnippets ?? {},\n\t\tpromptGuidelines: options.promptGuidelines ?? [],\n\t\tcontextFiles: options.contextFiles ?? [],\n\t\tskills: options.skills ?? [],\n\t};\n}\n\nexport function resolvePreset(\n\tmodel: ModelWithPromptPresetMetadata,\n\tsettings: PromptPresetSettings,\n\toptions?: Partial<BuildDynamicSystemPromptOptions>,\n): ResolvedPromptPreset | undefined {\n\tconst name = resolvePresetName(model, settings);\n\tif (!name) {\n\t\treturn undefined;\n\t}\n\treturn buildPreset(name, withDefaults(options));\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ExtensionAPI } from "../../types.ts";
2
+ import type { Engine } from "./rules/engine.ts";
3
+ export declare function registerSlashCommands(pi: ExtensionAPI, engine: Engine): void;
4
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,gBAAgB,CAAC;AAE5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAwD5E"}
@@ -0,0 +1,87 @@
1
+ const RULE_SUBCOMMANDS = ["list", "show", "paths", "status"];
2
+ export function registerSlashCommands(pi, engine) {
3
+ pi.registerCommand("rules", {
4
+ description: "Inspect loaded pi-rules.",
5
+ getArgumentCompletions: (prefix) => {
6
+ const completions = RULE_SUBCOMMANDS.filter((subcommand) => subcommand.startsWith(prefix)).map((subcommand) => ({
7
+ value: subcommand,
8
+ label: subcommand,
9
+ }));
10
+ return completions.length > 0 ? completions : null;
11
+ },
12
+ handler: async (args, ctx) => {
13
+ const tokens = args.trim().length === 0 ? [] : args.trim().split(/\s+/);
14
+ const subcommand = tokens[0] ?? "";
15
+ const loaded = engine.loadStaticRules(ctx.cwd);
16
+ if (subcommand === "" || subcommand === "status") {
17
+ notify(ctx, buildSummaryText(loaded.rules, loaded.diagnostics));
18
+ return;
19
+ }
20
+ if (subcommand === "list") {
21
+ notify(ctx, formatRuleList(loaded.rules));
22
+ return;
23
+ }
24
+ if (subcommand === "show") {
25
+ const id = tokens[1] ?? "";
26
+ const rule = findRuleById(loaded.rules, id);
27
+ if (rule === null) {
28
+ notify(ctx, `Rule not found: ${id}`, "error");
29
+ return;
30
+ }
31
+ notify(ctx, rule.body);
32
+ return;
33
+ }
34
+ if (subcommand === "paths") {
35
+ notify(ctx, loaded.rules.map((rule) => rule.path).join("\n"));
36
+ return;
37
+ }
38
+ notify(ctx, `Unknown /rules subcommand: ${subcommand}`, "error");
39
+ },
40
+ });
41
+ pi.registerCommand("reload-rules", {
42
+ description: "Reload pi-rules for the current session.",
43
+ handler: async (_args, ctx) => {
44
+ engine.resetSession(ctx.cwd);
45
+ const loaded = engine.loadStaticRules(ctx.cwd);
46
+ notify(ctx, buildReloadText(loaded.rules, loaded.diagnostics));
47
+ },
48
+ });
49
+ }
50
+ function notify(ctx, message, severity = "info") {
51
+ ctx.ui.notify(message, severity);
52
+ }
53
+ function buildSummaryText(rules, diagnostics) {
54
+ return appendDiagnostics(`pi-rules: ${rules.length} rules from ${countSources(rules)} sources`, diagnostics);
55
+ }
56
+ function buildReloadText(rules, diagnostics) {
57
+ return appendDiagnostics(`Reloaded ${rules.length} rules from ${countSources(rules)} sources`, diagnostics);
58
+ }
59
+ function appendDiagnostics(text, diagnostics) {
60
+ return diagnostics.length === 0 ? text : `${text}, ${diagnostics.length} diagnostics`;
61
+ }
62
+ function countSources(rules) {
63
+ return new Set(rules.map((rule) => rule.source)).size;
64
+ }
65
+ function formatRuleList(rules) {
66
+ return rules
67
+ .map((rule) => `${rule.relativePath} [${rule.source}, ${formatMatchReason(rule.matchReason)}]`)
68
+ .join("\n");
69
+ }
70
+ function formatMatchReason(matchReason) {
71
+ if (typeof matchReason === "string") {
72
+ return matchReason;
73
+ }
74
+ if (matchReason.kind === "no-match") {
75
+ return matchReason.kind;
76
+ }
77
+ return `${matchReason.kind}:${matchReason.pattern}`;
78
+ }
79
+ function findRuleById(rules, id) {
80
+ const exactMatch = rules.find((rule) => rule.relativePath === id);
81
+ if (exactMatch !== undefined) {
82
+ return exactMatch;
83
+ }
84
+ const suffixMatches = rules.filter((rule) => rule.relativePath.endsWith(id));
85
+ return suffixMatches.length === 1 ? (suffixMatches[0] ?? null) : null;
86
+ }
87
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/commands.ts"],"names":[],"mappings":"AAKA,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAEtE,MAAM,UAAU,qBAAqB,CAAC,EAAgB,EAAE,MAAc;IACrE,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE;QAC3B,WAAW,EAAE,0BAA0B;QACvC,sBAAsB,EAAE,CAAC,MAAM,EAAE,EAAE;YAClC,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAC7F,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBAChB,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,UAAU;aACjB,CAAC,CACF,CAAC;YACF,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QACpD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE/C,IAAI,UAAU,KAAK,EAAE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAClD,MAAM,CAAC,GAAG,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;gBAChE,OAAO;YACR,CAAC;YAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1C,OAAO;YACR,CAAC;YAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC5C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBACnB,MAAM,CAAC,GAAG,EAAE,mBAAmB,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;oBAC9C,OAAO;gBACR,CAAC;gBAED,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvB,OAAO;YACR,CAAC;YAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9D,OAAO;YACR,CAAC;YAED,MAAM,CAAC,GAAG,EAAE,8BAA8B,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;QAClE,CAAC;KACD,CAAC,CAAC;IAEH,EAAE,CAAC,eAAe,CAAC,cAAc,EAAE;QAClC,WAAW,EAAE,0CAA0C;QACvD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7B,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAChE,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,GAA4B,EAAE,OAAe,EAAE,QAAQ,GAAiC,MAAM;IAC7G,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAgC,EAAE,WAA0C;IACrG,OAAO,iBAAiB,CAAC,aAAa,KAAK,CAAC,MAAM,eAAe,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAC9G,CAAC;AAED,SAAS,eAAe,CAAC,KAAgC,EAAE,WAA0C;IACpG,OAAO,iBAAiB,CAAC,YAAY,KAAK,CAAC,MAAM,eAAe,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAC7G,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,WAA0C;IAClF,OAAO,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,WAAW,CAAC,MAAM,cAAc,CAAC;AACvF,CAAC;AAED,SAAS,YAAY,CAAC,KAAgC;IACrD,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,KAAgC;IACvD,OAAO,KAAK;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,MAAM,KAAK,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;SAC9F,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAwB;IAClD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,WAAW,CAAC;IACpB,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACrC,OAAO,WAAW,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,OAAO,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,YAAY,CAAC,KAAgC,EAAE,EAAU;IACjE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;IAClE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC","sourcesContent":["import type { ExtensionAPI, ExtensionCommandContext } from \"../../types.ts\";\n\nimport type { Engine } from \"./rules/engine.ts\";\nimport type { LoadedRule, MatchReason, RuleDiagnostic } from \"./rules/types.ts\";\n\nconst RULE_SUBCOMMANDS = [\"list\", \"show\", \"paths\", \"status\"] as const;\n\nexport function registerSlashCommands(pi: ExtensionAPI, engine: Engine): void {\n\tpi.registerCommand(\"rules\", {\n\t\tdescription: \"Inspect loaded pi-rules.\",\n\t\tgetArgumentCompletions: (prefix) => {\n\t\t\tconst completions = RULE_SUBCOMMANDS.filter((subcommand) => subcommand.startsWith(prefix)).map(\n\t\t\t\t(subcommand) => ({\n\t\t\t\t\tvalue: subcommand,\n\t\t\t\t\tlabel: subcommand,\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn completions.length > 0 ? completions : null;\n\t\t},\n\t\thandler: async (args, ctx) => {\n\t\t\tconst tokens = args.trim().length === 0 ? [] : args.trim().split(/\\s+/);\n\t\t\tconst subcommand = tokens[0] ?? \"\";\n\t\t\tconst loaded = engine.loadStaticRules(ctx.cwd);\n\n\t\t\tif (subcommand === \"\" || subcommand === \"status\") {\n\t\t\t\tnotify(ctx, buildSummaryText(loaded.rules, loaded.diagnostics));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (subcommand === \"list\") {\n\t\t\t\tnotify(ctx, formatRuleList(loaded.rules));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (subcommand === \"show\") {\n\t\t\t\tconst id = tokens[1] ?? \"\";\n\t\t\t\tconst rule = findRuleById(loaded.rules, id);\n\t\t\t\tif (rule === null) {\n\t\t\t\t\tnotify(ctx, `Rule not found: ${id}`, \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnotify(ctx, rule.body);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (subcommand === \"paths\") {\n\t\t\t\tnotify(ctx, loaded.rules.map((rule) => rule.path).join(\"\\n\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tnotify(ctx, `Unknown /rules subcommand: ${subcommand}`, \"error\");\n\t\t},\n\t});\n\n\tpi.registerCommand(\"reload-rules\", {\n\t\tdescription: \"Reload pi-rules for the current session.\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tengine.resetSession(ctx.cwd);\n\t\t\tconst loaded = engine.loadStaticRules(ctx.cwd);\n\t\t\tnotify(ctx, buildReloadText(loaded.rules, loaded.diagnostics));\n\t\t},\n\t});\n}\n\nfunction notify(ctx: ExtensionCommandContext, message: string, severity: \"info\" | \"warning\" | \"error\" = \"info\"): void {\n\tctx.ui.notify(message, severity);\n}\n\nfunction buildSummaryText(rules: ReadonlyArray<LoadedRule>, diagnostics: ReadonlyArray<RuleDiagnostic>): string {\n\treturn appendDiagnostics(`pi-rules: ${rules.length} rules from ${countSources(rules)} sources`, diagnostics);\n}\n\nfunction buildReloadText(rules: ReadonlyArray<LoadedRule>, diagnostics: ReadonlyArray<RuleDiagnostic>): string {\n\treturn appendDiagnostics(`Reloaded ${rules.length} rules from ${countSources(rules)} sources`, diagnostics);\n}\n\nfunction appendDiagnostics(text: string, diagnostics: ReadonlyArray<RuleDiagnostic>): string {\n\treturn diagnostics.length === 0 ? text : `${text}, ${diagnostics.length} diagnostics`;\n}\n\nfunction countSources(rules: ReadonlyArray<LoadedRule>): number {\n\treturn new Set(rules.map((rule) => rule.source)).size;\n}\n\nfunction formatRuleList(rules: ReadonlyArray<LoadedRule>): string {\n\treturn rules\n\t\t.map((rule) => `${rule.relativePath} [${rule.source}, ${formatMatchReason(rule.matchReason)}]`)\n\t\t.join(\"\\n\");\n}\n\nfunction formatMatchReason(matchReason: MatchReason): string {\n\tif (typeof matchReason === \"string\") {\n\t\treturn matchReason;\n\t}\n\tif (matchReason.kind === \"no-match\") {\n\t\treturn matchReason.kind;\n\t}\n\n\treturn `${matchReason.kind}:${matchReason.pattern}`;\n}\n\nfunction findRuleById(rules: ReadonlyArray<LoadedRule>, id: string): LoadedRule | null {\n\tconst exactMatch = rules.find((rule) => rule.relativePath === id);\n\tif (exactMatch !== undefined) {\n\t\treturn exactMatch;\n\t}\n\n\tconst suffixMatches = rules.filter((rule) => rule.relativePath.endsWith(id));\n\treturn suffixMatches.length === 1 ? (suffixMatches[0] ?? null) : null;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ExtensionAPI } from "../../types.ts";
2
+ export default function piRulesExtension(pi: ExtensionAPI): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAanD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAgI/D"}