@decibelsystems/tools 2.0.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 (478) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +342 -0
  3. package/dist/agentic/compiler.d.ts +21 -0
  4. package/dist/agentic/compiler.d.ts.map +1 -0
  5. package/dist/agentic/compiler.js +267 -0
  6. package/dist/agentic/compiler.js.map +1 -0
  7. package/dist/agentic/golden.d.ts +25 -0
  8. package/dist/agentic/golden.d.ts.map +1 -0
  9. package/dist/agentic/golden.js +255 -0
  10. package/dist/agentic/golden.js.map +1 -0
  11. package/dist/agentic/index.d.ts +17 -0
  12. package/dist/agentic/index.d.ts.map +1 -0
  13. package/dist/agentic/index.js +153 -0
  14. package/dist/agentic/index.js.map +1 -0
  15. package/dist/agentic/linter.d.ts +20 -0
  16. package/dist/agentic/linter.d.ts.map +1 -0
  17. package/dist/agentic/linter.js +340 -0
  18. package/dist/agentic/linter.js.map +1 -0
  19. package/dist/agentic/renderer.d.ts +17 -0
  20. package/dist/agentic/renderer.d.ts.map +1 -0
  21. package/dist/agentic/renderer.js +277 -0
  22. package/dist/agentic/renderer.js.map +1 -0
  23. package/dist/agentic/types.d.ts +199 -0
  24. package/dist/agentic/types.d.ts.map +1 -0
  25. package/dist/agentic/types.js +8 -0
  26. package/dist/agentic/types.js.map +1 -0
  27. package/dist/architectAdrs.d.ts +32 -0
  28. package/dist/architectAdrs.d.ts.map +1 -0
  29. package/dist/architectAdrs.js +162 -0
  30. package/dist/architectAdrs.js.map +1 -0
  31. package/dist/client/facade-client.d.ts +41 -0
  32. package/dist/client/facade-client.d.ts.map +1 -0
  33. package/dist/client/facade-client.js +243 -0
  34. package/dist/client/facade-client.js.map +1 -0
  35. package/dist/client/index.d.ts +4 -0
  36. package/dist/client/index.d.ts.map +1 -0
  37. package/dist/client/index.js +18 -0
  38. package/dist/client/index.js.map +1 -0
  39. package/dist/client/transports.d.ts +78 -0
  40. package/dist/client/transports.d.ts.map +1 -0
  41. package/dist/client/transports.js +258 -0
  42. package/dist/client/transports.js.map +1 -0
  43. package/dist/client/types.d.ts +49 -0
  44. package/dist/client/types.d.ts.map +1 -0
  45. package/dist/client/types.js +8 -0
  46. package/dist/client/types.js.map +1 -0
  47. package/dist/config.d.ts +8 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +19 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/daemon.d.ts +77 -0
  52. package/dist/daemon.d.ts.map +1 -0
  53. package/dist/daemon.js +374 -0
  54. package/dist/daemon.js.map +1 -0
  55. package/dist/daemonConfig.d.ts +43 -0
  56. package/dist/daemonConfig.d.ts.map +1 -0
  57. package/dist/daemonConfig.js +113 -0
  58. package/dist/daemonConfig.js.map +1 -0
  59. package/dist/dataRoot.d.ts +5 -0
  60. package/dist/dataRoot.d.ts.map +1 -0
  61. package/dist/dataRoot.js +23 -0
  62. package/dist/dataRoot.js.map +1 -0
  63. package/dist/decibelPaths.d.ts +42 -0
  64. package/dist/decibelPaths.d.ts.map +1 -0
  65. package/dist/decibelPaths.js +150 -0
  66. package/dist/decibelPaths.js.map +1 -0
  67. package/dist/facades/definitions.d.ts +6 -0
  68. package/dist/facades/definitions.d.ts.map +1 -0
  69. package/dist/facades/definitions.js +450 -0
  70. package/dist/facades/definitions.js.map +1 -0
  71. package/dist/facades/index.d.ts +27 -0
  72. package/dist/facades/index.d.ts.map +1 -0
  73. package/dist/facades/index.js +124 -0
  74. package/dist/facades/index.js.map +1 -0
  75. package/dist/facades/types.d.ts +38 -0
  76. package/dist/facades/types.d.ts.map +1 -0
  77. package/dist/facades/types.js +8 -0
  78. package/dist/facades/types.js.map +1 -0
  79. package/dist/httpServer.d.ts +66 -0
  80. package/dist/httpServer.d.ts.map +1 -0
  81. package/dist/httpServer.js +1723 -0
  82. package/dist/httpServer.js.map +1 -0
  83. package/dist/kernel.d.ts +87 -0
  84. package/dist/kernel.d.ts.map +1 -0
  85. package/dist/kernel.js +256 -0
  86. package/dist/kernel.js.map +1 -0
  87. package/dist/lib/agent-services/assumptions.d.ts +16 -0
  88. package/dist/lib/agent-services/assumptions.d.ts.map +1 -0
  89. package/dist/lib/agent-services/assumptions.js +284 -0
  90. package/dist/lib/agent-services/assumptions.js.map +1 -0
  91. package/dist/lib/agent-services/context-pack.d.ts +6 -0
  92. package/dist/lib/agent-services/context-pack.d.ts.map +1 -0
  93. package/dist/lib/agent-services/context-pack.js +354 -0
  94. package/dist/lib/agent-services/context-pack.js.map +1 -0
  95. package/dist/lib/agent-services/drift-guard.d.ts +14 -0
  96. package/dist/lib/agent-services/drift-guard.d.ts.map +1 -0
  97. package/dist/lib/agent-services/drift-guard.js +355 -0
  98. package/dist/lib/agent-services/drift-guard.js.map +1 -0
  99. package/dist/lib/agent-services/index.d.ts +5 -0
  100. package/dist/lib/agent-services/index.d.ts.map +1 -0
  101. package/dist/lib/agent-services/index.js +10 -0
  102. package/dist/lib/agent-services/index.js.map +1 -0
  103. package/dist/lib/benchmark.d.ts +110 -0
  104. package/dist/lib/benchmark.d.ts.map +1 -0
  105. package/dist/lib/benchmark.js +338 -0
  106. package/dist/lib/benchmark.js.map +1 -0
  107. package/dist/lib/supabase.d.ts +123 -0
  108. package/dist/lib/supabase.d.ts.map +1 -0
  109. package/dist/lib/supabase.js +91 -0
  110. package/dist/lib/supabase.js.map +1 -0
  111. package/dist/license.d.ts +30 -0
  112. package/dist/license.d.ts.map +1 -0
  113. package/dist/license.js +131 -0
  114. package/dist/license.js.map +1 -0
  115. package/dist/projectPaths.d.ts +27 -0
  116. package/dist/projectPaths.d.ts.map +1 -0
  117. package/dist/projectPaths.js +86 -0
  118. package/dist/projectPaths.js.map +1 -0
  119. package/dist/projectRegistry.d.ts +97 -0
  120. package/dist/projectRegistry.d.ts.map +1 -0
  121. package/dist/projectRegistry.js +374 -0
  122. package/dist/projectRegistry.js.map +1 -0
  123. package/dist/sentinelIssues.d.ts +65 -0
  124. package/dist/sentinelIssues.d.ts.map +1 -0
  125. package/dist/sentinelIssues.js +297 -0
  126. package/dist/sentinelIssues.js.map +1 -0
  127. package/dist/server.d.ts +3 -0
  128. package/dist/server.d.ts.map +1 -0
  129. package/dist/server.js +195 -0
  130. package/dist/server.js.map +1 -0
  131. package/dist/test.d.ts +7 -0
  132. package/dist/test.d.ts.map +1 -0
  133. package/dist/test.js +77 -0
  134. package/dist/test.js.map +1 -0
  135. package/dist/tools/agentic/index.d.ts +7 -0
  136. package/dist/tools/agentic/index.d.ts.map +1 -0
  137. package/dist/tools/agentic/index.js +203 -0
  138. package/dist/tools/agentic/index.js.map +1 -0
  139. package/dist/tools/architect/index.d.ts +11 -0
  140. package/dist/tools/architect/index.d.ts.map +1 -0
  141. package/dist/tools/architect/index.js +506 -0
  142. package/dist/tools/architect/index.js.map +1 -0
  143. package/dist/tools/architect.d.ts +19 -0
  144. package/dist/tools/architect.d.ts.map +1 -0
  145. package/dist/tools/architect.js +88 -0
  146. package/dist/tools/architect.js.map +1 -0
  147. package/dist/tools/auditor/index.d.ts +10 -0
  148. package/dist/tools/auditor/index.d.ts.map +1 -0
  149. package/dist/tools/auditor/index.js +310 -0
  150. package/dist/tools/auditor/index.js.map +1 -0
  151. package/dist/tools/auditor.d.ts +149 -0
  152. package/dist/tools/auditor.d.ts.map +1 -0
  153. package/dist/tools/auditor.js +775 -0
  154. package/dist/tools/auditor.js.map +1 -0
  155. package/dist/tools/bench/index.d.ts +3 -0
  156. package/dist/tools/bench/index.d.ts.map +1 -0
  157. package/dist/tools/bench/index.js +220 -0
  158. package/dist/tools/bench/index.js.map +1 -0
  159. package/dist/tools/bench.d.ts +89 -0
  160. package/dist/tools/bench.d.ts.map +1 -0
  161. package/dist/tools/bench.js +826 -0
  162. package/dist/tools/bench.js.map +1 -0
  163. package/dist/tools/context/index.d.ts +11 -0
  164. package/dist/tools/context/index.d.ts.map +1 -0
  165. package/dist/tools/context/index.js +482 -0
  166. package/dist/tools/context/index.js.map +1 -0
  167. package/dist/tools/context.d.ts +146 -0
  168. package/dist/tools/context.d.ts.map +1 -0
  169. package/dist/tools/context.js +481 -0
  170. package/dist/tools/context.js.map +1 -0
  171. package/dist/tools/coordinator/coordinator.d.ts +168 -0
  172. package/dist/tools/coordinator/coordinator.d.ts.map +1 -0
  173. package/dist/tools/coordinator/coordinator.js +535 -0
  174. package/dist/tools/coordinator/coordinator.js.map +1 -0
  175. package/dist/tools/coordinator/index.d.ts +12 -0
  176. package/dist/tools/coordinator/index.d.ts.map +1 -0
  177. package/dist/tools/coordinator/index.js +381 -0
  178. package/dist/tools/coordinator/index.js.map +1 -0
  179. package/dist/tools/corpus/index.d.ts +5 -0
  180. package/dist/tools/corpus/index.d.ts.map +1 -0
  181. package/dist/tools/corpus/index.js +105 -0
  182. package/dist/tools/corpus/index.js.map +1 -0
  183. package/dist/tools/corpus.d.ts +33 -0
  184. package/dist/tools/corpus.d.ts.map +1 -0
  185. package/dist/tools/corpus.js +180 -0
  186. package/dist/tools/corpus.js.map +1 -0
  187. package/dist/tools/crit.d.ts +63 -0
  188. package/dist/tools/crit.d.ts.map +1 -0
  189. package/dist/tools/crit.js +159 -0
  190. package/dist/tools/crit.js.map +1 -0
  191. package/dist/tools/data-inspector.d.ts +189 -0
  192. package/dist/tools/data-inspector.d.ts.map +1 -0
  193. package/dist/tools/data-inspector.js +669 -0
  194. package/dist/tools/data-inspector.js.map +1 -0
  195. package/dist/tools/deck.d.ts +11 -0
  196. package/dist/tools/deck.d.ts.map +1 -0
  197. package/dist/tools/deck.js +188 -0
  198. package/dist/tools/deck.js.map +1 -0
  199. package/dist/tools/designer/index.d.ts +11 -0
  200. package/dist/tools/designer/index.d.ts.map +1 -0
  201. package/dist/tools/designer/index.js +442 -0
  202. package/dist/tools/designer/index.js.map +1 -0
  203. package/dist/tools/designer/lateral-tools.d.ts +6 -0
  204. package/dist/tools/designer/lateral-tools.d.ts.map +1 -0
  205. package/dist/tools/designer/lateral-tools.js +190 -0
  206. package/dist/tools/designer/lateral-tools.js.map +1 -0
  207. package/dist/tools/designer.d.ts +122 -0
  208. package/dist/tools/designer.d.ts.map +1 -0
  209. package/dist/tools/designer.js +495 -0
  210. package/dist/tools/designer.js.map +1 -0
  211. package/dist/tools/dojo/index.d.ts +13 -0
  212. package/dist/tools/dojo/index.d.ts.map +1 -0
  213. package/dist/tools/dojo/index.js +613 -0
  214. package/dist/tools/dojo/index.js.map +1 -0
  215. package/dist/tools/dojo.d.ts +254 -0
  216. package/dist/tools/dojo.d.ts.map +1 -0
  217. package/dist/tools/dojo.js +933 -0
  218. package/dist/tools/dojo.js.map +1 -0
  219. package/dist/tools/dojoBench.d.ts +49 -0
  220. package/dist/tools/dojoBench.d.ts.map +1 -0
  221. package/dist/tools/dojoBench.js +205 -0
  222. package/dist/tools/dojoBench.js.map +1 -0
  223. package/dist/tools/dojoGraduated.d.ts +50 -0
  224. package/dist/tools/dojoGraduated.d.ts.map +1 -0
  225. package/dist/tools/dojoGraduated.js +174 -0
  226. package/dist/tools/dojoGraduated.js.map +1 -0
  227. package/dist/tools/dojoPolicy.d.ts +65 -0
  228. package/dist/tools/dojoPolicy.d.ts.map +1 -0
  229. package/dist/tools/dojoPolicy.js +263 -0
  230. package/dist/tools/dojoPolicy.js.map +1 -0
  231. package/dist/tools/feedback/index.d.ts +5 -0
  232. package/dist/tools/feedback/index.d.ts.map +1 -0
  233. package/dist/tools/feedback/index.js +153 -0
  234. package/dist/tools/feedback/index.js.map +1 -0
  235. package/dist/tools/feedback.d.ts +61 -0
  236. package/dist/tools/feedback.d.ts.map +1 -0
  237. package/dist/tools/feedback.js +209 -0
  238. package/dist/tools/feedback.js.map +1 -0
  239. package/dist/tools/forecast/index.d.ts +8 -0
  240. package/dist/tools/forecast/index.d.ts.map +1 -0
  241. package/dist/tools/forecast/index.js +283 -0
  242. package/dist/tools/forecast/index.js.map +1 -0
  243. package/dist/tools/forecast.d.ts +147 -0
  244. package/dist/tools/forecast.d.ts.map +1 -0
  245. package/dist/tools/forecast.js +417 -0
  246. package/dist/tools/forecast.js.map +1 -0
  247. package/dist/tools/friction/index.d.ts +7 -0
  248. package/dist/tools/friction/index.d.ts.map +1 -0
  249. package/dist/tools/friction/index.js +265 -0
  250. package/dist/tools/friction/index.js.map +1 -0
  251. package/dist/tools/friction.d.ts +82 -0
  252. package/dist/tools/friction.d.ts.map +1 -0
  253. package/dist/tools/friction.js +331 -0
  254. package/dist/tools/friction.js.map +1 -0
  255. package/dist/tools/git/index.d.ts +9 -0
  256. package/dist/tools/git/index.d.ts.map +1 -0
  257. package/dist/tools/git/index.js +237 -0
  258. package/dist/tools/git/index.js.map +1 -0
  259. package/dist/tools/git-sentinel/index.d.ts +7 -0
  260. package/dist/tools/git-sentinel/index.d.ts.map +1 -0
  261. package/dist/tools/git-sentinel/index.js +178 -0
  262. package/dist/tools/git-sentinel/index.js.map +1 -0
  263. package/dist/tools/git-sentinel.d.ts +78 -0
  264. package/dist/tools/git-sentinel.d.ts.map +1 -0
  265. package/dist/tools/git-sentinel.js +391 -0
  266. package/dist/tools/git-sentinel.js.map +1 -0
  267. package/dist/tools/git.d.ts +134 -0
  268. package/dist/tools/git.d.ts.map +1 -0
  269. package/dist/tools/git.js +374 -0
  270. package/dist/tools/git.js.map +1 -0
  271. package/dist/tools/guardian/index.d.ts +8 -0
  272. package/dist/tools/guardian/index.d.ts.map +1 -0
  273. package/dist/tools/guardian/index.js +171 -0
  274. package/dist/tools/guardian/index.js.map +1 -0
  275. package/dist/tools/guardian.d.ts +62 -0
  276. package/dist/tools/guardian.d.ts.map +1 -0
  277. package/dist/tools/guardian.js +332 -0
  278. package/dist/tools/guardian.js.map +1 -0
  279. package/dist/tools/hygiene/codebase-scanner.d.ts +38 -0
  280. package/dist/tools/hygiene/codebase-scanner.d.ts.map +1 -0
  281. package/dist/tools/hygiene/codebase-scanner.js +411 -0
  282. package/dist/tools/hygiene/codebase-scanner.js.map +1 -0
  283. package/dist/tools/hygiene/config-scanner.d.ts +33 -0
  284. package/dist/tools/hygiene/config-scanner.d.ts.map +1 -0
  285. package/dist/tools/hygiene/config-scanner.js +482 -0
  286. package/dist/tools/hygiene/config-scanner.js.map +1 -0
  287. package/dist/tools/hygiene/coverage-scanner.d.ts +41 -0
  288. package/dist/tools/hygiene/coverage-scanner.d.ts.map +1 -0
  289. package/dist/tools/hygiene/coverage-scanner.js +331 -0
  290. package/dist/tools/hygiene/coverage-scanner.js.map +1 -0
  291. package/dist/tools/hygiene/index.d.ts +7 -0
  292. package/dist/tools/hygiene/index.d.ts.map +1 -0
  293. package/dist/tools/hygiene/index.js +291 -0
  294. package/dist/tools/hygiene/index.js.map +1 -0
  295. package/dist/tools/hygiene/oracle-hygiene.d.ts +68 -0
  296. package/dist/tools/hygiene/oracle-hygiene.d.ts.map +1 -0
  297. package/dist/tools/hygiene/oracle-hygiene.js +324 -0
  298. package/dist/tools/hygiene/oracle-hygiene.js.map +1 -0
  299. package/dist/tools/index.d.ts +6 -0
  300. package/dist/tools/index.d.ts.map +1 -0
  301. package/dist/tools/index.js +130 -0
  302. package/dist/tools/index.js.map +1 -0
  303. package/dist/tools/lateral.d.ts +114 -0
  304. package/dist/tools/lateral.d.ts.map +1 -0
  305. package/dist/tools/lateral.js +536 -0
  306. package/dist/tools/lateral.js.map +1 -0
  307. package/dist/tools/learnings/index.d.ts +5 -0
  308. package/dist/tools/learnings/index.d.ts.map +1 -0
  309. package/dist/tools/learnings/index.js +138 -0
  310. package/dist/tools/learnings/index.js.map +1 -0
  311. package/dist/tools/learnings.d.ts +41 -0
  312. package/dist/tools/learnings.d.ts.map +1 -0
  313. package/dist/tools/learnings.js +149 -0
  314. package/dist/tools/learnings.js.map +1 -0
  315. package/dist/tools/oracle/index.d.ts +6 -0
  316. package/dist/tools/oracle/index.d.ts.map +1 -0
  317. package/dist/tools/oracle/index.js +217 -0
  318. package/dist/tools/oracle/index.js.map +1 -0
  319. package/dist/tools/oracle.d.ts +90 -0
  320. package/dist/tools/oracle.d.ts.map +1 -0
  321. package/dist/tools/oracle.js +529 -0
  322. package/dist/tools/oracle.js.map +1 -0
  323. package/dist/tools/policy.d.ts +119 -0
  324. package/dist/tools/policy.d.ts.map +1 -0
  325. package/dist/tools/policy.js +406 -0
  326. package/dist/tools/policy.js.map +1 -0
  327. package/dist/tools/provenance/index.d.ts +4 -0
  328. package/dist/tools/provenance/index.d.ts.map +1 -0
  329. package/dist/tools/provenance/index.js +63 -0
  330. package/dist/tools/provenance/index.js.map +1 -0
  331. package/dist/tools/provenance.d.ts +75 -0
  332. package/dist/tools/provenance.d.ts.map +1 -0
  333. package/dist/tools/provenance.js +224 -0
  334. package/dist/tools/provenance.js.map +1 -0
  335. package/dist/tools/rateLimiter.d.ts +45 -0
  336. package/dist/tools/rateLimiter.d.ts.map +1 -0
  337. package/dist/tools/rateLimiter.js +91 -0
  338. package/dist/tools/rateLimiter.js.map +1 -0
  339. package/dist/tools/registry/index.d.ts +10 -0
  340. package/dist/tools/registry/index.d.ts.map +1 -0
  341. package/dist/tools/registry/index.js +506 -0
  342. package/dist/tools/registry/index.js.map +1 -0
  343. package/dist/tools/registry.d.ts +3 -0
  344. package/dist/tools/registry.d.ts.map +1 -0
  345. package/dist/tools/registry.js +189 -0
  346. package/dist/tools/registry.js.map +1 -0
  347. package/dist/tools/roadmap/index.d.ts +11 -0
  348. package/dist/tools/roadmap/index.d.ts.map +1 -0
  349. package/dist/tools/roadmap/index.js +364 -0
  350. package/dist/tools/roadmap/index.js.map +1 -0
  351. package/dist/tools/roadmap.d.ts +103 -0
  352. package/dist/tools/roadmap.d.ts.map +1 -0
  353. package/dist/tools/roadmap.js +407 -0
  354. package/dist/tools/roadmap.js.map +1 -0
  355. package/dist/tools/senken.d.ts +11 -0
  356. package/dist/tools/senken.d.ts.map +1 -0
  357. package/dist/tools/senken.js +482 -0
  358. package/dist/tools/senken.js.map +1 -0
  359. package/dist/tools/sentinel/index.d.ts +21 -0
  360. package/dist/tools/sentinel/index.d.ts.map +1 -0
  361. package/dist/tools/sentinel/index.js +1067 -0
  362. package/dist/tools/sentinel/index.js.map +1 -0
  363. package/dist/tools/sentinel-scan-data.d.ts +90 -0
  364. package/dist/tools/sentinel-scan-data.d.ts.map +1 -0
  365. package/dist/tools/sentinel-scan-data.js +122 -0
  366. package/dist/tools/sentinel-scan-data.js.map +1 -0
  367. package/dist/tools/sentinel.d.ts +156 -0
  368. package/dist/tools/sentinel.d.ts.map +1 -0
  369. package/dist/tools/sentinel.js +603 -0
  370. package/dist/tools/sentinel.js.map +1 -0
  371. package/dist/tools/shared/index.d.ts +5 -0
  372. package/dist/tools/shared/index.d.ts.map +1 -0
  373. package/dist/tools/shared/index.js +8 -0
  374. package/dist/tools/shared/index.js.map +1 -0
  375. package/dist/tools/shared/project.d.ts +17 -0
  376. package/dist/tools/shared/project.d.ts.map +1 -0
  377. package/dist/tools/shared/project.js +36 -0
  378. package/dist/tools/shared/project.js.map +1 -0
  379. package/dist/tools/shared/response.d.ts +15 -0
  380. package/dist/tools/shared/response.d.ts.map +1 -0
  381. package/dist/tools/shared/response.js +77 -0
  382. package/dist/tools/shared/response.js.map +1 -0
  383. package/dist/tools/shared/runTracker.d.ts +87 -0
  384. package/dist/tools/shared/runTracker.d.ts.map +1 -0
  385. package/dist/tools/shared/runTracker.js +225 -0
  386. package/dist/tools/shared/runTracker.js.map +1 -0
  387. package/dist/tools/shared/validation.d.ts +10 -0
  388. package/dist/tools/shared/validation.d.ts.map +1 -0
  389. package/dist/tools/shared/validation.js +26 -0
  390. package/dist/tools/shared/validation.js.map +1 -0
  391. package/dist/tools/studio/cloud-spine.d.ts +27 -0
  392. package/dist/tools/studio/cloud-spine.d.ts.map +1 -0
  393. package/dist/tools/studio/cloud-spine.js +845 -0
  394. package/dist/tools/studio/cloud-spine.js.map +1 -0
  395. package/dist/tools/studio/index.d.ts +154 -0
  396. package/dist/tools/studio/index.d.ts.map +1 -0
  397. package/dist/tools/studio/index.js +541 -0
  398. package/dist/tools/studio/index.js.map +1 -0
  399. package/dist/tools/testSpec.d.ts +122 -0
  400. package/dist/tools/testSpec.d.ts.map +1 -0
  401. package/dist/tools/testSpec.js +525 -0
  402. package/dist/tools/testSpec.js.map +1 -0
  403. package/dist/tools/toolsIndex.d.ts +5 -0
  404. package/dist/tools/toolsIndex.d.ts.map +1 -0
  405. package/dist/tools/toolsIndex.js +37 -0
  406. package/dist/tools/toolsIndex.js.map +1 -0
  407. package/dist/tools/types.d.ts +47 -0
  408. package/dist/tools/types.d.ts.map +1 -0
  409. package/dist/tools/types.js +7 -0
  410. package/dist/tools/types.js.map +1 -0
  411. package/dist/tools/vector/index.d.ts +13 -0
  412. package/dist/tools/vector/index.d.ts.map +1 -0
  413. package/dist/tools/vector/index.js +592 -0
  414. package/dist/tools/vector/index.js.map +1 -0
  415. package/dist/tools/vector.d.ts +189 -0
  416. package/dist/tools/vector.d.ts.map +1 -0
  417. package/dist/tools/vector.js +570 -0
  418. package/dist/tools/vector.js.map +1 -0
  419. package/dist/tools/velocity/index.d.ts +9 -0
  420. package/dist/tools/velocity/index.d.ts.map +1 -0
  421. package/dist/tools/velocity/index.js +306 -0
  422. package/dist/tools/velocity/index.js.map +1 -0
  423. package/dist/tools/velocity.d.ts +143 -0
  424. package/dist/tools/velocity.d.ts.map +1 -0
  425. package/dist/tools/velocity.js +628 -0
  426. package/dist/tools/velocity.js.map +1 -0
  427. package/dist/tools/voice/index.d.ts +8 -0
  428. package/dist/tools/voice/index.d.ts.map +1 -0
  429. package/dist/tools/voice/index.js +203 -0
  430. package/dist/tools/voice/index.js.map +1 -0
  431. package/dist/tools/voice.d.ts +291 -0
  432. package/dist/tools/voice.d.ts.map +1 -0
  433. package/dist/tools/voice.js +734 -0
  434. package/dist/tools/voice.js.map +1 -0
  435. package/dist/tools/workflow/index.d.ts +8 -0
  436. package/dist/tools/workflow/index.d.ts.map +1 -0
  437. package/dist/tools/workflow/index.js +199 -0
  438. package/dist/tools/workflow/index.js.map +1 -0
  439. package/dist/tools/workflow.d.ts +123 -0
  440. package/dist/tools/workflow.d.ts.map +1 -0
  441. package/dist/tools/workflow.js +647 -0
  442. package/dist/tools/workflow.js.map +1 -0
  443. package/dist/transports/bridge.d.ts +22 -0
  444. package/dist/transports/bridge.d.ts.map +1 -0
  445. package/dist/transports/bridge.js +177 -0
  446. package/dist/transports/bridge.js.map +1 -0
  447. package/dist/transports/http.d.ts +9 -0
  448. package/dist/transports/http.d.ts.map +1 -0
  449. package/dist/transports/http.js +35 -0
  450. package/dist/transports/http.js.map +1 -0
  451. package/dist/transports/index.d.ts +6 -0
  452. package/dist/transports/index.d.ts.map +1 -0
  453. package/dist/transports/index.js +8 -0
  454. package/dist/transports/index.js.map +1 -0
  455. package/dist/transports/mcp.d.ts +9 -0
  456. package/dist/transports/mcp.d.ts.map +1 -0
  457. package/dist/transports/mcp.js +51 -0
  458. package/dist/transports/mcp.js.map +1 -0
  459. package/dist/transports/stdio.d.ts +9 -0
  460. package/dist/transports/stdio.d.ts.map +1 -0
  461. package/dist/transports/stdio.js +26 -0
  462. package/dist/transports/stdio.js.map +1 -0
  463. package/dist/transports/types.d.ts +27 -0
  464. package/dist/transports/types.d.ts.map +1 -0
  465. package/dist/transports/types.js +8 -0
  466. package/dist/transports/types.js.map +1 -0
  467. package/dist/types/agent-services.d.ts +193 -0
  468. package/dist/types/agent-services.d.ts.map +1 -0
  469. package/dist/types/agent-services.js +8 -0
  470. package/dist/types/agent-services.js.map +1 -0
  471. package/dist/types/index.d.ts +2 -0
  472. package/dist/types/index.d.ts.map +1 -0
  473. package/dist/types/index.js +7 -0
  474. package/dist/types/index.js.map +1 -0
  475. package/package.json +72 -0
  476. package/templates/AGENT.md +87 -0
  477. package/templates/com.decibel.daemon.plist +47 -0
  478. package/templates/sentinel/ISSUE_TEMPLATE.md +20 -0
