ghagga-core 2.8.1 → 2.9.1

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 (316) hide show
  1. package/dist/acp/adapter.d.ts +91 -0
  2. package/dist/acp/adapter.d.ts.map +1 -0
  3. package/dist/acp/adapter.js +315 -0
  4. package/dist/acp/adapter.js.map +1 -0
  5. package/dist/acp/index.d.ts +4 -0
  6. package/dist/acp/index.d.ts.map +1 -0
  7. package/dist/acp/index.js +2 -0
  8. package/dist/acp/index.js.map +1 -0
  9. package/dist/acp/types.d.ts +142 -0
  10. package/dist/acp/types.d.ts.map +1 -0
  11. package/dist/acp/types.js +13 -0
  12. package/dist/acp/types.js.map +1 -0
  13. package/dist/adversarial-qa.d.ts +60 -0
  14. package/dist/adversarial-qa.d.ts.map +1 -0
  15. package/dist/adversarial-qa.js +85 -0
  16. package/dist/adversarial-qa.js.map +1 -0
  17. package/dist/agents/audit.d.ts +18 -0
  18. package/dist/agents/audit.d.ts.map +1 -0
  19. package/dist/agents/audit.js +78 -0
  20. package/dist/agents/audit.js.map +1 -0
  21. package/dist/agents/consensus.d.ts +1 -1
  22. package/dist/agents/consensus.d.ts.map +1 -1
  23. package/dist/agents/consensus.js +10 -8
  24. package/dist/agents/consensus.js.map +1 -1
  25. package/dist/agents/diagnostic.d.ts.map +1 -1
  26. package/dist/agents/diagnostic.js +22 -20
  27. package/dist/agents/diagnostic.js.map +1 -1
  28. package/dist/agents/fan-out-lenses.d.ts +41 -0
  29. package/dist/agents/fan-out-lenses.d.ts.map +1 -1
  30. package/dist/agents/fan-out-lenses.js +117 -3
  31. package/dist/agents/fan-out-lenses.js.map +1 -1
  32. package/dist/agents/prompts.d.ts +12 -0
  33. package/dist/agents/prompts.d.ts.map +1 -1
  34. package/dist/agents/prompts.js +31 -0
  35. package/dist/agents/prompts.js.map +1 -1
  36. package/dist/agents/simple.d.ts +1 -1
  37. package/dist/agents/simple.d.ts.map +1 -1
  38. package/dist/agents/simple.js +10 -6
  39. package/dist/agents/simple.js.map +1 -1
  40. package/dist/agents/workflow.d.ts +1 -1
  41. package/dist/agents/workflow.d.ts.map +1 -1
  42. package/dist/agents/workflow.js +9 -8
  43. package/dist/agents/workflow.js.map +1 -1
  44. package/dist/aisvs.d.ts +44 -0
  45. package/dist/aisvs.d.ts.map +1 -0
  46. package/dist/aisvs.js +189 -0
  47. package/dist/aisvs.js.map +1 -0
  48. package/dist/checklist/context.d.ts.map +1 -1
  49. package/dist/checklist/context.js +2 -8
  50. package/dist/checklist/context.js.map +1 -1
  51. package/dist/checklist/defaults.d.ts.map +1 -1
  52. package/dist/checklist/defaults.js.map +1 -1
  53. package/dist/checklist/scorer.d.ts.map +1 -1
  54. package/dist/checklist/scorer.js +105 -12
  55. package/dist/checklist/scorer.js.map +1 -1
  56. package/dist/code-intel/client.d.ts +30 -0
  57. package/dist/code-intel/client.d.ts.map +1 -0
  58. package/dist/code-intel/client.js +91 -0
  59. package/dist/code-intel/client.js.map +1 -0
  60. package/dist/code-intel/context.d.ts +21 -0
  61. package/dist/code-intel/context.d.ts.map +1 -0
  62. package/dist/code-intel/context.js +72 -0
  63. package/dist/code-intel/context.js.map +1 -0
  64. package/dist/code-intel/index.d.ts +10 -0
  65. package/dist/code-intel/index.d.ts.map +1 -0
  66. package/dist/code-intel/index.js +11 -0
  67. package/dist/code-intel/index.js.map +1 -0
  68. package/dist/code-intel/types.d.ts +63 -0
  69. package/dist/code-intel/types.d.ts.map +1 -0
  70. package/dist/code-intel/types.js +9 -0
  71. package/dist/code-intel/types.js.map +1 -0
  72. package/dist/compress/index.d.ts +55 -0
  73. package/dist/compress/index.d.ts.map +1 -0
  74. package/dist/compress/index.js +166 -0
  75. package/dist/compress/index.js.map +1 -0
  76. package/dist/cost-footer.d.ts +38 -0
  77. package/dist/cost-footer.d.ts.map +1 -0
  78. package/dist/cost-footer.js +95 -0
  79. package/dist/cost-footer.js.map +1 -0
  80. package/dist/critique/critique.d.ts +40 -0
  81. package/dist/critique/critique.d.ts.map +1 -0
  82. package/dist/critique/critique.js +194 -0
  83. package/dist/critique/critique.js.map +1 -0
  84. package/dist/critique/cross-model.d.ts +123 -0
  85. package/dist/critique/cross-model.d.ts.map +1 -0
  86. package/dist/critique/cross-model.js +265 -0
  87. package/dist/critique/cross-model.js.map +1 -0
  88. package/dist/critique/index.d.ts +7 -0
  89. package/dist/critique/index.d.ts.map +1 -0
  90. package/dist/critique/index.js +5 -0
  91. package/dist/critique/index.js.map +1 -0
  92. package/dist/critique/prompts.d.ts +11 -0
  93. package/dist/critique/prompts.d.ts.map +1 -0
  94. package/dist/critique/prompts.js +66 -0
  95. package/dist/critique/prompts.js.map +1 -0
  96. package/dist/critique/types.d.ts +84 -0
  97. package/dist/critique/types.d.ts.map +1 -0
  98. package/dist/critique/types.js +13 -0
  99. package/dist/critique/types.js.map +1 -0
  100. package/dist/doc-validation/index.d.ts +9 -0
  101. package/dist/doc-validation/index.d.ts.map +1 -0
  102. package/dist/doc-validation/index.js +9 -0
  103. package/dist/doc-validation/index.js.map +1 -0
  104. package/dist/doc-validation/scanner.d.ts +40 -0
  105. package/dist/doc-validation/scanner.d.ts.map +1 -0
  106. package/dist/doc-validation/scanner.js +163 -0
  107. package/dist/doc-validation/scanner.js.map +1 -0
  108. package/dist/doc-validation/types.d.ts +27 -0
  109. package/dist/doc-validation/types.d.ts.map +1 -0
  110. package/dist/doc-validation/types.js +8 -0
  111. package/dist/doc-validation/types.js.map +1 -0
  112. package/dist/embed.d.ts +27 -0
  113. package/dist/embed.d.ts.map +1 -0
  114. package/dist/embed.js +47 -0
  115. package/dist/embed.js.map +1 -0
  116. package/dist/enhance/enhance.d.ts.map +1 -1
  117. package/dist/enhance/enhance.js +7 -25
  118. package/dist/enhance/enhance.js.map +1 -1
  119. package/dist/enhance/types.d.ts +5 -0
  120. package/dist/enhance/types.d.ts.map +1 -1
  121. package/dist/exploitability/analyzer.d.ts +42 -0
  122. package/dist/exploitability/analyzer.d.ts.map +1 -1
  123. package/dist/exploitability/analyzer.js +225 -0
  124. package/dist/exploitability/analyzer.js.map +1 -1
  125. package/dist/exploitability/index.d.ts +3 -2
  126. package/dist/exploitability/index.d.ts.map +1 -1
  127. package/dist/exploitability/index.js +1 -2
  128. package/dist/exploitability/index.js.map +1 -1
  129. package/dist/exploitability/types.d.ts +27 -0
  130. package/dist/exploitability/types.d.ts.map +1 -1
  131. package/dist/fetch-fix.d.ts +60 -0
  132. package/dist/fetch-fix.d.ts.map +1 -0
  133. package/dist/fetch-fix.js +137 -0
  134. package/dist/fetch-fix.js.map +1 -0
  135. package/dist/flood/index.d.ts +34 -0
  136. package/dist/flood/index.d.ts.map +1 -0
  137. package/dist/flood/index.js +67 -0
  138. package/dist/flood/index.js.map +1 -0
  139. package/dist/format.d.ts.map +1 -1
  140. package/dist/format.js +6 -1
  141. package/dist/format.js.map +1 -1
  142. package/dist/graph/blast-radius.js +2 -2
  143. package/dist/graph/blast-radius.js.map +1 -1
  144. package/dist/graph/call-chain.d.ts +36 -0
  145. package/dist/graph/call-chain.d.ts.map +1 -0
  146. package/dist/graph/call-chain.js +291 -0
  147. package/dist/graph/call-chain.js.map +1 -0
  148. package/dist/graph/index.d.ts +4 -0
  149. package/dist/graph/index.d.ts.map +1 -1
  150. package/dist/graph/index.js +2 -0
  151. package/dist/graph/index.js.map +1 -1
  152. package/dist/graph/reverse-deps.d.ts +37 -0
  153. package/dist/graph/reverse-deps.d.ts.map +1 -0
  154. package/dist/graph/reverse-deps.js +136 -0
  155. package/dist/graph/reverse-deps.js.map +1 -0
  156. package/dist/index.d.ts +48 -11
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +29 -7
  159. package/dist/index.js.map +1 -1
  160. package/dist/injection-corpus.d.ts +41 -0
  161. package/dist/injection-corpus.d.ts.map +1 -0
  162. package/dist/injection-corpus.js +181 -0
  163. package/dist/injection-corpus.js.map +1 -0
  164. package/dist/latent-comms.d.ts +31 -0
  165. package/dist/latent-comms.d.ts.map +1 -0
  166. package/dist/latent-comms.js +139 -0
  167. package/dist/latent-comms.js.map +1 -0
  168. package/dist/memory/pageindex/chunker.d.ts +33 -0
  169. package/dist/memory/pageindex/chunker.d.ts.map +1 -0
  170. package/dist/memory/pageindex/chunker.js +112 -0
  171. package/dist/memory/pageindex/chunker.js.map +1 -0
  172. package/dist/memory/pageindex/example.d.ts +22 -0
  173. package/dist/memory/pageindex/example.d.ts.map +1 -0
  174. package/dist/memory/pageindex/example.js +93 -0
  175. package/dist/memory/pageindex/example.js.map +1 -0
  176. package/dist/memory/pageindex/index.d.ts +15 -0
  177. package/dist/memory/pageindex/index.d.ts.map +1 -0
  178. package/dist/memory/pageindex/index.js +17 -0
  179. package/dist/memory/pageindex/index.js.map +1 -0
  180. package/dist/memory/pageindex/service.d.ts +53 -0
  181. package/dist/memory/pageindex/service.d.ts.map +1 -0
  182. package/dist/memory/pageindex/service.js +230 -0
  183. package/dist/memory/pageindex/service.js.map +1 -0
  184. package/dist/memory/pageindex/types.d.ts +67 -0
  185. package/dist/memory/pageindex/types.d.ts.map +1 -0
  186. package/dist/memory/pageindex/types.js +14 -0
  187. package/dist/memory/pageindex/types.js.map +1 -0
  188. package/dist/memory/persist.d.ts.map +1 -1
  189. package/dist/memory/persist.js +6 -2
  190. package/dist/memory/persist.js.map +1 -1
  191. package/dist/memory/sqlite.d.ts +69 -2
  192. package/dist/memory/sqlite.d.ts.map +1 -1
  193. package/dist/memory/sqlite.js +312 -5
  194. package/dist/memory/sqlite.js.map +1 -1
  195. package/dist/memory/taxonomy.d.ts +34 -0
  196. package/dist/memory/taxonomy.d.ts.map +1 -0
  197. package/dist/memory/taxonomy.js +189 -0
  198. package/dist/memory/taxonomy.js.map +1 -0
  199. package/dist/memory/versioning.d.ts.map +1 -1
  200. package/dist/memory/versioning.js.map +1 -1
  201. package/dist/negative.d.ts +23 -0
  202. package/dist/negative.d.ts.map +1 -0
  203. package/dist/negative.js +40 -0
  204. package/dist/negative.js.map +1 -0
  205. package/dist/pipeline.d.ts.map +1 -1
  206. package/dist/pipeline.js +455 -46
  207. package/dist/pipeline.js.map +1 -1
  208. package/dist/prompt-intel.d.ts +39 -0
  209. package/dist/prompt-intel.d.ts.map +1 -0
  210. package/dist/prompt-intel.js +148 -0
  211. package/dist/prompt-intel.js.map +1 -0
  212. package/dist/providers/cli-bridge.d.ts +4 -0
  213. package/dist/providers/cli-bridge.d.ts.map +1 -1
  214. package/dist/providers/cli-bridge.js +4 -0
  215. package/dist/providers/cli-bridge.js.map +1 -1
  216. package/dist/providers/generate-fn.d.ts +3 -15
  217. package/dist/providers/generate-fn.d.ts.map +1 -1
  218. package/dist/providers/generate-fn.js +3 -30
  219. package/dist/providers/generate-fn.js.map +1 -1
  220. package/dist/providers/index.d.ts.map +1 -1
  221. package/dist/providers/index.js.map +1 -1
  222. package/dist/providers/ollama.d.ts +15 -0
  223. package/dist/providers/ollama.d.ts.map +1 -0
  224. package/dist/providers/ollama.js +30 -0
  225. package/dist/providers/ollama.js.map +1 -0
  226. package/dist/ranking/index.d.ts +9 -0
  227. package/dist/ranking/index.d.ts.map +1 -0
  228. package/dist/ranking/index.js +82 -0
  229. package/dist/ranking/index.js.map +1 -0
  230. package/dist/recursive/circuit-breaker.d.ts +36 -0
  231. package/dist/recursive/circuit-breaker.d.ts.map +1 -0
  232. package/dist/recursive/circuit-breaker.js +62 -0
  233. package/dist/recursive/circuit-breaker.js.map +1 -0
  234. package/dist/recursive/index.d.ts +4 -0
  235. package/dist/recursive/index.d.ts.map +1 -1
  236. package/dist/recursive/index.js +18 -1
  237. package/dist/recursive/index.js.map +1 -1
  238. package/dist/recursive/types.d.ts +2 -0
  239. package/dist/recursive/types.d.ts.map +1 -1
  240. package/dist/recursive/types.js +1 -0
  241. package/dist/recursive/types.js.map +1 -1
  242. package/dist/scope/diff-mapper.js.map +1 -1
  243. package/dist/scope/entity-diff.d.ts +58 -0
  244. package/dist/scope/entity-diff.d.ts.map +1 -0
  245. package/dist/scope/entity-diff.js +224 -0
  246. package/dist/scope/entity-diff.js.map +1 -0
  247. package/dist/scope/extractor.d.ts.map +1 -1
  248. package/dist/scope/extractor.js.map +1 -1
  249. package/dist/scope/index.d.ts +3 -1
  250. package/dist/scope/index.d.ts.map +1 -1
  251. package/dist/scope/index.js +3 -0
  252. package/dist/scope/index.js.map +1 -1
  253. package/dist/scope/parser.d.ts +1 -1
  254. package/dist/scope/parser.d.ts.map +1 -1
  255. package/dist/scope/parser.js.map +1 -1
  256. package/dist/scope/types.d.ts +32 -0
  257. package/dist/scope/types.d.ts.map +1 -1
  258. package/dist/scope/types.js +7 -1
  259. package/dist/scope/types.js.map +1 -1
  260. package/dist/search/index.d.ts +11 -0
  261. package/dist/search/index.d.ts.map +1 -0
  262. package/dist/search/index.js +10 -0
  263. package/dist/search/index.js.map +1 -0
  264. package/dist/search/indexer.d.ts +67 -0
  265. package/dist/search/indexer.d.ts.map +1 -0
  266. package/dist/search/indexer.js +225 -0
  267. package/dist/search/indexer.js.map +1 -0
  268. package/dist/search/searcher.d.ts +34 -0
  269. package/dist/search/searcher.d.ts.map +1 -0
  270. package/dist/search/searcher.js +101 -0
  271. package/dist/search/searcher.js.map +1 -0
  272. package/dist/search/types.d.ts +81 -0
  273. package/dist/search/types.d.ts.map +1 -0
  274. package/dist/search/types.js +8 -0
  275. package/dist/search/types.js.map +1 -0
  276. package/dist/self-improve/index.d.ts +53 -0
  277. package/dist/self-improve/index.d.ts.map +1 -0
  278. package/dist/self-improve/index.js +136 -0
  279. package/dist/self-improve/index.js.map +1 -0
  280. package/dist/semantic-diff/index.d.ts +31 -0
  281. package/dist/semantic-diff/index.d.ts.map +1 -0
  282. package/dist/semantic-diff/index.js +215 -0
  283. package/dist/semantic-diff/index.js.map +1 -0
  284. package/dist/testing/index.d.ts +67 -0
  285. package/dist/testing/index.d.ts.map +1 -0
  286. package/dist/testing/index.js +76 -0
  287. package/dist/testing/index.js.map +1 -0
  288. package/dist/testing/vitest-helpers.d.ts +26 -0
  289. package/dist/testing/vitest-helpers.d.ts.map +1 -0
  290. package/dist/testing/vitest-helpers.js +37 -0
  291. package/dist/testing/vitest-helpers.js.map +1 -0
  292. package/dist/tools/index.d.ts +3 -1
  293. package/dist/tools/index.d.ts.map +1 -1
  294. package/dist/tools/index.js +2 -1
  295. package/dist/tools/index.js.map +1 -1
  296. package/dist/tools/remote-query.d.ts +40 -0
  297. package/dist/tools/remote-query.d.ts.map +1 -0
  298. package/dist/tools/remote-query.js +71 -0
  299. package/dist/tools/remote-query.js.map +1 -0
  300. package/dist/tracing/index.d.ts +39 -0
  301. package/dist/tracing/index.d.ts.map +1 -0
  302. package/dist/tracing/index.js +70 -0
  303. package/dist/tracing/index.js.map +1 -0
  304. package/dist/trajectory.d.ts +65 -0
  305. package/dist/trajectory.d.ts.map +1 -0
  306. package/dist/trajectory.js +126 -0
  307. package/dist/trajectory.js.map +1 -0
  308. package/dist/trust/index.d.ts +34 -0
  309. package/dist/trust/index.d.ts.map +1 -0
  310. package/dist/trust/index.js +78 -0
  311. package/dist/trust/index.js.map +1 -0
  312. package/dist/types.d.ts +144 -5
  313. package/dist/types.d.ts.map +1 -1
  314. package/dist/types.js +2 -11
  315. package/dist/types.js.map +1 -1
  316. package/package.json +1 -3
