trail-code 0.0.0-stage → 0.28.0-semantic.3

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 (593) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +567 -2
  3. package/dist/ai/crux.d.ts +88 -0
  4. package/dist/ai/crux.d.ts.map +1 -0
  5. package/dist/ai/crux.js +219 -0
  6. package/dist/ai/crux.js.map +1 -0
  7. package/dist/ai/failure.d.ts +60 -0
  8. package/dist/ai/failure.d.ts.map +1 -0
  9. package/dist/ai/failure.js +86 -0
  10. package/dist/ai/failure.js.map +1 -0
  11. package/dist/ai/llm/anthropic.d.ts +37 -0
  12. package/dist/ai/llm/anthropic.d.ts.map +1 -0
  13. package/dist/ai/llm/anthropic.js +144 -0
  14. package/dist/ai/llm/anthropic.js.map +1 -0
  15. package/dist/ai/llm/factory.d.ts +28 -0
  16. package/dist/ai/llm/factory.d.ts.map +1 -0
  17. package/dist/ai/llm/factory.js +36 -0
  18. package/dist/ai/llm/factory.js.map +1 -0
  19. package/dist/ai/llm/litellm.d.ts +34 -0
  20. package/dist/ai/llm/litellm.d.ts.map +1 -0
  21. package/dist/ai/llm/litellm.js +45 -0
  22. package/dist/ai/llm/litellm.js.map +1 -0
  23. package/dist/ai/llm/openai.d.ts +145 -0
  24. package/dist/ai/llm/openai.d.ts.map +1 -0
  25. package/dist/ai/llm/openai.js +629 -0
  26. package/dist/ai/llm/openai.js.map +1 -0
  27. package/dist/ai/llm/orcarouter.d.ts +34 -0
  28. package/dist/ai/llm/orcarouter.d.ts.map +1 -0
  29. package/dist/ai/llm/orcarouter.js +45 -0
  30. package/dist/ai/llm/orcarouter.js.map +1 -0
  31. package/dist/ai/llm/recover-tool.d.ts +21 -0
  32. package/dist/ai/llm/recover-tool.d.ts.map +1 -0
  33. package/dist/ai/llm/recover-tool.js +109 -0
  34. package/dist/ai/llm/recover-tool.js.map +1 -0
  35. package/dist/ai/llm/types.d.ts +122 -0
  36. package/dist/ai/llm/types.d.ts.map +1 -0
  37. package/dist/ai/llm/types.js +33 -0
  38. package/dist/ai/llm/types.js.map +1 -0
  39. package/dist/ai/providers.d.ts +59 -0
  40. package/dist/ai/providers.d.ts.map +1 -0
  41. package/dist/ai/providers.js +54 -0
  42. package/dist/ai/providers.js.map +1 -0
  43. package/dist/ai/summarize.d.ts +25 -0
  44. package/dist/ai/summarize.d.ts.map +1 -0
  45. package/dist/ai/summarize.js +34 -0
  46. package/dist/ai/summarize.js.map +1 -0
  47. package/dist/ai/synthesize.d.ts +40 -0
  48. package/dist/ai/synthesize.d.ts.map +1 -0
  49. package/dist/ai/synthesize.js +230 -0
  50. package/dist/ai/synthesize.js.map +1 -0
  51. package/dist/ask/ask.d.ts +199 -0
  52. package/dist/ask/ask.d.ts.map +1 -0
  53. package/dist/ask/ask.js +1291 -0
  54. package/dist/ask/ask.js.map +1 -0
  55. package/dist/ask/file-rank.d.ts +72 -0
  56. package/dist/ask/file-rank.d.ts.map +1 -0
  57. package/dist/ask/file-rank.js +160 -0
  58. package/dist/ask/file-rank.js.map +1 -0
  59. package/dist/ask/file-selection.d.ts +22 -0
  60. package/dist/ask/file-selection.d.ts.map +1 -0
  61. package/dist/ask/file-selection.js +66 -0
  62. package/dist/ask/file-selection.js.map +1 -0
  63. package/dist/ask/fuse.d.ts +195 -0
  64. package/dist/ask/fuse.d.ts.map +1 -0
  65. package/dist/ask/fuse.js +344 -0
  66. package/dist/ask/fuse.js.map +1 -0
  67. package/dist/ask/graphrank.d.ts +61 -0
  68. package/dist/ask/graphrank.d.ts.map +1 -0
  69. package/dist/ask/graphrank.js +130 -0
  70. package/dist/ask/graphrank.js.map +1 -0
  71. package/dist/ask/index-file.d.ts +44 -0
  72. package/dist/ask/index-file.d.ts.map +1 -0
  73. package/dist/ask/index-file.js +128 -0
  74. package/dist/ask/index-file.js.map +1 -0
  75. package/dist/ask/semantic.d.ts +42 -0
  76. package/dist/ask/semantic.d.ts.map +1 -0
  77. package/dist/ask/semantic.js +293 -0
  78. package/dist/ask/semantic.js.map +1 -0
  79. package/dist/bin/graft.d.ts +3 -0
  80. package/dist/bin/graft.d.ts.map +1 -0
  81. package/dist/bin/graft.js +14 -0
  82. package/dist/bin/graft.js.map +1 -0
  83. package/dist/bin/trail.d.ts +3 -0
  84. package/dist/bin/trail.d.ts.map +1 -0
  85. package/dist/bin/trail.js +13 -0
  86. package/dist/bin/trail.js.map +1 -0
  87. package/dist/blast/blast-cli.d.ts +35 -0
  88. package/dist/blast/blast-cli.d.ts.map +1 -0
  89. package/dist/blast/blast-cli.js +155 -0
  90. package/dist/blast/blast-cli.js.map +1 -0
  91. package/dist/blast/blast.d.ts +128 -0
  92. package/dist/blast/blast.d.ts.map +1 -0
  93. package/dist/blast/blast.js +383 -0
  94. package/dist/blast/blast.js.map +1 -0
  95. package/dist/blast/diff.d.ts +53 -0
  96. package/dist/blast/diff.d.ts.map +1 -0
  97. package/dist/blast/diff.js +193 -0
  98. package/dist/blast/diff.js.map +1 -0
  99. package/dist/blast/evidence.d.ts +51 -0
  100. package/dist/blast/evidence.d.ts.map +1 -0
  101. package/dist/blast/evidence.js +162 -0
  102. package/dist/blast/evidence.js.map +1 -0
  103. package/dist/blast/modules.d.ts +33 -0
  104. package/dist/blast/modules.d.ts.map +1 -0
  105. package/dist/blast/modules.js +83 -0
  106. package/dist/blast/modules.js.map +1 -0
  107. package/dist/blast/name.d.ts +74 -0
  108. package/dist/blast/name.d.ts.map +1 -0
  109. package/dist/blast/name.js +269 -0
  110. package/dist/blast/name.js.map +1 -0
  111. package/dist/blast/owners.d.ts +85 -0
  112. package/dist/blast/owners.d.ts.map +1 -0
  113. package/dist/blast/owners.js +272 -0
  114. package/dist/blast/owners.js.map +1 -0
  115. package/dist/blast/render.d.ts +46 -0
  116. package/dist/blast/render.d.ts.map +1 -0
  117. package/dist/blast/render.js +422 -0
  118. package/dist/blast/render.js.map +1 -0
  119. package/dist/blast/viz.d.ts +37 -0
  120. package/dist/blast/viz.d.ts.map +1 -0
  121. package/dist/blast/viz.js +180 -0
  122. package/dist/blast/viz.js.map +1 -0
  123. package/dist/brand.d.ts +111 -0
  124. package/dist/brand.d.ts.map +1 -0
  125. package/dist/brand.js +282 -0
  126. package/dist/brand.js.map +1 -0
  127. package/dist/claude/build-progress.d.ts +30 -0
  128. package/dist/claude/build-progress.d.ts.map +1 -0
  129. package/dist/claude/build-progress.js +81 -0
  130. package/dist/claude/build-progress.js.map +1 -0
  131. package/dist/claude/hermes-skill-template.d.ts +16 -0
  132. package/dist/claude/hermes-skill-template.d.ts.map +1 -0
  133. package/dist/claude/hermes-skill-template.js +154 -0
  134. package/dist/claude/hermes-skill-template.js.map +1 -0
  135. package/dist/claude/init.d.ts +65 -0
  136. package/dist/claude/init.d.ts.map +1 -0
  137. package/dist/claude/init.js +258 -0
  138. package/dist/claude/init.js.map +1 -0
  139. package/dist/claude/paths.d.ts +9 -0
  140. package/dist/claude/paths.d.ts.map +1 -0
  141. package/dist/claude/paths.js +22 -0
  142. package/dist/claude/paths.js.map +1 -0
  143. package/dist/claude/session-metrics.d.ts +73 -0
  144. package/dist/claude/session-metrics.d.ts.map +1 -0
  145. package/dist/claude/session-metrics.js +209 -0
  146. package/dist/claude/session-metrics.js.map +1 -0
  147. package/dist/claude/settings-merge.d.ts +76 -0
  148. package/dist/claude/settings-merge.d.ts.map +1 -0
  149. package/dist/claude/settings-merge.js +283 -0
  150. package/dist/claude/settings-merge.js.map +1 -0
  151. package/dist/claude/skill-template.d.ts +13 -0
  152. package/dist/claude/skill-template.d.ts.map +1 -0
  153. package/dist/claude/skill-template.js +290 -0
  154. package/dist/claude/skill-template.js.map +1 -0
  155. package/dist/claude/state.d.ts +85 -0
  156. package/dist/claude/state.d.ts.map +1 -0
  157. package/dist/claude/state.js +88 -0
  158. package/dist/claude/state.js.map +1 -0
  159. package/dist/claude/stats.d.ts +5 -0
  160. package/dist/claude/stats.d.ts.map +1 -0
  161. package/dist/claude/stats.js +24 -0
  162. package/dist/claude/stats.js.map +1 -0
  163. package/dist/cli-epilogue.d.ts +12 -0
  164. package/dist/cli-epilogue.d.ts.map +1 -0
  165. package/dist/cli-epilogue.js +72 -0
  166. package/dist/cli-epilogue.js.map +1 -0
  167. package/dist/cli-meta.d.ts +82 -0
  168. package/dist/cli-meta.d.ts.map +1 -0
  169. package/dist/cli-meta.js +238 -0
  170. package/dist/cli-meta.js.map +1 -0
  171. package/dist/cli-picker.d.ts +139 -0
  172. package/dist/cli-picker.d.ts.map +1 -0
  173. package/dist/cli-picker.js +439 -0
  174. package/dist/cli-picker.js.map +1 -0
  175. package/dist/cli.d.ts +3 -0
  176. package/dist/cli.d.ts.map +1 -0
  177. package/dist/cli.js +1638 -0
  178. package/dist/cli.js.map +1 -0
  179. package/dist/context/batches.d.ts +29 -0
  180. package/dist/context/batches.d.ts.map +1 -0
  181. package/dist/context/batches.js +130 -0
  182. package/dist/context/batches.js.map +1 -0
  183. package/dist/context/build.d.ts +57 -0
  184. package/dist/context/build.d.ts.map +1 -0
  185. package/dist/context/build.js +396 -0
  186. package/dist/context/build.js.map +1 -0
  187. package/dist/context/check.d.ts +42 -0
  188. package/dist/context/check.d.ts.map +1 -0
  189. package/dist/context/check.js +162 -0
  190. package/dist/context/check.js.map +1 -0
  191. package/dist/context/map-dir.d.ts +13 -0
  192. package/dist/context/map-dir.d.ts.map +1 -0
  193. package/dist/context/map-dir.js +81 -0
  194. package/dist/context/map-dir.js.map +1 -0
  195. package/dist/context/node-file.d.ts +109 -0
  196. package/dist/context/node-file.d.ts.map +1 -0
  197. package/dist/context/node-file.js +390 -0
  198. package/dist/context/node-file.js.map +1 -0
  199. package/dist/context/price.d.ts +49 -0
  200. package/dist/context/price.d.ts.map +1 -0
  201. package/dist/context/price.js +83 -0
  202. package/dist/context/price.js.map +1 -0
  203. package/dist/context/savings.d.ts +67 -0
  204. package/dist/context/savings.d.ts.map +1 -0
  205. package/dist/context/savings.js +125 -0
  206. package/dist/context/savings.js.map +1 -0
  207. package/dist/engine.d.ts +85 -0
  208. package/dist/engine.d.ts.map +1 -0
  209. package/dist/engine.js +122 -0
  210. package/dist/engine.js.map +1 -0
  211. package/dist/graph/bindings.d.ts +64 -0
  212. package/dist/graph/bindings.d.ts.map +1 -0
  213. package/dist/graph/bindings.js +713 -0
  214. package/dist/graph/bindings.js.map +1 -0
  215. package/dist/graph/build-run.d.ts +25 -0
  216. package/dist/graph/build-run.d.ts.map +1 -0
  217. package/dist/graph/build-run.js +121 -0
  218. package/dist/graph/build-run.js.map +1 -0
  219. package/dist/graph/build.d.ts +88 -0
  220. package/dist/graph/build.d.ts.map +1 -0
  221. package/dist/graph/build.js +386 -0
  222. package/dist/graph/build.js.map +1 -0
  223. package/dist/graph/cards.d.ts +46 -0
  224. package/dist/graph/cards.d.ts.map +1 -0
  225. package/dist/graph/cards.js +280 -0
  226. package/dist/graph/cards.js.map +1 -0
  227. package/dist/graph/check.d.ts +25 -0
  228. package/dist/graph/check.d.ts.map +1 -0
  229. package/dist/graph/check.js +192 -0
  230. package/dist/graph/check.js.map +1 -0
  231. package/dist/graph/container.d.ts +63 -0
  232. package/dist/graph/container.d.ts.map +1 -0
  233. package/dist/graph/container.js +191 -0
  234. package/dist/graph/container.js.map +1 -0
  235. package/dist/graph/depth-parser.d.ts +61 -0
  236. package/dist/graph/depth-parser.d.ts.map +1 -0
  237. package/dist/graph/depth-parser.js +153 -0
  238. package/dist/graph/depth-parser.js.map +1 -0
  239. package/dist/graph/enrich.d.ts +62 -0
  240. package/dist/graph/enrich.d.ts.map +1 -0
  241. package/dist/graph/enrich.js +258 -0
  242. package/dist/graph/enrich.js.map +1 -0
  243. package/dist/graph/extract-cache.d.ts +101 -0
  244. package/dist/graph/extract-cache.d.ts.map +1 -0
  245. package/dist/graph/extract-cache.js +199 -0
  246. package/dist/graph/extract-cache.js.map +1 -0
  247. package/dist/graph/extract.d.ts +85 -0
  248. package/dist/graph/extract.d.ts.map +1 -0
  249. package/dist/graph/extract.js +2377 -0
  250. package/dist/graph/extract.js.map +1 -0
  251. package/dist/graph/fingerprint.d.ts +76 -0
  252. package/dist/graph/fingerprint.d.ts.map +1 -0
  253. package/dist/graph/fingerprint.js +160 -0
  254. package/dist/graph/fingerprint.js.map +1 -0
  255. package/dist/graph/generic.d.ts +74 -0
  256. package/dist/graph/generic.d.ts.map +1 -0
  257. package/dist/graph/generic.js +773 -0
  258. package/dist/graph/generic.js.map +1 -0
  259. package/dist/graph/invariants.d.ts +33 -0
  260. package/dist/graph/invariants.d.ts.map +1 -0
  261. package/dist/graph/invariants.js +52 -0
  262. package/dist/graph/invariants.js.map +1 -0
  263. package/dist/graph/load.d.ts +29 -0
  264. package/dist/graph/load.d.ts.map +1 -0
  265. package/dist/graph/load.js +97 -0
  266. package/dist/graph/load.js.map +1 -0
  267. package/dist/graph/lsp/client.d.ts +61 -0
  268. package/dist/graph/lsp/client.d.ts.map +1 -0
  269. package/dist/graph/lsp/client.js +217 -0
  270. package/dist/graph/lsp/client.js.map +1 -0
  271. package/dist/graph/lsp/enrich.d.ts +11 -0
  272. package/dist/graph/lsp/enrich.d.ts.map +1 -0
  273. package/dist/graph/lsp/enrich.js +163 -0
  274. package/dist/graph/lsp/enrich.js.map +1 -0
  275. package/dist/graph/lsp/registry.d.ts +22 -0
  276. package/dist/graph/lsp/registry.d.ts.map +1 -0
  277. package/dist/graph/lsp/registry.js +71 -0
  278. package/dist/graph/lsp/registry.js.map +1 -0
  279. package/dist/graph/map.d.ts +107 -0
  280. package/dist/graph/map.d.ts.map +1 -0
  281. package/dist/graph/map.js +239 -0
  282. package/dist/graph/map.js.map +1 -0
  283. package/dist/graph/markdown.d.ts +22 -0
  284. package/dist/graph/markdown.d.ts.map +1 -0
  285. package/dist/graph/markdown.js +143 -0
  286. package/dist/graph/markdown.js.map +1 -0
  287. package/dist/graph/native.d.ts +46 -0
  288. package/dist/graph/native.d.ts.map +1 -0
  289. package/dist/graph/native.js +169 -0
  290. package/dist/graph/native.js.map +1 -0
  291. package/dist/graph/queries/c.scm +13 -0
  292. package/dist/graph/queries/c_sharp.scm +19 -0
  293. package/dist/graph/queries/clojure.scm +58 -0
  294. package/dist/graph/queries/cpp.scm +23 -0
  295. package/dist/graph/queries/dart.scm +42 -0
  296. package/dist/graph/queries/elixir.scm +54 -0
  297. package/dist/graph/queries/gleam.scm +51 -0
  298. package/dist/graph/queries/java.scm +20 -0
  299. package/dist/graph/queries/kotlin.scm +43 -0
  300. package/dist/graph/queries/lua.scm +36 -0
  301. package/dist/graph/queries/nix.scm +32 -0
  302. package/dist/graph/queries/php.scm +40 -0
  303. package/dist/graph/queries/ruby.scm +65 -0
  304. package/dist/graph/queries/rust.scm +41 -0
  305. package/dist/graph/queries/scala.scm +66 -0
  306. package/dist/graph/queries/solidity.scm +43 -0
  307. package/dist/graph/queries/swift.scm +51 -0
  308. package/dist/graph/refresh.d.ts +106 -0
  309. package/dist/graph/refresh.d.ts.map +1 -0
  310. package/dist/graph/refresh.js +430 -0
  311. package/dist/graph/refresh.js.map +1 -0
  312. package/dist/graph/relations.d.ts +14 -0
  313. package/dist/graph/relations.d.ts.map +1 -0
  314. package/dist/graph/relations.js +8 -0
  315. package/dist/graph/relations.js.map +1 -0
  316. package/dist/graph/resolve.d.ts +17 -0
  317. package/dist/graph/resolve.d.ts.map +1 -0
  318. package/dist/graph/resolve.js +716 -0
  319. package/dist/graph/resolve.js.map +1 -0
  320. package/dist/graph/root.d.ts +11 -0
  321. package/dist/graph/root.d.ts.map +1 -0
  322. package/dist/graph/root.js +40 -0
  323. package/dist/graph/root.js.map +1 -0
  324. package/dist/graph/scopes.d.ts +40 -0
  325. package/dist/graph/scopes.d.ts.map +1 -0
  326. package/dist/graph/scopes.js +383 -0
  327. package/dist/graph/scopes.js.map +1 -0
  328. package/dist/graph/seed.d.ts +38 -0
  329. package/dist/graph/seed.d.ts.map +1 -0
  330. package/dist/graph/seed.js +229 -0
  331. package/dist/graph/seed.js.map +1 -0
  332. package/dist/graph/source-files.d.ts +46 -0
  333. package/dist/graph/source-files.d.ts.map +1 -0
  334. package/dist/graph/source-files.js +118 -0
  335. package/dist/graph/source-files.js.map +1 -0
  336. package/dist/graph/traverse-cli.d.ts +55 -0
  337. package/dist/graph/traverse-cli.d.ts.map +1 -0
  338. package/dist/graph/traverse-cli.js +189 -0
  339. package/dist/graph/traverse-cli.js.map +1 -0
  340. package/dist/graph/traverse.d.ts +112 -0
  341. package/dist/graph/traverse.d.ts.map +1 -0
  342. package/dist/graph/traverse.js +192 -0
  343. package/dist/graph/traverse.js.map +1 -0
  344. package/dist/graph/types.d.ts +78 -0
  345. package/dist/graph/types.d.ts.map +1 -0
  346. package/dist/graph/types.js +14 -0
  347. package/dist/graph/types.js.map +1 -0
  348. package/dist/graph/wasm-runtime.d.ts +19 -0
  349. package/dist/graph/wasm-runtime.d.ts.map +1 -0
  350. package/dist/graph/wasm-runtime.js +38 -0
  351. package/dist/graph/wasm-runtime.js.map +1 -0
  352. package/dist/graph/workspace-cli.d.ts +56 -0
  353. package/dist/graph/workspace-cli.d.ts.map +1 -0
  354. package/dist/graph/workspace-cli.js +111 -0
  355. package/dist/graph/workspace-cli.js.map +1 -0
  356. package/dist/graph/workspace.d.ts +172 -0
  357. package/dist/graph/workspace.d.ts.map +1 -0
  358. package/dist/graph/workspace.js +714 -0
  359. package/dist/graph/workspace.js.map +1 -0
  360. package/dist/graph/write.d.ts +13 -0
  361. package/dist/graph/write.d.ts.map +1 -0
  362. package/dist/graph/write.js +86 -0
  363. package/dist/graph/write.js.map +1 -0
  364. package/dist/hosts/antigravity.d.ts +14 -0
  365. package/dist/hosts/antigravity.d.ts.map +1 -0
  366. package/dist/hosts/antigravity.js +59 -0
  367. package/dist/hosts/antigravity.js.map +1 -0
  368. package/dist/hosts/auto.d.ts +37 -0
  369. package/dist/hosts/auto.d.ts.map +1 -0
  370. package/dist/hosts/auto.js +141 -0
  371. package/dist/hosts/auto.js.map +1 -0
  372. package/dist/hosts/claude-global.d.ts +72 -0
  373. package/dist/hosts/claude-global.d.ts.map +1 -0
  374. package/dist/hosts/claude-global.js +230 -0
  375. package/dist/hosts/claude-global.js.map +1 -0
  376. package/dist/hosts/config-write.d.ts +36 -0
  377. package/dist/hosts/config-write.d.ts.map +1 -0
  378. package/dist/hosts/config-write.js +64 -0
  379. package/dist/hosts/config-write.js.map +1 -0
  380. package/dist/hosts/init.d.ts +28 -0
  381. package/dist/hosts/init.d.ts.map +1 -0
  382. package/dist/hosts/init.js +89 -0
  383. package/dist/hosts/init.js.map +1 -0
  384. package/dist/hosts/instructions.d.ts +14 -0
  385. package/dist/hosts/instructions.d.ts.map +1 -0
  386. package/dist/hosts/instructions.js +95 -0
  387. package/dist/hosts/instructions.js.map +1 -0
  388. package/dist/hosts/mcp-config.d.ts +78 -0
  389. package/dist/hosts/mcp-config.d.ts.map +1 -0
  390. package/dist/hosts/mcp-config.js +251 -0
  391. package/dist/hosts/mcp-config.js.map +1 -0
  392. package/dist/hosts/plan.d.ts +32 -0
  393. package/dist/hosts/plan.d.ts.map +1 -0
  394. package/dist/hosts/plan.js +73 -0
  395. package/dist/hosts/plan.js.map +1 -0
  396. package/dist/hosts/registry.d.ts +41 -0
  397. package/dist/hosts/registry.d.ts.map +1 -0
  398. package/dist/hosts/registry.js +164 -0
  399. package/dist/hosts/registry.js.map +1 -0
  400. package/dist/hosts/retract.d.ts +47 -0
  401. package/dist/hosts/retract.d.ts.map +1 -0
  402. package/dist/hosts/retract.js +520 -0
  403. package/dist/hosts/retract.js.map +1 -0
  404. package/dist/hosts/sections.d.ts +47 -0
  405. package/dist/hosts/sections.d.ts.map +1 -0
  406. package/dist/hosts/sections.js +127 -0
  407. package/dist/hosts/sections.js.map +1 -0
  408. package/dist/index.d.ts +41 -0
  409. package/dist/index.d.ts.map +1 -0
  410. package/dist/index.js +32 -0
  411. package/dist/index.js.map +1 -0
  412. package/dist/ingest/fs.d.ts +79 -0
  413. package/dist/ingest/fs.d.ts.map +1 -0
  414. package/dist/ingest/fs.js +306 -0
  415. package/dist/ingest/fs.js.map +1 -0
  416. package/dist/init-guard.d.ts +16 -0
  417. package/dist/init-guard.d.ts.map +1 -0
  418. package/dist/init-guard.js +27 -0
  419. package/dist/init-guard.js.map +1 -0
  420. package/dist/mcp/instructions.d.ts +5 -0
  421. package/dist/mcp/instructions.d.ts.map +1 -0
  422. package/dist/mcp/instructions.js +64 -0
  423. package/dist/mcp/instructions.js.map +1 -0
  424. package/dist/mcp/kept-listing.d.ts +27 -0
  425. package/dist/mcp/kept-listing.d.ts.map +1 -0
  426. package/dist/mcp/kept-listing.js +63 -0
  427. package/dist/mcp/kept-listing.js.map +1 -0
  428. package/dist/mcp/server.d.ts +4 -0
  429. package/dist/mcp/server.d.ts.map +1 -0
  430. package/dist/mcp/server.js +147 -0
  431. package/dist/mcp/server.js.map +1 -0
  432. package/dist/mcp/tool-names.d.ts +27 -0
  433. package/dist/mcp/tool-names.d.ts.map +1 -0
  434. package/dist/mcp/tool-names.js +47 -0
  435. package/dist/mcp/tool-names.js.map +1 -0
  436. package/dist/mcp/tools.d.ts +22 -0
  437. package/dist/mcp/tools.d.ts.map +1 -0
  438. package/dist/mcp/tools.js +440 -0
  439. package/dist/mcp/tools.js.map +1 -0
  440. package/dist/node-version.d.ts +15 -0
  441. package/dist/node-version.d.ts.map +1 -0
  442. package/dist/node-version.js +23 -0
  443. package/dist/node-version.js.map +1 -0
  444. package/dist/search/grep-cli.d.ts +35 -0
  445. package/dist/search/grep-cli.d.ts.map +1 -0
  446. package/dist/search/grep-cli.js +115 -0
  447. package/dist/search/grep-cli.js.map +1 -0
  448. package/dist/search/grep.d.ts +60 -0
  449. package/dist/search/grep.d.ts.map +1 -0
  450. package/dist/search/grep.js +143 -0
  451. package/dist/search/grep.js.map +1 -0
  452. package/dist/search/ignored-code.d.ts +9 -0
  453. package/dist/search/ignored-code.d.ts.map +1 -0
  454. package/dist/search/ignored-code.js +73 -0
  455. package/dist/search/ignored-code.js.map +1 -0
  456. package/dist/search/user-regexp.d.ts +26 -0
  457. package/dist/search/user-regexp.d.ts.map +1 -0
  458. package/dist/search/user-regexp.js +150 -0
  459. package/dist/search/user-regexp.js.map +1 -0
  460. package/dist/telemetry/contract.d.ts +117 -0
  461. package/dist/telemetry/contract.d.ts.map +1 -0
  462. package/dist/telemetry/contract.js +341 -0
  463. package/dist/telemetry/contract.js.map +1 -0
  464. package/dist/telemetry/flush.d.ts +21 -0
  465. package/dist/telemetry/flush.d.ts.map +1 -0
  466. package/dist/telemetry/flush.js +85 -0
  467. package/dist/telemetry/flush.js.map +1 -0
  468. package/dist/telemetry/gate.d.ts +30 -0
  469. package/dist/telemetry/gate.d.ts.map +1 -0
  470. package/dist/telemetry/gate.js +81 -0
  471. package/dist/telemetry/gate.js.map +1 -0
  472. package/dist/telemetry/identity.d.ts +40 -0
  473. package/dist/telemetry/identity.d.ts.map +1 -0
  474. package/dist/telemetry/identity.js +80 -0
  475. package/dist/telemetry/identity.js.map +1 -0
  476. package/dist/telemetry/index.d.ts +18 -0
  477. package/dist/telemetry/index.d.ts.map +1 -0
  478. package/dist/telemetry/index.js +16 -0
  479. package/dist/telemetry/index.js.map +1 -0
  480. package/dist/telemetry/key.d.ts +21 -0
  481. package/dist/telemetry/key.d.ts.map +1 -0
  482. package/dist/telemetry/key.js +49 -0
  483. package/dist/telemetry/key.js.map +1 -0
  484. package/dist/telemetry/notice.d.ts +19 -0
  485. package/dist/telemetry/notice.d.ts.map +1 -0
  486. package/dist/telemetry/notice.js +93 -0
  487. package/dist/telemetry/notice.js.map +1 -0
  488. package/dist/telemetry/queue.d.ts +35 -0
  489. package/dist/telemetry/queue.d.ts.map +1 -0
  490. package/dist/telemetry/queue.js +162 -0
  491. package/dist/telemetry/queue.js.map +1 -0
  492. package/dist/telemetry/send.d.ts +19 -0
  493. package/dist/telemetry/send.d.ts.map +1 -0
  494. package/dist/telemetry/send.js +84 -0
  495. package/dist/telemetry/send.js.map +1 -0
  496. package/dist/telemetry/sessions.d.ts +25 -0
  497. package/dist/telemetry/sessions.d.ts.map +1 -0
  498. package/dist/telemetry/sessions.js +104 -0
  499. package/dist/telemetry/sessions.js.map +1 -0
  500. package/dist/telemetry/track.d.ts +62 -0
  501. package/dist/telemetry/track.d.ts.map +1 -0
  502. package/dist/telemetry/track.js +143 -0
  503. package/dist/telemetry/track.js.map +1 -0
  504. package/dist/upkeep-run.d.ts +22 -0
  505. package/dist/upkeep-run.d.ts.map +1 -0
  506. package/dist/upkeep-run.js +85 -0
  507. package/dist/upkeep-run.js.map +1 -0
  508. package/dist/upkeep.d.ts +127 -0
  509. package/dist/upkeep.d.ts.map +1 -0
  510. package/dist/upkeep.js +252 -0
  511. package/dist/upkeep.js.map +1 -0
  512. package/dist/util/actions-folder.d.ts +2 -0
  513. package/dist/util/actions-folder.d.ts.map +1 -0
  514. package/dist/util/actions-folder.js +9 -0
  515. package/dist/util/actions-folder.js.map +1 -0
  516. package/dist/util/browser.d.ts +3 -0
  517. package/dist/util/browser.d.ts.map +1 -0
  518. package/dist/util/browser.js +14 -0
  519. package/dist/util/browser.js.map +1 -0
  520. package/dist/util/child-process.d.ts +15 -0
  521. package/dist/util/child-process.d.ts.map +1 -0
  522. package/dist/util/child-process.js +15 -0
  523. package/dist/util/child-process.js.map +1 -0
  524. package/dist/util/front-matter.d.ts +46 -0
  525. package/dist/util/front-matter.d.ts.map +1 -0
  526. package/dist/util/front-matter.js +113 -0
  527. package/dist/util/front-matter.js.map +1 -0
  528. package/dist/util/id.d.ts +7 -0
  529. package/dist/util/id.d.ts.map +1 -0
  530. package/dist/util/id.js +14 -0
  531. package/dist/util/id.js.map +1 -0
  532. package/dist/util/paths.d.ts +29 -0
  533. package/dist/util/paths.d.ts.map +1 -0
  534. package/dist/util/paths.js +71 -0
  535. package/dist/util/paths.js.map +1 -0
  536. package/dist/util/private-file.d.ts +14 -0
  537. package/dist/util/private-file.d.ts.map +1 -0
  538. package/dist/util/private-file.js +82 -0
  539. package/dist/util/private-file.js.map +1 -0
  540. package/dist/util/source.d.ts +4 -0
  541. package/dist/util/source.d.ts.map +1 -0
  542. package/dist/util/source.js +12 -0
  543. package/dist/util/source.js.map +1 -0
  544. package/dist/util/spinner.d.ts +15 -0
  545. package/dist/util/spinner.d.ts.map +1 -0
  546. package/dist/util/spinner.js +52 -0
  547. package/dist/util/spinner.js.map +1 -0
  548. package/dist/util/state.d.ts +120 -0
  549. package/dist/util/state.d.ts.map +1 -0
  550. package/dist/util/state.js +264 -0
  551. package/dist/util/state.js.map +1 -0
  552. package/dist/vendor/grammars/tree-sitter-go.LICENSE +21 -0
  553. package/dist/vendor/grammars/tree-sitter-go.wasm +0 -0
  554. package/dist/vendor/grammars/tree-sitter-java.LICENSE +21 -0
  555. package/dist/vendor/grammars/tree-sitter-java.wasm +0 -0
  556. package/dist/vendor/grammars/tree-sitter-kotlin.LICENSE +9 -0
  557. package/dist/vendor/grammars/tree-sitter-kotlin.wasm +0 -0
  558. package/dist/vendor/grammars/tree-sitter-php.LICENSE +22 -0
  559. package/dist/vendor/grammars/tree-sitter-php.wasm +0 -0
  560. package/dist/vendor/grammars/tree-sitter-python.LICENSE +21 -0
  561. package/dist/vendor/grammars/tree-sitter-python.wasm +0 -0
  562. package/dist/vendor/grammars/tree-sitter-r.LICENSE +9 -0
  563. package/dist/vendor/grammars/tree-sitter-r.wasm +0 -0
  564. package/dist/vendor/grammars/tree-sitter-swift.LICENSE +21 -0
  565. package/dist/vendor/grammars/tree-sitter-swift.wasm +0 -0
  566. package/dist/vendor/grammars/tree-sitter-tsx.wasm +0 -0
  567. package/dist/vendor/grammars/tree-sitter-typescript.LICENSE +21 -0
  568. package/dist/vendor/grammars/tree-sitter-typescript.wasm +0 -0
  569. package/dist/viewer/app.js +2 -0
  570. package/dist/viewer/index.html +49 -0
  571. package/dist/viewer/style.css +154 -0
  572. package/dist/viz/assemble.d.ts +83 -0
  573. package/dist/viz/assemble.d.ts.map +1 -0
  574. package/dist/viz/assemble.js +101 -0
  575. package/dist/viz/assemble.js.map +1 -0
  576. package/dist/viz/export.d.ts +39 -0
  577. package/dist/viz/export.d.ts.map +1 -0
  578. package/dist/viz/export.js +98 -0
  579. package/dist/viz/export.js.map +1 -0
  580. package/dist/viz/serve.d.ts +13 -0
  581. package/dist/viz/serve.d.ts.map +1 -0
  582. package/dist/viz/serve.js +130 -0
  583. package/dist/viz/serve.js.map +1 -0
  584. package/package.json +115 -4
  585. package/scripts/build-grammar-wasm.mjs +112 -0
  586. package/scripts/build-viewer.mjs +44 -0
  587. package/scripts/graph-quality.mjs +117 -0
  588. package/scripts/pack-trail.mjs +53 -0
  589. package/scripts/postinstall.mjs +65 -0
  590. package/scripts/run-tests.mjs +72 -0
  591. package/scripts/stamp-telemetry-key.mjs +56 -0
  592. package/scripts/tally-audit.mjs +140 -0
  593. package/scripts/vendor-grammars.mjs +53 -0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * OrcaRouter transport. The OrcaRouter gateway speaks the OpenAI-compatible
