@theihtisham/agent-shadow-brain 5.2.0 → 6.0.2

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 (301) hide show
  1. package/README.md +310 -1014
  2. package/dist/brain/agent-firewall.d.ts +7 -0
  3. package/dist/brain/agent-firewall.d.ts.map +1 -0
  4. package/dist/brain/agent-firewall.js +152 -0
  5. package/dist/brain/agent-firewall.js.map +1 -0
  6. package/dist/brain/agent-handoff.d.ts +19 -0
  7. package/dist/brain/agent-handoff.d.ts.map +1 -0
  8. package/dist/brain/agent-handoff.js +127 -0
  9. package/dist/brain/agent-handoff.js.map +1 -0
  10. package/dist/brain/air-gap.d.ts +23 -0
  11. package/dist/brain/air-gap.d.ts.map +1 -0
  12. package/dist/brain/air-gap.js +137 -0
  13. package/dist/brain/air-gap.js.map +1 -0
  14. package/dist/brain/attention-heatmap.d.ts +24 -0
  15. package/dist/brain/attention-heatmap.d.ts.map +1 -0
  16. package/dist/brain/attention-heatmap.js +108 -0
  17. package/dist/brain/attention-heatmap.js.map +1 -0
  18. package/dist/brain/auto-setup.js +19 -14
  19. package/dist/brain/auto-setup.js.map +1 -1
  20. package/dist/brain/auto-update.js +1 -1
  21. package/dist/brain/brain-3d.d.ts +79 -0
  22. package/dist/brain/brain-3d.d.ts.map +1 -0
  23. package/dist/brain/brain-3d.js +468 -0
  24. package/dist/brain/brain-3d.js.map +1 -0
  25. package/dist/brain/brain-active-learner.d.ts +74 -0
  26. package/dist/brain/brain-active-learner.d.ts.map +1 -0
  27. package/dist/brain/brain-active-learner.js +425 -0
  28. package/dist/brain/brain-active-learner.js.map +1 -0
  29. package/dist/brain/brain-ascii.d.ts +32 -0
  30. package/dist/brain/brain-ascii.d.ts.map +1 -0
  31. package/dist/brain/brain-ascii.js +402 -0
  32. package/dist/brain/brain-ascii.js.map +1 -0
  33. package/dist/brain/brain-chat.d.ts +42 -0
  34. package/dist/brain/brain-chat.d.ts.map +1 -0
  35. package/dist/brain/brain-chat.js +162 -0
  36. package/dist/brain/brain-chat.js.map +1 -0
  37. package/dist/brain/brain-cinema.d.ts +45 -0
  38. package/dist/brain/brain-cinema.d.ts.map +1 -0
  39. package/dist/brain/brain-cinema.js +393 -0
  40. package/dist/brain/brain-cinema.js.map +1 -0
  41. package/dist/brain/brain-coach.d.ts +45 -0
  42. package/dist/brain/brain-coach.d.ts.map +1 -0
  43. package/dist/brain/brain-coach.js +383 -0
  44. package/dist/brain/brain-coach.js.map +1 -0
  45. package/dist/brain/brain-consolidator.d.ts +56 -0
  46. package/dist/brain/brain-consolidator.d.ts.map +1 -0
  47. package/dist/brain/brain-consolidator.js +386 -0
  48. package/dist/brain/brain-consolidator.js.map +1 -0
  49. package/dist/brain/brain-contradictions.d.ts +57 -0
  50. package/dist/brain/brain-contradictions.d.ts.map +1 -0
  51. package/dist/brain/brain-contradictions.js +443 -0
  52. package/dist/brain/brain-contradictions.js.map +1 -0
  53. package/dist/brain/brain-diff.d.ts +61 -0
  54. package/dist/brain/brain-diff.d.ts.map +1 -0
  55. package/dist/brain/brain-diff.js +439 -0
  56. package/dist/brain/brain-diff.js.map +1 -0
  57. package/dist/brain/brain-dna.d.ts +59 -0
  58. package/dist/brain/brain-dna.d.ts.map +1 -0
  59. package/dist/brain/brain-dna.js +336 -0
  60. package/dist/brain/brain-dna.js.map +1 -0
  61. package/dist/brain/brain-doppelganger.d.ts +32 -0
  62. package/dist/brain/brain-doppelganger.d.ts.map +1 -0
  63. package/dist/brain/brain-doppelganger.js +417 -0
  64. package/dist/brain/brain-doppelganger.js.map +1 -0
  65. package/dist/brain/brain-encryption.d.ts +14 -0
  66. package/dist/brain/brain-encryption.d.ts.map +1 -0
  67. package/dist/brain/brain-encryption.js +68 -0
  68. package/dist/brain/brain-encryption.js.map +1 -0
  69. package/dist/brain/brain-exchange.d.ts +30 -0
  70. package/dist/brain/brain-exchange.d.ts.map +1 -0
  71. package/dist/brain/brain-exchange.js +106 -0
  72. package/dist/brain/brain-exchange.js.map +1 -0
  73. package/dist/brain/brain-garden.d.ts +18 -0
  74. package/dist/brain/brain-garden.d.ts.map +1 -0
  75. package/dist/brain/brain-garden.js +81 -0
  76. package/dist/brain/brain-garden.js.map +1 -0
  77. package/dist/brain/brain-graph-walker.d.ts +54 -0
  78. package/dist/brain/brain-graph-walker.d.ts.map +1 -0
  79. package/dist/brain/brain-graph-walker.js +412 -0
  80. package/dist/brain/brain-graph-walker.js.map +1 -0
  81. package/dist/brain/brain-holiday-card.d.ts +50 -0
  82. package/dist/brain/brain-holiday-card.d.ts.map +1 -0
  83. package/dist/brain/brain-holiday-card.js +432 -0
  84. package/dist/brain/brain-holiday-card.js.map +1 -0
  85. package/dist/brain/brain-memes.d.ts +44 -0
  86. package/dist/brain/brain-memes.d.ts.map +1 -0
  87. package/dist/brain/brain-memes.js +438 -0
  88. package/dist/brain/brain-memes.js.map +1 -0
  89. package/dist/brain/brain-memory-tiers.d.ts +67 -0
  90. package/dist/brain/brain-memory-tiers.d.ts.map +1 -0
  91. package/dist/brain/brain-memory-tiers.js +292 -0
  92. package/dist/brain/brain-memory-tiers.js.map +1 -0
  93. package/dist/brain/brain-notebook.d.ts +68 -0
  94. package/dist/brain/brain-notebook.d.ts.map +1 -0
  95. package/dist/brain/brain-notebook.js +379 -0
  96. package/dist/brain/brain-notebook.js.map +1 -0
  97. package/dist/brain/brain-portability.js +1 -1
  98. package/dist/brain/brain-quantize.d.ts +62 -0
  99. package/dist/brain/brain-quantize.d.ts.map +1 -0
  100. package/dist/brain/brain-quantize.js +346 -0
  101. package/dist/brain/brain-quantize.js.map +1 -0
  102. package/dist/brain/brain-query-expander.d.ts +31 -0
  103. package/dist/brain/brain-query-expander.d.ts.map +1 -0
  104. package/dist/brain/brain-query-expander.js +417 -0
  105. package/dist/brain/brain-query-expander.js.map +1 -0
  106. package/dist/brain/brain-quest.d.ts +58 -0
  107. package/dist/brain/brain-quest.d.ts.map +1 -0
  108. package/dist/brain/brain-quest.js +541 -0
  109. package/dist/brain/brain-quest.js.map +1 -0
  110. package/dist/brain/brain-recall-cache.d.ts +73 -0
  111. package/dist/brain/brain-recall-cache.d.ts.map +1 -0
  112. package/dist/brain/brain-recall-cache.js +444 -0
  113. package/dist/brain/brain-recall-cache.js.map +1 -0
  114. package/dist/brain/brain-reflex.d.ts +55 -0
  115. package/dist/brain/brain-reflex.d.ts.map +1 -0
  116. package/dist/brain/brain-reflex.js +364 -0
  117. package/dist/brain/brain-reflex.js.map +1 -0
  118. package/dist/brain/brain-replay.d.ts +74 -0
  119. package/dist/brain/brain-replay.d.ts.map +1 -0
  120. package/dist/brain/brain-replay.js +336 -0
  121. package/dist/brain/brain-replay.js.map +1 -0
  122. package/dist/brain/brain-rerank.d.ts +39 -0
  123. package/dist/brain/brain-rerank.d.ts.map +1 -0
  124. package/dist/brain/brain-rerank.js +216 -0
  125. package/dist/brain/brain-rerank.js.map +1 -0
  126. package/dist/brain/brain-roast.d.ts +44 -0
  127. package/dist/brain/brain-roast.d.ts.map +1 -0
  128. package/dist/brain/brain-roast.js +566 -0
  129. package/dist/brain/brain-roast.js.map +1 -0
  130. package/dist/brain/brain-sonification.d.ts +57 -0
  131. package/dist/brain/brain-sonification.d.ts.map +1 -0
  132. package/dist/brain/brain-sonification.js +286 -0
  133. package/dist/brain/brain-sonification.js.map +1 -0
  134. package/dist/brain/brain-tarot.d.ts +49 -0
  135. package/dist/brain/brain-tarot.d.ts.map +1 -0
  136. package/dist/brain/brain-tarot.js +634 -0
  137. package/dist/brain/brain-tarot.js.map +1 -0
  138. package/dist/brain/brain-time-capsule.d.ts +80 -0
  139. package/dist/brain/brain-time-capsule.d.ts.map +1 -0
  140. package/dist/brain/brain-time-capsule.js +289 -0
  141. package/dist/brain/brain-time-capsule.js.map +1 -0
  142. package/dist/brain/brain-trophies.d.ts +60 -0
  143. package/dist/brain/brain-trophies.d.ts.map +1 -0
  144. package/dist/brain/brain-trophies.js +431 -0
  145. package/dist/brain/brain-trophies.js.map +1 -0
  146. package/dist/brain/brain-working-memory.d.ts +78 -0
  147. package/dist/brain/brain-working-memory.d.ts.map +1 -0
  148. package/dist/brain/brain-working-memory.js +367 -0
  149. package/dist/brain/brain-working-memory.js.map +1 -0
  150. package/dist/brain/branch-brain.d.ts +23 -0
  151. package/dist/brain/branch-brain.d.ts.map +1 -0
  152. package/dist/brain/branch-brain.js +159 -0
  153. package/dist/brain/branch-brain.js.map +1 -0
  154. package/dist/brain/calibration-monitor.d.ts +20 -0
  155. package/dist/brain/calibration-monitor.d.ts.map +1 -0
  156. package/dist/brain/calibration-monitor.js +144 -0
  157. package/dist/brain/calibration-monitor.js.map +1 -0
  158. package/dist/brain/causal-chains.d.ts +37 -0
  159. package/dist/brain/causal-chains.d.ts.map +1 -0
  160. package/dist/brain/causal-chains.js +250 -0
  161. package/dist/brain/causal-chains.js.map +1 -0
  162. package/dist/brain/collision-detective.d.ts +32 -0
  163. package/dist/brain/collision-detective.d.ts.map +1 -0
  164. package/dist/brain/collision-detective.js +233 -0
  165. package/dist/brain/collision-detective.js.map +1 -0
  166. package/dist/brain/confidence-gate.d.ts +69 -0
  167. package/dist/brain/confidence-gate.d.ts.map +1 -0
  168. package/dist/brain/confidence-gate.js +244 -0
  169. package/dist/brain/confidence-gate.js.map +1 -0
  170. package/dist/brain/constitution.d.ts +59 -0
  171. package/dist/brain/constitution.d.ts.map +1 -0
  172. package/dist/brain/constitution.js +315 -0
  173. package/dist/brain/constitution.js.map +1 -0
  174. package/dist/brain/cost-aware-spawner.d.ts +7 -0
  175. package/dist/brain/cost-aware-spawner.d.ts.map +1 -0
  176. package/dist/brain/cost-aware-spawner.js +77 -0
  177. package/dist/brain/cost-aware-spawner.js.map +1 -0
  178. package/dist/brain/dream-engine.d.ts +35 -0
  179. package/dist/brain/dream-engine.d.ts.map +1 -0
  180. package/dist/brain/dream-engine.js +273 -0
  181. package/dist/brain/dream-engine.js.map +1 -0
  182. package/dist/brain/embeddings-v2.d.ts +58 -0
  183. package/dist/brain/embeddings-v2.d.ts.map +1 -0
  184. package/dist/brain/embeddings-v2.js +344 -0
  185. package/dist/brain/embeddings-v2.js.map +1 -0
  186. package/dist/brain/embeddings.d.ts +27 -0
  187. package/dist/brain/embeddings.d.ts.map +1 -0
  188. package/dist/brain/embeddings.js +175 -0
  189. package/dist/brain/embeddings.js.map +1 -0
  190. package/dist/brain/forgetting-curve.d.ts +21 -0
  191. package/dist/brain/forgetting-curve.d.ts.map +1 -0
  192. package/dist/brain/forgetting-curve.js +174 -0
  193. package/dist/brain/forgetting-curve.js.map +1 -0
  194. package/dist/brain/formal-verification-bridge.d.ts +26 -0
  195. package/dist/brain/formal-verification-bridge.d.ts.map +1 -0
  196. package/dist/brain/formal-verification-bridge.js +219 -0
  197. package/dist/brain/formal-verification-bridge.js.map +1 -0
  198. package/dist/brain/global-brain.d.ts +8 -1
  199. package/dist/brain/global-brain.d.ts.map +1 -1
  200. package/dist/brain/global-brain.js +24 -0
  201. package/dist/brain/global-brain.js.map +1 -1
  202. package/dist/brain/hallucination-quarantine.d.ts +26 -0
  203. package/dist/brain/hallucination-quarantine.d.ts.map +1 -0
  204. package/dist/brain/hallucination-quarantine.js +135 -0
  205. package/dist/brain/hallucination-quarantine.js.map +1 -0
  206. package/dist/brain/hive-accelerator.d.ts +39 -0
  207. package/dist/brain/hive-accelerator.d.ts.map +1 -0
  208. package/dist/brain/hive-accelerator.js +152 -0
  209. package/dist/brain/hive-accelerator.js.map +1 -0
  210. package/dist/brain/hive-voice.d.ts +71 -0
  211. package/dist/brain/hive-voice.d.ts.map +1 -0
  212. package/dist/brain/hive-voice.js +352 -0
  213. package/dist/brain/hive-voice.js.map +1 -0
  214. package/dist/brain/json-output.d.ts +26 -0
  215. package/dist/brain/json-output.d.ts.map +1 -0
  216. package/dist/brain/json-output.js +112 -0
  217. package/dist/brain/json-output.js.map +1 -0
  218. package/dist/brain/l0-cache.js +1 -1
  219. package/dist/brain/l0-cache.js.map +1 -1
  220. package/dist/brain/local-llm.d.ts +20 -0
  221. package/dist/brain/local-llm.d.ts.map +1 -0
  222. package/dist/brain/local-llm.js +132 -0
  223. package/dist/brain/local-llm.js.map +1 -0
  224. package/dist/brain/markdown-export.d.ts +48 -0
  225. package/dist/brain/markdown-export.d.ts.map +1 -0
  226. package/dist/brain/markdown-export.js +382 -0
  227. package/dist/brain/markdown-export.js.map +1 -0
  228. package/dist/brain/mcp-server.d.ts +40 -0
  229. package/dist/brain/mcp-server.d.ts.map +1 -1
  230. package/dist/brain/mcp-server.js +395 -12
  231. package/dist/brain/mcp-server.js.map +1 -1
  232. package/dist/brain/model-registry.d.ts +96 -0
  233. package/dist/brain/model-registry.d.ts.map +1 -0
  234. package/dist/brain/model-registry.js +585 -0
  235. package/dist/brain/model-registry.js.map +1 -0
  236. package/dist/brain/multimodal-vision.d.ts +38 -0
  237. package/dist/brain/multimodal-vision.d.ts.map +1 -0
  238. package/dist/brain/multimodal-vision.js +257 -0
  239. package/dist/brain/multimodal-vision.js.map +1 -0
  240. package/dist/brain/orchestrator.js +1 -1
  241. package/dist/brain/otel-lite.d.ts +71 -0
  242. package/dist/brain/otel-lite.d.ts.map +1 -0
  243. package/dist/brain/otel-lite.js +232 -0
  244. package/dist/brain/otel-lite.js.map +1 -0
  245. package/dist/brain/pr-auto-review.d.ts +17 -0
  246. package/dist/brain/pr-auto-review.d.ts.map +1 -0
  247. package/dist/brain/pr-auto-review.js +73 -0
  248. package/dist/brain/pr-auto-review.js.map +1 -0
  249. package/dist/brain/pre-mortem.d.ts +21 -0
  250. package/dist/brain/pre-mortem.d.ts.map +1 -0
  251. package/dist/brain/pre-mortem.js +210 -0
  252. package/dist/brain/pre-mortem.js.map +1 -0
  253. package/dist/brain/prompt-cache.d.ts +54 -0
  254. package/dist/brain/prompt-cache.d.ts.map +1 -0
  255. package/dist/brain/prompt-cache.js +105 -0
  256. package/dist/brain/prompt-cache.js.map +1 -0
  257. package/dist/brain/reputation-ledger.d.ts +42 -0
  258. package/dist/brain/reputation-ledger.d.ts.map +1 -0
  259. package/dist/brain/reputation-ledger.js +326 -0
  260. package/dist/brain/reputation-ledger.js.map +1 -0
  261. package/dist/brain/session-hooks.d.ts +19 -0
  262. package/dist/brain/session-hooks.d.ts.map +1 -1
  263. package/dist/brain/session-hooks.js +249 -18
  264. package/dist/brain/session-hooks.js.map +1 -1
  265. package/dist/brain/subagent-bridge.d.ts +46 -0
  266. package/dist/brain/subagent-bridge.d.ts.map +1 -0
  267. package/dist/brain/subagent-bridge.js +364 -0
  268. package/dist/brain/subagent-bridge.js.map +1 -0
  269. package/dist/brain/swarm-debate.d.ts +22 -0
  270. package/dist/brain/swarm-debate.d.ts.map +1 -0
  271. package/dist/brain/swarm-debate.js +134 -0
  272. package/dist/brain/swarm-debate.js.map +1 -0
  273. package/dist/brain/team-brain-sync.d.ts +22 -0
  274. package/dist/brain/team-brain-sync.d.ts.map +1 -0
  275. package/dist/brain/team-brain-sync.js +132 -0
  276. package/dist/brain/team-brain-sync.js.map +1 -0
  277. package/dist/brain/token-economy.d.ts +25 -0
  278. package/dist/brain/token-economy.d.ts.map +1 -0
  279. package/dist/brain/token-economy.js +216 -0
  280. package/dist/brain/token-economy.js.map +1 -0
  281. package/dist/brain/voice-mode.d.ts +15 -0
  282. package/dist/brain/voice-mode.d.ts.map +1 -0
  283. package/dist/brain/voice-mode.js +97 -0
  284. package/dist/brain/voice-mode.js.map +1 -0
  285. package/dist/cli.js +1702 -4
  286. package/dist/cli.js.map +1 -1
  287. package/dist/dashboard/server.d.ts +6 -0
  288. package/dist/dashboard/server.d.ts.map +1 -1
  289. package/dist/dashboard/server.js +1118 -368
  290. package/dist/dashboard/server.js.map +1 -1
  291. package/dist/dashboard/v6-dashboard-html.d.ts +2 -0
  292. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -0
  293. package/dist/dashboard/v6-dashboard-html.js +2474 -0
  294. package/dist/dashboard/v6-dashboard-html.js.map +1 -0
  295. package/dist/index.d.ts +27 -0
  296. package/dist/index.d.ts.map +1 -1
  297. package/dist/index.js +29 -1
  298. package/dist/index.js.map +1 -1
  299. package/dist/types.d.ts +518 -2
  300. package/dist/types.d.ts.map +1 -1
  301. package/package.json +33 -4