@@ -17,5 +17,6 @@ export { createNodeExecutionContext } from './execution.js';
17
17
  export { initializeDefaultTools, resetInitialization } from './plugins/index.js';
18
18
  // ─── Runner ─────────────────────────────────────────────────────
19
19
  /** @deprecated Always returns true. Kept for backward compatibility. */
20
- export { isToolRegistryEnabled } from './runner.js';
20
+ export { formatStaticAnalysisContext, isToolRegistryEnabled } from './runner.js';
21
+ export { fetchRemoteFile, searchRemoteCode } from './remote-query.js';
21
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,mEAAmE;AAEnE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAK3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,mEAAmE;AAEnE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAErE,mEAAmE;AAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,mEAAmE;AAEnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAE5D,mEAAmE;AAEnE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEjF,mEAAmE;AAEnE,wEAAwE;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,mEAAmE;AAEnE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAK3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,mEAAmE;AAEnE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAErE,mEAAmE;AAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,mEAAmE;AAEnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAE5D,mEAAmE;AAEnE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEjF,mEAAmE;AAEnE,wEAAwE;AACxE,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAKjF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * codedb_remote — query public GitHub repos without cloning.
3
+ *
4
+ * Provides two utilities:
5
+ * - fetchRemoteFile: fetch a single file by path via raw.githubusercontent.com
6
+ * - searchRemoteCode: search for code patterns via the GitHub Search API
7
+ *
8
+ * Both functions NEVER throw; they return null / [] on any error instead.
9
+ */
10
+ export interface RemoteQueryOptions {
11
+ owner: string;
12
+ repo: string;
13
+ /** Git ref to target. Defaults to "HEAD". */
14
+ ref?: string;
15
+ }
16
+ /**
17
+ * Fetch a single file from a public (or token-accessible) GitHub repository.
18
+ *
19
+ * @param path - Path to the file relative to the repo root (e.g. "src/index.ts")
20
+ * @param opts - Owner, repo, and optional ref
21
+ * @param token - Optional GitHub personal-access token or installation token
22
+ * @returns File contents as a string, or null on any error (4xx, 5xx, network, etc.)
23
+ */
24
+ export declare function fetchRemoteFile(path: string, opts: RemoteQueryOptions, token?: string): Promise<string | null>;
25
+ /**
26
+ * Search for code matching a query inside a GitHub repository.
27
+ *
28
+ * Uses the GitHub Code Search API with text-match fragments enabled.
29
+ * Rate-limited: unauthenticated = 10 req/min, authenticated = 30 req/min.
30
+ *
31
+ * @param query - Search query (will be scoped to the repo automatically)
32
+ * @param opts - Owner and repo to search in (ref is not used by GitHub's search API)
33
+ * @param token - Optional GitHub token; strongly recommended to avoid rate-limit errors
34
+ * @returns Array of { path, snippet } objects, or [] on any error
35
+ */
36
+ export declare function searchRemoteCode(query: string, opts: RemoteQueryOptions, token?: string): Promise<Array<{
37
+ path: string;
38
+ snippet: string;
39
+ }>>;
40
+ //# sourceMappingURL=remote-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-query.d.ts","sourceRoot":"","sources":["../../src/tools/remote-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,kBAAkB,EACxB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBxB;AAiBD;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,kBAAkB,EACxB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAyBnD"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * codedb_remote — query public GitHub repos without cloning.
3
+ *
4
+ * Provides two utilities:
5
+ * - fetchRemoteFile: fetch a single file by path via raw.githubusercontent.com
6
+ * - searchRemoteCode: search for code patterns via the GitHub Search API
7
+ *
8
+ * Both functions NEVER throw; they return null / [] on any error instead.
9
+ */
10
+ /**
11
+ * Fetch a single file from a public (or token-accessible) GitHub repository.
12
+ *
13
+ * @param path - Path to the file relative to the repo root (e.g. "src/index.ts")
14
+ * @param opts - Owner, repo, and optional ref
15
+ * @param token - Optional GitHub personal-access token or installation token
16
+ * @returns File contents as a string, or null on any error (4xx, 5xx, network, etc.)
17
+ */
18
+ export async function fetchRemoteFile(path, opts, token) {
19
+ const ref = opts.ref ?? 'HEAD';
20
+ const url = `https://raw.githubusercontent.com/${opts.owner}/${opts.repo}/${ref}/${path}`;
21
+ try {
22
+ const headers = {};
23
+ if (token) {
24
+ headers.Authorization = `Bearer ${token}`;
25
+ }
26
+ const response = await fetch(url, { headers });
27
+ if (!response.ok) {
28
+ return null;
29
+ }
30
+ return await response.text();
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ /**
37
+ * Search for code matching a query inside a GitHub repository.
38
+ *
39
+ * Uses the GitHub Code Search API with text-match fragments enabled.
40
+ * Rate-limited: unauthenticated = 10 req/min, authenticated = 30 req/min.
41
+ *
42
+ * @param query - Search query (will be scoped to the repo automatically)
43
+ * @param opts - Owner and repo to search in (ref is not used by GitHub's search API)
44
+ * @param token - Optional GitHub token; strongly recommended to avoid rate-limit errors
45
+ * @returns Array of { path, snippet } objects, or [] on any error
46
+ */
47
+ export async function searchRemoteCode(query, opts, token) {
48
+ const scopedQuery = `${query} repo:${opts.owner}/${opts.repo}`;
49
+ const url = `https://api.github.com/search/code?q=${encodeURIComponent(scopedQuery)}`;
50
+ try {
51
+ const headers = {
52
+ Accept: 'application/vnd.github.v3.text-match+json',
53
+ };
54
+ if (token) {
55
+ headers.Authorization = `Bearer ${token}`;
56
+ }
57
+ const response = await fetch(url, { headers });
58
+ if (!response.ok) {
59
+ return [];
60
+ }
61
+ const data = (await response.json());
62
+ return (data.items ?? []).map((item) => ({
63
+ path: item.path,
64
+ snippet: item.text_matches?.[0]?.fragment ?? '',
65
+ }));
66
+ }
67
+ catch {
68
+ return [];
69
+ }
70
+ }
71
+ //# sourceMappingURL=remote-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-query.js","sourceRoot":"","sources":["../../src/tools/remote-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,IAAwB,EACxB,KAAc;IAEd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC;IAC/B,MAAM,GAAG,GAAG,qCAAqC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IAE1F,IAAI,CAAC;QACH,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAiBD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,IAAwB,EACxB,KAAc;IAEd,MAAM,WAAW,GAAG,GAAG,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,GAAG,GAAG,wCAAwC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;IAEtF,IAAI,CAAC;QACH,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,2CAA2C;SACpD,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE;SAChD,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Lightweight OTel-compatible tracing abstraction.
3
+ *
4
+ * Works WITHOUT requiring @opentelemetry packages (they are optional).
5
+ * Defaults to a no-op implementation. Real OTel can be injected via
6
+ * configureTracer() at application startup.
7
+ */
8
+ export interface Span {
9
+ setAttribute(key: string, value: string | number | boolean): void;
10
+ recordException(error: Error): void;
11
+ end(): void;
12
+ }
13
+ export interface Tracer {
14
+ startSpan(name: string, attributes?: Record<string, string | number | boolean>): Span;
15
+ }
16
+ /**
17
+ * Replace the global tracer with a real OTel tracer (or any custom implementation).
18
+ * Must be called before any pipeline operations to take effect.
19
+ */
20
+ export declare function configureTracer(tracer: Tracer): void;
21
+ /**
22
+ * Get the currently active global tracer.
23
+ * Returns NoopTracer by default when OTel is not configured.
24
+ */
25
+ export declare function getTracer(): Tracer;
26
+ /**
27
+ * Wrap an async function in a span.
28
+ *
29
+ * Creates a span, passes it to the callback so attributes can be set
30
+ * mid-execution, then ends the span when the promise settles.
31
+ * Exceptions are recorded on the span before being re-thrown.
32
+ *
33
+ * @param name - Span name (e.g., "ghagga.review")
34
+ * @param attributes - Initial span attributes set before the function runs
35
+ * @param fn - Async function to execute inside the span
36
+ * @returns The resolved value of fn
37
+ */
38
+ export declare function withSpan<T>(name: string, attributes: Record<string, string | number | boolean>, fn: (span: Span) => Promise<T>): Promise<T>;
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,IAAI;IACnB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAClE,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpC,GAAG,IAAI,IAAI,CAAC;CACb;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;CACvF;AA4BD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EACrD,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC,CAaZ"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Lightweight OTel-compatible tracing abstraction.
3
+ *
4
+ * Works WITHOUT requiring @opentelemetry packages (they are optional).
5
+ * Defaults to a no-op implementation. Real OTel can be injected via
6
+ * configureTracer() at application startup.
7
+ */
8
+ // ─── No-op Implementation ────────────────────────────────────────
9
+ class NoopSpan {
10
+ setAttribute(_key, _value) {
11
+ // intentional no-op
12
+ }
13
+ recordException(_error) {
14
+ // intentional no-op
15
+ }
16
+ end() {
17
+ // intentional no-op
18
+ }
19
+ }
20
+ class NoopTracer {
21
+ startSpan(_name, _attributes) {
22
+ return new NoopSpan();
23
+ }
24
+ }
25
+ // ─── Global Tracer State ─────────────────────────────────────────
26
+ let _tracer = new NoopTracer();
27
+ /**
28
+ * Replace the global tracer with a real OTel tracer (or any custom implementation).
29
+ * Must be called before any pipeline operations to take effect.
30
+ */
31
+ export function configureTracer(tracer) {
32
+ _tracer = tracer;
33
+ }
34
+ /**
35
+ * Get the currently active global tracer.
36
+ * Returns NoopTracer by default when OTel is not configured.
37
+ */
38
+ export function getTracer() {
39
+ return _tracer;
40
+ }
41
+ // ─── Convenience Wrapper ─────────────────────────────────────────
42
+ /**
43
+ * Wrap an async function in a span.
44
+ *
45
+ * Creates a span, passes it to the callback so attributes can be set
46
+ * mid-execution, then ends the span when the promise settles.
47
+ * Exceptions are recorded on the span before being re-thrown.
48
+ *
49
+ * @param name - Span name (e.g., "ghagga.review")
50
+ * @param attributes - Initial span attributes set before the function runs
51
+ * @param fn - Async function to execute inside the span
52
+ * @returns The resolved value of fn
53
+ */
54
+ export async function withSpan(name, attributes, fn) {
55
+ const span = _tracer.startSpan(name, attributes);
56
+ try {
57
+ const result = await fn(span);
58
+ return result;
59
+ }
60
+ catch (error) {
61
+ if (error instanceof Error) {
62
+ span.recordException(error);
63
+ }
64
+ throw error;
65
+ }
66
+ finally {
67
+ span.end();
68
+ }
69
+ }
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,oEAAoE;AAEpE,MAAM,QAAQ;IACZ,YAAY,CAAC,IAAY,EAAE,MAAiC;QAC1D,oBAAoB;IACtB,CAAC;IAED,eAAe,CAAC,MAAa;QAC3B,oBAAoB;IACtB,CAAC;IAED,GAAG;QACD,oBAAoB;IACtB,CAAC;CACF;AAED,MAAM,UAAU;IACd,SAAS,CAAC,KAAa,EAAE,WAAuD;QAC9E,OAAO,IAAI,QAAQ,EAAE,CAAC;IACxB,CAAC;CACF;AAED,oEAAoE;AAEpE,IAAI,OAAO,GAAW,IAAI,UAAU,EAAE,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,GAAG,MAAM,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,oEAAoE;AAEpE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,UAAqD,EACrD,EAA8B;IAE9B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Trajectory recording — captures every step of the review pipeline
3
+ * as a structured JSON event for debugging and explainability.
4
+ *
5
+ * After a review, consumers can inspect the trajectory to understand:
6
+ * - Which agents ran and in what order
7
+ * - What each agent received as input and produced as output
8
+ * - Token usage per step
9
+ * - Total cost breakdown
10
+ */
11
+ export type TrajectoryEventType = 'pipeline_start' | 'pipeline_end' | 'agent_start' | 'agent_end' | 'tool_start' | 'tool_end' | 'llm_call' | 'error';
12
+ export interface TrajectoryEvent {
13
+ type: TrajectoryEventType;
14
+ timestamp: string;
15
+ step: string;
16
+ durationMs?: number;
17
+ tokensUsed?: number;
18
+ model?: string;
19
+ input?: string;
20
+ output?: string;
21
+ error?: string;
22
+ metadata?: Record<string, unknown>;
23
+ }
24
+ export interface Trajectory {
25
+ reviewId: string;
26
+ project: string;
27
+ startedAt: string;
28
+ completedAt: string | null;
29
+ events: TrajectoryEvent[];
30
+ totalTokens: number;
31
+ totalDurationMs: number;
32
+ estimatedCostUSD: number;
33
+ }
34
+ export declare class TrajectoryRecorder {
35
+ private events;
36
+ private startTime;
37
+ private reviewId;
38
+ private project;
39
+ constructor(reviewId: string, project: string);
40
+ record(type: TrajectoryEventType, step: string, data: Partial<Omit<TrajectoryEvent, 'type' | 'timestamp' | 'step'>>): void;
41
+ recordAgentStart(agent: string, model?: string): void;
42
+ recordAgentEnd(agent: string, opts: {
43
+ tokensUsed?: number;
44
+ durationMs?: number;
45
+ output?: string;
46
+ }): void;
47
+ recordToolStart(tool: string): void;
48
+ recordToolEnd(tool: string, opts: {
49
+ durationMs?: number;
50
+ output?: string;
51
+ }): void;
52
+ recordLLMCall(model: string, opts: {
53
+ tokensUsed?: number;
54
+ durationMs?: number;
55
+ }): void;
56
+ recordError(step: string, error: string): void;
57
+ finalize(): Trajectory;
58
+ getEvents(): ReadonlyArray<TrajectoryEvent>;
59
+ getEventsByType(type: TrajectoryEventType): TrajectoryEvent[];
60
+ getAgentSteps(): string[];
61
+ }
62
+ export declare function formatTrajectory(trajectory: Trajectory): string;
63
+ export declare function trajectoryToJSON(trajectory: Trajectory): string;
64
+ export declare function trajectoryFromJSON(json: string): Trajectory;
65
+ //# sourceMappingURL=trajectory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trajectory.d.ts","sourceRoot":"","sources":["../src/trajectory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,MAAM,mBAAmB,GAC3B,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,WAAW,GACX,YAAY,GACZ,UAAU,GACV,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAID,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAO7C,MAAM,CACJ,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC,CAAC,GAClE,IAAI;IASP,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAIrD,cAAc,CACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAClE,IAAI;IAIP,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAInC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIjF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAItF,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9C,QAAQ,IAAI,UAAU;IAoBtB,SAAS,IAAI,aAAa,CAAC,eAAe,CAAC;IAI3C,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe,EAAE;IAI7D,aAAa,IAAI,MAAM,EAAE;CAG1B;AAID,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAoD/D;AAID,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAE/D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAE3D"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Trajectory recording — captures every step of the review pipeline
3
+ * as a structured JSON event for debugging and explainability.
4
+ *
5
+ * After a review, consumers can inspect the trajectory to understand:
6
+ * - Which agents ran and in what order
7
+ * - What each agent received as input and produced as output
8
+ * - Token usage per step
9
+ * - Total cost breakdown
10
+ */
11
+ // ── Recorder ──
12
+ export class TrajectoryRecorder {
13
+ events = [];
14
+ startTime;
15
+ reviewId;
16
+ project;
17
+ constructor(reviewId, project) {
18
+ this.reviewId = reviewId;
19
+ this.project = project;
20
+ this.startTime = Date.now();
21
+ this.record('pipeline_start', 'pipeline', {});
22
+ }
23
+ record(type, step, data) {
24
+ this.events.push({
25
+ type,
26
+ timestamp: new Date().toISOString(),
27
+ step,
28
+ ...data,
29
+ });
30
+ }
31
+ recordAgentStart(agent, model) {
32
+ this.record('agent_start', agent, { model });
33
+ }
34
+ recordAgentEnd(agent, opts) {
35
+ this.record('agent_end', agent, opts);
36
+ }
37
+ recordToolStart(tool) {
38
+ this.record('tool_start', tool, {});
39
+ }
40
+ recordToolEnd(tool, opts) {
41
+ this.record('tool_end', tool, opts);
42
+ }
43
+ recordLLMCall(model, opts) {
44
+ this.record('llm_call', model, { model, ...opts });
45
+ }
46
+ recordError(step, error) {
47
+ this.record('error', step, { error });
48
+ }
49
+ // ── Finalization ──
50
+ finalize() {
51
+ this.record('pipeline_end', 'pipeline', {});
52
+ const totalTokens = this.events.reduce((sum, e) => sum + (e.tokensUsed ?? 0), 0);
53
+ const totalDurationMs = Date.now() - this.startTime;
54
+ return {
55
+ reviewId: this.reviewId,
56
+ project: this.project,
57
+ startedAt: new Date(this.startTime).toISOString(),
58
+ completedAt: new Date().toISOString(),
59
+ events: this.events,
60
+ totalTokens,
61
+ totalDurationMs,
62
+ estimatedCostUSD: 0, // filled by consumer with pricing info
63
+ };
64
+ }
65
+ // ── Query ──
66
+ getEvents() {
67
+ return this.events;
68
+ }
69
+ getEventsByType(type) {
70
+ return this.events.filter((e) => e.type === type);
71
+ }
72
+ getAgentSteps() {
73
+ return this.events.filter((e) => e.type === 'agent_start').map((e) => e.step);
74
+ }
75
+ }
76
+ // ── Formatting ──
77
+ export function formatTrajectory(trajectory) {
78
+ const lines = [];
79
+ lines.push(`## Review Trajectory — ${trajectory.reviewId}`);
80
+ lines.push(`**Project**: ${trajectory.project} | **Duration**: ${(trajectory.totalDurationMs / 1000).toFixed(1)}s | **Tokens**: ${trajectory.totalTokens}`);
81
+ lines.push('');
82
+ let indent = 0;
83
+ for (const event of trajectory.events) {
84
+ const prefix = ' '.repeat(indent);
85
+ const ts = event.timestamp.slice(11, 19); // HH:MM:SS
86
+ switch (event.type) {
87
+ case 'pipeline_start':
88
+ lines.push(`${prefix}${ts} ▶ Pipeline started`);
89
+ indent++;
90
+ break;
91
+ case 'pipeline_end':
92
+ indent = Math.max(0, indent - 1);
93
+ lines.push(`${prefix}${ts} ■ Pipeline ended`);
94
+ break;
95
+ case 'agent_start':
96
+ lines.push(`${prefix}${ts} → ${event.step}${event.model ? ` (${event.model})` : ''}`);
97
+ indent++;
98
+ break;
99
+ case 'agent_end':
100
+ indent = Math.max(0, indent - 1);
101
+ lines.push(`${prefix}${ts} ← ${event.step}${event.tokensUsed ? ` [${event.tokensUsed} tok]` : ''}${event.durationMs ? ` ${event.durationMs}ms` : ''}`);
102
+ break;
103
+ case 'tool_start':
104
+ lines.push(`${prefix}${ts} 🔧 ${event.step}`);
105
+ break;
106
+ case 'tool_end':
107
+ lines.push(`${prefix}${ts} ✓ ${event.step}${event.durationMs ? ` ${event.durationMs}ms` : ''}`);
108
+ break;
109
+ case 'llm_call':
110
+ lines.push(`${prefix}${ts} 🤖 ${event.model}${event.tokensUsed ? ` [${event.tokensUsed} tok]` : ''}`);
111
+ break;
112
+ case 'error':
113
+ lines.push(`${prefix}${ts} ✗ ERROR: ${event.error}`);
114
+ break;
115
+ }
116
+ }
117
+ return lines.join('\n');
118
+ }
119
+ // ── Serialization ──
120
+ export function trajectoryToJSON(trajectory) {
121
+ return JSON.stringify(trajectory, null, 2);
122
+ }
123
+ export function trajectoryFromJSON(json) {
124
+ return JSON.parse(json);
125
+ }
126
+ //# sourceMappingURL=trajectory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trajectory.js","sourceRoot":"","sources":["../src/trajectory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Author Trust Scoring
3
+ *
4
+ * Computes a trust score (0–1) for a PR author based on their git history
5
+ * in the repository. High-trust authors (well-known contributors) receive
6
+ * lightweight "simple" review; new/unknown authors receive deep "workflow" review.
7
+ *
8
+ * Score formula:
9
+ * commit_count_score : min(commitCount / 50, 1.0) * 0.6
10
+ * tenure_score : min(daysSinceFirstCommit / 365, 1.0) * 0.3
11
+ * recency_score : daysSinceLastCommit < 90 ? 0.1 : 0
12
+ */
13
+ import type { AuthorTrustScore, AuthorTrustTier } from '../types.js';
14
+ export interface TrustScoringOptions {
15
+ /** Path to the git repository directory. */
16
+ cwd: string;
17
+ /** Score threshold to classify an author as "trusted". Default: 0.7 */
18
+ trustedThreshold?: number;
19
+ /** Score threshold below which an author is classified as "new". Default: 0.3 */
20
+ newThreshold?: number;
21
+ }
22
+ /**
23
+ * Compute a trust score (0–1) for a given author using git log stats.
24
+ * Falls back to score=0 / tier="new" when git is unavailable or no history found.
25
+ */
26
+ export declare function computeAuthorTrustScore(author: string, options: TrustScoringOptions): Promise<AuthorTrustScore>;
27
+ /**
28
+ * Map a trust tier to a recommended review mode.
29
+ * - trusted → simple (lightweight, lower LLM cost)
30
+ * - new → workflow (deep multi-specialist review)
31
+ * - standard → unchanged (use the caller's default mode)
32
+ */
33
+ export declare function getReviewModeForTier(tier: AuthorTrustTier, defaultMode: string): string;
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trust/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAIrE,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CA0D3B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CASvF"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Author Trust Scoring
3
+ *
4
+ * Computes a trust score (0–1) for a PR author based on their git history
5
+ * in the repository. High-trust authors (well-known contributors) receive
6
+ * lightweight "simple" review; new/unknown authors receive deep "workflow" review.
7
+ *
8
+ * Score formula:
9
+ * commit_count_score : min(commitCount / 50, 1.0) * 0.6
10
+ * tenure_score : min(daysSinceFirstCommit / 365, 1.0) * 0.3
11
+ * recency_score : daysSinceLastCommit < 90 ? 0.1 : 0
12
+ */
13
+ import { execFile } from 'node:child_process';
14
+ import { promisify } from 'node:util';
15
+ const execFileAsync = promisify(execFile);
16
+ /**
17
+ * Compute a trust score (0–1) for a given author using git log stats.
18
+ * Falls back to score=0 / tier="new" when git is unavailable or no history found.
19
+ */
20
+ export async function computeAuthorTrustScore(author, options) {
21
+ const { cwd, trustedThreshold = 0.7, newThreshold = 0.3 } = options;
22
+ let commitCount = 0;
23
+ let firstSeenDaysAgo = 0;
24
+ let lastSeenDaysAgo = 999;
25
+ try {
26
+ // Count commits by author
27
+ const { stdout: countOut } = await execFileAsync('git', ['log', '--oneline', '--author', author, '--'], { cwd });
28
+ commitCount = countOut.trim().split('\n').filter(Boolean).length;
29
+ if (commitCount > 0) {
30
+ // Get all commit timestamps (Unix epoch seconds), sorted ascending
31
+ const { stdout: datesOut } = await execFileAsync('git', ['log', '--format=%at', '--author', author, '--'], { cwd });
32
+ const timestamps = datesOut
33
+ .trim()
34
+ .split('\n')
35
+ .filter(Boolean)
36
+ .map(Number)
37
+ .sort((a, b) => a - b);
38
+ if (timestamps.length > 0) {
39
+ const nowSec = Date.now() / 1000;
40
+ firstSeenDaysAgo = Math.floor((nowSec - timestamps[0]) / (60 * 60 * 24));
41
+ lastSeenDaysAgo = Math.floor((nowSec - timestamps[timestamps.length - 1]) / (60 * 60 * 24));
42
+ }
43
+ }
44
+ }
45
+ catch {
46
+ // git unavailable or not a repo — treat as new author (score=0)
47
+ }
48
+ const commitScore = Math.min(commitCount / 50, 1.0) * 0.6;
49
+ const tenureScore = Math.min(firstSeenDaysAgo / 365, 1.0) * 0.3;
50
+ const recencyScore = lastSeenDaysAgo < 90 ? 0.1 : 0;
51
+ const score = Math.round((commitScore + tenureScore + recencyScore) * 100) / 100;
52
+ const tier = score >= trustedThreshold ? 'trusted' : score >= newThreshold ? 'standard' : 'new';
53
+ return {
54
+ author,
55
+ score,
56
+ tier,
57
+ commitCount,
58
+ firstSeenDaysAgo,
59
+ lastUpdated: new Date(),
60
+ };
61
+ }
62
+ /**
63
+ * Map a trust tier to a recommended review mode.
64
+ * - trusted → simple (lightweight, lower LLM cost)
65
+ * - new → workflow (deep multi-specialist review)
66
+ * - standard → unchanged (use the caller's default mode)
67
+ */
68
+ export function getReviewModeForTier(tier, defaultMode) {
69
+ switch (tier) {
70
+ case 'trusted':
71
+ return 'simple';
72
+ case 'new':
73
+ return 'workflow';
74
+ default:
75
+ return defaultMode;
76
+ }
77
+ }
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trust/index.ts"],"names":[],"mappings":"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"}