@@ -0,0 +1,284 @@
1
+ // ============================================================================
2
+ // Assumption Aggregation Service
3
+ // ============================================================================
4
+ // Aggregates assumptions across runs to identify patterns, high-risk categories,
5
+ // and things the agent should always ask about rather than assume.
6
+ // ============================================================================
7
+ import { getRun, listRuns } from '../../tools/vector.js';
8
+ // ============================================================================
9
+ // Constants
10
+ // ============================================================================
11
+ /** Threshold for considering a category high-risk */
12
+ const HIGH_RISK_INVALIDATION_RATE = 0.3; // 30%+ invalidation = high risk
13
+ /** Minimum occurrences to consider for "always ask" */
14
+ const MIN_OCCURRENCES_FOR_ALWAYS_ASK = 2;
15
+ /** Invalidation rate threshold for "always ask" */
16
+ const ALWAYS_ASK_INVALIDATION_RATE = 0.5; // 50%+ invalidation = always ask
17
+ // ============================================================================
18
+ // Helpers
19
+ // ============================================================================
20
+ /**
21
+ * Extract tracked assumptions from run events
22
+ */
23
+ function extractAssumptions(events, run_id) {
24
+ const assumptions = [];
25
+ for (const event of events) {
26
+ if (event.type !== 'assumption_made')
27
+ continue;
28
+ if (!event.payload)
29
+ continue;
30
+ const payload = event.payload;
31
+ assumptions.push({
32
+ assumption: payload.assumption || payload.content || 'Unknown assumption',
33
+ rationale: payload.rationale,
34
+ alternatives: payload.alternatives,
35
+ ask_if_below: payload.ask_if_below,
36
+ category: normalizeCategory(payload.category),
37
+ outcome: normalizeOutcome(payload.outcome),
38
+ run_id,
39
+ timestamp: event.ts,
40
+ });
41
+ }
42
+ return assumptions;
43
+ }
44
+ /**
45
+ * Normalize category string to valid AssumptionCategory
46
+ */
47
+ function normalizeCategory(category) {
48
+ if (!category)
49
+ return 'other';
50
+ const normalized = category.toLowerCase().replace(/[^a-z_]/g, '');
51
+ const validCategories = [
52
+ 'architecture', 'api_behavior', 'auth', 'data_format',
53
+ 'dependencies', 'environment', 'permissions', 'performance',
54
+ 'security', 'user_intent', 'other'
55
+ ];
56
+ if (validCategories.includes(normalized)) {
57
+ return normalized;
58
+ }
59
+ // Map common variations
60
+ if (normalized.includes('api'))
61
+ return 'api_behavior';
62
+ if (normalized.includes('auth') || normalized.includes('login'))
63
+ return 'auth';
64
+ if (normalized.includes('data') || normalized.includes('format'))
65
+ return 'data_format';
66
+ if (normalized.includes('dep') || normalized.includes('package'))
67
+ return 'dependencies';
68
+ if (normalized.includes('env') || normalized.includes('config'))
69
+ return 'environment';
70
+ if (normalized.includes('perm') || normalized.includes('access'))
71
+ return 'permissions';
72
+ if (normalized.includes('perf') || normalized.includes('speed'))
73
+ return 'performance';
74
+ if (normalized.includes('sec'))
75
+ return 'security';
76
+ if (normalized.includes('user') || normalized.includes('intent'))
77
+ return 'user_intent';
78
+ return 'other';
79
+ }
80
+ /**
81
+ * Normalize outcome string to valid AssumptionOutcome
82
+ */
83
+ function normalizeOutcome(outcome) {
84
+ if (!outcome)
85
+ return 'unknown';
86
+ const normalized = outcome.toLowerCase();
87
+ if (normalized === 'validated' || normalized === 'valid' || normalized === 'correct') {
88
+ return 'validated';
89
+ }
90
+ if (normalized === 'invalidated' || normalized === 'invalid' || normalized === 'wrong' || normalized === 'incorrect') {
91
+ return 'invalidated';
92
+ }
93
+ return 'unknown';
94
+ }
95
+ /**
96
+ * Infer outcome from subsequent events if not explicitly set
97
+ */
98
+ function inferOutcome(assumption, allEvents, assumptionIndex) {
99
+ if (assumption.outcome !== 'unknown') {
100
+ return assumption.outcome;
101
+ }
102
+ // Look at events after this assumption
103
+ const subsequentEvents = allEvents.slice(assumptionIndex + 1);
104
+ for (const event of subsequentEvents) {
105
+ // Backtrack or error after assumption often means it was wrong
106
+ if (event.type === 'backtrack' || event.type === 'error') {
107
+ const payload = event.payload;
108
+ if (payload?.reason?.toLowerCase().includes(assumption.assumption.toLowerCase())) {
109
+ return 'invalidated';
110
+ }
111
+ }
112
+ // User correction specifically about this assumption
113
+ if (event.type === 'user_correction') {
114
+ const payload = event.payload;
115
+ if (payload?.correction?.toLowerCase().includes(assumption.assumption.toLowerCase())) {
116
+ return 'invalidated';
117
+ }
118
+ }
119
+ }
120
+ return 'unknown';
121
+ }
122
+ // ============================================================================
123
+ // Main Functions
124
+ // ============================================================================
125
+ /**
126
+ * Aggregate assumptions from multiple runs
127
+ */
128
+ export async function aggregateAssumptions(projectId, options) {
129
+ const lookbackDays = options?.lookback_days || 30;
130
+ const maxRuns = options?.max_runs || 100;
131
+ // Get recent runs
132
+ const { runs } = await listRuns({
133
+ projectId,
134
+ limit: maxRuns,
135
+ });
136
+ // Filter by date
137
+ const cutoff = new Date();
138
+ cutoff.setDate(cutoff.getDate() - lookbackDays);
139
+ const cutoffStr = cutoff.toISOString();
140
+ const recentRuns = runs.filter(r => r.created_at >= cutoffStr);
141
+ // Collect all assumptions
142
+ const allAssumptions = [];
143
+ for (const run of recentRuns) {
144
+ try {
145
+ const runData = await getRun({
146
+ projectId,
147
+ run_id: run.run_id,
148
+ include_events: true,
149
+ });
150
+ if (!runData.events)
151
+ continue;
152
+ const assumptions = extractAssumptions(runData.events, run.run_id);
153
+ // Try to infer outcomes
154
+ for (let i = 0; i < runData.events.length; i++) {
155
+ const event = runData.events[i];
156
+ if (event.type === 'assumption_made') {
157
+ const assumptionIndex = assumptions.findIndex(a => a.timestamp === event.ts && a.run_id === run.run_id);
158
+ if (assumptionIndex >= 0) {
159
+ assumptions[assumptionIndex].outcome = inferOutcome(assumptions[assumptionIndex], runData.events, i);
160
+ }
161
+ }
162
+ }
163
+ allAssumptions.push(...assumptions);
164
+ }
165
+ catch {
166
+ // Skip runs we can't read
167
+ }
168
+ }
169
+ // Calculate stats
170
+ const stats = calculateStats(allAssumptions);
171
+ return {
172
+ ...stats,
173
+ assumptions: allAssumptions,
174
+ period: {
175
+ start: cutoffStr,
176
+ end: new Date().toISOString(),
177
+ run_count: recentRuns.length,
178
+ },
179
+ };
180
+ }
181
+ /**
182
+ * Calculate statistics from assumptions
183
+ */
184
+ function calculateStats(assumptions) {
185
+ const byOutcome = {
186
+ validated: 0,
187
+ invalidated: 0,
188
+ unknown: 0,
189
+ };
190
+ const byCategory = {
191
+ architecture: { valid: 0, invalid: 0, total: 0 },
192
+ api_behavior: { valid: 0, invalid: 0, total: 0 },
193
+ auth: { valid: 0, invalid: 0, total: 0 },
194
+ data_format: { valid: 0, invalid: 0, total: 0 },
195
+ dependencies: { valid: 0, invalid: 0, total: 0 },
196
+ environment: { valid: 0, invalid: 0, total: 0 },
197
+ permissions: { valid: 0, invalid: 0, total: 0 },
198
+ performance: { valid: 0, invalid: 0, total: 0 },
199
+ security: { valid: 0, invalid: 0, total: 0 },
200
+ user_intent: { valid: 0, invalid: 0, total: 0 },
201
+ other: { valid: 0, invalid: 0, total: 0 },
202
+ };
203
+ // Track specific assumptions for "always ask"
204
+ const assumptionOccurrences = new Map();
205
+ for (const a of assumptions) {
206
+ byOutcome[a.outcome]++;
207
+ const cat = byCategory[a.category];
208
+ cat.total++;
209
+ if (a.outcome === 'validated')
210
+ cat.valid++;
211
+ if (a.outcome === 'invalidated')
212
+ cat.invalid++;
213
+ // Normalize assumption text for grouping
214
+ const normalized = a.assumption.toLowerCase().trim();
215
+ const existing = assumptionOccurrences.get(normalized) || { valid: 0, invalid: 0 };
216
+ if (a.outcome === 'validated')
217
+ existing.valid++;
218
+ if (a.outcome === 'invalidated')
219
+ existing.invalid++;
220
+ assumptionOccurrences.set(normalized, existing);
221
+ }
222
+ // Calculate category validation rates and find high-risk ones
223
+ const categoryValidationRates = {};
224
+ const highRiskCategories = [];
225
+ for (const [category, stats] of Object.entries(byCategory)) {
226
+ const cat = category;
227
+ if (stats.total === 0) {
228
+ categoryValidationRates[cat] = 1; // No data = assume safe
229
+ continue;
230
+ }
231
+ const knownOutcomes = stats.valid + stats.invalid;
232
+ if (knownOutcomes === 0) {
233
+ categoryValidationRates[cat] = 1;
234
+ continue;
235
+ }
236
+ const validationRate = stats.valid / knownOutcomes;
237
+ categoryValidationRates[cat] = validationRate;
238
+ const invalidationRate = stats.invalid / knownOutcomes;
239
+ if (invalidationRate >= HIGH_RISK_INVALIDATION_RATE && stats.total >= MIN_OCCURRENCES_FOR_ALWAYS_ASK) {
240
+ highRiskCategories.push(cat);
241
+ }
242
+ }
243
+ // Find specific assumptions to always ask about
244
+ const alwaysAsk = [];
245
+ for (const [assumption, counts] of assumptionOccurrences) {
246
+ const total = counts.valid + counts.invalid;
247
+ if (total < MIN_OCCURRENCES_FOR_ALWAYS_ASK)
248
+ continue;
249
+ const invalidationRate = counts.invalid / total;
250
+ if (invalidationRate >= ALWAYS_ASK_INVALIDATION_RATE) {
251
+ alwaysAsk.push(assumption);
252
+ }
253
+ }
254
+ return {
255
+ total_count: assumptions.length,
256
+ by_outcome: byOutcome,
257
+ high_risk_categories: highRiskCategories,
258
+ always_ask: alwaysAsk,
259
+ category_validation_rates: categoryValidationRates,
260
+ };
261
+ }
262
+ /**
263
+ * Check if a specific assumption should be asked about
264
+ */
265
+ export async function shouldAskAbout(assumption, category, projectId) {
266
+ const stats = await aggregateAssumptions(projectId);
267
+ // Check if this specific assumption is in always_ask
268
+ const normalized = assumption.toLowerCase().trim();
269
+ if (stats.always_ask.some(a => normalized.includes(a) || a.includes(normalized))) {
270
+ return {
271
+ should_ask: true,
272
+ reason: 'This assumption has been invalidated frequently in the past',
273
+ };
274
+ }
275
+ // Check if category is high-risk
276
+ if (stats.high_risk_categories.includes(category)) {
277
+ return {
278
+ should_ask: true,
279
+ reason: `Category "${category}" has a high invalidation rate (${Math.round((1 - stats.category_validation_rates[category]) * 100)}%)`,
280
+ };
281
+ }
282
+ return { should_ask: false };
283
+ }
284
+ //# sourceMappingURL=assumptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assumptions.js","sourceRoot":"","sources":["../../../src/lib/agent-services/assumptions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ContextPackRequest, ContextPackResponse } from '../../types/agent-services.js';
2
+ /**
3
+ * Build a context pack for a new task based on historical runs
4
+ */
5
+ export declare function buildContextPack(request: ContextPackRequest, projectId?: string): Promise<ContextPackResponse>;
6
+ //# sourceMappingURL=context-pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-pack.d.ts","sourceRoot":"","sources":["../../../src/lib/agent-services/context-pack.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAIpB,MAAM,+BAA+B,CAAC;AAuTvC;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,kBAAkB,EAC3B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,CAAC,CA2G9B"}
@@ -0,0 +1,354 @@
1
+ // ============================================================================
2
+ // Context Pack Service
3
+ // ============================================================================
4
+ // Builds a memory brief from past runs before starting a new task.
5
+ // Helps agents avoid repeating past mistakes and learn from history.
6
+ // ============================================================================
7
+ import { getRun, listRuns } from '../../tools/vector.js';
8
+ // ============================================================================
9
+ // Constants
10
+ // ============================================================================
11
+ /** Default lookback period in days */
12
+ const DEFAULT_LOOKBACK_DAYS = 30;
13
+ /** Default max runs to analyze */
14
+ const DEFAULT_MAX_RUNS = 50;
15
+ /** Minimum similarity score to consider a run relevant */
16
+ const MIN_SIMILARITY_SCORE = 0.3;
17
+ /** Common error patterns to track */
18
+ const COMMON_ERROR_PATTERNS = [
19
+ { pattern: 'type error', category: 'type_safety' },
20
+ { pattern: 'undefined', category: 'null_check' },
21
+ { pattern: 'not found', category: 'missing_resource' },
22
+ { pattern: 'permission denied', category: 'permissions' },
23
+ { pattern: 'timeout', category: 'performance' },
24
+ { pattern: 'connection refused', category: 'connectivity' },
25
+ { pattern: 'syntax error', category: 'syntax' },
26
+ { pattern: 'import', category: 'dependencies' },
27
+ { pattern: 'module not found', category: 'dependencies' },
28
+ ];
29
+ // ============================================================================
30
+ // Helpers
31
+ // ============================================================================
32
+ /**
33
+ * Calculate similarity between task and a past run's prompt
34
+ */
35
+ function calculateSimilarity(task, promptSpec, filesHint) {
36
+ const taskLower = task.toLowerCase();
37
+ const promptLower = promptSpec.raw_prompt.toLowerCase();
38
+ let score = 0;
39
+ const reasons = [];
40
+ // Check for shared keywords (simple word overlap)
41
+ const taskWords = new Set(taskLower.split(/\s+/).filter(w => w.length > 3));
42
+ const promptWords = new Set(promptLower.split(/\s+/).filter(w => w.length > 3));
43
+ let sharedWords = 0;
44
+ for (const word of taskWords) {
45
+ if (promptWords.has(word))
46
+ sharedWords++;
47
+ }
48
+ if (taskWords.size > 0) {
49
+ const wordOverlap = sharedWords / taskWords.size;
50
+ score += wordOverlap * 0.4; // Up to 40% from word overlap
51
+ if (wordOverlap > 0.3) {
52
+ reasons.push(`Shares ${sharedWords} keywords`);
53
+ }
54
+ }
55
+ // Check for intent goal similarity
56
+ if (promptSpec.intent?.goal) {
57
+ const goalLower = promptSpec.intent.goal.toLowerCase();
58
+ const goalWords = new Set(goalLower.split(/\s+/).filter(w => w.length > 3));
59
+ let goalShared = 0;
60
+ for (const word of taskWords) {
61
+ if (goalWords.has(word))
62
+ goalShared++;
63
+ }
64
+ if (taskWords.size > 0 && goalShared > 0) {
65
+ score += 0.2; // 20% boost for goal overlap
66
+ reasons.push('Similar goal');
67
+ }
68
+ }
69
+ // Check for file hint overlap with scope
70
+ if (filesHint && filesHint.length > 0 && promptSpec.intent?.scope) {
71
+ const scopeSet = new Set(promptSpec.intent.scope.map(s => s.toLowerCase()));
72
+ const hintSet = new Set(filesHint.map(f => f.toLowerCase()));
73
+ for (const hint of hintSet) {
74
+ for (const scope of scopeSet) {
75
+ if (hint.includes(scope) || scope.includes(hint)) {
76
+ score += 0.2;
77
+ reasons.push(`File overlap: ${hint}`);
78
+ break;
79
+ }
80
+ }
81
+ }
82
+ }
83
+ // Check for common action verbs
84
+ const actionVerbs = ['add', 'fix', 'update', 'refactor', 'implement', 'create', 'delete', 'remove'];
85
+ for (const verb of actionVerbs) {
86
+ if (taskLower.includes(verb) && promptLower.includes(verb)) {
87
+ score += 0.1;
88
+ reasons.push(`Same action: ${verb}`);
89
+ break;
90
+ }
91
+ }
92
+ return {
93
+ score: Math.min(score, 1),
94
+ reason: reasons.length > 0 ? reasons.join(', ') : 'Low similarity',
95
+ };
96
+ }
97
+ /**
98
+ * Extract files touched from run events
99
+ */
100
+ function extractFilesTouched(events) {
101
+ const files = new Set();
102
+ for (const event of events) {
103
+ if (event.type === 'file_touched' && event.payload?.file) {
104
+ files.add(event.payload.file);
105
+ }
106
+ if (event.type === 'command_ran' && event.payload?.files) {
107
+ for (const f of event.payload.files) {
108
+ files.add(f);
109
+ }
110
+ }
111
+ }
112
+ return Array.from(files);
113
+ }
114
+ /**
115
+ * Extract key learnings from a run
116
+ */
117
+ function extractLearnings(events, success) {
118
+ const learnings = [];
119
+ // Look for user corrections - these are always valuable
120
+ for (const event of events) {
121
+ if (event.type === 'user_correction' && event.payload?.correction) {
122
+ learnings.push(`User correction: ${event.payload.correction}`);
123
+ }
124
+ }
125
+ // Look for backtracks - what went wrong?
126
+ for (const event of events) {
127
+ if (event.type === 'backtrack' && event.payload?.reason) {
128
+ learnings.push(`Had to backtrack: ${event.payload.reason}`);
129
+ }
130
+ }
131
+ // Look for errors
132
+ for (const event of events) {
133
+ if (event.type === 'error' && event.payload?.message) {
134
+ learnings.push(`Error encountered: ${event.payload.message}`);
135
+ }
136
+ }
137
+ // For successful runs, note what worked
138
+ if (success && events.length > 0) {
139
+ const lastEvent = events[events.length - 1];
140
+ if (lastEvent.type === 'run_completed' && lastEvent.payload?.summary) {
141
+ learnings.push(`Success: ${lastEvent.payload.summary}`);
142
+ }
143
+ }
144
+ return learnings.slice(0, 5); // Cap at 5 learnings
145
+ }
146
+ /**
147
+ * Analyze file churn across runs
148
+ */
149
+ function analyzeChurn(runs) {
150
+ const fileStats = new Map();
151
+ for (const run of runs) {
152
+ const files = extractFilesTouched(run.events);
153
+ for (const file of files) {
154
+ const existing = fileStats.get(file) || { touches: 0, failures: 0, lastTouch: '' };
155
+ existing.touches++;
156
+ if (!run.success)
157
+ existing.failures++;
158
+ if (run.created_at > existing.lastTouch)
159
+ existing.lastTouch = run.created_at;
160
+ fileStats.set(file, existing);
161
+ }
162
+ }
163
+ // Convert to hotspots, sort by touch count
164
+ const hotspots = [];
165
+ for (const [file, stats] of fileStats) {
166
+ if (stats.touches < 2)
167
+ continue; // Only interested in files touched multiple times
168
+ hotspots.push({
169
+ file,
170
+ touch_count: stats.touches,
171
+ failure_rate: stats.touches > 0 ? stats.failures / stats.touches : 0,
172
+ last_touched: stats.lastTouch,
173
+ });
174
+ }
175
+ // Sort by touch count * failure rate (problematic files bubble up)
176
+ hotspots.sort((a, b) => {
177
+ const scoreA = a.touch_count * (1 + a.failure_rate);
178
+ const scoreB = b.touch_count * (1 + b.failure_rate);
179
+ return scoreB - scoreA;
180
+ });
181
+ return hotspots.slice(0, 10); // Top 10 hotspots
182
+ }
183
+ /**
184
+ * Analyze failure patterns across runs
185
+ */
186
+ function analyzeFailurePatterns(runs) {
187
+ const patternCounts = new Map();
188
+ for (const run of runs) {
189
+ if (run.success)
190
+ continue; // Only look at failed runs
191
+ for (const event of run.events) {
192
+ if (event.type !== 'error')
193
+ continue;
194
+ const message = (event.payload?.message || '').toLowerCase();
195
+ for (const { pattern, category } of COMMON_ERROR_PATTERNS) {
196
+ if (message.includes(pattern)) {
197
+ const existing = patternCounts.get(category) || { count: 0, examples: [] };
198
+ existing.count++;
199
+ if (existing.examples.length < 3) {
200
+ existing.examples.push(event.payload?.message || pattern);
201
+ }
202
+ patternCounts.set(category, existing);
203
+ }
204
+ }
205
+ }
206
+ }
207
+ // Convert to patterns with prevention suggestions
208
+ const patterns = [];
209
+ const preventionSuggestions = {
210
+ type_safety: 'Add type annotations and check for type mismatches before running',
211
+ null_check: 'Check for undefined/null values before accessing properties',
212
+ missing_resource: 'Verify files and resources exist before operations',
213
+ permissions: 'Check file permissions and authentication before access',
214
+ performance: 'Consider timeout settings and async operation handling',
215
+ connectivity: 'Verify network connectivity and service availability',
216
+ syntax: 'Validate syntax before executing commands',
217
+ dependencies: 'Check that all imports and dependencies are installed',
218
+ };
219
+ for (const [category, stats] of patternCounts) {
220
+ if (stats.count < 2)
221
+ continue; // Only patterns that occur multiple times
222
+ patterns.push({
223
+ pattern: category.replace('_', ' '),
224
+ occurrence_count: stats.count,
225
+ suggested_prevention: preventionSuggestions[category] || 'Review similar past errors',
226
+ });
227
+ }
228
+ patterns.sort((a, b) => b.occurrence_count - a.occurrence_count);
229
+ return patterns;
230
+ }
231
+ /**
232
+ * Generate suggested questions based on task and history
233
+ */
234
+ function generateQuestions(task, relevantRuns, failurePatterns) {
235
+ const questions = [];
236
+ // Questions based on past failures
237
+ for (const pattern of failurePatterns.slice(0, 2)) {
238
+ questions.push(`Past runs had ${pattern.pattern} issues - have you addressed this?`);
239
+ }
240
+ // Questions based on similar runs that failed
241
+ const failedRuns = relevantRuns.filter(r => r.outcome === 'failed');
242
+ if (failedRuns.length > 0) {
243
+ questions.push('Similar tasks have failed before - what makes this attempt different?');
244
+ }
245
+ // Questions based on ambiguous terms in task
246
+ const ambiguousTerms = ['refactor', 'improve', 'fix', 'update', 'optimize'];
247
+ for (const term of ambiguousTerms) {
248
+ if (task.toLowerCase().includes(term)) {
249
+ questions.push(`What specifically should be ${term}ed?`);
250
+ break;
251
+ }
252
+ }
253
+ // General scoping question if no files mentioned
254
+ if (!task.match(/\.(ts|js|py|go|rs|java|tsx|jsx)/) && !task.includes('src/')) {
255
+ questions.push('Which specific files or modules should be modified?');
256
+ }
257
+ return questions.slice(0, 5); // Cap at 5 questions
258
+ }
259
+ // ============================================================================
260
+ // Main Function
261
+ // ============================================================================
262
+ /**
263
+ * Build a context pack for a new task based on historical runs
264
+ */
265
+ export async function buildContextPack(request, projectId) {
266
+ const lookbackDays = request.lookback_days || DEFAULT_LOOKBACK_DAYS;
267
+ const maxRuns = request.max_runs || DEFAULT_MAX_RUNS;
268
+ // Get recent runs
269
+ const { runs } = await listRuns({
270
+ projectId,
271
+ limit: maxRuns,
272
+ });
273
+ // Filter by date
274
+ const cutoff = new Date();
275
+ cutoff.setDate(cutoff.getDate() - lookbackDays);
276
+ const cutoffStr = cutoff.toISOString();
277
+ const recentRuns = runs.filter(r => r.created_at >= cutoffStr);
278
+ // Load full run data
279
+ const fullRuns = [];
280
+ for (const run of recentRuns) {
281
+ try {
282
+ const runData = await getRun({
283
+ projectId,
284
+ run_id: run.run_id,
285
+ include_events: true,
286
+ });
287
+ fullRuns.push({
288
+ run_id: run.run_id,
289
+ prompt: runData.prompt,
290
+ events: runData.events || [],
291
+ success: run.success ?? !runData.completed, // If not completed, consider failed
292
+ created_at: run.created_at,
293
+ });
294
+ }
295
+ catch {
296
+ // Skip runs we can't read
297
+ }
298
+ }
299
+ // Find relevant runs
300
+ const relevantRuns = [];
301
+ for (const run of fullRuns) {
302
+ const { score, reason } = calculateSimilarity(request.task, run.prompt, request.files_hint);
303
+ if (score >= MIN_SIMILARITY_SCORE) {
304
+ relevantRuns.push({
305
+ run_id: run.run_id,
306
+ similarity_reason: reason,
307
+ outcome: run.success ? 'success' : 'failed',
308
+ key_learnings: extractLearnings(run.events, run.success),
309
+ files_touched: extractFilesTouched(run.events),
310
+ });
311
+ }
312
+ }
313
+ // Sort by similarity (implicit in the order we found them, but could enhance)
314
+ relevantRuns.sort((a, b) => {
315
+ // Failed runs are more instructive
316
+ if (a.outcome === 'failed' && b.outcome !== 'failed')
317
+ return -1;
318
+ if (b.outcome === 'failed' && a.outcome !== 'failed')
319
+ return 1;
320
+ return 0;
321
+ });
322
+ // Analyze churn and failure patterns
323
+ const churnHotspots = analyzeChurn(fullRuns);
324
+ const failurePatterns = analyzeFailurePatterns(fullRuns);
325
+ // Generate suggested questions
326
+ const suggestedQuestions = generateQuestions(request.task, relevantRuns, failurePatterns);
327
+ // Build context summary
328
+ let contextSummary = '';
329
+ if (relevantRuns.length > 0) {
330
+ const successCount = relevantRuns.filter(r => r.outcome === 'success').length;
331
+ const failCount = relevantRuns.filter(r => r.outcome === 'failed').length;
332
+ contextSummary += `Found ${relevantRuns.length} similar past runs (${successCount} successful, ${failCount} failed). `;
333
+ }
334
+ else {
335
+ contextSummary += 'No similar past runs found. ';
336
+ }
337
+ if (failurePatterns.length > 0) {
338
+ contextSummary += `Common issues: ${failurePatterns.map(p => p.pattern).join(', ')}. `;
339
+ }
340
+ if (churnHotspots.length > 0) {
341
+ const problematic = churnHotspots.filter(h => h.failure_rate > 0.3);
342
+ if (problematic.length > 0) {
343
+ contextSummary += `High-risk files: ${problematic.slice(0, 3).map(h => h.file).join(', ')}.`;
344
+ }
345
+ }
346
+ return {
347
+ relevant_runs: relevantRuns.slice(0, 10), // Top 10 relevant runs
348
+ churn_hotspots: churnHotspots,
349
+ failure_patterns: failurePatterns,
350
+ suggested_questions: suggestedQuestions,
351
+ context_summary: contextSummary.trim() || 'No historical context available.',
352
+ };
353
+ }
354
+ //# sourceMappingURL=context-pack.js.map