3
+ * wire format, so this reuses the OpenAI adapter's request/response translation
4
+ * and simply points it at the gateway. The value over a bare `openai` provider +
5
+ * `baseUrl` is a first-class, self-describing provider: a sensible default
6
+ * gateway address and `/v1/models` auto-discovery (see {@link listOrcaRouterModels}),
7
+ * so callers can enumerate whatever upstream models the gateway routes to —
8
+ * reaching 150+ models from OpenAI, Anthropic, Google, DeepSeek, Qwen, and more
9
+ * through one endpoint without a per-vendor code path.
10
+ */
11
+ import OpenAI from "openai";
12
+ import { OpenAIChatModel, type OpenAIChatModelOptions } from "./openai.js";
13
+ /** Public endpoint of the OrcaRouter AI gateway. */
14
+ export declare const DEFAULT_ORCAROUTER_BASE_URL = "https://api.orcarouter.ai/v1";
15
+ export type OrcaRouterChatModelOptions = OpenAIChatModelOptions;
16
+ /**
17
+ * ChatModel backed by the OrcaRouter gateway. Inherits every translation detail
18
+ * from {@link OpenAIChatModel} (the gateway is OpenAI-compatible) and only
19
+ * changes the defaults: the gateway base URL and an `orcarouter:<model>` label.
20
+ */
21
+ export declare class OrcaRouterChatModel extends OpenAIChatModel {
22
+ constructor(opts: OrcaRouterChatModelOptions);
23
+ }
24
+ /**
25
+ * Auto-discover the models the OrcaRouter gateway can route to via `GET
26
+ * /v1/models`. Returns the model ids so a caller can present/validate them
27
+ * instead of hardcoding a model string. A stub `client` may be injected for tests.
28
+ */
29
+ export declare function listOrcaRouterModels(opts: {
30
+ apiKey: string;
31
+ baseUrl?: string;
32
+ client?: OpenAI;
33
+ }): Promise<string[]>;
34
+ //# sourceMappingURL=orcarouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orcarouter.d.ts","sourceRoot":"","sources":["../../../src/ai/llm/orcarouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG3E,oDAAoD;AACpD,eAAO,MAAM,2BAA2B,iCAAiC,CAAC;AAE1E,MAAM,MAAM,0BAA0B,GAAG,sBAAsB,CAAC;AAEhE;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;gBAC1C,IAAI,EAAE,0BAA0B;CAO7C;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUpB"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * OrcaRouter transport. The OrcaRouter gateway speaks the OpenAI-compatible
3
+ * wire format, so this reuses the OpenAI adapter's request/response translation
4
+ * and simply points it at the gateway. The value over a bare `openai` provider +
5
+ * `baseUrl` is a first-class, self-describing provider: a sensible default
6
+ * gateway address and `/v1/models` auto-discovery (see {@link listOrcaRouterModels}),
7
+ * so callers can enumerate whatever upstream models the gateway routes to —
8
+ * reaching 150+ models from OpenAI, Anthropic, Google, DeepSeek, Qwen, and more
9
+ * through one endpoint without a per-vendor code path.
10
+ */
11
+ import OpenAI from "openai";
12
+ import { OpenAIChatModel } from "./openai.js";
13
+ import { transportRetries } from "./types.js";
14
+ /** Public endpoint of the OrcaRouter AI gateway. */
15
+ export const DEFAULT_ORCAROUTER_BASE_URL = "https://api.orcarouter.ai/v1";
16
+ /**
17
+ * ChatModel backed by the OrcaRouter gateway. Inherits every translation detail
18
+ * from {@link OpenAIChatModel} (the gateway is OpenAI-compatible) and only
19
+ * changes the defaults: the gateway base URL and an `orcarouter:<model>` label.
20
+ */
21
+ export class OrcaRouterChatModel extends OpenAIChatModel {
22
+ constructor(opts) {
23
+ super({
24
+ ...opts,
25
+ baseUrl: opts.baseUrl ?? DEFAULT_ORCAROUTER_BASE_URL,
26
+ label: opts.label ?? `orcarouter:${opts.model}`,
27
+ });
28
+ }
29
+ }
30
+ /**
31
+ * Auto-discover the models the OrcaRouter gateway can route to via `GET
32
+ * /v1/models`. Returns the model ids so a caller can present/validate them
33
+ * instead of hardcoding a model string. A stub `client` may be injected for tests.
34
+ */
35
+ export async function listOrcaRouterModels(opts) {
36
+ const client = opts.client ??
37
+ new OpenAI({
38
+ apiKey: opts.apiKey,
39
+ baseURL: opts.baseUrl ?? DEFAULT_ORCAROUTER_BASE_URL,
40
+ maxRetries: transportRetries(),
41
+ });
42
+ const res = await client.models.list();
43
+ return res.data.map((m) => m.id);
44
+ }
45
+ //# sourceMappingURL=orcarouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orcarouter.js","sourceRoot":"","sources":["../../../src/ai/llm/orcarouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,eAAe,EAA+B,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,oDAAoD;AACpD,MAAM,CAAC,MAAM,2BAA2B,GAAG,8BAA8B,CAAC;AAI1E;;;;GAIG;AACH,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IACtD,YAAY,IAAgC;QAC1C,KAAK,CAAC;YACJ,GAAG,IAAI;YACP,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,2BAA2B;YACpD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,cAAc,IAAI,CAAC,KAAK,EAAE;SAChD,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAI1C;IACC,MAAM,MAAM,GACV,IAAI,CAAC,MAAM;QACX,IAAI,MAAM,CAAC;YACT,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,2BAA2B;YACpD,UAAU,EAAE,gBAAgB,EAAE;SAC/B,CAAC,CAAC;IACL,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACvC,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Recover a forced-tool payload from assistant `content` when a gateway ignored
3
+ * `tool_choice` and wrote JSON text instead of `tool_calls` (#129).
4
+ *
5
+ * Conservative: only succeeds when `text` parses as JSON matching one of:
6
+ * - `[{ name, parameters|arguments|args }]`
7
+ * - `{ name, parameters|arguments|args }`
8
+ * - a fenced ```json block wrapping either
9
+ * - a bare object whose `payloadKey` is an array
10
+ * Anything else (prose, truncated JSON, a guessed shape) returns undefined.
11
+ * Callers MUST run the same schema validation they use for real tool calls.
12
+ */
13
+ /** Leading/trailing ```json fence, linear in `raw.length` — no quantified-whitespace regex. */
14
+ export declare function unwrapMarkdownFence(raw: string): string;
15
+ export declare function recoverToolArgsFromContent(text: string, opts: {
16
+ toolNames: readonly string[];
17
+ payloadKey: string;
18
+ }): Record<string, unknown> | undefined;
19
+ /** One stderr line when a structured op got neither a tool call nor recoverable JSON. */
20
+ export declare function warnToolChoiceIgnored(op: string, reason: "empty" | "unparsed"): void;
21
+ //# sourceMappingURL=recover-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recover-tool.d.ts","sourceRoot":"","sources":["../../../src/ai/llm/recover-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,+FAA+F;AAC/F,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASvD;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACzD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAiErC;AAED,yFAAyF;AACzF,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAMpF"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Recover a forced-tool payload from assistant `content` when a gateway ignored
3
+ * `tool_choice` and wrote JSON text instead of `tool_calls` (#129).
4
+ *
5
+ * Conservative: only succeeds when `text` parses as JSON matching one of:
6
+ * - `[{ name, parameters|arguments|args }]`
7
+ * - `{ name, parameters|arguments|args }`
8
+ * - a fenced ```json block wrapping either
9
+ * - a bare object whose `payloadKey` is an array
10
+ * Anything else (prose, truncated JSON, a guessed shape) returns undefined.
11
+ * Callers MUST run the same schema validation they use for real tool calls.
12
+ */
13
+ /** Leading/trailing ```json fence, linear in `raw.length` — no quantified-whitespace regex. */
14
+ export function unwrapMarkdownFence(raw) {
15
+ let s = raw;
16
+ if (s.startsWith("```")) {
17
+ s = s.slice(3);
18
+ if (s.length >= 4 && s.slice(0, 4).toLowerCase() === "json")
19
+ s = s.slice(4);
20
+ s = s.trimStart();
21
+ }
22
+ if (s.endsWith("```"))
23
+ s = s.slice(0, -3).trimEnd();
24
+ return s.trim();
25
+ }
26
+ export function recoverToolArgsFromContent(text, opts) {
27
+ const raw = text?.trim();
28
+ if (!raw)
29
+ return undefined;
30
+ const stripped = unwrapMarkdownFence(raw);
31
+ const accepted = new Set(opts.toolNames);
32
+ const asPayload = (value) => {
33
+ if (!value || typeof value !== "object")
34
+ return undefined;
35
+ if (Array.isArray(value)) {
36
+ for (const item of value) {
37
+ const hit = asPayload(item);
38
+ if (hit)
39
+ return hit;
40
+ }
41
+ return undefined;
42
+ }
43
+ const obj = value;
44
+ const wrapped = typeof obj.name === "string" || "parameters" in obj || "arguments" in obj || "args" in obj;
45
+ if (wrapped) {
46
+ const name = typeof obj.name === "string" ? obj.name : "";
47
+ if (name && !accepted.has(name))
48
+ return undefined;
49
+ let params = obj.parameters ?? obj.arguments ?? obj.args;
50
+ if (typeof params === "string") {
51
+ try {
52
+ params = JSON.parse(params);
53
+ }
54
+ catch {
55
+ return undefined;
56
+ }
57
+ }
58
+ const hit = asPayload(params);
59
+ if (hit)
60
+ return hit;
61
+ // `{ name, nodes: [...] }` — payload at the same level as the wrapper.
62
+ if (Array.isArray(obj[opts.payloadKey]))
63
+ return obj;
64
+ return undefined;
65
+ }
66
+ if (Array.isArray(obj[opts.payloadKey]))
67
+ return obj;
68
+ return undefined;
69
+ };
70
+ try {
71
+ const hit = asPayload(JSON.parse(stripped));
72
+ if (hit)
73
+ return hit;
74
+ }
75
+ catch {
76
+ /* try a bracket slice below */
77
+ }
78
+ const objStart = stripped.indexOf("{");
79
+ const objEnd = stripped.lastIndexOf("}");
80
+ if (objStart >= 0 && objEnd > objStart) {
81
+ try {
82
+ const hit = asPayload(JSON.parse(stripped.slice(objStart, objEnd + 1)));
83
+ if (hit)
84
+ return hit;
85
+ }
86
+ catch {
87
+ /* try array slice */
88
+ }
89
+ }
90
+ const arrStart = stripped.indexOf("[");
91
+ const arrEnd = stripped.lastIndexOf("]");
92
+ if (arrStart >= 0 && arrEnd > arrStart) {
93
+ try {
94
+ return asPayload(JSON.parse(stripped.slice(arrStart, arrEnd + 1)));
95
+ }
96
+ catch {
97
+ return undefined;
98
+ }
99
+ }
100
+ return undefined;
101
+ }
102
+ /** One stderr line when a structured op got neither a tool call nor recoverable JSON. */
103
+ export function warnToolChoiceIgnored(op, reason) {
104
+ const detail = reason === "empty"
105
+ ? "model returned no tool call and no content (provider may ignore forced tool_choice)"
106
+ : "model did not honor tool_choice and content is not parseable tool-call JSON";
107
+ console.error(`⚠ ${op}: ${detail} — this batch is empty`);
108
+ }
109
+ //# sourceMappingURL=recover-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recover-tool.js","sourceRoot":"","sources":["../../../src/ai/llm/recover-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Provider-neutral chat transport.
3
+ *
4
+ * Every LLM call in graft — the engine's single-shot summarize/synthesize/crux
5
+ * ops, and any multi-turn tool-use loop built on top — goes through one interface,
6
+ * {@link ChatModel}. Adapters translate this neutral shape to a concrete SDK
7
+ * (OpenAI-compatible or native Anthropic). Nothing above this layer knows which
8
+ * provider is in play, so adding a provider is a new adapter, never a change to
9
+ * a call site.
10
+ *
11
+ * The design carries three affordances that let a single interface serve the
12
+ * multi-turn loop as cleanly as a one-shot call:
13
+ * - {@link ChatResponse.assistant} — a ready-to-append assistant message, so a
14
+ * caller continues a conversation without touching provider shapes.
15
+ * - {@link Message.providerRaw} — opaque verbatim replay of a message the same
16
+ * adapter produced (preserves Anthropic thinking-block signatures, which must
17
+ * be echoed back unchanged).
18
+ * - {@link Usage} normalized to uncached-input, so token accounting is identical
19
+ * across providers.
20
+ */
21
+ /** A single tool invocation requested by the model. `args` is ALREADY parsed. */
22
+ export interface ToolCall {
23
+ id: string;
24
+ name: string;
25
+ /** Parsed argument object. Adapters (de)serialize to their wire format. */
26
+ args: unknown;
27
+ }
28
+ /** One turn in a conversation, in provider-neutral form. */
29
+ export interface Message {
30
+ role: "system" | "user" | "assistant" | "tool";
31
+ /** Plain-text content. Empty string when a turn is purely tool calls/results. */
32
+ content: string;
33
+ /** Assistant turns only: tool calls the model asked for. */
34
+ toolCalls?: ToolCall[];
35
+ /** Tool turns only: the id of the {@link ToolCall} this result answers. */
36
+ toolCallId?: string;
37
+ /**
38
+ * Request a provider cache marker (`cache_control: ephemeral`) on THIS message.
39
+ * The transport only understands this per-message flag; any sliding/rotation
40
+ * policy lives in the caller.
41
+ */
42
+ cacheBreakpoint?: boolean;
43
+ /**
44
+ * Opaque, provider-tagged payload from the adapter that produced this message.
45
+ * When the SAME adapter replays it, the original wire form is sent verbatim
46
+ * (preserving e.g. Anthropic thinking blocks + signatures). A different adapter
47
+ * ignores it and reconstructs from {@link content}/{@link toolCalls}.
48
+ */
49
+ providerRaw?: {
50
+ provider: string;
51
+ raw: unknown;
52
+ };
53
+ }
54
+ /** A tool the model may call. `parameters` is a JSON Schema object. */
55
+ export interface ToolSpec {
56
+ name: string;
57
+ description: string;
58
+ parameters: Record<string, unknown>;
59
+ }
60
+ /**
61
+ * How the model must shape its reply:
62
+ * - `text` — free-form assistant text.
63
+ * - `json` — a JSON object (mapped to a forced synthetic tool on both providers,
64
+ * since that is the one structured-output mechanism they share).
65
+ * - `tool` — force a call to the named tool (structured output with a schema).
66
+ */
67
+ export type ResponseFormat = {
68
+ kind: "text";
69
+ } | {
70
+ kind: "json";
71
+ } | {
72
+ kind: "tool";
73
+ name: string;
74
+ };
75
+ /**
76
+ * Token accounting, normalized across providers. `input` is UNCACHED input only
77
+ * (OpenAI reports cached tokens inside `prompt_tokens`; Anthropic reports them
78
+ * separately — adapters reconcile so callers can sum these directly).
79
+ */
80
+ export interface Usage {
81
+ input: number;
82
+ output: number;
83
+ cacheRead: number;
84
+ cacheCreate: number;
85
+ }
86
+ export interface ChatRequest {
87
+ messages: Message[];
88
+ tools?: ToolSpec[];
89
+ /** Default: `{ kind: "text" }`. */
90
+ responseFormat?: ResponseFormat;
91
+ /** Providers that reject it (current Anthropic models) drop it in the adapter. */
92
+ temperature?: number;
93
+ /** Max output tokens. Required by Anthropic; adapters supply a default. */
94
+ maxTokens?: number;
95
+ }
96
+ export interface ChatResponse {
97
+ /** Concatenated assistant text (empty when the turn only made tool calls). */
98
+ text: string;
99
+ toolCalls: ToolCall[];
100
+ usage: Usage;
101
+ stopReason: string | null;
102
+ /** The assistant turn as a neutral message — push straight back into `messages`. */
103
+ assistant: Message;
104
+ }
105
+ /**
106
+ * A configured connection to one model. `label` is a stable `<provider>:<model>`
107
+ * string recorded in the graph manifest.
108
+ */
109
+ export interface ChatModel {
110
+ readonly label: string;
111
+ create(req: ChatRequest): Promise<ChatResponse>;
112
+ }
113
+ /**
114
+ * How many times the transport retries a failed request before the error reaches
115
+ * the caller. Both SDKs retry only what is worth retrying (429 and 5xx, honouring
116
+ * `Retry-After`) with exponential backoff, so this is the knob that separates a
117
+ * transient rate limit from a real failure — #127 lost whole files to the first
118
+ * 429 a shared gateway threw. Env-overridable because a metered corporate gateway
119
+ * may want fewer, and a flaky local proxy more.
120
+ */
121
+ export declare function transportRetries(): number;
122
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ai/llm/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,iFAAiF;AACjF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,IAAI,EAAE,OAAO,CAAC;CACf;AAED,4DAA4D;AAC5D,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;OAKG;IACH,WAAW,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;CAClD;AAED,uEAAuE;AACvE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,mCAAmC;IACnC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oFAAoF;IACpF,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACjD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAGzC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Provider-neutral chat transport.
3
+ *
4
+ * Every LLM call in graft — the engine's single-shot summarize/synthesize/crux
5
+ * ops, and any multi-turn tool-use loop built on top — goes through one interface,
6
+ * {@link ChatModel}. Adapters translate this neutral shape to a concrete SDK
7
+ * (OpenAI-compatible or native Anthropic). Nothing above this layer knows which
8
+ * provider is in play, so adding a provider is a new adapter, never a change to
9
+ * a call site.
10
+ *
11
+ * The design carries three affordances that let a single interface serve the
12
+ * multi-turn loop as cleanly as a one-shot call:
13
+ * - {@link ChatResponse.assistant} — a ready-to-append assistant message, so a
14
+ * caller continues a conversation without touching provider shapes.
15
+ * - {@link Message.providerRaw} — opaque verbatim replay of a message the same
16
+ * adapter produced (preserves Anthropic thinking-block signatures, which must
17
+ * be echoed back unchanged).
18
+ * - {@link Usage} normalized to uncached-input, so token accounting is identical
19
+ * across providers.
20
+ */
21
+ /**
22
+ * How many times the transport retries a failed request before the error reaches
23
+ * the caller. Both SDKs retry only what is worth retrying (429 and 5xx, honouring
24
+ * `Retry-After`) with exponential backoff, so this is the knob that separates a
25
+ * transient rate limit from a real failure — #127 lost whole files to the first
26
+ * 429 a shared gateway threw. Env-overridable because a metered corporate gateway
27
+ * may want fewer, and a flaky local proxy more.
28
+ */
29
+ export function transportRetries() {
30
+ const raw = Number(process.env.GRAFT_LLM_RETRIES);
31
+ return Number.isFinite(raw) && raw >= 0 ? Math.floor(raw) : 4;
32
+ }
33
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ai/llm/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA+FH;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,59 @@
1
+ import type { Summarizer } from "./summarize.js";
2
+ import type { Synthesizer } from "./synthesize.js";
3
+ import type { CruxSummarizer } from "./crux.js";
4
+ import type { ChatModel } from "./llm/types.js";
5
+ import type { ProviderKind } from "./llm/factory.js";
6
+ /**
7
+ * User-facing configuration. Anything omitted falls back to environment
8
+ * variables and then to sensible defaults.
9
+ *
10
+ * graft is vendor-neutral: `provider` names only the WIRE FORMAT, not a company.
11
+ * `openai` speaks the OpenAI-compatible API — point `baseUrl` at OpenRouter,
12
+ * Fireworks, a LiteLLM proxy, Groq, a local server, or OpenAI itself, and pass
13
+ * your own key. `anthropic` speaks the native Messages API. Any LLM-backed
14
+ * operation needs an API key.
15
+ */
16
+ export interface EngineConfig {
17
+ /** Where the graph lives. Env: GRAFT_DIR. Default: `<repo>/.context`. */
18
+ contextDir?: string;
19
+ /** Wire format / SDK. Env: GRAFT_PROVIDER. Default: `openai`. */
20
+ provider?: ProviderKind;
21
+ /** API key for the chosen provider. Env: GRAFT_API_KEY (legacy: OPENROUTER_API_KEY). */
22
+ apiKey?: string;
23
+ /** Model id. Env: GRAFT_MODEL. Provider-specific default. */
24
+ model?: string;
25
+ /** Base URL for OpenAI-compatible endpoints. Env: GRAFT_BASE_URL. */
26
+ baseUrl?: string;
27
+ /** Override the whole transport (skips provider/apiKey/baseUrl). */
28
+ chatModel?: ChatModel;
29
+ /** Override the synthesizer. */
30
+ synthesizer?: Synthesizer;
31
+ /** Override the code summarizer. */
32
+ summarizer?: Summarizer;
33
+ /** Override the per-symbol crux summarizer. */
34
+ cruxSummarizer?: CruxSummarizer;
35
+ }
36
+ /** Fully-resolved configuration with all defaults applied. */
37
+ export interface ResolvedConfig {
38
+ contextDir?: string;
39
+ provider: ProviderKind;
40
+ apiKey?: string;
41
+ model: string;
42
+ baseUrl?: string;
43
+ headers?: Record<string, string>;
44
+ /** True when the key came from the deprecated OPENROUTER_* fallback. */
45
+ usedLegacyEnv: boolean;
46
+ chatModel?: ChatModel;
47
+ synthesizer?: Synthesizer;
48
+ summarizer?: Summarizer;
49
+ cruxSummarizer?: CruxSummarizer;
50
+ }
51
+ /** Per-provider default model. */
52
+ export declare const DEFAULT_MODELS: Record<ProviderKind, string>;
53
+ export declare const DEFAULTS: {
54
+ readonly provider: ProviderKind;
55
+ readonly model: string;
56
+ };
57
+ /** Merge user config with environment variables and defaults. */
58
+ export declare function resolveConfig(config?: EngineConfig): ResolvedConfig;
59
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/ai/providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,oEAAoE;IACpE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gCAAgC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,oCAAoC;IACpC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,wEAAwE;IACxE,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAKD,kCAAkC;AAClC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAOvD,CAAC;AAEF,eAAO,MAAM,QAAQ;uBACG,YAAY;;CAE1B,CAAC;AAEX,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,MAAM,GAAE,YAAiB,GAAG,cAAc,CAyCvE"}
@@ -0,0 +1,54 @@
1
+ const OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
2
+ const ORCAROUTER_BASE_URL = "https://api.orcarouter.ai/v1";
3
+ /** Per-provider default model. */
4
+ export const DEFAULT_MODELS = {
5
+ openai: "openai/gpt-4o-mini",
6
+ anthropic: "claude-sonnet-5",
7
+ // Provider-prefixed so the LiteLLM proxy routes it; override with GRAFT_MODEL.
8
+ litellm: "openai/gpt-4o-mini",
9
+ // Provider-prefixed so the OrcaRouter gateway routes it; override with GRAFT_MODEL.
10
+ orcarouter: "openai/gpt-4o-mini",
11
+ };
12
+ export const DEFAULTS = {
13
+ provider: "openai",
14
+ model: DEFAULT_MODELS.openai,
15
+ };
16
+ /** Merge user config with environment variables and defaults. */
17
+ export function resolveConfig(config = {}) {
18
+ const env = process.env;
19
+ const provider = config.provider ?? env.GRAFT_PROVIDER ?? DEFAULTS.provider;
20
+ const explicitKey = config.apiKey ?? env.GRAFT_API_KEY;
21
+ const legacyKey = env.OPENROUTER_API_KEY;
22
+ const apiKey = explicitKey ?? legacyKey ?? env.ORCAROUTER_API_KEY;
23
+ const usedLegacyEnv = !explicitKey && !!legacyKey;
24
+ const model = config.model ??
25
+ env.GRAFT_MODEL ??
26
+ env.GRAFT_OPENROUTER_MODEL ??
27
+ env.ORCAROUTER_MODEL ??
28
+ DEFAULT_MODELS[provider];
29
+ let baseUrl = config.baseUrl ?? env.GRAFT_BASE_URL ?? env.OPENROUTER_BASE_URL ?? env.ORCAROUTER_BASE_URL;
30
+ // Back-compat: an existing setup with only OPENROUTER_API_KEY keeps hitting
31
+ // OpenRouter without any config change.
32
+ if (!baseUrl && provider === "openai" && usedLegacyEnv)
33
+ baseUrl = OPENROUTER_BASE_URL;
34
+ // The orcarouter provider points at the gateway unless a base URL is given.
35
+ if (!baseUrl && provider === "orcarouter")
36
+ baseUrl = ORCAROUTER_BASE_URL;
37
+ const headers = provider === "openai" && baseUrl?.includes("openrouter.ai")
38
+ ? { "X-Title": "graft" }
39
+ : undefined;
40
+ return {
41
+ contextDir: config.contextDir ?? env.GRAFT_DIR,
42
+ provider,
43
+ apiKey,
44
+ model,
45
+ baseUrl,
46
+ headers,
47
+ usedLegacyEnv,
48
+ chatModel: config.chatModel,
49
+ synthesizer: config.synthesizer,
50
+ summarizer: config.summarizer,
51
+ cruxSummarizer: config.cruxSummarizer,
52
+ };
53
+ }
54
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/ai/providers.ts"],"names":[],"mappings":"AAwDA,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAC3D,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAE3D,kCAAkC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAiC;IAC1D,MAAM,EAAE,oBAAoB;IAC5B,SAAS,EAAE,iBAAiB;IAC5B,+EAA+E;IAC/E,OAAO,EAAE,oBAAoB;IAC7B,oFAAoF;IACpF,UAAU,EAAE,oBAAoB;CACjC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,QAAQ,EAAE,QAAwB;IAClC,KAAK,EAAE,cAAc,CAAC,MAAM;CACpB,CAAC;AAEX,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,SAAuB,EAAE;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAK,GAAG,CAAC,cAA2C,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAE1G,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC;IACvD,MAAM,SAAS,GAAG,GAAG,CAAC,kBAAkB,CAAC;IACzC,MAAM,MAAM,GAAG,WAAW,IAAI,SAAS,IAAI,GAAG,CAAC,kBAAkB,CAAC;IAClE,MAAM,aAAa,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC;IAElD,MAAM,KAAK,GACT,MAAM,CAAC,KAAK;QACZ,GAAG,CAAC,WAAW;QACf,GAAG,CAAC,sBAAsB;QAC1B,GAAG,CAAC,gBAAgB;QACpB,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE3B,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,mBAAmB,CAAC;IACzG,4EAA4E;IAC5E,wCAAwC;IACxC,IAAI,CAAC,OAAO,IAAI,QAAQ,KAAK,QAAQ,IAAI,aAAa;QAAE,OAAO,GAAG,mBAAmB,CAAC;IACtF,4EAA4E;IAC5E,IAAI,CAAC,OAAO,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,GAAG,mBAAmB,CAAC;IAEzE,MAAM,OAAO,GACX,QAAQ,KAAK,QAAQ,IAAI,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC;QACzD,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE;QACxB,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,SAAS;QAC9C,QAAQ;QACR,MAAM;QACN,KAAK;QACL,OAAO;QACP,OAAO;QACP,aAAa;QACb,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ChatModel } from "./llm/types.js";
2
+ /**
3
+ * Turns one source-code file into a short prose summary for the knowledge graph.
4
+ *
5
+ * Code repos are deliberately NOT fed through the per-chunk entity extractor:
6
+ * static structure is better served by grep/tree-sitter in the consuming agent,
7
+ * and LLM extraction over raw code produces noisy, duplicated entities. Instead
8
+ * the repo ingest path summarizes each file into plain English (purpose, key
9
+ * exports, dependencies, design decisions) and ingests those summaries — prose
10
+ * the existing extraction pipeline is actually good at.
11
+ */
12
+ export interface Summarizer {
13
+ summarize(code: string, opts: {
14
+ path: string;
15
+ }): Promise<string>;
16
+ }
17
+ /** Summarizer backed by any {@link ChatModel} (a plain-text completion). */
18
+ export declare class ChatSummarizer implements Summarizer {
19
+ private model;
20
+ constructor(model: ChatModel);
21
+ summarize(code: string, opts: {
22
+ path: string;
23
+ }): Promise<string>;
24
+ }
25
+ //# sourceMappingURL=summarize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../src/ai/summarize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClE;AAqBD,4EAA4E;AAC5E,qBAAa,cAAe,YAAW,UAAU;IACnC,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,SAAS;IAE9B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAWvE"}
@@ -0,0 +1,34 @@
1
+ const SYSTEM_PROMPT = `You document source code for a team knowledge base. Given one source file, write a compact plain-English summary covering:
2
+ 1. The purpose of the file — what it exists to do.
3
+ 2. The key exported functions/classes/types and what each is for.
4
+ 3. Important dependencies: internal modules it builds on, external libraries or services it talks to.
5
+ 4. Notable design decisions, constraints, or gotchas evident in the code.
6
+
7
+ Write 3-8 sentences of flowing prose. Name concrete identifiers (modules, classes, services) so they can become graph entities. No code blocks, no line-by-line narration, no filler.`;
8
+ /** Cap the code sent per file so a single giant file can't blow the context. */
9
+ const MAX_CODE_CHARS = 24_000;
10
+ function userContent(code, path) {
11
+ const clipped = code.length > MAX_CODE_CHARS
12
+ ? `${code.slice(0, MAX_CODE_CHARS)}\n… (truncated at ${MAX_CODE_CHARS} characters)`
13
+ : code;
14
+ return `File: ${path}\n\n${clipped}`;
15
+ }
16
+ /** Summarizer backed by any {@link ChatModel} (a plain-text completion). */
17
+ export class ChatSummarizer {
18
+ model;
19
+ constructor(model) {
20
+ this.model = model;
21
+ }
22
+ async summarize(code, opts) {
23
+ const res = await this.model.create({
24
+ temperature: 0,
25
+ maxTokens: 2048,
26
+ messages: [
27
+ { role: "system", content: SYSTEM_PROMPT },
28
+ { role: "user", content: userContent(code, opts.path) },
29
+ ],
30
+ });
31
+ return res.text.trim();
32
+ }
33
+ }
34
+ //# sourceMappingURL=summarize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../src/ai/summarize.ts"],"names":[],"mappings":"AAgBA,MAAM,aAAa,GAAG;;;;;;sLAMgK,CAAC;AAEvL,gFAAgF;AAChF,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,SAAS,WAAW,CAAC,IAAY,EAAE,IAAY;IAC7C,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,GAAG,cAAc;QAC1B,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,qBAAqB,cAAc,cAAc;QACnF,CAAC,CAAC,IAAI,CAAC;IACX,OAAO,SAAS,IAAI,OAAO,OAAO,EAAE,CAAC;AACvC,CAAC;AAED,4EAA4E;AAC5E,MAAM,OAAO,cAAc;IACL;IAApB,YAAoB,KAAgB;QAAhB,UAAK,GAAL,KAAK,CAAW;IAAG,CAAC;IAExC,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,IAAsB;QAClD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAClC,WAAW,EAAE,CAAC;YACd,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;gBAC1C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;aACxD;SACF,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The synthesis step: turn per-file prose summaries into a CURATED set of graph
3
+ * nodes. This is where granularity is decided — the model groups related files
4
+ * into subsystem nodes, keeps a notable file as its own node when it deserves
5
+ * one, and adds cross-cutting concept nodes, instead of emitting one entity per
6
+ * incidental identifier. Each node is attributed to the source files it is
7
+ * grounded in, so provenance (and staleness) stays exact.
8
+ */
9
+ import type { ChatModel } from "./llm/types.js";
10
+ /** A directed edge to another node, by node name (resolved to a slug later). */
11
+ export interface SynthLink {
12
+ to: string;
13
+ relation: string;
14
+ description?: string;
15
+ }
16
+ /** A node as proposed by the synthesizer, before it is written to disk. */
17
+ export interface SynthNode {
18
+ name: string;
19
+ /** system | api | file | concept */
20
+ type: string;
21
+ summary: string;
22
+ /** Source file paths (from the provided set) this node is grounded in. */
23
+ sources: string[];
24
+ links: SynthLink[];
25
+ }
26
+ /** One labeled file summary fed into synthesis. */
27
+ export interface FileSummary {
28
+ path: string;
29
+ summary: string;
30
+ }
31
+ export interface Synthesizer {
32
+ synthesize(files: FileSummary[]): Promise<SynthNode[]>;
33
+ }
34
+ /** Synthesizer backed by any {@link ChatModel} via forced tool calling. */
35
+ export declare class ChatSynthesizer implements Synthesizer {
36
+ private model;
37
+ constructor(model: ChatModel);
38
+ synthesize(files: FileSummary[]): Promise<SynthNode[]>;
39
+ }
40
+ //# sourceMappingURL=synthesize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesize.d.ts","sourceRoot":"","sources":["../../src/ai/synthesize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,gFAAgF;AAChF,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,2EAA2E;AAC3E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CACxD;AAmLD,2EAA2E;AAC3E,qBAAa,eAAgB,YAAW,WAAW;IACrC,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,SAAS;IAE9B,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAyB7D"}