@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 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n\tGoalAlreadyExistsError,\n\tGoalNotFoundError,\n\tInvalidGoalStoreError,\n\tUnsupportedGoalStoreVersionError,\n} from \"./errors.ts\";\nimport type { Goal, GoalAccountingMode, GoalFile, GoalStoreRef, GoalUpdate, TokenUsageSnapshot } from \"./types.ts\";\nimport { isRecord } from \"./types.ts\";\nimport { validateObjective } from \"./validation.ts\";\n\nconst STORE_VERSION = 1;\n\nexport function goalFilePath(ref: GoalStoreRef): string {\n\treturn join(ref.baseDir, `${encodeURIComponent(ref.threadId)}.json`);\n}\n\nexport async function readGoal(ref: GoalStoreRef): Promise<Goal | null> {\n\tconst filePath = goalFilePath(ref);\n\ttry {\n\t\tconst raw = await readFile(filePath, \"utf8\");\n\t\treturn parseGoalFile(raw).goal;\n\t} catch (error) {\n\t\tif (isMissingFile(error)) return null;\n\t\tthrow error;\n\t}\n}\n\nexport async function writeGoal(ref: GoalStoreRef, goal: Goal | null): Promise<void> {\n\tconst filePath = goalFilePath(ref);\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tconst file: GoalFile = { version: STORE_VERSION, goal };\n\tawait writeFile(filePath, `${JSON.stringify(file, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function createGoal(ref: GoalStoreRef, objective: string): Promise<Goal> {\n\tif ((await readGoal(ref)) !== null) {\n\t\tthrow new GoalAlreadyExistsError(\"cannot create a new goal because this thread already has a goal\");\n\t}\n\n\tconst normalizedObjective = validateObjective(objective);\n\tconst now = nowSeconds();\n\tconst goal: Goal = {\n\t\tid: randomUUID(),\n\t\tthreadId: ref.threadId,\n\t\tobjective: normalizedObjective,\n\t\tstatus: \"active\",\n\t\ttokensUsed: 0,\n\t\ttimeUsedSeconds: 0,\n\t\tcreatedAt: now,\n\t\tupdatedAt: now,\n\t\tlastStartedAt: now,\n\t};\n\tawait writeGoal(ref, goal);\n\treturn goal;\n}\n\nexport async function updateGoal(ref: GoalStoreRef, update: GoalUpdate): Promise<Goal> {\n\tconst current = await readGoal(ref);\n\tif (!current) throw new GoalNotFoundError(\"cannot update goal: no goal exists\");\n\n\tconst objective = update.objective === undefined ? current.objective : validateObjective(update.objective);\n\tconst now = nowSeconds();\n\tconst hasObjectiveUpdate = update.objective !== undefined;\n\tconst replacesGoal = hasObjectiveUpdate && (objective !== current.objective || current.status === \"complete\");\n\tconst requestedStatus = update.status ?? (hasObjectiveUpdate ? \"active\" : undefined);\n\n\tif (replacesGoal) {\n\t\tconst status = requestedStatus ?? \"active\";\n\t\tconst next: Goal = {\n\t\t\tid: randomUUID(),\n\t\t\tthreadId: ref.threadId,\n\t\t\tobjective,\n\t\t\tstatus,\n\t\t\ttokensUsed: 0,\n\t\t\ttimeUsedSeconds: 0,\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t};\n\t\tif (status === \"active\") next.lastStartedAt = now;\n\t\tif (status === \"complete\") next.completedAt = now;\n\t\tawait writeGoal(ref, next);\n\t\treturn next;\n\t}\n\n\tconst status = requestedStatus ?? current.status;\n\tconst next: Goal = {\n\t\t...current,\n\t\tobjective,\n\t\tstatus,\n\t\tupdatedAt: now,\n\t};\n\n\tif (status === \"active\" && current.status !== \"active\") {\n\t\tnext.lastStartedAt = now;\n\t} else if (status !== \"active\") {\n\t\tdelete next.lastStartedAt;\n\t}\n\n\tif (status === \"complete\") {\n\t\tnext.completedAt = current.completedAt ?? now;\n\t} else {\n\t\tdelete next.completedAt;\n\t}\n\n\tawait writeGoal(ref, next);\n\treturn next;\n}\n\nexport async function clearGoal(ref: GoalStoreRef): Promise<boolean> {\n\tconst hadGoal = (await readGoal(ref)) !== null;\n\tawait writeGoal(ref, null);\n\treturn hadGoal;\n}\n\nexport async function accountGoalUsage(\n\tref: GoalStoreRef,\n\tusage: TokenUsageSnapshot,\n\telapsedSeconds: number,\n\tmode: GoalAccountingMode = \"active\",\n\texpectedGoalId?: string,\n): Promise<Goal | null> {\n\tconst goal = await readGoal(ref);\n\tif (!goal) return goal;\n\tif (expectedGoalId !== undefined && goal.id !== expectedGoalId) return goal;\n\tif (!canAccountGoalUsage(goal, mode)) return goal;\n\n\tconst now = nowSeconds();\n\tconst next: Goal = {\n\t\t...goal,\n\t\ttokensUsed: goal.tokensUsed + goalTokenDeltaForUsage(usage),\n\t\ttimeUsedSeconds: goal.timeUsedSeconds + Math.max(0, Math.trunc(elapsedSeconds)),\n\t\tupdatedAt: now,\n\t};\n\tawait writeGoal(ref, next);\n\treturn next;\n}\n\nfunction canAccountGoalUsage(goal: Goal, mode: GoalAccountingMode): boolean {\n\tswitch (mode) {\n\t\tcase \"active\":\n\t\t\treturn goal.status === \"active\";\n\t\tcase \"activeOrComplete\":\n\t\t\treturn goal.status === \"active\" || goal.status === \"complete\";\n\t}\n}\n\nfunction goalTokenDeltaForUsage(usage: TokenUsageSnapshot): number {\n\treturn Math.max(0, usage.input) + Math.max(0, usage.output);\n}\n\nfunction parseGoalFile(raw: string): GoalFile {\n\tconst parsed: unknown = JSON.parse(raw);\n\tif (!isRecord(parsed)) throw new InvalidGoalStoreError(\"goal store must be a JSON object\");\n\tif (parsed.version !== STORE_VERSION) throw new UnsupportedGoalStoreVersionError(\"unsupported goal store version\");\n\tconst goal = parsed.goal;\n\tif (goal !== null && !isGoal(goal)) throw new InvalidGoalStoreError(\"goal store contains an invalid goal\");\n\treturn {\n\t\tversion: STORE_VERSION,\n\t\tgoal,\n\t};\n}\n\nfunction isMissingFile(error: unknown): boolean {\n\treturn error instanceof Error && \"code\" in error && (error as { code: unknown }).code === \"ENOENT\";\n}\n\nfunction isGoal(value: unknown): value is Goal {\n\tif (!isRecord(value)) return false;\n\treturn (\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.threadId === \"string\" &&\n\t\ttypeof value.objective === \"string\" &&\n\t\tisGoalStatus(value.status) &&\n\t\tisNonNegativeSafeInteger(value.tokensUsed) &&\n\t\tisNonNegativeSafeInteger(value.timeUsedSeconds) &&\n\t\tisNonNegativeSafeInteger(value.createdAt) &&\n\t\tisNonNegativeSafeInteger(value.updatedAt) &&\n\t\t(value.lastStartedAt === undefined || isNonNegativeSafeInteger(value.lastStartedAt)) &&\n\t\t(value.completedAt === undefined || isNonNegativeSafeInteger(value.completedAt))\n\t);\n}\n\nfunction isGoalStatus(value: unknown): value is Goal[\"status\"] {\n\treturn value === \"active\" || value === \"paused\" || value === \"complete\";\n}\n\nfunction isNonNegativeSafeInteger(value: unknown): value is number {\n\treturn Number.isSafeInteger(value) && (value as number) >= 0;\n}\n\nfunction nowSeconds(): number {\n\treturn Math.trunc(Date.now() / 1000);\n}\n"]}
@@ -0,0 +1,50 @@
1
+ export declare const GOAL_STATUS_VALUES: readonly ["active", "paused", "complete"];
2
+ export declare const COMPLETABLE_GOAL_STATUS_VALUES: readonly ["complete"];
3
+ export type GoalStatus = (typeof GOAL_STATUS_VALUES)[number];
4
+ export type CompletableGoalStatus = (typeof COMPLETABLE_GOAL_STATUS_VALUES)[number];
5
+ export type GoalStoreRef = {
6
+ baseDir: string;
7
+ threadId: string;
8
+ };
9
+ export type GoalAccountingMode = "active" | "activeOrComplete";
10
+ export type Goal = {
11
+ id: string;
12
+ threadId: string;
13
+ objective: string;
14
+ status: GoalStatus;
15
+ tokensUsed: number;
16
+ timeUsedSeconds: number;
17
+ createdAt: number;
18
+ updatedAt: number;
19
+ lastStartedAt?: number;
20
+ completedAt?: number;
21
+ };
22
+ export type GoalFile = {
23
+ version: 1;
24
+ goal: Goal | null;
25
+ };
26
+ export type TokenUsageSnapshot = {
27
+ input: number;
28
+ output: number;
29
+ cacheRead: number;
30
+ cacheWrite: number;
31
+ totalTokens: number;
32
+ };
33
+ export type GoalUpdate = {
34
+ objective?: string;
35
+ status?: GoalStatus;
36
+ };
37
+ export type GoalToolSnapshot = {
38
+ threadId: string;
39
+ objective: string;
40
+ status: GoalStatus;
41
+ tokensUsed: number;
42
+ timeUsedSeconds: number;
43
+ createdAt: number;
44
+ updatedAt: number;
45
+ };
46
+ export type GoalToolResponse = {
47
+ goal: GoalToolSnapshot | null;
48
+ };
49
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
50
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,YAAI,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;AAC5E,eAAO,MAAM,8BAA8B,YAAI,UAAU,CAAU,CAAC;AAEpE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7D,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpF,MAAM,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,kBAAkB,CAAC;AAE/D,MAAM,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
@@ -0,0 +1,6 @@
1
+ export const GOAL_STATUS_VALUES = ["active", "paused", "complete"];
2
+ export const COMPLETABLE_GOAL_STATUS_VALUES = ["complete"];
3
+ export function isRecord(value) {
4
+ return typeof value === "object" && value !== null;
5
+ }
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;AAC5E,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,UAAU,CAAU,CAAC;AAyDpE,MAAM,UAAU,QAAQ,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACpD,CAAC","sourcesContent":["export const GOAL_STATUS_VALUES = [\"active\", \"paused\", \"complete\"] as const;\nexport const COMPLETABLE_GOAL_STATUS_VALUES = [\"complete\"] as const;\n\nexport type GoalStatus = (typeof GOAL_STATUS_VALUES)[number];\nexport type CompletableGoalStatus = (typeof COMPLETABLE_GOAL_STATUS_VALUES)[number];\n\nexport type GoalStoreRef = {\n\tbaseDir: string;\n\tthreadId: string;\n};\n\nexport type GoalAccountingMode = \"active\" | \"activeOrComplete\";\n\nexport type Goal = {\n\tid: string;\n\tthreadId: string;\n\tobjective: string;\n\tstatus: GoalStatus;\n\ttokensUsed: number;\n\ttimeUsedSeconds: number;\n\tcreatedAt: number;\n\tupdatedAt: number;\n\tlastStartedAt?: number;\n\tcompletedAt?: number;\n};\n\nexport type GoalFile = {\n\tversion: 1;\n\tgoal: Goal | null;\n};\n\nexport type TokenUsageSnapshot = {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotalTokens: number;\n};\n\nexport type GoalUpdate = {\n\tobjective?: string;\n\tstatus?: GoalStatus;\n};\n\nexport type GoalToolSnapshot = {\n\tthreadId: string;\n\tobjective: string;\n\tstatus: GoalStatus;\n\ttokensUsed: number;\n\ttimeUsedSeconds: number;\n\tcreatedAt: number;\n\tupdatedAt: number;\n};\n\nexport type GoalToolResponse = {\n\tgoal: GoalToolSnapshot | null;\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ExtensionContext } from "../../types.ts";
2
+ import type { Goal } from "./types.ts";
3
+ export declare const STATUS_KEY = "goal";
4
+ export declare function updateGoalUi(ctx: ExtensionContext, goal: Goal | null): void;
5
+ export declare function goalStatusText(goal: Goal): string;
6
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAG3E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAWjD"}
@@ -0,0 +1,20 @@
1
+ import { formatGoalElapsedSeconds } from "./format.js";
2
+ export const STATUS_KEY = "goal";
3
+ export function updateGoalUi(ctx, goal) {
4
+ if (!ctx.hasUI)
5
+ return;
6
+ ctx.ui.setStatus(STATUS_KEY, goal === null ? undefined : goalStatusText(goal));
7
+ }
8
+ export function goalStatusText(goal) {
9
+ switch (goal.status) {
10
+ case "active":
11
+ return goal.timeUsedSeconds > 0
12
+ ? `Pursuing goal (${formatGoalElapsedSeconds(goal.timeUsedSeconds)})`
13
+ : "Pursuing goal";
14
+ case "paused":
15
+ return "Goal paused (/goal resume)";
16
+ case "complete":
17
+ return "Goal achieved";
18
+ }
19
+ }
20
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/ui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAGvD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAEjC,MAAM,UAAU,YAAY,CAAC,GAAqB,EAAE,IAAiB;IACpE,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO;IACvB,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAU;IACxC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,QAAQ;YACZ,OAAO,IAAI,CAAC,eAAe,GAAG,CAAC;gBAC9B,CAAC,CAAC,kBAAkB,wBAAwB,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG;gBACrE,CAAC,CAAC,eAAe,CAAC;QACpB,KAAK,QAAQ;YACZ,OAAO,4BAA4B,CAAC;QACrC,KAAK,UAAU;YACd,OAAO,eAAe,CAAC;IACzB,CAAC;AACF,CAAC","sourcesContent":["import type { ExtensionContext } from \"../../types.ts\";\nimport { formatGoalElapsedSeconds } from \"./format.ts\";\nimport type { Goal } from \"./types.ts\";\n\nexport const STATUS_KEY = \"goal\";\n\nexport function updateGoalUi(ctx: ExtensionContext, goal: Goal | null): void {\n\tif (!ctx.hasUI) return;\n\tctx.ui.setStatus(STATUS_KEY, goal === null ? undefined : goalStatusText(goal));\n}\n\nexport function goalStatusText(goal: Goal): string {\n\tswitch (goal.status) {\n\t\tcase \"active\":\n\t\t\treturn goal.timeUsedSeconds > 0\n\t\t\t\t? `Pursuing goal (${formatGoalElapsedSeconds(goal.timeUsedSeconds)})`\n\t\t\t\t: \"Pursuing goal\";\n\t\tcase \"paused\":\n\t\t\treturn \"Goal paused (/goal resume)\";\n\t\tcase \"complete\":\n\t\t\treturn \"Goal achieved\";\n\t}\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare const MAX_OBJECTIVE_LENGTH = 4000;
2
+ export declare function validateObjective(value: string): string;
3
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/validation.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,OAAQ,CAAC;AAI1C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUvD"}
@@ -0,0 +1,13 @@
1
+ export const MAX_OBJECTIVE_LENGTH = 4_000;
2
+ const GOAL_TOO_LONG_FILE_HINT = "Put longer instructions in a file and refer to that file in the goal, for example: /goal follow the instructions in docs/goal.md.";
3
+ export function validateObjective(value) {
4
+ const objective = value.trim();
5
+ if (objective.length === 0)
6
+ throw new Error("objective must not be empty");
7
+ const objectiveCharacters = [...objective].length;
8
+ if (objectiveCharacters > MAX_OBJECTIVE_LENGTH) {
9
+ throw new Error(`Goal objective is too long: ${objectiveCharacters.toLocaleString()} characters. Limit: ${MAX_OBJECTIVE_LENGTH.toLocaleString()} characters. ${GOAL_TOO_LONG_FILE_HINT}`);
10
+ }
11
+ return objective;
12
+ }
13
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/validation.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAC1C,MAAM,uBAAuB,GAC5B,mIAAmI,CAAC;AAErI,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC3E,MAAM,mBAAmB,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC;IAClD,IAAI,mBAAmB,GAAG,oBAAoB,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACd,+BAA+B,mBAAmB,CAAC,cAAc,EAAE,uBAAuB,oBAAoB,CAAC,cAAc,EAAE,gBAAgB,uBAAuB,EAAE,CACxK,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["export const MAX_OBJECTIVE_LENGTH = 4_000;\nconst GOAL_TOO_LONG_FILE_HINT =\n\t\"Put longer instructions in a file and refer to that file in the goal, for example: /goal follow the instructions in docs/goal.md.\";\n\nexport function validateObjective(value: string): string {\n\tconst objective = value.trim();\n\tif (objective.length === 0) throw new Error(\"objective must not be empty\");\n\tconst objectiveCharacters = [...objective].length;\n\tif (objectiveCharacters > MAX_OBJECTIVE_LENGTH) {\n\t\tthrow new Error(\n\t\t\t`Goal objective is too long: ${objectiveCharacters.toLocaleString()} characters. Limit: ${MAX_OBJECTIVE_LENGTH.toLocaleString()} characters. ${GOAL_TOO_LONG_FILE_HINT}`,\n\t\t);\n\t}\n\treturn objective;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAOxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAM9D,OAAO,YAAY,MAAM,UAAU,CAAC;AAEpC,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,gBAAgB,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,YAAI,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAU,CAAC;AAEhG,eAAO,MAAM,+BAA+B;;;;;CAKoC,CAAC;AAEjF,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAgBtD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAQxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAO9D,OAAO,YAAY,MAAM,UAAU,CAAC;AAIpC,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,gBAAgB,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,YAAI,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAU,CAAC;AAEhG,eAAO,MAAM,+BAA+B;;;;;CAKoC,CAAC;AAEjF,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAoBtD,CAAC"}
@@ -4,19 +4,23 @@ import bashTimeoutExtension from "./bash-timeout/index.js";
4
4
  import compactionExtension from "./compaction/index.js";
5
5
  import diffExtension from "./diff.js";
6
6
  import filesExtension from "./files.js";
7
+ import goalExtension from "./goal/index.js";
7
8
  import gptApplyPatchExtension from "./gpt-apply-patch/index.js";
8
9
  import historySearchExtension from "./history-search/index.js";
9
- import kimiWebSearchExtension from "./kimi-web-search/index.js";
10
+ import nestedAgentsMdExtension from "./nested-agents-md/index.js";
10
11
  import openaiWebSearchExtension from "./openai-web-search/index.js";
11
12
  import permissionSystemExtension from "./permission-system/index.js";
12
13
  import promptPresetExtension from "./prompt-preset/index.js";
13
14
  import promptUrlWidgetExtension from "./prompt-url-widget.js";
14
15
  import redrawsExtension from "./redraws.js";
16
+ import piRulesExtension from "./rules/index.js";
15
17
  import serviceTierExtension from "./service-tier.js";
16
18
  import sessionObserverExtension from "./session-observer/index.js";
17
19
  import todowriteExtension from "./todotools/index.js";
18
20
  import toolPairGuardExtension from "./tool-pair-guard/index.js";
19
21
  import tpsExtension from "./tps.js";
22
+ import webfetchExtension from "./webfetch/index.js";
23
+ import websearchExtension from "./websearch/index.js";
20
24
  export const globalDefaultExtensionIds = ["diff", "files", "prompt-url-widget", "tps"];
21
25
  export const globalDefaultExtensionFactories = {
22
26
  diff: diffExtension,
@@ -39,6 +43,10 @@ export const builtinExtensions = [
39
43
  { id: "compaction", factory: compactionExtension },
40
44
  { id: "history-search", factory: historySearchExtension },
41
45
  { id: "session-observer", factory: sessionObserverExtension },
42
- { id: "kimi-web-search", factory: kimiWebSearchExtension },
46
+ { id: "websearch", factory: websearchExtension },
47
+ { id: "webfetch", factory: webfetchExtension },
48
+ { id: "nested-agents-md", factory: nestedAgentsMdExtension },
49
+ { id: "rules", factory: piRulesExtension },
50
+ { id: "goal", factory: goalExtension },
43
51
  ];
44
52
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AACA,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;AAC/D,OAAO,2BAA2B,MAAM,iCAAiC,CAAC;AAC1E,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAC3D,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AACxC,OAAO,sBAAsB,MAAM,4BAA4B,CAAC;AAChE,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;AAC/D,OAAO,sBAAsB,MAAM,4BAA4B,CAAC;AAChE,OAAO,wBAAwB,MAAM,8BAA8B,CAAC;AACpE,OAAO,yBAAyB,MAAM,8BAA8B,CAAC;AACrE,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAC7D,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAC9D,OAAO,gBAAgB,MAAM,cAAc,CAAC;AAC5C,OAAO,oBAAoB,MAAM,mBAAmB,CAAC;AACrD,OAAO,wBAAwB,MAAM,6BAA6B,CAAC;AACnE,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,sBAAsB,MAAM,4BAA4B,CAAC;AAChE,OAAO,YAAY,MAAM,UAAU,CAAC;AAOpC,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAU,CAAC;AAEhG,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC9C,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,cAAc;IACrB,mBAAmB,EAAE,wBAAwB;IAC7C,GAAG,EAAE,YAAY;CAC8D,CAAC;AAEjF,MAAM,CAAC,MAAM,iBAAiB,GAA8B;IAC3D,EAAE,EAAE,EAAE,mBAAmB,EAAE,OAAO,EAAE,yBAAyB,EAAE;IAC/D,EAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,sBAAsB,EAAE;IAC1D,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,qBAAqB,EAAE;IACvD,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,EAAE;IAChD,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE;IAC5C,EAAE,EAAE,EAAE,sBAAsB,EAAE,OAAO,EAAE,2BAA2B,EAAE;IACpE,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,sBAAsB,EAAE;IACzD,EAAE,EAAE,EAAE,mBAAmB,EAAE,OAAO,EAAE,wBAAwB,EAAE;IAC9D,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB,EAAE;IACrD,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB,EAAE;IACrD,EAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,sBAAsB,EAAE;IAC1D,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE;IAClD,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,sBAAsB,EAAE;IACzD,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,wBAAwB,EAAE;IAC7D,EAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,sBAAsB,EAAE;CAC1D,CAAC","sourcesContent":["import type { ExtensionFactory } from \"../types.ts\";\nimport anthropicBashExtension from \"./anthropic-bash/index.ts\";\nimport anthropicWebSearchExtension from \"./anthropic-web-search/index.ts\";\nimport bashTimeoutExtension from \"./bash-timeout/index.ts\";\nimport compactionExtension from \"./compaction/index.ts\";\nimport diffExtension from \"./diff.ts\";\nimport filesExtension from \"./files.ts\";\nimport gptApplyPatchExtension from \"./gpt-apply-patch/index.ts\";\nimport historySearchExtension from \"./history-search/index.ts\";\nimport kimiWebSearchExtension from \"./kimi-web-search/index.ts\";\nimport openaiWebSearchExtension from \"./openai-web-search/index.ts\";\nimport permissionSystemExtension from \"./permission-system/index.ts\";\nimport promptPresetExtension from \"./prompt-preset/index.ts\";\nimport promptUrlWidgetExtension from \"./prompt-url-widget.ts\";\nimport redrawsExtension from \"./redraws.ts\";\nimport serviceTierExtension from \"./service-tier.ts\";\nimport sessionObserverExtension from \"./session-observer/index.ts\";\nimport todowriteExtension from \"./todotools/index.ts\";\nimport toolPairGuardExtension from \"./tool-pair-guard/index.ts\";\nimport tpsExtension from \"./tps.ts\";\n\nexport interface BuiltinExtensionFactory {\n\tid: string;\n\tfactory: ExtensionFactory;\n}\n\nexport const globalDefaultExtensionIds = [\"diff\", \"files\", \"prompt-url-widget\", \"tps\"] as const;\n\nexport const globalDefaultExtensionFactories = {\n\tdiff: diffExtension,\n\tfiles: filesExtension,\n\t\"prompt-url-widget\": promptUrlWidgetExtension,\n\ttps: tpsExtension,\n} satisfies Record<(typeof globalDefaultExtensionIds)[number], ExtensionFactory>;\n\nexport const builtinExtensions: BuiltinExtensionFactory[] = [\n\t{ id: \"permission-system\", factory: permissionSystemExtension },\n\t{ id: \"gpt-apply-patch\", factory: gptApplyPatchExtension },\n\t{ id: \"prompt-preset\", factory: promptPresetExtension },\n\t{ id: \"todowrite\", factory: todowriteExtension },\n\t{ id: \"redraws\", factory: redrawsExtension },\n\t{ id: \"anthropic-web-search\", factory: anthropicWebSearchExtension },\n\t{ id: \"anthropic-bash\", factory: anthropicBashExtension },\n\t{ id: \"openai-web-search\", factory: openaiWebSearchExtension },\n\t{ id: \"service-tier\", factory: serviceTierExtension },\n\t{ id: \"bash-timeout\", factory: bashTimeoutExtension },\n\t{ id: \"tool-pair-guard\", factory: toolPairGuardExtension },\n\t{ id: \"compaction\", factory: compactionExtension },\n\t{ id: \"history-search\", factory: historySearchExtension },\n\t{ id: \"session-observer\", factory: sessionObserverExtension },\n\t{ id: \"kimi-web-search\", factory: kimiWebSearchExtension },\n];\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionFactory } from \"../types.ts\";\nimport anthropicBashExtension from \"./anthropic-bash/index.ts\";\nimport anthropicWebSearchExtension from \"./anthropic-web-search/index.ts\";\nimport bashTimeoutExtension from \"./bash-timeout/index.ts\";\nimport compactionExtension from \"./compaction/index.ts\";\nimport diffExtension from \"./diff.ts\";\nimport filesExtension from \"./files.ts\";\nimport goalExtension from \"./goal/index.ts\";\nimport gptApplyPatchExtension from \"./gpt-apply-patch/index.ts\";\nimport historySearchExtension from \"./history-search/index.ts\";\nimport nestedAgentsMdExtension from \"./nested-agents-md/index.ts\";\nimport openaiWebSearchExtension from \"./openai-web-search/index.ts\";\nimport permissionSystemExtension from \"./permission-system/index.ts\";\nimport promptPresetExtension from \"./prompt-preset/index.ts\";\nimport promptUrlWidgetExtension from \"./prompt-url-widget.ts\";\nimport redrawsExtension from \"./redraws.ts\";\nimport piRulesExtension from \"./rules/index.ts\";\nimport serviceTierExtension from \"./service-tier.ts\";\nimport sessionObserverExtension from \"./session-observer/index.ts\";\nimport todowriteExtension from \"./todotools/index.ts\";\nimport toolPairGuardExtension from \"./tool-pair-guard/index.ts\";\nimport tpsExtension from \"./tps.ts\";\nimport webfetchExtension from \"./webfetch/index.ts\";\nimport websearchExtension from \"./websearch/index.ts\";\n\nexport interface BuiltinExtensionFactory {\n\tid: string;\n\tfactory: ExtensionFactory;\n}\n\nexport const globalDefaultExtensionIds = [\"diff\", \"files\", \"prompt-url-widget\", \"tps\"] as const;\n\nexport const globalDefaultExtensionFactories = {\n\tdiff: diffExtension,\n\tfiles: filesExtension,\n\t\"prompt-url-widget\": promptUrlWidgetExtension,\n\ttps: tpsExtension,\n} satisfies Record<(typeof globalDefaultExtensionIds)[number], ExtensionFactory>;\n\nexport const builtinExtensions: BuiltinExtensionFactory[] = [\n\t{ id: \"permission-system\", factory: permissionSystemExtension },\n\t{ id: \"gpt-apply-patch\", factory: gptApplyPatchExtension },\n\t{ id: \"prompt-preset\", factory: promptPresetExtension },\n\t{ id: \"todowrite\", factory: todowriteExtension },\n\t{ id: \"redraws\", factory: redrawsExtension },\n\t{ id: \"anthropic-web-search\", factory: anthropicWebSearchExtension },\n\t{ id: \"anthropic-bash\", factory: anthropicBashExtension },\n\t{ id: \"openai-web-search\", factory: openaiWebSearchExtension },\n\t{ id: \"service-tier\", factory: serviceTierExtension },\n\t{ id: \"bash-timeout\", factory: bashTimeoutExtension },\n\t{ id: \"tool-pair-guard\", factory: toolPairGuardExtension },\n\t{ id: \"compaction\", factory: compactionExtension },\n\t{ id: \"history-search\", factory: historySearchExtension },\n\t{ id: \"session-observer\", factory: sessionObserverExtension },\n\t{ id: \"websearch\", factory: websearchExtension },\n\t{ id: \"webfetch\", factory: webfetchExtension },\n\t{ id: \"nested-agents-md\", factory: nestedAgentsMdExtension },\n\t{ id: \"rules\", factory: piRulesExtension },\n\t{ id: \"goal\", factory: goalExtension },\n];\n"]}
@@ -0,0 +1,10 @@
1
+ export interface ContainmentResult {
2
+ canonicalPath: string;
3
+ canonicalRoot: string;
4
+ }
5
+ export interface ResolveAndContainInput {
6
+ filePath: string;
7
+ rootDir: string;
8
+ }
9
+ export declare function resolveAndContain(input: ResolveAndContainInput): Promise<ContainmentResult | null>;
10
+ //# sourceMappingURL=containment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containment.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/containment.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAoBxG"}
@@ -0,0 +1,23 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { isAbsolute, resolve, sep } from "node:path";
3
+ export async function resolveAndContain(input) {
4
+ if (!input.filePath)
5
+ return null;
6
+ const resolvedPath = isAbsolute(input.filePath) ? input.filePath : resolve(input.rootDir, input.filePath);
7
+ let canonicalRoot;
8
+ let canonicalPath;
9
+ try {
10
+ canonicalRoot = await realpath(input.rootDir);
11
+ canonicalPath = await realpath(resolvedPath);
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ if (canonicalPath === canonicalRoot)
17
+ return null;
18
+ const rootBoundary = canonicalRoot.endsWith(sep) ? canonicalRoot : canonicalRoot + sep;
19
+ if (!canonicalPath.startsWith(rootBoundary))
20
+ return null;
21
+ return { canonicalPath, canonicalRoot };
22
+ }
23
+ //# sourceMappingURL=containment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containment.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/containment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAYrD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA6B;IACpE,IAAI,CAAC,KAAK,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE1G,IAAI,aAAqB,CAAC;IAC1B,IAAI,aAAqB,CAAC;IAC1B,IAAI,CAAC;QACJ,aAAa,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9C,aAAa,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,aAAa,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IAEjD,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC;IACvF,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AACzC,CAAC","sourcesContent":["import { realpath } from \"node:fs/promises\";\nimport { isAbsolute, resolve, sep } from \"node:path\";\n\nexport interface ContainmentResult {\n\tcanonicalPath: string;\n\tcanonicalRoot: string;\n}\n\nexport interface ResolveAndContainInput {\n\tfilePath: string;\n\trootDir: string;\n}\n\nexport async function resolveAndContain(input: ResolveAndContainInput): Promise<ContainmentResult | null> {\n\tif (!input.filePath) return null;\n\n\tconst resolvedPath = isAbsolute(input.filePath) ? input.filePath : resolve(input.rootDir, input.filePath);\n\n\tlet canonicalRoot: string;\n\tlet canonicalPath: string;\n\ttry {\n\t\tcanonicalRoot = await realpath(input.rootDir);\n\t\tcanonicalPath = await realpath(resolvedPath);\n\t} catch {\n\t\treturn null;\n\t}\n\n\tif (canonicalPath === canonicalRoot) return null;\n\n\tconst rootBoundary = canonicalRoot.endsWith(sep) ? canonicalRoot : canonicalRoot + sep;\n\tif (!canonicalPath.startsWith(rootBoundary)) return null;\n\n\treturn { canonicalPath, canonicalRoot };\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export declare class InjectionFileReadError extends Error {
2
+ readonly path: string;
3
+ constructor(path: string, cause: unknown);
4
+ }
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,sBAAuB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAKvC;CACD"}
@@ -0,0 +1,9 @@
1
+ export class InjectionFileReadError extends Error {
2
+ constructor(path, cause) {
3
+ const message = cause instanceof Error ? cause.message : String(cause);
4
+ super(`Failed to read ${path}: ${message}`);
5
+ this.name = "InjectionFileReadError";
6
+ this.path = path;
7
+ }
8
+ }
9
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAGhD,YAAY,IAAY,EAAE,KAAc;QACvC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,KAAK,CAAC,kBAAkB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;CACD","sourcesContent":["export class InjectionFileReadError extends Error {\n\treadonly path: string;\n\n\tconstructor(path: string, cause: unknown) {\n\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\tsuper(`Failed to read ${path}: ${message}`);\n\t\tthis.name = \"InjectionFileReadError\";\n\t\tthis.path = path;\n\t}\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export interface FindAgentsMdUpInput {
2
+ startDir: string;
3
+ rootDir: string;
4
+ fileNames?: readonly string[];
5
+ }
6
+ export declare function findAgentsMdUp(input: FindAgentsMdUpInput): Promise<string[]>;
7
+ //# sourceMappingURL=find-agents-md-up.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-agents-md-up.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/find-agents-md-up.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBlF"}
@@ -0,0 +1,44 @@
1
+ import { constants, promises as fsPromises } from "node:fs";
2
+ import { dirname, isAbsolute, join, relative } from "node:path";
3
+ import { DEFAULT_FILE_NAMES } from "./types.js";
4
+ export async function findAgentsMdUp(input) {
5
+ const fileNames = input.fileNames ?? DEFAULT_FILE_NAMES;
6
+ const collected = [];
7
+ let current = input.startDir;
8
+ while (true) {
9
+ const isRoot = current === input.rootDir;
10
+ if (!isRoot) {
11
+ for (const name of fileNames) {
12
+ const candidate = join(current, name);
13
+ const exists = await fileExists(candidate);
14
+ if (exists) {
15
+ collected.push(candidate);
16
+ break;
17
+ }
18
+ }
19
+ }
20
+ if (isRoot)
21
+ break;
22
+ const parent = dirname(current);
23
+ if (parent === current)
24
+ break;
25
+ if (!isWithinRoot(input.rootDir, parent))
26
+ break;
27
+ current = parent;
28
+ }
29
+ return collected.reverse();
30
+ }
31
+ function isWithinRoot(rootDir, candidate) {
32
+ const relativePath = relative(rootDir, candidate);
33
+ return relativePath === "" || (!relativePath.startsWith("..") && !isAbsolute(relativePath));
34
+ }
35
+ async function fileExists(path) {
36
+ try {
37
+ await fsPromises.access(path, constants.F_OK);
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ //# sourceMappingURL=find-agents-md-up.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-agents-md-up.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/find-agents-md-up.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAQhD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAA0B;IAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACxD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC;IAE7B,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,MAAM,EAAE,CAAC;oBACZ,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC1B,MAAM;gBACP,CAAC;YACF,CAAC;QACF,CAAC;QACD,IAAI,MAAM;YAAE,MAAM;QAClB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,MAAM;QAC9B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;YAAE,MAAM;QAChD,OAAO,GAAG,MAAM,CAAC;IAClB,CAAC;IAED,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,SAAiB;IACvD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAClD,OAAO,YAAY,KAAK,EAAE,IAAI,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC;QACJ,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC","sourcesContent":["import { constants, promises as fsPromises } from \"node:fs\";\nimport { dirname, isAbsolute, join, relative } from \"node:path\";\nimport { DEFAULT_FILE_NAMES } from \"./types.ts\";\n\nexport interface FindAgentsMdUpInput {\n\tstartDir: string;\n\trootDir: string;\n\tfileNames?: readonly string[];\n}\n\nexport async function findAgentsMdUp(input: FindAgentsMdUpInput): Promise<string[]> {\n\tconst fileNames = input.fileNames ?? DEFAULT_FILE_NAMES;\n\tconst collected: string[] = [];\n\tlet current = input.startDir;\n\n\twhile (true) {\n\t\tconst isRoot = current === input.rootDir;\n\t\tif (!isRoot) {\n\t\t\tfor (const name of fileNames) {\n\t\t\t\tconst candidate = join(current, name);\n\t\t\t\tconst exists = await fileExists(candidate);\n\t\t\t\tif (exists) {\n\t\t\t\t\tcollected.push(candidate);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (isRoot) break;\n\t\tconst parent = dirname(current);\n\t\tif (parent === current) break;\n\t\tif (!isWithinRoot(input.rootDir, parent)) break;\n\t\tcurrent = parent;\n\t}\n\n\treturn collected.reverse();\n}\n\nfunction isWithinRoot(rootDir: string, candidate: string): boolean {\n\tconst relativePath = relative(rootDir, candidate);\n\treturn relativePath === \"\" || (!relativePath.startsWith(\"..\") && !isAbsolute(relativePath));\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait fsPromises.access(path, constants.F_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export interface FormatDirectoryContextInput {
2
+ absolutePath: string;
3
+ content: string;
4
+ truncated: boolean;
5
+ }
6
+ export declare function formatDirectoryContext(input: FormatDirectoryContextInput): string;
7
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/format.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,2BAA2B;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,MAAM,CAKjF"}
@@ -0,0 +1,7 @@
1
+ export function formatDirectoryContext(input) {
2
+ const notice = input.truncated
3
+ ? `\n\n[Note: Content was truncated to save context window space. For full context, please read the file directly: ${input.absolutePath}]`
4
+ : "";
5
+ return `\n\n[Directory Context: ${input.absolutePath}]\n${input.content}${notice}`;
6
+ }
7
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/format.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACxE,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS;QAC7B,CAAC,CAAC,mHAAmH,KAAK,CAAC,YAAY,GAAG;QAC1I,CAAC,CAAC,EAAE,CAAC;IACN,OAAO,2BAA2B,KAAK,CAAC,YAAY,MAAM,KAAK,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;AACpF,CAAC","sourcesContent":["export interface FormatDirectoryContextInput {\n\tabsolutePath: string;\n\tcontent: string;\n\ttruncated: boolean;\n}\n\nexport function formatDirectoryContext(input: FormatDirectoryContextInput): string {\n\tconst notice = input.truncated\n\t\t? `\\n\\n[Note: Content was truncated to save context window space. For full context, please read the file directly: ${input.absolutePath}]`\n\t\t: \"\";\n\treturn `\\n\\n[Directory Context: ${input.absolutePath}]\\n${input.content}${notice}`;\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { InjectionCache } from "./injection-cache.ts";
2
+ import { type InjectionConfig, type InjectionResult } from "./types.ts";
3
+ export interface InjectDirectoryContextInput {
4
+ filePath: string;
5
+ rootDir: string;
6
+ cache: InjectionCache;
7
+ sessionKey: string;
8
+ config?: Partial<InjectionConfig>;
9
+ }
10
+ export declare function injectDirectoryContext(input: InjectDirectoryContextInput): Promise<InjectionResult>;
11
+ //# sourceMappingURL=inject-directory-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-directory-context.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/inject-directory-context.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAKN,KAAK,eAAe,EAEpB,KAAK,eAAe,EACpB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;CAClC;AAQD,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,eAAe,CAAC,CA0DzG"}
@@ -0,0 +1,77 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { resolveAndContain } from "./containment.js";
4
+ import { InjectionFileReadError } from "./errors.js";
5
+ import { findAgentsMdUp } from "./find-agents-md-up.js";
6
+ import { formatDirectoryContext } from "./format.js";
7
+ import { truncateBytes } from "./truncate.js";
8
+ import { DEFAULT_FILE_NAMES, DEFAULT_MAX_BYTES_PER_FILE, DEFAULT_MAX_BYTES_PER_READ, } from "./types.js";
9
+ const EMPTY_RESULT = Object.freeze({
10
+ injectedText: "",
11
+ injectedFiles: [],
12
+ errors: [],
13
+ });
14
+ export async function injectDirectoryContext(input) {
15
+ const config = resolveConfig(input.config);
16
+ const contained = await resolveAndContain({
17
+ filePath: input.filePath,
18
+ rootDir: input.rootDir,
19
+ });
20
+ if (!contained)
21
+ return cloneEmpty();
22
+ const candidates = await findAgentsMdUp({
23
+ startDir: dirname(contained.canonicalPath),
24
+ rootDir: contained.canonicalRoot,
25
+ fileNames: config.fileNames,
26
+ });
27
+ const injectedFiles = [];
28
+ const errors = [];
29
+ let injectedText = "";
30
+ let bytesBudget = config.maxBytesPerRead;
31
+ for (const agentsPath of candidates) {
32
+ const agentsDir = dirname(agentsPath);
33
+ if (input.cache.hasInjected(input.sessionKey, agentsDir))
34
+ continue;
35
+ if (bytesBudget <= 0)
36
+ break;
37
+ let content;
38
+ try {
39
+ content = await readFile(agentsPath, "utf-8");
40
+ }
41
+ catch (error) {
42
+ errors.push({
43
+ path: agentsPath,
44
+ error: new InjectionFileReadError(agentsPath, error),
45
+ });
46
+ continue;
47
+ }
48
+ const perFileCap = Math.min(config.maxBytesPerFile, bytesBudget);
49
+ const truncated = truncateBytes(content, perFileCap);
50
+ injectedFiles.push({
51
+ absolutePath: agentsPath,
52
+ directory: agentsDir,
53
+ truncated: truncated.truncated,
54
+ originalBytes: truncated.originalBytes,
55
+ injectedBytes: truncated.resultBytes,
56
+ });
57
+ injectedText += formatDirectoryContext({
58
+ absolutePath: agentsPath,
59
+ content: truncated.result,
60
+ truncated: truncated.truncated,
61
+ });
62
+ input.cache.markInjected(input.sessionKey, agentsDir);
63
+ bytesBudget -= truncated.resultBytes;
64
+ }
65
+ return { injectedText, injectedFiles, errors };
66
+ }
67
+ function resolveConfig(partial) {
68
+ return {
69
+ fileNames: partial?.fileNames ?? DEFAULT_FILE_NAMES,
70
+ maxBytesPerFile: partial?.maxBytesPerFile ?? DEFAULT_MAX_BYTES_PER_FILE,
71
+ maxBytesPerRead: partial?.maxBytesPerRead ?? DEFAULT_MAX_BYTES_PER_READ,
72
+ };
73
+ }
74
+ function cloneEmpty() {
75
+ return { injectedText: EMPTY_RESULT.injectedText, injectedFiles: [], errors: [] };
76
+ }
77
+ //# sourceMappingURL=inject-directory-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-directory-context.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/inject-directory-context.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { resolveAndContain } from \"./containment.ts\";\nimport { InjectionFileReadError } from \"./errors.ts\";\nimport { findAgentsMdUp } from \"./find-agents-md-up.ts\";\nimport { formatDirectoryContext } from \"./format.ts\";\nimport type { InjectionCache } from \"./injection-cache.ts\";\nimport { truncateBytes } from \"./truncate.ts\";\nimport {\n\tDEFAULT_FILE_NAMES,\n\tDEFAULT_MAX_BYTES_PER_FILE,\n\tDEFAULT_MAX_BYTES_PER_READ,\n\ttype InjectedFileInfo,\n\ttype InjectionConfig,\n\ttype InjectionFileError,\n\ttype InjectionResult,\n} from \"./types.ts\";\n\nexport interface InjectDirectoryContextInput {\n\tfilePath: string;\n\trootDir: string;\n\tcache: InjectionCache;\n\tsessionKey: string;\n\tconfig?: Partial<InjectionConfig>;\n}\n\nconst EMPTY_RESULT: InjectionResult = Object.freeze({\n\tinjectedText: \"\",\n\tinjectedFiles: [],\n\terrors: [],\n} satisfies InjectionResult);\n\nexport async function injectDirectoryContext(input: InjectDirectoryContextInput): Promise<InjectionResult> {\n\tconst config = resolveConfig(input.config);\n\n\tconst contained = await resolveAndContain({\n\t\tfilePath: input.filePath,\n\t\trootDir: input.rootDir,\n\t});\n\tif (!contained) return cloneEmpty();\n\n\tconst candidates = await findAgentsMdUp({\n\t\tstartDir: dirname(contained.canonicalPath),\n\t\trootDir: contained.canonicalRoot,\n\t\tfileNames: config.fileNames,\n\t});\n\n\tconst injectedFiles: InjectedFileInfo[] = [];\n\tconst errors: InjectionFileError[] = [];\n\tlet injectedText = \"\";\n\tlet bytesBudget = config.maxBytesPerRead;\n\n\tfor (const agentsPath of candidates) {\n\t\tconst agentsDir = dirname(agentsPath);\n\t\tif (input.cache.hasInjected(input.sessionKey, agentsDir)) continue;\n\t\tif (bytesBudget <= 0) break;\n\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = await readFile(agentsPath, \"utf-8\");\n\t\t} catch (error) {\n\t\t\terrors.push({\n\t\t\t\tpath: agentsPath,\n\t\t\t\terror: new InjectionFileReadError(agentsPath, error),\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst perFileCap = Math.min(config.maxBytesPerFile, bytesBudget);\n\t\tconst truncated = truncateBytes(content, perFileCap);\n\n\t\tinjectedFiles.push({\n\t\t\tabsolutePath: agentsPath,\n\t\t\tdirectory: agentsDir,\n\t\t\ttruncated: truncated.truncated,\n\t\t\toriginalBytes: truncated.originalBytes,\n\t\t\tinjectedBytes: truncated.resultBytes,\n\t\t});\n\n\t\tinjectedText += formatDirectoryContext({\n\t\t\tabsolutePath: agentsPath,\n\t\t\tcontent: truncated.result,\n\t\t\ttruncated: truncated.truncated,\n\t\t});\n\n\t\tinput.cache.markInjected(input.sessionKey, agentsDir);\n\t\tbytesBudget -= truncated.resultBytes;\n\t}\n\n\treturn { injectedText, injectedFiles, errors };\n}\n\nfunction resolveConfig(partial: Partial<InjectionConfig> | undefined): InjectionConfig {\n\treturn {\n\t\tfileNames: partial?.fileNames ?? DEFAULT_FILE_NAMES,\n\t\tmaxBytesPerFile: partial?.maxBytesPerFile ?? DEFAULT_MAX_BYTES_PER_FILE,\n\t\tmaxBytesPerRead: partial?.maxBytesPerRead ?? DEFAULT_MAX_BYTES_PER_READ,\n\t};\n}\n\nfunction cloneEmpty(): InjectionResult {\n\treturn { injectedText: EMPTY_RESULT.injectedText, injectedFiles: [], errors: [] };\n}\n"]}
@@ -0,0 +1,11 @@
1
+ export declare class InjectionCache {
2
+ private readonly sessions;
3
+ private getOrCreate;
4
+ hasInjected(sessionKey: string, canonicalDir: string): boolean;
5
+ markInjected(sessionKey: string, canonicalDir: string): void;
6
+ getCacheSize(sessionKey: string): number;
7
+ listInjected(sessionKey: string): string[];
8
+ clearSession(sessionKey: string): void;
9
+ clearAll(): void;
10
+ }
11
+ //# sourceMappingURL=injection-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection-cache.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/injection-cache.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE3D,OAAO,CAAC,WAAW;IASnB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAE7D;IAED,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAE3D;IAED,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvC;IAED,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAGzC;IAED,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAErC;IAED,QAAQ,IAAI,IAAI,CAEf;CACD"}
@@ -0,0 +1,33 @@
1
+ export class InjectionCache {
2
+ constructor() {
3
+ this.sessions = new Map();
4
+ }
5
+ getOrCreate(sessionKey) {
6
+ let set = this.sessions.get(sessionKey);
7
+ if (!set) {
8
+ set = new Set();
9
+ this.sessions.set(sessionKey, set);
10
+ }
11
+ return set;
12
+ }
13
+ hasInjected(sessionKey, canonicalDir) {
14
+ return this.sessions.get(sessionKey)?.has(canonicalDir) ?? false;
15
+ }
16
+ markInjected(sessionKey, canonicalDir) {
17
+ this.getOrCreate(sessionKey).add(canonicalDir);
18
+ }
19
+ getCacheSize(sessionKey) {
20
+ return this.sessions.get(sessionKey)?.size ?? 0;
21
+ }
22
+ listInjected(sessionKey) {
23
+ const set = this.sessions.get(sessionKey);
24
+ return set ? Array.from(set) : [];
25
+ }
26
+ clearSession(sessionKey) {
27
+ this.sessions.delete(sessionKey);
28
+ }
29
+ clearAll() {
30
+ this.sessions.clear();
31
+ }
32
+ }
33
+ //# sourceMappingURL=injection-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection-cache.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/injection-cache.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAc;IAA3B;QACkB,aAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAmC5D,CAAC;IAjCQ,WAAW,CAAC,UAAkB;QACrC,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,WAAW,CAAC,UAAkB,EAAE,YAAoB;QACnD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC;IAClE,CAAC;IAED,YAAY,CAAC,UAAkB,EAAE,YAAoB;QACpD,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC;IAED,YAAY,CAAC,UAAkB;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,YAAY,CAAC,UAAkB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,CAAC;IAED,YAAY,CAAC,UAAkB;QAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ;QACP,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACD","sourcesContent":["export class InjectionCache {\n\tprivate readonly sessions = new Map<string, Set<string>>();\n\n\tprivate getOrCreate(sessionKey: string): Set<string> {\n\t\tlet set = this.sessions.get(sessionKey);\n\t\tif (!set) {\n\t\t\tset = new Set<string>();\n\t\t\tthis.sessions.set(sessionKey, set);\n\t\t}\n\t\treturn set;\n\t}\n\n\thasInjected(sessionKey: string, canonicalDir: string): boolean {\n\t\treturn this.sessions.get(sessionKey)?.has(canonicalDir) ?? false;\n\t}\n\n\tmarkInjected(sessionKey: string, canonicalDir: string): void {\n\t\tthis.getOrCreate(sessionKey).add(canonicalDir);\n\t}\n\n\tgetCacheSize(sessionKey: string): number {\n\t\treturn this.sessions.get(sessionKey)?.size ?? 0;\n\t}\n\n\tlistInjected(sessionKey: string): string[] {\n\t\tconst set = this.sessions.get(sessionKey);\n\t\treturn set ? Array.from(set) : [];\n\t}\n\n\tclearSession(sessionKey: string): void {\n\t\tthis.sessions.delete(sessionKey);\n\t}\n\n\tclearAll(): void {\n\t\tthis.sessions.clear();\n\t}\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export interface SessionKeyContext {
2
+ sessionManager?: {
3
+ getSessionFile?(): string | null | undefined;
4
+ };
5
+ }
6
+ export declare const SINGLETON_SESSION_KEY = "__pi_nested_agents_md_singleton__";
7
+ export declare function getSessionKey(ctx: SessionKeyContext): string;
8
+ //# sourceMappingURL=session-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-key.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/session-key.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,cAAc,CAAC,EAAE;QAChB,cAAc,CAAC,IAAI,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;KAC7C,CAAC;CACF;AAED,eAAO,MAAM,qBAAqB,sCAAsC,CAAC;AAEzE,wBAAgB,aAAa,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAI5D"}
@@ -0,0 +1,8 @@
1
+ export const SINGLETON_SESSION_KEY = "__pi_nested_agents_md_singleton__";
2
+ export function getSessionKey(ctx) {
3
+ const file = ctx.sessionManager?.getSessionFile?.();
4
+ if (typeof file === "string" && file.length > 0)
5
+ return file;
6
+ return SINGLETON_SESSION_KEY;
7
+ }
8
+ //# sourceMappingURL=session-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-key.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/session-key.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,qBAAqB,GAAG,mCAAmC,CAAC;AAEzE,MAAM,UAAU,aAAa,CAAC,GAAsB;IACnD,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,EAAE,CAAC;IACpD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,qBAAqB,CAAC;AAC9B,CAAC","sourcesContent":["export interface SessionKeyContext {\n\tsessionManager?: {\n\t\tgetSessionFile?(): string | null | undefined;\n\t};\n}\n\nexport const SINGLETON_SESSION_KEY = \"__pi_nested_agents_md_singleton__\";\n\nexport function getSessionKey(ctx: SessionKeyContext): string {\n\tconst file = ctx.sessionManager?.getSessionFile?.();\n\tif (typeof file === \"string\" && file.length > 0) return file;\n\treturn SINGLETON_SESSION_KEY;\n}\n"]}