hackmyagent 0.7.2 → 0.8.0

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 (333) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +66 -28
  3. package/dist/arp/cli/index.d.ts +3 -0
  4. package/dist/arp/cli/index.d.ts.map +1 -0
  5. package/dist/arp/cli/index.js +219 -0
  6. package/dist/arp/cli/index.js.map +1 -0
  7. package/dist/arp/config/loader.d.ts +8 -0
  8. package/dist/arp/config/loader.d.ts.map +1 -0
  9. package/dist/arp/config/loader.js +102 -0
  10. package/dist/arp/config/loader.js.map +1 -0
  11. package/dist/arp/enforcement/kill-switch.d.ts +22 -0
  12. package/dist/arp/enforcement/kill-switch.d.ts.map +1 -0
  13. package/dist/arp/enforcement/kill-switch.js +122 -0
  14. package/dist/arp/enforcement/kill-switch.js.map +1 -0
  15. package/dist/arp/engine/event-engine.d.ts +29 -0
  16. package/dist/arp/engine/event-engine.d.ts.map +1 -0
  17. package/dist/arp/engine/event-engine.js +233 -0
  18. package/dist/arp/engine/event-engine.js.map +1 -0
  19. package/dist/arp/index.d.ts +81 -0
  20. package/dist/arp/index.d.ts.map +1 -0
  21. package/dist/arp/index.js +239 -0
  22. package/dist/arp/index.js.map +1 -0
  23. package/dist/arp/intelligence/adapters.d.ts +45 -0
  24. package/dist/arp/intelligence/adapters.d.ts.map +1 -0
  25. package/dist/arp/intelligence/adapters.js +222 -0
  26. package/dist/arp/intelligence/adapters.js.map +1 -0
  27. package/dist/arp/intelligence/anomaly.d.ts +32 -0
  28. package/dist/arp/intelligence/anomaly.d.ts.map +1 -0
  29. package/dist/arp/intelligence/anomaly.js +80 -0
  30. package/dist/arp/intelligence/anomaly.js.map +1 -0
  31. package/dist/arp/intelligence/budget.d.ts +33 -0
  32. package/dist/arp/intelligence/budget.d.ts.map +1 -0
  33. package/dist/arp/intelligence/budget.js +150 -0
  34. package/dist/arp/intelligence/budget.js.map +1 -0
  35. package/dist/arp/intelligence/coordinator.d.ts +43 -0
  36. package/dist/arp/intelligence/coordinator.d.ts.map +1 -0
  37. package/dist/arp/intelligence/coordinator.js +301 -0
  38. package/dist/arp/intelligence/coordinator.js.map +1 -0
  39. package/dist/arp/interceptors/a2a-protocol.d.ts +29 -0
  40. package/dist/arp/interceptors/a2a-protocol.d.ts.map +1 -0
  41. package/dist/arp/interceptors/a2a-protocol.js +111 -0
  42. package/dist/arp/interceptors/a2a-protocol.js.map +1 -0
  43. package/dist/arp/interceptors/filesystem.d.ts +33 -0
  44. package/dist/arp/interceptors/filesystem.d.ts.map +1 -0
  45. package/dist/arp/interceptors/filesystem.js +199 -0
  46. package/dist/arp/interceptors/filesystem.js.map +1 -0
  47. package/dist/arp/interceptors/mcp-protocol.d.ts +25 -0
  48. package/dist/arp/interceptors/mcp-protocol.d.ts.map +1 -0
  49. package/dist/arp/interceptors/mcp-protocol.js +126 -0
  50. package/dist/arp/interceptors/mcp-protocol.js.map +1 -0
  51. package/dist/arp/interceptors/network.d.ts +26 -0
  52. package/dist/arp/interceptors/network.d.ts.map +1 -0
  53. package/dist/arp/interceptors/network.js +146 -0
  54. package/dist/arp/interceptors/network.js.map +1 -0
  55. package/dist/arp/interceptors/process.d.ts +26 -0
  56. package/dist/arp/interceptors/process.d.ts.map +1 -0
  57. package/dist/arp/interceptors/process.js +157 -0
  58. package/dist/arp/interceptors/process.js.map +1 -0
  59. package/dist/arp/interceptors/prompt.d.ts +29 -0
  60. package/dist/arp/interceptors/prompt.d.ts.map +1 -0
  61. package/dist/arp/interceptors/prompt.js +82 -0
  62. package/dist/arp/interceptors/prompt.js.map +1 -0
  63. package/dist/arp/license/index.d.ts +59 -0
  64. package/dist/arp/license/index.d.ts.map +1 -0
  65. package/dist/arp/license/index.js +78 -0
  66. package/dist/arp/license/index.js.map +1 -0
  67. package/dist/arp/monitors/filesystem.d.ts +21 -0
  68. package/dist/arp/monitors/filesystem.d.ts.map +1 -0
  69. package/dist/arp/monitors/filesystem.js +141 -0
  70. package/dist/arp/monitors/filesystem.js.map +1 -0
  71. package/dist/arp/monitors/network.d.ts +32 -0
  72. package/dist/arp/monitors/network.d.ts.map +1 -0
  73. package/dist/arp/monitors/network.js +301 -0
  74. package/dist/arp/monitors/network.js.map +1 -0
  75. package/dist/arp/monitors/process.d.ts +24 -0
  76. package/dist/arp/monitors/process.d.ts.map +1 -0
  77. package/dist/arp/monitors/process.js +205 -0
  78. package/dist/arp/monitors/process.js.map +1 -0
  79. package/dist/arp/patterns/ai-threats.d.ts +48 -0
  80. package/dist/arp/patterns/ai-threats.d.ts.map +1 -0
  81. package/dist/arp/patterns/ai-threats.js +215 -0
  82. package/dist/arp/patterns/ai-threats.js.map +1 -0
  83. package/dist/arp/proxy/forward.d.ts +23 -0
  84. package/dist/arp/proxy/forward.d.ts.map +1 -0
  85. package/dist/arp/proxy/forward.js +152 -0
  86. package/dist/arp/proxy/forward.js.map +1 -0
  87. package/dist/arp/proxy/server.d.ts +45 -0
  88. package/dist/arp/proxy/server.d.ts.map +1 -0
  89. package/dist/arp/proxy/server.js +331 -0
  90. package/dist/arp/proxy/server.js.map +1 -0
  91. package/dist/arp/reporting/local-log.d.ts +22 -0
  92. package/dist/arp/reporting/local-log.d.ts.map +1 -0
  93. package/dist/arp/reporting/local-log.js +116 -0
  94. package/dist/arp/reporting/local-log.js.map +1 -0
  95. package/dist/arp/types.d.ts +230 -0
  96. package/dist/arp/types.d.ts.map +1 -0
  97. package/dist/arp/types.js +4 -0
  98. package/dist/arp/types.js.map +1 -0
  99. package/dist/attack/custom-payloads.d.ts +11 -0
  100. package/dist/attack/custom-payloads.d.ts.map +1 -0
  101. package/dist/attack/custom-payloads.js +108 -0
  102. package/dist/attack/custom-payloads.js.map +1 -0
  103. package/dist/attack/fail-policy.d.ts +16 -0
  104. package/dist/attack/fail-policy.d.ts.map +1 -0
  105. package/dist/attack/fail-policy.js +36 -0
  106. package/dist/attack/fail-policy.js.map +1 -0
  107. package/dist/attack/index.d.ts +12 -0
  108. package/dist/attack/index.d.ts.map +1 -0
  109. package/dist/attack/index.js +30 -0
  110. package/dist/attack/index.js.map +1 -0
  111. package/dist/attack/payloads/a2a-attacks.d.ts +12 -0
  112. package/dist/attack/payloads/a2a-attacks.d.ts.map +1 -0
  113. package/dist/attack/payloads/a2a-attacks.js +221 -0
  114. package/dist/attack/payloads/a2a-attacks.js.map +1 -0
  115. package/dist/attack/payloads/capability-abuse.d.ts +8 -0
  116. package/dist/attack/payloads/capability-abuse.d.ts.map +1 -0
  117. package/dist/attack/payloads/capability-abuse.js +222 -0
  118. package/dist/attack/payloads/capability-abuse.js.map +1 -0
  119. package/dist/attack/payloads/context-manipulation.d.ts +8 -0
  120. package/dist/attack/payloads/context-manipulation.d.ts.map +1 -0
  121. package/dist/attack/payloads/context-manipulation.js +217 -0
  122. package/dist/attack/payloads/context-manipulation.js.map +1 -0
  123. package/dist/attack/payloads/data-exfiltration.d.ts +8 -0
  124. package/dist/attack/payloads/data-exfiltration.d.ts.map +1 -0
  125. package/dist/attack/payloads/data-exfiltration.js +249 -0
  126. package/dist/attack/payloads/data-exfiltration.js.map +1 -0
  127. package/dist/attack/payloads/index.d.ts +29 -0
  128. package/dist/attack/payloads/index.d.ts.map +1 -0
  129. package/dist/attack/payloads/index.js +76 -0
  130. package/dist/attack/payloads/index.js.map +1 -0
  131. package/dist/attack/payloads/jailbreak.d.ts +8 -0
  132. package/dist/attack/payloads/jailbreak.d.ts.map +1 -0
  133. package/dist/attack/payloads/jailbreak.js +265 -0
  134. package/dist/attack/payloads/jailbreak.js.map +1 -0
  135. package/dist/attack/payloads/mcp-exploitation.d.ts +12 -0
  136. package/dist/attack/payloads/mcp-exploitation.d.ts.map +1 -0
  137. package/dist/attack/payloads/mcp-exploitation.js +221 -0
  138. package/dist/attack/payloads/mcp-exploitation.js.map +1 -0
  139. package/dist/attack/payloads/prompt-injection.d.ts +8 -0
  140. package/dist/attack/payloads/prompt-injection.d.ts.map +1 -0
  141. package/dist/attack/payloads/prompt-injection.js +262 -0
  142. package/dist/attack/payloads/prompt-injection.js.map +1 -0
  143. package/dist/attack/scanner.d.ts +84 -0
  144. package/dist/attack/scanner.d.ts.map +1 -0
  145. package/dist/attack/scanner.js +509 -0
  146. package/dist/attack/scanner.js.map +1 -0
  147. package/dist/attack/types.d.ts +153 -0
  148. package/dist/attack/types.d.ts.map +1 -0
  149. package/dist/attack/types.js +46 -0
  150. package/dist/attack/types.js.map +1 -0
  151. package/dist/benchmarks/index.d.ts +16 -0
  152. package/dist/benchmarks/index.d.ts.map +1 -0
  153. package/dist/benchmarks/index.js +27 -0
  154. package/dist/benchmarks/index.js.map +1 -0
  155. package/dist/benchmarks/oasb-1.d.ts +112 -0
  156. package/dist/benchmarks/oasb-1.d.ts.map +1 -0
  157. package/dist/benchmarks/oasb-1.js +1124 -0
  158. package/dist/benchmarks/oasb-1.js.map +1 -0
  159. package/dist/checker/check-skill.d.ts +48 -0
  160. package/dist/checker/check-skill.d.ts.map +1 -0
  161. package/dist/checker/check-skill.js +105 -0
  162. package/dist/checker/check-skill.js.map +1 -0
  163. package/dist/checker/index.d.ts +12 -0
  164. package/dist/checker/index.d.ts.map +1 -0
  165. package/dist/checker/index.js +16 -0
  166. package/dist/checker/index.js.map +1 -0
  167. package/dist/checker/permission-analyzer.d.ts +12 -0
  168. package/dist/checker/permission-analyzer.d.ts.map +1 -0
  169. package/dist/checker/permission-analyzer.js +84 -0
  170. package/dist/checker/permission-analyzer.js.map +1 -0
  171. package/dist/checker/publisher-verifier.d.ts +34 -0
  172. package/dist/checker/publisher-verifier.d.ts.map +1 -0
  173. package/dist/checker/publisher-verifier.js +121 -0
  174. package/dist/checker/publisher-verifier.js.map +1 -0
  175. package/dist/checker/skill-identifier.d.ts +14 -0
  176. package/dist/checker/skill-identifier.d.ts.map +1 -0
  177. package/dist/checker/skill-identifier.js +55 -0
  178. package/dist/checker/skill-identifier.js.map +1 -0
  179. package/dist/cli.d.ts +7 -0
  180. package/dist/cli.d.ts.map +1 -0
  181. package/dist/cli.js +3534 -0
  182. package/dist/cli.js.map +1 -0
  183. package/dist/hardening/index.d.ts +7 -0
  184. package/dist/hardening/index.d.ts.map +1 -0
  185. package/dist/hardening/index.js +9 -0
  186. package/dist/hardening/index.js.map +1 -0
  187. package/dist/hardening/scanner.d.ts +147 -0
  188. package/dist/hardening/scanner.d.ts.map +1 -0
  189. package/dist/hardening/scanner.js +5445 -0
  190. package/dist/hardening/scanner.js.map +1 -0
  191. package/dist/hardening/security-check.d.ts +85 -0
  192. package/dist/hardening/security-check.d.ts.map +1 -0
  193. package/dist/hardening/security-check.js +6 -0
  194. package/dist/hardening/security-check.js.map +1 -0
  195. package/dist/index.d.ts +38 -4
  196. package/dist/index.d.ts.map +1 -1
  197. package/dist/index.js +91 -3525
  198. package/dist/index.js.map +1 -1
  199. package/dist/mcp-server.js +10 -10
  200. package/dist/mcp-server.js.map +1 -1
  201. package/dist/oasb/config/dvaa-targets.d.ts +13 -0
  202. package/dist/oasb/config/dvaa-targets.d.ts.map +1 -0
  203. package/dist/oasb/config/dvaa-targets.js +89 -0
  204. package/dist/oasb/config/dvaa-targets.js.map +1 -0
  205. package/dist/oasb/harness/arp-wrapper.d.ts +29 -0
  206. package/dist/oasb/harness/arp-wrapper.d.ts.map +1 -0
  207. package/dist/oasb/harness/arp-wrapper.js +134 -0
  208. package/dist/oasb/harness/arp-wrapper.js.map +1 -0
  209. package/dist/oasb/harness/dvaa-client.d.ts +46 -0
  210. package/dist/oasb/harness/dvaa-client.d.ts.map +1 -0
  211. package/dist/oasb/harness/dvaa-client.js +98 -0
  212. package/dist/oasb/harness/dvaa-client.js.map +1 -0
  213. package/dist/oasb/harness/dvaa-manager.d.ts +17 -0
  214. package/dist/oasb/harness/dvaa-manager.d.ts.map +1 -0
  215. package/dist/oasb/harness/dvaa-manager.js +132 -0
  216. package/dist/oasb/harness/dvaa-manager.js.map +1 -0
  217. package/dist/oasb/harness/event-collector.d.ts +33 -0
  218. package/dist/oasb/harness/event-collector.d.ts.map +1 -0
  219. package/dist/oasb/harness/event-collector.js +86 -0
  220. package/dist/oasb/harness/event-collector.js.map +1 -0
  221. package/dist/oasb/harness/metrics.d.ts +14 -0
  222. package/dist/oasb/harness/metrics.d.ts.map +1 -0
  223. package/dist/oasb/harness/metrics.js +56 -0
  224. package/dist/oasb/harness/metrics.js.map +1 -0
  225. package/dist/oasb/harness/mock-llm-adapter.d.ts +34 -0
  226. package/dist/oasb/harness/mock-llm-adapter.d.ts.map +1 -0
  227. package/dist/oasb/harness/mock-llm-adapter.js +69 -0
  228. package/dist/oasb/harness/mock-llm-adapter.js.map +1 -0
  229. package/dist/oasb/harness/types.d.ts +74 -0
  230. package/dist/oasb/harness/types.d.ts.map +1 -0
  231. package/dist/oasb/harness/types.js +3 -0
  232. package/dist/oasb/harness/types.js.map +1 -0
  233. package/dist/plugins/core.d.ts +109 -0
  234. package/dist/plugins/core.d.ts.map +1 -0
  235. package/dist/plugins/core.js +30 -0
  236. package/dist/plugins/core.js.map +1 -0
  237. package/dist/plugins/credvault.d.ts +22 -0
  238. package/dist/plugins/credvault.d.ts.map +1 -0
  239. package/dist/plugins/credvault.js +374 -0
  240. package/dist/plugins/credvault.js.map +1 -0
  241. package/dist/plugins/signcrypt.d.ts +27 -0
  242. package/dist/plugins/signcrypt.d.ts.map +1 -0
  243. package/dist/plugins/signcrypt.js +317 -0
  244. package/dist/plugins/signcrypt.js.map +1 -0
  245. package/dist/plugins/skillguard.d.ts +25 -0
  246. package/dist/plugins/skillguard.d.ts.map +1 -0
  247. package/dist/plugins/skillguard.js +346 -0
  248. package/dist/plugins/skillguard.js.map +1 -0
  249. package/dist/registry/client.d.ts +125 -0
  250. package/dist/registry/client.d.ts.map +1 -0
  251. package/dist/registry/client.js +308 -0
  252. package/dist/registry/client.js.map +1 -0
  253. package/dist/registry/index.d.ts +3 -0
  254. package/dist/registry/index.d.ts.map +1 -0
  255. package/dist/registry/index.js +10 -0
  256. package/dist/registry/index.js.map +1 -0
  257. package/dist/scanner/external-scanner.d.ts +13 -0
  258. package/dist/scanner/external-scanner.d.ts.map +1 -0
  259. package/dist/scanner/external-scanner.js +299 -0
  260. package/dist/scanner/external-scanner.js.map +1 -0
  261. package/dist/scanner/index.d.ts +6 -0
  262. package/dist/scanner/index.d.ts.map +1 -0
  263. package/dist/scanner/index.js +9 -0
  264. package/dist/scanner/index.js.map +1 -0
  265. package/dist/scanner/types.d.ts +32 -0
  266. package/dist/scanner/types.d.ts.map +1 -0
  267. package/dist/scanner/types.js +6 -0
  268. package/dist/scanner/types.js.map +1 -0
  269. package/dist/semantic/deep-scan.d.ts +13 -0
  270. package/dist/semantic/deep-scan.d.ts.map +1 -0
  271. package/dist/semantic/deep-scan.js +63 -0
  272. package/dist/semantic/deep-scan.js.map +1 -0
  273. package/dist/semantic/index.d.ts +17 -0
  274. package/dist/semantic/index.d.ts.map +1 -0
  275. package/dist/semantic/index.js +39 -0
  276. package/dist/semantic/index.js.map +1 -0
  277. package/dist/semantic/integration/cost-estimator.d.ts +17 -0
  278. package/dist/semantic/integration/cost-estimator.d.ts.map +1 -0
  279. package/dist/semantic/integration/cost-estimator.js +54 -0
  280. package/dist/semantic/integration/cost-estimator.js.map +1 -0
  281. package/dist/semantic/integration/finding-adapter.d.ts +34 -0
  282. package/dist/semantic/integration/finding-adapter.d.ts.map +1 -0
  283. package/dist/semantic/integration/finding-adapter.js +41 -0
  284. package/dist/semantic/integration/finding-adapter.js.map +1 -0
  285. package/dist/semantic/integration/oasb-upgrader.d.ts +20 -0
  286. package/dist/semantic/integration/oasb-upgrader.d.ts.map +1 -0
  287. package/dist/semantic/integration/oasb-upgrader.js +47 -0
  288. package/dist/semantic/integration/oasb-upgrader.js.map +1 -0
  289. package/dist/semantic/llm/budget.d.ts +50 -0
  290. package/dist/semantic/llm/budget.d.ts.map +1 -0
  291. package/dist/semantic/llm/budget.js +139 -0
  292. package/dist/semantic/llm/budget.js.map +1 -0
  293. package/dist/semantic/llm/cache.d.ts +36 -0
  294. package/dist/semantic/llm/cache.d.ts.map +1 -0
  295. package/dist/semantic/llm/cache.js +103 -0
  296. package/dist/semantic/llm/cache.js.map +1 -0
  297. package/dist/semantic/llm/client.d.ts +49 -0
  298. package/dist/semantic/llm/client.d.ts.map +1 -0
  299. package/dist/semantic/llm/client.js +64 -0
  300. package/dist/semantic/llm/client.js.map +1 -0
  301. package/dist/semantic/llm/index.d.ts +33 -0
  302. package/dist/semantic/llm/index.d.ts.map +1 -0
  303. package/dist/semantic/llm/index.js +129 -0
  304. package/dist/semantic/llm/index.js.map +1 -0
  305. package/dist/semantic/llm/prompts.d.ts +30 -0
  306. package/dist/semantic/llm/prompts.d.ts.map +1 -0
  307. package/dist/semantic/llm/prompts.js +120 -0
  308. package/dist/semantic/llm/prompts.js.map +1 -0
  309. package/dist/semantic/structural/credential-context.d.ts +14 -0
  310. package/dist/semantic/structural/credential-context.d.ts.map +1 -0
  311. package/dist/semantic/structural/credential-context.js +295 -0
  312. package/dist/semantic/structural/credential-context.js.map +1 -0
  313. package/dist/semantic/structural/index.d.ts +28 -0
  314. package/dist/semantic/structural/index.d.ts.map +1 -0
  315. package/dist/semantic/structural/index.js +138 -0
  316. package/dist/semantic/structural/index.js.map +1 -0
  317. package/dist/semantic/structural/instruction.d.ts +19 -0
  318. package/dist/semantic/structural/instruction.d.ts.map +1 -0
  319. package/dist/semantic/structural/instruction.js +167 -0
  320. package/dist/semantic/structural/instruction.js.map +1 -0
  321. package/dist/semantic/structural/mcp-config.d.ts +22 -0
  322. package/dist/semantic/structural/mcp-config.d.ts.map +1 -0
  323. package/dist/semantic/structural/mcp-config.js +294 -0
  324. package/dist/semantic/structural/mcp-config.js.map +1 -0
  325. package/dist/semantic/structural/permission-model.d.ts +16 -0
  326. package/dist/semantic/structural/permission-model.d.ts.map +1 -0
  327. package/dist/semantic/structural/permission-model.js +121 -0
  328. package/dist/semantic/structural/permission-model.js.map +1 -0
  329. package/dist/semantic/types.d.ts +122 -0
  330. package/dist/semantic/types.d.ts.map +1 -0
  331. package/dist/semantic/types.js +10 -0
  332. package/dist/semantic/types.js.map +1 -0
  333. package/package.json +25 -14
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /**
3
+ * LLM Budget Tracking (Layer 3)
4
+ *
5
+ * Tracks daily LLM API spend and enforces budget cap.
6
+ * Default: $1/day (configurable via HACKMYAGENT_LLM_BUDGET env var).
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.BudgetTracker = void 0;
43
+ const fs = __importStar(require("fs/promises"));
44
+ const path = __importStar(require("path"));
45
+ /** Anthropic API pricing (per 1M tokens) */
46
+ const PRICING = {
47
+ haiku: { input: 0.25, output: 1.25 },
48
+ sonnet: { input: 3.0, output: 15.0 },
49
+ };
50
+ class BudgetTracker {
51
+ constructor(budgetCapUsd, cacheDir = '.hackmyagent-cache') {
52
+ this.budgetCap = budgetCapUsd ??
53
+ parseFloat(process.env.HACKMYAGENT_LLM_BUDGET || '1.0');
54
+ this.cacheDir = cacheDir;
55
+ }
56
+ /**
57
+ * Calculate cost for a request.
58
+ */
59
+ calculateCost(model, inputTokens, outputTokens) {
60
+ const pricing = PRICING[model];
61
+ return ((inputTokens / 1000000) * pricing.input +
62
+ (outputTokens / 1000000) * pricing.output);
63
+ }
64
+ /**
65
+ * Estimate cost before making a request.
66
+ */
67
+ estimateCost(model, estimatedInputTokens, estimatedOutputTokens = 1000) {
68
+ return this.calculateCost(model, estimatedInputTokens, estimatedOutputTokens);
69
+ }
70
+ /**
71
+ * Check if we're within budget for today.
72
+ */
73
+ async isWithinBudget() {
74
+ const state = await this.loadState();
75
+ return state.totalCostUsd < this.budgetCap;
76
+ }
77
+ /**
78
+ * Get remaining budget for today.
79
+ */
80
+ async remainingBudget() {
81
+ const state = await this.loadState();
82
+ return Math.max(0, this.budgetCap - state.totalCostUsd);
83
+ }
84
+ /**
85
+ * Record a completed request's cost.
86
+ */
87
+ async recordCost(model, inputTokens, outputTokens) {
88
+ const cost = this.calculateCost(model, inputTokens, outputTokens);
89
+ const state = await this.loadState();
90
+ state.totalCostUsd += cost;
91
+ state.requests += 1;
92
+ await this.saveState(state);
93
+ return cost;
94
+ }
95
+ /**
96
+ * Get today's spend summary.
97
+ */
98
+ async getSummary() {
99
+ const state = await this.loadState();
100
+ return {
101
+ spent: state.totalCostUsd,
102
+ cap: this.budgetCap,
103
+ remaining: Math.max(0, this.budgetCap - state.totalCostUsd),
104
+ requests: state.requests,
105
+ };
106
+ }
107
+ todayKey() {
108
+ return new Date().toISOString().split('T')[0];
109
+ }
110
+ budgetFilePath() {
111
+ return path.join(this.cacheDir, 'budget.json');
112
+ }
113
+ async loadState() {
114
+ const today = this.todayKey();
115
+ try {
116
+ const data = await fs.readFile(this.budgetFilePath(), 'utf-8');
117
+ const state = JSON.parse(data);
118
+ // Reset if it's a new day
119
+ if (state.date !== today) {
120
+ return { date: today, totalCostUsd: 0, requests: 0 };
121
+ }
122
+ return state;
123
+ }
124
+ catch {
125
+ return { date: today, totalCostUsd: 0, requests: 0 };
126
+ }
127
+ }
128
+ async saveState(state) {
129
+ try {
130
+ await fs.mkdir(this.cacheDir, { recursive: true });
131
+ await fs.writeFile(this.budgetFilePath(), JSON.stringify(state, null, 2));
132
+ }
133
+ catch {
134
+ // Budget write failures are non-fatal
135
+ }
136
+ }
137
+ }
138
+ exports.BudgetTracker = BudgetTracker;
139
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../../src/semantic/llm/budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * LLM Response Cache (Layer 3)
3
+ *
4
+ * SHA-256 content-hash based cache. Same file content = same analysis result.
5
+ * Stored in .hackmyagent-cache/ (or configurable directory).
6
+ */
7
+ export interface CacheEntry {
8
+ hash: string;
9
+ response: string;
10
+ model: string;
11
+ timestamp: string;
12
+ inputTokens: number;
13
+ outputTokens: number;
14
+ }
15
+ export declare class LLMCache {
16
+ private cacheDir;
17
+ constructor(cacheDir?: string);
18
+ /**
19
+ * Generate SHA-256 hash of content + prompt (so different analysis types
20
+ * don't share cache entries).
21
+ */
22
+ hash(content: string, systemPrompt: string): string;
23
+ /**
24
+ * Get cached response for content hash. Returns null if not cached.
25
+ */
26
+ get(contentHash: string): Promise<CacheEntry | null>;
27
+ /**
28
+ * Store response in cache.
29
+ */
30
+ set(contentHash: string, entry: CacheEntry): Promise<void>;
31
+ /**
32
+ * Check if a hash has a cached result.
33
+ */
34
+ has(contentHash: string): Promise<boolean>;
35
+ }
36
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/semantic/llm/cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,GAAE,MAA6B;IAInD;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IASnD;;OAEG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAU1D;;OAEG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhE;;OAEG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CASjD"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * LLM Response Cache (Layer 3)
4
+ *
5
+ * SHA-256 content-hash based cache. Same file content = same analysis result.
6
+ * Stored in .hackmyagent-cache/ (or configurable directory).
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.LLMCache = void 0;
43
+ const fs = __importStar(require("fs/promises"));
44
+ const path = __importStar(require("path"));
45
+ const crypto = __importStar(require("crypto"));
46
+ class LLMCache {
47
+ constructor(cacheDir = '.hackmyagent-cache') {
48
+ this.cacheDir = cacheDir;
49
+ }
50
+ /**
51
+ * Generate SHA-256 hash of content + prompt (so different analysis types
52
+ * don't share cache entries).
53
+ */
54
+ hash(content, systemPrompt) {
55
+ return crypto
56
+ .createHash('sha256')
57
+ .update(content)
58
+ .update('\0')
59
+ .update(systemPrompt)
60
+ .digest('hex');
61
+ }
62
+ /**
63
+ * Get cached response for content hash. Returns null if not cached.
64
+ */
65
+ async get(contentHash) {
66
+ const cachePath = path.join(this.cacheDir, `${contentHash}.json`);
67
+ try {
68
+ const data = await fs.readFile(cachePath, 'utf-8');
69
+ return JSON.parse(data);
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ /**
76
+ * Store response in cache.
77
+ */
78
+ async set(contentHash, entry) {
79
+ try {
80
+ await fs.mkdir(this.cacheDir, { recursive: true });
81
+ const cachePath = path.join(this.cacheDir, `${contentHash}.json`);
82
+ await fs.writeFile(cachePath, JSON.stringify(entry, null, 2));
83
+ }
84
+ catch {
85
+ // Cache write failures are non-fatal
86
+ }
87
+ }
88
+ /**
89
+ * Check if a hash has a cached result.
90
+ */
91
+ async has(contentHash) {
92
+ const cachePath = path.join(this.cacheDir, `${contentHash}.json`);
93
+ try {
94
+ await fs.access(cachePath);
95
+ return true;
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ }
101
+ }
102
+ exports.LLMCache = LLMCache;
103
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/semantic/llm/cache.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,gDAAkC;AAClC,2CAA6B;AAC7B,+CAAiC;AAWjC,MAAa,QAAQ;IAGnB,YAAY,WAAmB,oBAAoB;QACjD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,OAAe,EAAE,YAAoB;QACxC,OAAO,MAAM;aACV,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;aACf,MAAM,CAAC,IAAI,CAAC;aACZ,MAAM,CAAC,YAAY,CAAC;aACpB,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,WAAmB;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,KAAiB;QAC9C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;YAClE,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,WAAmB;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AA1DD,4BA0DC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Raw Anthropic API Client (Layer 3)
3
+ *
4
+ * Zero-dependency fetch() client for Claude API.
5
+ * Used only in CLI standalone mode (--deep with ANTHROPIC_API_KEY).
6
+ */
7
+ export interface AnthropicMessage {
8
+ role: 'user' | 'assistant';
9
+ content: string;
10
+ }
11
+ export interface AnthropicRequest {
12
+ model: string;
13
+ max_tokens: number;
14
+ system?: string;
15
+ messages: AnthropicMessage[];
16
+ }
17
+ export interface AnthropicResponse {
18
+ id: string;
19
+ content: Array<{
20
+ type: string;
21
+ text: string;
22
+ }>;
23
+ model: string;
24
+ usage: {
25
+ input_tokens: number;
26
+ output_tokens: number;
27
+ };
28
+ }
29
+ export interface AnthropicError {
30
+ type: string;
31
+ error: {
32
+ type: string;
33
+ message: string;
34
+ };
35
+ }
36
+ export declare class AnthropicClient {
37
+ private apiKey;
38
+ private baseUrl;
39
+ constructor(apiKey: string, baseUrl?: string);
40
+ /**
41
+ * Send a message to Claude and get a text response.
42
+ */
43
+ chat(model: 'haiku' | 'sonnet', systemPrompt: string, userMessage: string, maxTokens?: number): Promise<{
44
+ text: string;
45
+ inputTokens: number;
46
+ outputTokens: number;
47
+ }>;
48
+ }
49
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/semantic/llm/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAQD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAoC;IAKzE;;OAEG;IACG,IAAI,CACR,KAAK,EAAE,OAAO,GAAG,QAAQ,EACzB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAa,GACvB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CA4CxE"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ /**
3
+ * Raw Anthropic API Client (Layer 3)
4
+ *
5
+ * Zero-dependency fetch() client for Claude API.
6
+ * Used only in CLI standalone mode (--deep with ANTHROPIC_API_KEY).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AnthropicClient = void 0;
10
+ /** Model ID mapping */
11
+ const MODEL_IDS = {
12
+ haiku: 'claude-haiku-4-5-20251001',
13
+ sonnet: 'claude-sonnet-4-5-20250929',
14
+ };
15
+ class AnthropicClient {
16
+ constructor(apiKey, baseUrl = 'https://api.anthropic.com') {
17
+ this.apiKey = apiKey;
18
+ this.baseUrl = baseUrl;
19
+ }
20
+ /**
21
+ * Send a message to Claude and get a text response.
22
+ */
23
+ async chat(model, systemPrompt, userMessage, maxTokens = 4096) {
24
+ const request = {
25
+ model: MODEL_IDS[model],
26
+ max_tokens: maxTokens,
27
+ system: systemPrompt,
28
+ messages: [{ role: 'user', content: userMessage }],
29
+ };
30
+ const response = await fetch(`${this.baseUrl}/v1/messages`, {
31
+ method: 'POST',
32
+ headers: {
33
+ 'Content-Type': 'application/json',
34
+ 'x-api-key': this.apiKey,
35
+ 'anthropic-version': '2023-06-01',
36
+ },
37
+ body: JSON.stringify(request),
38
+ });
39
+ if (!response.ok) {
40
+ const errorBody = await response.text();
41
+ let errorMessage;
42
+ try {
43
+ const parsed = JSON.parse(errorBody);
44
+ errorMessage = parsed.error?.message || errorBody;
45
+ }
46
+ catch {
47
+ errorMessage = errorBody;
48
+ }
49
+ throw new Error(`Anthropic API error (${response.status}): ${errorMessage}`);
50
+ }
51
+ const body = (await response.json());
52
+ const text = body.content
53
+ .filter((c) => c.type === 'text')
54
+ .map((c) => c.text)
55
+ .join('');
56
+ return {
57
+ text,
58
+ inputTokens: body.usage.input_tokens,
59
+ outputTokens: body.usage.output_tokens,
60
+ };
61
+ }
62
+ }
63
+ exports.AnthropicClient = AnthropicClient;
64
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/semantic/llm/client.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAgCH,uBAAuB;AACvB,MAAM,SAAS,GAAG;IAChB,KAAK,EAAE,2BAA2B;IAClC,MAAM,EAAE,4BAA4B;CAC5B,CAAC;AAEX,MAAa,eAAe;IAI1B,YAAY,MAAc,EAAE,UAAkB,2BAA2B;QACvE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,KAAyB,EACzB,YAAoB,EACpB,WAAmB,EACnB,YAAoB,IAAI;QAExB,MAAM,OAAO,GAAqB;YAChC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;YACvB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;SACnD,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,cAAc,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,IAAI,CAAC,MAAM;gBACxB,mBAAmB,EAAE,YAAY;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,YAAoB,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAmB,CAAC;gBACvD,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC;YACD,MAAM,IAAI,KAAK,CACb,wBAAwB,QAAQ,CAAC,MAAM,MAAM,YAAY,EAAE,CAC5D,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO;aACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;YACpC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;SACvC,CAAC;IACJ,CAAC;CACF;AA7DD,0CA6DC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * LLM Analyzer (Layer 3 Orchestrator)
3
+ *
4
+ * Coordinates LLM-powered analysis for standalone CLI mode (--deep).
5
+ * Uses the Anthropic API directly with caching and budget control.
6
+ *
7
+ * NOT used in MCP server mode — there, the host LLM does the reasoning.
8
+ */
9
+ import type { SemanticFinding, AnalysisFile, LLMAnalysisOptions } from '../types';
10
+ export declare class LLMAnalyzer {
11
+ private client;
12
+ private cache;
13
+ private budget;
14
+ private onProgress?;
15
+ constructor(options: LLMAnalysisOptions);
16
+ /**
17
+ * Analyze files using LLM. Respects cache and budget.
18
+ */
19
+ analyze(files: AnalysisFile[]): Promise<{
20
+ findings: SemanticFinding[];
21
+ cost: number;
22
+ cachedResults: number;
23
+ }>;
24
+ /**
25
+ * Parse JSON findings from LLM response.
26
+ */
27
+ private parseFindings;
28
+ private normalizeSeverity;
29
+ }
30
+ export { AnthropicClient } from './client';
31
+ export { LLMCache } from './cache';
32
+ export { BudgetTracker } from './budget';
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/semantic/llm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAelF,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAC,CAA4B;gBAEnC,OAAO,EAAE,kBAAkB;IAOvC;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;QAC5C,QAAQ,EAAE,eAAe,EAAE,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IAqFF;;OAEG;IACH,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,iBAAiB;CAS1B;AAED,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ /**
3
+ * LLM Analyzer (Layer 3 Orchestrator)
4
+ *
5
+ * Coordinates LLM-powered analysis for standalone CLI mode (--deep).
6
+ * Uses the Anthropic API directly with caching and budget control.
7
+ *
8
+ * NOT used in MCP server mode — there, the host LLM does the reasoning.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.BudgetTracker = exports.LLMCache = exports.AnthropicClient = exports.LLMAnalyzer = void 0;
12
+ const client_1 = require("./client");
13
+ const cache_1 = require("./cache");
14
+ const budget_1 = require("./budget");
15
+ const prompts_1 = require("./prompts");
16
+ class LLMAnalyzer {
17
+ constructor(options) {
18
+ this.client = new client_1.AnthropicClient(options.apiKey);
19
+ this.cache = new cache_1.LLMCache(options.cacheDir);
20
+ this.budget = new budget_1.BudgetTracker(options.budgetCap, options.cacheDir);
21
+ this.onProgress = options.onProgress;
22
+ }
23
+ /**
24
+ * Analyze files using LLM. Respects cache and budget.
25
+ */
26
+ async analyze(files) {
27
+ const allFindings = [];
28
+ let totalCost = 0;
29
+ let cachedResults = 0;
30
+ for (let i = 0; i < files.length; i++) {
31
+ const file = files[i];
32
+ const { systemPrompt, model } = (0, prompts_1.getPromptForFileType)(file.type);
33
+ // Check cache
34
+ const contentHash = this.cache.hash(file.content, systemPrompt);
35
+ const cached = await this.cache.get(contentHash);
36
+ if (cached) {
37
+ this.onProgress?.(`[${i + 1}/${files.length}] ${file.path} .............. (cached)`);
38
+ const findings = this.parseFindings(cached.response, file);
39
+ allFindings.push(...findings);
40
+ cachedResults++;
41
+ continue;
42
+ }
43
+ // Check budget
44
+ const withinBudget = await this.budget.isWithinBudget();
45
+ if (!withinBudget) {
46
+ this.onProgress?.(`[${i + 1}/${files.length}] ${file.path} .............. skipped (budget exceeded)`);
47
+ continue;
48
+ }
49
+ // Call LLM
50
+ this.onProgress?.(`[${i + 1}/${files.length}] ${file.path} ..............`);
51
+ try {
52
+ const userMessage = (0, prompts_1.buildFileAnalysisMessage)(file.path, file.content, file.type);
53
+ const result = await this.client.chat(model, systemPrompt, userMessage);
54
+ // Cache the response
55
+ await this.cache.set(contentHash, {
56
+ hash: contentHash,
57
+ response: result.text,
58
+ model,
59
+ timestamp: new Date().toISOString(),
60
+ inputTokens: result.inputTokens,
61
+ outputTokens: result.outputTokens,
62
+ });
63
+ // Record cost
64
+ const cost = await this.budget.recordCost(model, result.inputTokens, result.outputTokens);
65
+ totalCost += cost;
66
+ // Parse findings
67
+ const findings = this.parseFindings(result.text, file);
68
+ allFindings.push(...findings);
69
+ this.onProgress?.(` ${findings.length} finding${findings.length === 1 ? '' : 's'}`);
70
+ }
71
+ catch (error) {
72
+ const msg = error instanceof Error ? error.message : String(error);
73
+ this.onProgress?.(` error: ${msg}`);
74
+ // Graceful degradation — continue with remaining files
75
+ }
76
+ }
77
+ return { findings: allFindings, cost: totalCost, cachedResults };
78
+ }
79
+ /**
80
+ * Parse JSON findings from LLM response.
81
+ */
82
+ parseFindings(response, file) {
83
+ try {
84
+ // Extract JSON array from response (may have markdown code blocks)
85
+ const jsonMatch = response.match(/\[[\s\S]*\]/);
86
+ if (!jsonMatch)
87
+ return [];
88
+ const raw = JSON.parse(jsonMatch[0]);
89
+ if (!Array.isArray(raw))
90
+ return [];
91
+ return raw
92
+ .filter((f) => f.description && f.severity)
93
+ .map((f, idx) => ({
94
+ id: `SEM-LLM-${String(idx + 1).padStart(3, '0')}`,
95
+ title: f.type || 'LLM finding',
96
+ description: f.description || '',
97
+ rationale: f.rationale || '',
98
+ category: 'credential',
99
+ severity: this.normalizeSeverity(f.severity || 'medium'),
100
+ file: file.path,
101
+ line: f.line ?? undefined,
102
+ recommendation: f.recommendation || 'Review and remediate.',
103
+ layer: 3,
104
+ autoFixable: false,
105
+ }));
106
+ }
107
+ catch {
108
+ return [];
109
+ }
110
+ }
111
+ normalizeSeverity(s) {
112
+ const lower = s.toLowerCase();
113
+ if (lower === 'critical')
114
+ return 'critical';
115
+ if (lower === 'high')
116
+ return 'high';
117
+ if (lower === 'medium')
118
+ return 'medium';
119
+ return 'low';
120
+ }
121
+ }
122
+ exports.LLMAnalyzer = LLMAnalyzer;
123
+ var client_2 = require("./client");
124
+ Object.defineProperty(exports, "AnthropicClient", { enumerable: true, get: function () { return client_2.AnthropicClient; } });
125
+ var cache_2 = require("./cache");
126
+ Object.defineProperty(exports, "LLMCache", { enumerable: true, get: function () { return cache_2.LLMCache; } });
127
+ var budget_2 = require("./budget");
128
+ Object.defineProperty(exports, "BudgetTracker", { enumerable: true, get: function () { return budget_2.BudgetTracker; } });
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/semantic/llm/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * LLM Prompt Templates (Layer 3)
3
+ *
4
+ * Structured prompts for each analysis type.
5
+ * Each prompt requests JSON output with line numbers, severity, and rationale.
6
+ */
7
+ /**
8
+ * System prompt for credential detection (uses Haiku — fast classification)
9
+ */
10
+ export declare const CREDENTIAL_DETECTION_PROMPT = "You are a security analyst specializing in credential detection. Analyze the following file for ANY form of credentials, secrets, tokens, or passwords.\n\nLook for ALL credential types including:\n- API keys in any format (not just known prefixes)\n- Database connection strings with passwords\n- JWT tokens\n- OAuth tokens and refresh tokens\n- Private keys (RSA, Ed25519, etc.)\n- Basic auth credentials\n- Session tokens\n- Webhook secrets\n- Encryption keys\n\nFor each credential found, respond with a JSON array:\n[\n {\n \"line\": <line number>,\n \"type\": \"<credential type>\",\n \"severity\": \"critical\" | \"high\",\n \"description\": \"<what was found>\",\n \"rationale\": \"<why this is a security risk in this specific file context>\"\n }\n]\n\nIf no credentials are found, respond with an empty array: []\n\nIMPORTANT: Be thorough but avoid false positives. Example strings, documentation references, and redacted values (xxx, ***, REDACTED) are NOT findings.";
11
+ /**
12
+ * System prompt for MCP threat analysis (uses Sonnet — complex reasoning)
13
+ */
14
+ export declare const MCP_THREAT_ANALYSIS_PROMPT = "You are a security analyst specializing in AI agent security. Analyze the following MCP (Model Context Protocol) configuration for security threats.\n\nEvaluate:\n1. **Capability scope**: What can each server do? Is it overprivileged?\n2. **Attack chains**: Can the combination of servers enable read\u2192execute\u2192exfiltrate attacks?\n3. **Secrets exposure**: Are credentials passed via args (visible to LLM) instead of env vars?\n4. **Trust boundaries**: Are servers from untrusted sources given privileged access?\n5. **Sandbox integrity**: Are there flags that bypass security sandboxes?\n\nFor each finding, respond with a JSON array:\n[\n {\n \"line\": <line number or null>,\n \"type\": \"<finding type>\",\n \"severity\": \"critical\" | \"high\" | \"medium\" | \"low\",\n \"description\": \"<what was found>\",\n \"rationale\": \"<why this is a security risk>\",\n \"recommendation\": \"<specific fix>\"\n }\n]\n\nIf no issues found, respond with an empty array: []";
15
+ /**
16
+ * System prompt for instruction analysis (uses Sonnet — nuanced reasoning)
17
+ */
18
+ export declare const INSTRUCTION_ANALYSIS_PROMPT = "You are a security analyst specializing in AI agent security. Analyze the following agent instruction file for security risks.\n\nThis file is loaded into the AI agent's context window with every interaction. Evaluate:\n\n1. **Prompt injection vectors**: Could an attacker craft input that exploits these instructions?\n2. **Permissive behaviors**: Does the file tell the agent to bypass security controls?\n3. **Data exfiltration risks**: Could the instructions be used to leak sensitive data?\n4. **Credential exposure**: Are any secrets, tokens, or passwords present in the instructions?\n5. **Missing boundaries**: What security constraints are absent that should be present?\n\nFor each finding, respond with a JSON array:\n[\n {\n \"line\": <line number or null>,\n \"type\": \"<finding type>\",\n \"severity\": \"critical\" | \"high\" | \"medium\" | \"low\",\n \"description\": \"<what was found>\",\n \"rationale\": \"<why this is a security risk>\",\n \"recommendation\": \"<specific fix>\"\n }\n]\n\nIf no issues found, respond with an empty array: []";
19
+ /**
20
+ * Build the user message for file analysis
21
+ */
22
+ export declare function buildFileAnalysisMessage(filePath: string, content: string, fileType: string): string;
23
+ /**
24
+ * Select the appropriate prompt for a file type
25
+ */
26
+ export declare function getPromptForFileType(fileType: string): {
27
+ systemPrompt: string;
28
+ model: 'haiku' | 'sonnet';
29
+ };
30
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/semantic/llm/prompts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B,s+BA0BgH,CAAC;AAEzJ;;GAEG;AACH,eAAO,MAAM,0BAA0B,0+BAqBa,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,2BAA2B,8jCAsBY,CAAC;AAErD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,GACf;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,CAYrD"}