@@ -0,0 +1,38 @@
1
+ export interface VisionEntity {
2
+ id: string;
3
+ sourcePath: string;
4
+ hash: string;
5
+ capturedAt: string;
6
+ description: string;
7
+ ocr?: string;
8
+ tags: string[];
9
+ project: string;
10
+ embedding?: number[];
11
+ }
12
+ export declare class MultimodalVision {
13
+ private ollamaModel;
14
+ private ollamaBaseUrl;
15
+ private initialized;
16
+ init(): Promise<void>;
17
+ /** Ingest an image file. Returns the persisted VisionEntity. */
18
+ ingestImage(filePath: string, opts?: {
19
+ project?: string;
20
+ tags?: string[];
21
+ prompt?: string;
22
+ }): Promise<VisionEntity>;
23
+ /** Semantic search across stored image descriptions. */
24
+ search(query: string, topK?: number, project?: string): Promise<VisionEntity[]>;
25
+ /** Recent ingests, newest first. */
26
+ recent(limit?: number, project?: string): Promise<VisionEntity[]>;
27
+ /** True if a vision model was detected. */
28
+ hasVisionModel(): boolean;
29
+ private describe;
30
+ private appendIndex;
31
+ private loadAll;
32
+ }
33
+ /** OCR stub. TODO: wire up tesseract.js or system tesseract for real OCR.
34
+ * Returns null today; vision model + description handles text most of the time. */
35
+ export declare function ocrExtract(_filePath: string): Promise<string | null>;
36
+ export declare function getMultimodalVision(): MultimodalVision;
37
+ export declare function resetMultimodalVisionForTests(): void;
38
+ //# sourceMappingURL=multimodal-vision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multimodal-vision.d.ts","sourceRoot":"","sources":["../../src/brain/multimodal-vision.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAOD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B3B,gEAAgE;IAC1D,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5D,OAAO,CAAC,YAAY,CAAC;IAoDxB,wDAAwD;IAClD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAK,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAuBjF,oCAAoC;IAC9B,MAAM,CAAC,KAAK,SAAK,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAOnE,2CAA2C;IAC3C,cAAc,IAAI,OAAO;YAIX,QAAQ;IA4BtB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,OAAO;CAyBhB;AAED;oFACoF;AACpF,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAI1E;AAkBD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAGtD;AACD,wBAAgB,6BAA6B,IAAI,IAAI,CAAsB"}
@@ -0,0 +1,257 @@
1
+ // src/brain/multimodal-vision.ts — Image ingestion via Ollama llava
2
+ // v6.0.2 — Multimodal Edition
3
+ //
4
+ // Adds image understanding to the brain. Uses Ollama llava (or llava-llama3 /
5
+ // bakllava — probed in priority order). Falls through gracefully if no
6
+ // vision model is available: the image is registered but undescribed.
7
+ //
8
+ // Storage layout:
9
+ // ~/.shadow-brain/vision/<project>/<hash>.json — metadata (path + desc)
10
+ // ~/.shadow-brain/vision/<project>/index.json — flat index for search
11
+ //
12
+ // The actual image is NOT copied — it stays at sourcePath. The brain holds
13
+ // only the path, hash, description, and (optional) embedding.
14
+ import * as fs from 'fs';
15
+ import * as path from 'path';
16
+ import * as os from 'os';
17
+ import * as crypto from 'crypto';
18
+ import { getEmbeddings } from './embeddings.js';
19
+ import { getModelRegistry } from './model-registry.js';
20
+ const VISION_DIR = path.join(os.homedir(), '.shadow-brain', 'vision');
21
+ const PREFERRED_MODELS = ['llava', 'llava-llama3', 'bakllava'];
22
+ const DEFAULT_PROMPT = 'Describe this image in detail. Focus on UI elements, text, code, ' +
23
+ 'diagrams. Use plain factual language.';
24
+ export class MultimodalVision {
25
+ constructor() {
26
+ this.ollamaModel = null;
27
+ this.ollamaBaseUrl = 'http://127.0.0.1:11434';
28
+ this.initialized = false;
29
+ }
30
+ async init() {
31
+ if (this.initialized)
32
+ return;
33
+ fs.mkdirSync(VISION_DIR, { recursive: true });
34
+ try {
35
+ const reg = getModelRegistry();
36
+ await reg.init();
37
+ const ollama = reg.getProvider('ollama');
38
+ if (ollama?.enabled) {
39
+ this.ollamaBaseUrl = ollama.baseUrl;
40
+ const res = await fetch(this.ollamaBaseUrl + '/api/tags', {
41
+ signal: AbortSignal.timeout(2000),
42
+ });
43
+ if (res.ok) {
44
+ const json = (await res.json());
45
+ for (const pref of PREFERRED_MODELS) {
46
+ const match = json.models?.find(m => m.name.startsWith(pref));
47
+ if (match) {
48
+ this.ollamaModel = match.name;
49
+ break;
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ catch { /* no ollama — graceful */ }
56
+ this.initialized = true;
57
+ }
58
+ /** Ingest an image file. Returns the persisted VisionEntity. */
59
+ async ingestImage(filePath, opts) {
60
+ await this.init();
61
+ const absPath = path.resolve(filePath);
62
+ if (!fs.existsSync(absPath)) {
63
+ throw new Error(`Image file not found: ${absPath}`);
64
+ }
65
+ const buf = fs.readFileSync(absPath);
66
+ const hash = crypto.createHash('sha256').update(buf).digest('hex').slice(0, 16);
67
+ const project = (opts?.project || 'default').replace(/[^a-zA-Z0-9._-]/g, '_');
68
+ const projectDir = path.join(VISION_DIR, project);
69
+ fs.mkdirSync(projectDir, { recursive: true });
70
+ // De-dupe by hash within project
71
+ const metaPath = path.join(projectDir, `${hash}.json`);
72
+ if (fs.existsSync(metaPath)) {
73
+ try {
74
+ return JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
75
+ }
76
+ catch { /* re-ingest */ }
77
+ }
78
+ const prompt = opts?.prompt || DEFAULT_PROMPT;
79
+ const description = await this.describe(buf, prompt);
80
+ const ocr = await ocrExtract(absPath);
81
+ const tags = (opts?.tags || []).slice(0, 32);
82
+ let embedding;
83
+ try {
84
+ const e = getEmbeddings();
85
+ embedding = await e.embed(description + ' ' + (ocr || '') + ' ' + tags.join(' '));
86
+ }
87
+ catch { /* embedding optional */ }
88
+ const entity = {
89
+ id: `vision_${hash}`,
90
+ sourcePath: absPath,
91
+ hash,
92
+ capturedAt: new Date().toISOString(),
93
+ description,
94
+ ocr: ocr || undefined,
95
+ tags,
96
+ project,
97
+ embedding,
98
+ };
99
+ try {
100
+ fs.writeFileSync(metaPath, JSON.stringify(entity, null, 2));
101
+ this.appendIndex(projectDir, entity);
102
+ }
103
+ catch { /* non-fatal */ }
104
+ return entity;
105
+ }
106
+ /** Semantic search across stored image descriptions. */
107
+ async search(query, topK = 10, project) {
108
+ await this.init();
109
+ const all = this.loadAll(project);
110
+ if (all.length === 0)
111
+ return [];
112
+ try {
113
+ const e = getEmbeddings();
114
+ const qVec = await e.embed(query);
115
+ const scored = all.map(ent => {
116
+ const v = ent.embedding;
117
+ const score = v ? cosine(qVec, v) : keywordScore(ent, query);
118
+ return { ent, score };
119
+ });
120
+ scored.sort((a, b) => b.score - a.score);
121
+ return scored.slice(0, topK).map(s => s.ent);
122
+ }
123
+ catch {
124
+ // Fallback to keyword scoring on description + tags + ocr
125
+ const scored = all.map(ent => ({ ent, score: keywordScore(ent, query) }));
126
+ scored.sort((a, b) => b.score - a.score);
127
+ return scored.slice(0, topK).map(s => s.ent);
128
+ }
129
+ }
130
+ /** Recent ingests, newest first. */
131
+ async recent(limit = 20, project) {
132
+ await this.init();
133
+ const all = this.loadAll(project);
134
+ all.sort((a, b) => b.capturedAt.localeCompare(a.capturedAt));
135
+ return all.slice(0, limit);
136
+ }
137
+ /** True if a vision model was detected. */
138
+ hasVisionModel() { return this.ollamaModel !== null; }
139
+ // ── Internals ────────────────────────────────────────────────────────
140
+ async describe(imageBuf, prompt) {
141
+ if (!this.ollamaModel) {
142
+ return '[vision model not available — image registered but undescribed]';
143
+ }
144
+ try {
145
+ const b64 = imageBuf.toString('base64');
146
+ const res = await fetch(this.ollamaBaseUrl + '/api/generate', {
147
+ method: 'POST',
148
+ headers: { 'Content-Type': 'application/json' },
149
+ body: JSON.stringify({
150
+ model: this.ollamaModel,
151
+ prompt,
152
+ images: [b64],
153
+ stream: false,
154
+ }),
155
+ signal: AbortSignal.timeout(120000),
156
+ });
157
+ if (!res.ok) {
158
+ return '[vision model error — image registered but undescribed]';
159
+ }
160
+ const json = (await res.json());
161
+ const text = (json.response || '').trim();
162
+ return text || '[vision model returned empty description]';
163
+ }
164
+ catch {
165
+ return '[vision model unreachable — image registered but undescribed]';
166
+ }
167
+ }
168
+ appendIndex(projectDir, entity) {
169
+ const indexPath = path.join(projectDir, 'index.json');
170
+ let idx = { schemaVersion: 1, entries: [] };
171
+ if (fs.existsSync(indexPath)) {
172
+ try {
173
+ idx = JSON.parse(fs.readFileSync(indexPath, 'utf-8'));
174
+ }
175
+ catch { /* reset */ }
176
+ }
177
+ if (!idx.entries.some(e => e.hash === entity.hash)) {
178
+ idx.entries.push({
179
+ id: entity.id,
180
+ hash: entity.hash,
181
+ capturedAt: entity.capturedAt,
182
+ tags: entity.tags,
183
+ });
184
+ }
185
+ const tmp = indexPath + '.tmp';
186
+ fs.writeFileSync(tmp, JSON.stringify(idx, null, 2));
187
+ fs.renameSync(tmp, indexPath);
188
+ }
189
+ loadAll(project) {
190
+ if (!fs.existsSync(VISION_DIR))
191
+ return [];
192
+ const projects = project
193
+ ? [project.replace(/[^a-zA-Z0-9._-]/g, '_')]
194
+ : fs.readdirSync(VISION_DIR).filter(d => {
195
+ try {
196
+ return fs.statSync(path.join(VISION_DIR, d)).isDirectory();
197
+ }
198
+ catch {
199
+ return false;
200
+ }
201
+ });
202
+ const out = [];
203
+ for (const p of projects) {
204
+ const dir = path.join(VISION_DIR, p);
205
+ if (!fs.existsSync(dir))
206
+ continue;
207
+ let files = [];
208
+ try {
209
+ files = fs.readdirSync(dir);
210
+ }
211
+ catch {
212
+ continue;
213
+ }
214
+ for (const f of files) {
215
+ if (!f.endsWith('.json') || f === 'index.json')
216
+ continue;
217
+ try {
218
+ const raw = fs.readFileSync(path.join(dir, f), 'utf-8');
219
+ out.push(JSON.parse(raw));
220
+ }
221
+ catch { /* skip */ }
222
+ }
223
+ }
224
+ return out;
225
+ }
226
+ }
227
+ /** OCR stub. TODO: wire up tesseract.js or system tesseract for real OCR.
228
+ * Returns null today; vision model + description handles text most of the time. */
229
+ export async function ocrExtract(_filePath) {
230
+ // TODO: integrate tesseract.js (pure JS) or shell out to `tesseract` CLI
231
+ // when available. Kept as a stub to avoid pulling a heavy dependency.
232
+ return null;
233
+ }
234
+ function cosine(a, b) {
235
+ let dot = 0;
236
+ const n = Math.min(a.length, b.length);
237
+ for (let i = 0; i < n; i++)
238
+ dot += a[i] * b[i];
239
+ return dot;
240
+ }
241
+ function keywordScore(ent, query) {
242
+ const q = query.toLowerCase().split(/\s+/).filter(t => t.length > 1);
243
+ const hay = (ent.description + ' ' + (ent.ocr || '') + ' ' + ent.tags.join(' ')).toLowerCase();
244
+ let score = 0;
245
+ for (const t of q)
246
+ if (hay.includes(t))
247
+ score += 1;
248
+ return score / Math.max(q.length, 1);
249
+ }
250
+ let _instance = null;
251
+ export function getMultimodalVision() {
252
+ if (!_instance)
253
+ _instance = new MultimodalVision();
254
+ return _instance;
255
+ }
256
+ export function resetMultimodalVisionForTests() { _instance = null; }
257
+ //# sourceMappingURL=multimodal-vision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multimodal-vision.js","sourceRoot":"","sources":["../../src/brain/multimodal-vision.ts"],"names":[],"mappings":"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"}
@@ -780,7 +780,7 @@ export class Orchestrator extends EventEmitter {
780
780
  getStatus() {
781
781
  return {
782
782
  running: this.running,
783
- version: '5.1.1',
783
+ version: '6.0.0',
784
784
  agents: this.adapters.map(a => `${a.displayName} (${a.name})`),
785
785
  insightsGenerated: this.currentSession?.insights.length || 0,
786
786
  filesReviewed: this.currentSession?.filesReviewed || 0,
@@ -0,0 +1,71 @@
1
+ export type SpanStatusCode = 'UNSET' | 'OK' | 'ERROR';
2
+ export interface SpanEvent {
3
+ name: string;
4
+ time_ns: number;
5
+ attributes?: Record<string, unknown>;
6
+ }
7
+ export interface TraceLine {
8
+ trace_id: string;
9
+ span_id: string;
10
+ parent_span_id?: string;
11
+ name: string;
12
+ tracer_name: string;
13
+ start_ns: number;
14
+ end_ns: number;
15
+ attributes: Record<string, unknown>;
16
+ events: SpanEvent[];
17
+ status: {
18
+ code: SpanStatusCode;
19
+ message?: string;
20
+ };
21
+ }
22
+ export interface SpanOptions {
23
+ attributes?: Record<string, unknown>;
24
+ parent?: Span;
25
+ }
26
+ export declare class Span {
27
+ readonly traceId: string;
28
+ readonly spanId: string;
29
+ readonly parentSpanId?: string;
30
+ readonly name: string;
31
+ readonly tracerName: string;
32
+ readonly startNs: number;
33
+ private endNs;
34
+ private ended;
35
+ private attrs;
36
+ private events;
37
+ private status;
38
+ private tracer;
39
+ constructor(tracer: Tracer, name: string, opts?: SpanOptions);
40
+ setAttribute(key: string, value: unknown): this;
41
+ addEvent(name: string, attributes?: Record<string, unknown>): this;
42
+ recordException(err: unknown): this;
43
+ setStatus(code: SpanStatusCode, message?: string): this;
44
+ end(): void;
45
+ private toLine;
46
+ }
47
+ export declare class Tracer {
48
+ readonly name: string;
49
+ private sampleRate;
50
+ private lastRotation;
51
+ constructor(name: string);
52
+ startSpan(name: string, opts?: SpanOptions): Span;
53
+ /** Auto begin/end around an async function. */
54
+ withSpan<T>(name: string, fn: (span: Span) => Promise<T> | T, opts?: SpanOptions): Promise<T>;
55
+ /** Set sample rate 0-1. 1 = emit all spans, 0 = drop all. */
56
+ sample(rate: number): void;
57
+ /** Internal: write a line. Sampling + rotation handled here. */
58
+ emitSpan(line: TraceLine): void;
59
+ private cleanupOldFiles;
60
+ }
61
+ export declare function trace(name: string): Tracer;
62
+ export declare const OtelLite: {
63
+ trace: typeof trace;
64
+ /** Read the tail of today's trace file. Returns parsed TraceLines, newest last. */
65
+ tail(lines?: number): Promise<TraceLine[]>;
66
+ /** Path of today's trace file (whether or not it exists yet). */
67
+ todayFilePath(): string;
68
+ /** Manually trigger retention cleanup. */
69
+ cleanup(): void;
70
+ };
71
+ //# sourceMappingURL=otel-lite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel-lite.d.ts","sourceRoot":"","sources":["../../src/brain/otel-lite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,232 @@
1
+ // src/brain/otel-lite.ts — Zero-dep OpenTelemetry-compatible JSONL tracer
2
+ // v6.0.2 — Multimodal Edition
3
+ //
4
+ // Stand-in for real OpenTelemetry. Emits JSONL spans that match OTel's
5
+ // "Compatible JSONL exporter" shape so users can pipe the file into a real
6
+ // OTel collector later. Zero dependencies.
7
+ //
8
+ // Storage:
9
+ // ~/.shadow-brain/traces/<YYYY-MM-DD>.jsonl
10
+ // Daily rotation, retains last 14 days, drops older silently.
11
+ //
12
+ // Usage:
13
+ // const tracer = trace('shadow-brain');
14
+ // const span = tracer.startSpan('brain.recall', { attributes: { project } });
15
+ // span.setAttribute('query', q); span.addEvent('cache.miss');
16
+ // try { ... } catch (e) { span.recordException(e); throw e; }
17
+ // span.end();
18
+ //
19
+ // await tracer.withSpan('embed', async () => { ... }); // auto begin/end
20
+ import * as fs from 'fs';
21
+ import * as path from 'path';
22
+ import * as os from 'os';
23
+ import * as crypto from 'crypto';
24
+ const TRACE_DIR = path.join(os.homedir(), '.shadow-brain', 'traces');
25
+ const RETENTION_DAYS = 14;
26
+ export class Span {
27
+ constructor(tracer, name, opts) {
28
+ this.endNs = 0;
29
+ this.ended = false;
30
+ this.attrs = {};
31
+ this.events = [];
32
+ this.status = { code: 'UNSET' };
33
+ this.tracer = tracer;
34
+ this.name = name;
35
+ this.tracerName = tracer.name;
36
+ this.traceId = opts?.parent?.traceId || randomHex(32);
37
+ this.spanId = randomHex(16);
38
+ this.parentSpanId = opts?.parent?.spanId;
39
+ this.startNs = nowNs();
40
+ if (opts?.attributes)
41
+ for (const [k, v] of Object.entries(opts.attributes))
42
+ this.attrs[k] = v;
43
+ }
44
+ setAttribute(key, value) {
45
+ if (!this.ended)
46
+ this.attrs[key] = value;
47
+ return this;
48
+ }
49
+ addEvent(name, attributes) {
50
+ if (!this.ended)
51
+ this.events.push({ name, time_ns: nowNs(), attributes });
52
+ return this;
53
+ }
54
+ recordException(err) {
55
+ if (this.ended)
56
+ return this;
57
+ const e = err instanceof Error ? err : new Error(String(err));
58
+ this.events.push({
59
+ name: 'exception',
60
+ time_ns: nowNs(),
61
+ attributes: {
62
+ 'exception.type': e.name,
63
+ 'exception.message': e.message,
64
+ 'exception.stacktrace': e.stack || '',
65
+ },
66
+ });
67
+ this.status = { code: 'ERROR', message: e.message };
68
+ return this;
69
+ }
70
+ setStatus(code, message) {
71
+ if (!this.ended)
72
+ this.status = { code, message };
73
+ return this;
74
+ }
75
+ end() {
76
+ if (this.ended)
77
+ return;
78
+ this.ended = true;
79
+ this.endNs = nowNs();
80
+ try {
81
+ this.tracer.emitSpan(this.toLine());
82
+ }
83
+ catch { /* never throw */ }
84
+ }
85
+ toLine() {
86
+ return {
87
+ trace_id: this.traceId,
88
+ span_id: this.spanId,
89
+ parent_span_id: this.parentSpanId,
90
+ name: this.name,
91
+ tracer_name: this.tracerName,
92
+ start_ns: this.startNs,
93
+ end_ns: this.endNs,
94
+ attributes: this.attrs,
95
+ events: this.events,
96
+ status: this.status,
97
+ };
98
+ }
99
+ }
100
+ export class Tracer {
101
+ constructor(name) {
102
+ this.sampleRate = 1.0;
103
+ this.lastRotation = '';
104
+ this.name = name;
105
+ }
106
+ startSpan(name, opts) {
107
+ return new Span(this, name, opts);
108
+ }
109
+ /** Auto begin/end around an async function. */
110
+ async withSpan(name, fn, opts) {
111
+ const span = this.startSpan(name, opts);
112
+ try {
113
+ const result = await fn(span);
114
+ if (span['status'].code === 'UNSET')
115
+ span.setStatus('OK');
116
+ return result;
117
+ }
118
+ catch (err) {
119
+ span.recordException(err);
120
+ throw err;
121
+ }
122
+ finally {
123
+ span.end();
124
+ }
125
+ }
126
+ /** Set sample rate 0-1. 1 = emit all spans, 0 = drop all. */
127
+ sample(rate) {
128
+ if (!Number.isFinite(rate))
129
+ return;
130
+ this.sampleRate = Math.max(0, Math.min(1, rate));
131
+ }
132
+ /** Internal: write a line. Sampling + rotation handled here. */
133
+ emitSpan(line) {
134
+ if (this.sampleRate < 1.0 && Math.random() > this.sampleRate)
135
+ return;
136
+ try {
137
+ fs.mkdirSync(TRACE_DIR, { recursive: true });
138
+ const today = todayStamp();
139
+ if (today !== this.lastRotation) {
140
+ this.cleanupOldFiles();
141
+ this.lastRotation = today;
142
+ }
143
+ const file = path.join(TRACE_DIR, `${today}.jsonl`);
144
+ fs.appendFileSync(file, JSON.stringify(line) + '\n');
145
+ }
146
+ catch { /* never throw from tracing */ }
147
+ }
148
+ cleanupOldFiles() {
149
+ try {
150
+ if (!fs.existsSync(TRACE_DIR))
151
+ return;
152
+ const files = fs.readdirSync(TRACE_DIR).filter(f => f.endsWith('.jsonl'));
153
+ const cutoff = Date.now() - RETENTION_DAYS * 86400000;
154
+ for (const f of files) {
155
+ const stamp = f.replace('.jsonl', '');
156
+ const t = Date.parse(stamp + 'T00:00:00Z');
157
+ if (Number.isFinite(t) && t < cutoff) {
158
+ try {
159
+ fs.unlinkSync(path.join(TRACE_DIR, f));
160
+ }
161
+ catch { /* ignore */ }
162
+ }
163
+ }
164
+ }
165
+ catch { /* ignore */ }
166
+ }
167
+ }
168
+ // ── Public API ───────────────────────────────────────────────────────────
169
+ const _tracers = new Map();
170
+ export function trace(name) {
171
+ let t = _tracers.get(name);
172
+ if (!t) {
173
+ t = new Tracer(name);
174
+ _tracers.set(name, t);
175
+ }
176
+ return t;
177
+ }
178
+ export const OtelLite = {
179
+ trace,
180
+ /** Read the tail of today's trace file. Returns parsed TraceLines, newest last. */
181
+ async tail(lines = 100) {
182
+ try {
183
+ const file = path.join(TRACE_DIR, `${todayStamp()}.jsonl`);
184
+ if (!fs.existsSync(file))
185
+ return [];
186
+ const raw = fs.readFileSync(file, 'utf-8');
187
+ const split = raw.split('\n').filter(l => l.length > 0);
188
+ const slice = split.slice(Math.max(0, split.length - lines));
189
+ const out = [];
190
+ for (const line of slice) {
191
+ try {
192
+ out.push(JSON.parse(line));
193
+ }
194
+ catch { /* skip bad line */ }
195
+ }
196
+ return out;
197
+ }
198
+ catch {
199
+ return [];
200
+ }
201
+ },
202
+ /** Path of today's trace file (whether or not it exists yet). */
203
+ todayFilePath() {
204
+ return path.join(TRACE_DIR, `${todayStamp()}.jsonl`);
205
+ },
206
+ /** Manually trigger retention cleanup. */
207
+ cleanup() {
208
+ const t = trace('_internal_');
209
+ // emitSpan triggers cleanup; do a noop pass with sampling 0 so no line is written
210
+ const prev = t['sampleRate'];
211
+ t.sample(0);
212
+ t['cleanupOldFiles']();
213
+ t.sample(prev);
214
+ },
215
+ };
216
+ // ── helpers ──────────────────────────────────────────────────────────────
217
+ function nowNs() {
218
+ // Node high-res; convert ms → ns. process.hrtime.bigint is exact ns but
219
+ // not wall-clock. Use Date.now * 1e6 so timestamps align with logs.
220
+ return Date.now() * 1000000;
221
+ }
222
+ function todayStamp() {
223
+ const d = new Date();
224
+ const y = d.getUTCFullYear();
225
+ const m = String(d.getUTCMonth() + 1).padStart(2, '0');
226
+ const day = String(d.getUTCDate()).padStart(2, '0');
227
+ return `${y}-${m}-${day}`;
228
+ }
229
+ function randomHex(chars) {
230
+ return crypto.randomBytes(Math.ceil(chars / 2)).toString('hex').slice(0, chars);
231
+ }
232
+ //# sourceMappingURL=otel-lite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel-lite.js","sourceRoot":"","sources":["../../src/brain/otel-lite.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8BAA8B;AAC9B,EAAE;AACF,uEAAuE;AACvE,2EAA2E;AAC3E,2CAA2C;AAC3C,EAAE;AACF,WAAW;AACX,8CAA8C;AAC9C,gEAAgE;AAChE,EAAE;AACF,SAAS;AACT,0CAA0C;AAC1C,gFAAgF;AAChF,gEAAgE;AAChE,gEAAgE;AAChE,gBAAgB;AAChB,EAAE;AACF,2EAA2E;AAE3E,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;AACrE,MAAM,cAAc,GAAG,EAAE,CAAC;AA4B1B,MAAM,OAAO,IAAI;IAcf,YAAY,MAAc,EAAE,IAAY,EAAE,IAAkB;QAPpD,UAAK,GAAW,CAAC,CAAC;QAClB,UAAK,GAAG,KAAK,CAAC;QACd,UAAK,GAA4B,EAAE,CAAC;QACpC,WAAM,GAAgB,EAAE,CAAC;QACzB,WAAM,GAA+C,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAI7E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;QACvB,IAAI,IAAI,EAAE,UAAU;YAAE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChG,CAAC;IAED,YAAY,CAAC,GAAW,EAAE,KAAc;QACtC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,UAAoC;QACzD,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe,CAAC,GAAY;QAC1B,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,KAAK,EAAE;YAChB,UAAU,EAAE;gBACV,gBAAgB,EAAE,CAAC,CAAC,IAAI;gBACxB,mBAAmB,EAAE,CAAC,CAAC,OAAO;gBAC9B,sBAAsB,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;aACtC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,IAAoB,EAAE,OAAgB;QAC9C,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG;QACD,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC1E,CAAC;IAEO,MAAM;QACZ,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,OAAO;YACtB,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,cAAc,EAAE,IAAI,CAAC,YAAY;YACjC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,UAAU;YAC5B,QAAQ,EAAE,IAAI,CAAC,OAAO;YACtB,MAAM,EAAE,IAAI,CAAC,KAAK;YAClB,UAAU,EAAE,IAAI,CAAC,KAAK;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,MAAM;IAKjB,YAAY,IAAY;QAHhB,eAAU,GAAG,GAAG,CAAC;QACjB,iBAAY,GAAG,EAAE,CAAC;QAEE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAAC,CAAC;IAE/C,SAAS,CAAC,IAAY,EAAE,IAAkB;QACxC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,QAAQ,CAAI,IAAY,EAAE,EAAkC,EAAE,IAAkB;QACpF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,OAAO;gBAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1D,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,gEAAgE;IAChE,QAAQ,CAAC,IAAe;QACtB,IAAI,IAAI,CAAC,UAAU,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU;YAAE,OAAO;QACrE,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC5B,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC;YACpD,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;IAC5C,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO;YACtC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,QAAU,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC;gBAC3C,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;oBACrC,IAAI,CAAC;wBAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;CACF;AAED,4EAA4E;AAE5E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,CAAC,EAAE,CAAC;QAAC,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAAC,CAAC;IACxD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,KAAK;IAEL,mFAAmF;IACnF,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;YAC7D,MAAM,GAAG,GAAgB,EAAE,CAAC;YAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;YAChF,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,aAAa;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,0CAA0C;IAC1C,OAAO;QACL,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9B,kFAAkF;QAClF,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACvB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;CACF,CAAC;AAEF,4EAA4E;AAE5E,SAAS,KAAK;IACZ,wEAAwE;IACxE,oEAAoE;IACpE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,OAAS,CAAC;AAChC,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;IAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { PRReviewComment } from '../types.js';
2
+ export interface PRReviewInput {
3
+ repo: string;
4
+ prNumber: number;
5
+ projectDir: string;
6
+ diffSummary: string;
7
+ changedFiles: string[];
8
+ }
9
+ export declare class PRAutoReview {
10
+ private brain;
11
+ constructor();
12
+ generate(input: PRReviewInput): Promise<PRReviewComment>;
13
+ private extractTerms;
14
+ }
15
+ export declare function getPRAutoReview(): PRAutoReview;
16
+ export declare function resetPRAutoReviewForTests(): void;
17
+ //# sourceMappingURL=pr-auto-review.d.ts.map