@oscharko-dev/keiko 0.1.0-beta.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 (450) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +7 -0
  3. package/README.md +621 -0
  4. package/TRADEMARKS.md +41 -0
  5. package/dist/audit/aggregate.d.ts +5 -0
  6. package/dist/audit/aggregate.js +25 -0
  7. package/dist/audit/build.d.ts +2 -0
  8. package/dist/audit/build.js +224 -0
  9. package/dist/audit/errors.d.ts +25 -0
  10. package/dist/audit/errors.js +39 -0
  11. package/dist/audit/index-api.d.ts +14 -0
  12. package/dist/audit/index-api.js +131 -0
  13. package/dist/audit/index.d.ts +12 -0
  14. package/dist/audit/index.js +17 -0
  15. package/dist/audit/persist.d.ts +8 -0
  16. package/dist/audit/persist.js +40 -0
  17. package/dist/audit/redaction.d.ts +3 -0
  18. package/dist/audit/redaction.js +61 -0
  19. package/dist/audit/report.d.ts +18 -0
  20. package/dist/audit/report.js +50 -0
  21. package/dist/audit/retention.d.ts +3 -0
  22. package/dist/audit/retention.js +95 -0
  23. package/dist/audit/runid.d.ts +1 -0
  24. package/dist/audit/runid.js +29 -0
  25. package/dist/audit/side-file.d.ts +12 -0
  26. package/dist/audit/side-file.js +82 -0
  27. package/dist/audit/store.d.ts +12 -0
  28. package/dist/audit/store.js +198 -0
  29. package/dist/audit/types.d.ts +188 -0
  30. package/dist/audit/types.js +8 -0
  31. package/dist/audit/workflow-evidence.d.ts +27 -0
  32. package/dist/audit/workflow-evidence.js +145 -0
  33. package/dist/cli/context.d.ts +2 -0
  34. package/dist/cli/context.js +102 -0
  35. package/dist/cli/evaluate.d.ts +7 -0
  36. package/dist/cli/evaluate.js +207 -0
  37. package/dist/cli/evidence.d.ts +8 -0
  38. package/dist/cli/evidence.js +88 -0
  39. package/dist/cli/gateway-config.d.ts +10 -0
  40. package/dist/cli/gateway-config.js +12 -0
  41. package/dist/cli/gen-tests.d.ts +7 -0
  42. package/dist/cli/gen-tests.js +208 -0
  43. package/dist/cli/index.d.ts +2 -0
  44. package/dist/cli/index.js +14 -0
  45. package/dist/cli/investigate.d.ts +8 -0
  46. package/dist/cli/investigate.js +242 -0
  47. package/dist/cli/models.d.ts +3 -0
  48. package/dist/cli/models.js +64 -0
  49. package/dist/cli/run.d.ts +7 -0
  50. package/dist/cli/run.js +187 -0
  51. package/dist/cli/runner.d.ts +6 -0
  52. package/dist/cli/runner.js +83 -0
  53. package/dist/cli/ui.d.ts +31 -0
  54. package/dist/cli/ui.js +240 -0
  55. package/dist/cli/verify.d.ts +2 -0
  56. package/dist/cli/verify.js +103 -0
  57. package/dist/evaluations/fixtures/bug-investigation/happy-path.d.ts +2 -0
  58. package/dist/evaluations/fixtures/bug-investigation/happy-path.js +66 -0
  59. package/dist/evaluations/fixtures/bug-investigation/investigation-only.d.ts +2 -0
  60. package/dist/evaluations/fixtures/bug-investigation/investigation-only.js +39 -0
  61. package/dist/evaluations/fixtures/bug-investigation/unsafe-action.d.ts +2 -0
  62. package/dist/evaluations/fixtures/bug-investigation/unsafe-action.js +37 -0
  63. package/dist/evaluations/fixtures/index.d.ts +7 -0
  64. package/dist/evaluations/fixtures/index.js +35 -0
  65. package/dist/evaluations/fixtures/support.d.ts +5 -0
  66. package/dist/evaluations/fixtures/support.js +42 -0
  67. package/dist/evaluations/fixtures/unit-tests/happy-path.d.ts +2 -0
  68. package/dist/evaluations/fixtures/unit-tests/happy-path.js +40 -0
  69. package/dist/evaluations/fixtures/unit-tests/retry-then-accept.d.ts +2 -0
  70. package/dist/evaluations/fixtures/unit-tests/retry-then-accept.js +39 -0
  71. package/dist/evaluations/fixtures/unit-tests/unsafe-action.d.ts +2 -0
  72. package/dist/evaluations/fixtures/unit-tests/unsafe-action.js +32 -0
  73. package/dist/evaluations/index.d.ts +12 -0
  74. package/dist/evaluations/index.js +12 -0
  75. package/dist/evaluations/manifest-check.d.ts +1 -0
  76. package/dist/evaluations/manifest-check.js +48 -0
  77. package/dist/evaluations/model-provider.d.ts +12 -0
  78. package/dist/evaluations/model-provider.js +26 -0
  79. package/dist/evaluations/render.d.ts +2 -0
  80. package/dist/evaluations/render.js +59 -0
  81. package/dist/evaluations/runner-support.d.ts +27 -0
  82. package/dist/evaluations/runner-support.js +163 -0
  83. package/dist/evaluations/runner.d.ts +20 -0
  84. package/dist/evaluations/runner.js +174 -0
  85. package/dist/evaluations/scorer.d.ts +14 -0
  86. package/dist/evaluations/scorer.js +131 -0
  87. package/dist/evaluations/scripted-model.d.ts +6 -0
  88. package/dist/evaluations/scripted-model.js +26 -0
  89. package/dist/evaluations/surface-parity.d.ts +2 -0
  90. package/dist/evaluations/surface-parity.js +184 -0
  91. package/dist/evaluations/types.d.ts +74 -0
  92. package/dist/evaluations/types.js +16 -0
  93. package/dist/gateway/capabilities.d.ts +11 -0
  94. package/dist/gateway/capabilities.data.d.ts +2 -0
  95. package/dist/gateway/capabilities.data.js +203 -0
  96. package/dist/gateway/capabilities.js +41 -0
  97. package/dist/gateway/config.d.ts +15 -0
  98. package/dist/gateway/config.js +154 -0
  99. package/dist/gateway/errors.d.ts +72 -0
  100. package/dist/gateway/errors.js +82 -0
  101. package/dist/gateway/gateway.d.ts +19 -0
  102. package/dist/gateway/gateway.js +94 -0
  103. package/dist/gateway/index.d.ts +10 -0
  104. package/dist/gateway/index.js +11 -0
  105. package/dist/gateway/model-selection.d.ts +9 -0
  106. package/dist/gateway/model-selection.js +36 -0
  107. package/dist/gateway/normalize.d.ts +7 -0
  108. package/dist/gateway/normalize.js +93 -0
  109. package/dist/gateway/openai-adapter.d.ts +20 -0
  110. package/dist/gateway/openai-adapter.js +263 -0
  111. package/dist/gateway/redaction.d.ts +1 -0
  112. package/dist/gateway/redaction.js +51 -0
  113. package/dist/gateway/resilience.d.ts +24 -0
  114. package/dist/gateway/resilience.js +166 -0
  115. package/dist/gateway/types.d.ts +108 -0
  116. package/dist/gateway/types.js +2 -0
  117. package/dist/harness/adapters.d.ts +23 -0
  118. package/dist/harness/adapters.js +38 -0
  119. package/dist/harness/context.d.ts +33 -0
  120. package/dist/harness/context.js +21 -0
  121. package/dist/harness/emitter.d.ts +15 -0
  122. package/dist/harness/emitter.js +72 -0
  123. package/dist/harness/errors.d.ts +21 -0
  124. package/dist/harness/errors.js +39 -0
  125. package/dist/harness/executor.d.ts +3 -0
  126. package/dist/harness/executor.js +211 -0
  127. package/dist/harness/fingerprint.d.ts +6 -0
  128. package/dist/harness/fingerprint.js +43 -0
  129. package/dist/harness/index.d.ts +9 -0
  130. package/dist/harness/index.js +13 -0
  131. package/dist/harness/loop.d.ts +3 -0
  132. package/dist/harness/loop.js +159 -0
  133. package/dist/harness/patcher.d.ts +4 -0
  134. package/dist/harness/patcher.js +49 -0
  135. package/dist/harness/planner.d.ts +3 -0
  136. package/dist/harness/planner.js +21 -0
  137. package/dist/harness/ports.d.ts +61 -0
  138. package/dist/harness/ports.js +4 -0
  139. package/dist/harness/session.d.ts +25 -0
  140. package/dist/harness/session.js +116 -0
  141. package/dist/harness/sinks.d.ts +30 -0
  142. package/dist/harness/sinks.js +72 -0
  143. package/dist/harness/tasks/explain-plan.d.ts +3 -0
  144. package/dist/harness/tasks/explain-plan.js +29 -0
  145. package/dist/harness/tasks/generate-unit-tests.d.ts +3 -0
  146. package/dist/harness/tasks/generate-unit-tests.js +28 -0
  147. package/dist/harness/tasks/investigate-bug.d.ts +3 -0
  148. package/dist/harness/tasks/investigate-bug.js +31 -0
  149. package/dist/harness/tasks/policy.d.ts +11 -0
  150. package/dist/harness/tasks/policy.js +22 -0
  151. package/dist/harness/tasks/verify.d.ts +3 -0
  152. package/dist/harness/tasks/verify.js +16 -0
  153. package/dist/harness/types.d.ts +270 -0
  154. package/dist/harness/types.js +33 -0
  155. package/dist/index.d.ts +11 -0
  156. package/dist/index.js +36 -0
  157. package/dist/sdk/index.d.ts +9 -0
  158. package/dist/sdk/index.js +37 -0
  159. package/dist/sdk/run-agent.d.ts +16 -0
  160. package/dist/sdk/run-agent.js +56 -0
  161. package/dist/tools/browser/cdp-client.d.ts +35 -0
  162. package/dist/tools/browser/cdp-client.js +218 -0
  163. package/dist/tools/browser/errors.d.ts +25 -0
  164. package/dist/tools/browser/errors.js +55 -0
  165. package/dist/tools/browser/index.d.ts +5 -0
  166. package/dist/tools/browser/index.js +6 -0
  167. package/dist/tools/browser/session.d.ts +44 -0
  168. package/dist/tools/browser/session.js +748 -0
  169. package/dist/tools/browser/types.d.ts +48 -0
  170. package/dist/tools/browser/types.js +2 -0
  171. package/dist/tools/browser/validators.d.ts +5 -0
  172. package/dist/tools/browser/validators.js +97 -0
  173. package/dist/tools/errors.d.ts +59 -0
  174. package/dist/tools/errors.js +94 -0
  175. package/dist/tools/exec.d.ts +42 -0
  176. package/dist/tools/exec.js +327 -0
  177. package/dist/tools/index.d.ts +11 -0
  178. package/dist/tools/index.js +14 -0
  179. package/dist/tools/patch-content.d.ts +10 -0
  180. package/dist/tools/patch-content.js +126 -0
  181. package/dist/tools/patch-normalize.d.ts +1 -0
  182. package/dist/tools/patch-normalize.js +80 -0
  183. package/dist/tools/patch-parse.d.ts +8 -0
  184. package/dist/tools/patch-parse.js +201 -0
  185. package/dist/tools/patch.d.ts +18 -0
  186. package/dist/tools/patch.js +403 -0
  187. package/dist/tools/registry.d.ts +36 -0
  188. package/dist/tools/registry.js +231 -0
  189. package/dist/tools/sandbox.d.ts +8 -0
  190. package/dist/tools/sandbox.js +121 -0
  191. package/dist/tools/schemas.d.ts +2 -0
  192. package/dist/tools/schemas.js +51 -0
  193. package/dist/tools/terminal-policy.d.ts +9 -0
  194. package/dist/tools/terminal-policy.js +313 -0
  195. package/dist/tools/types.d.ts +99 -0
  196. package/dist/tools/types.js +103 -0
  197. package/dist/tools/writer.d.ts +7 -0
  198. package/dist/tools/writer.js +20 -0
  199. package/dist/ui/browser.d.ts +10 -0
  200. package/dist/ui/browser.js +231 -0
  201. package/dist/ui/chat-handlers.d.ts +4 -0
  202. package/dist/ui/chat-handlers.js +281 -0
  203. package/dist/ui/csp-hashes.json +17 -0
  204. package/dist/ui/csp.d.ts +2 -0
  205. package/dist/ui/csp.js +66 -0
  206. package/dist/ui/deps.d.ts +34 -0
  207. package/dist/ui/deps.js +137 -0
  208. package/dist/ui/evidence.d.ts +27 -0
  209. package/dist/ui/evidence.js +142 -0
  210. package/dist/ui/files-deny.d.ts +2 -0
  211. package/dist/ui/files-deny.js +12 -0
  212. package/dist/ui/files.d.ts +65 -0
  213. package/dist/ui/files.js +492 -0
  214. package/dist/ui/headers.d.ts +2 -0
  215. package/dist/ui/headers.js +21 -0
  216. package/dist/ui/host-check.d.ts +2 -0
  217. package/dist/ui/host-check.js +58 -0
  218. package/dist/ui/index.d.ts +20 -0
  219. package/dist/ui/index.js +23 -0
  220. package/dist/ui/load-csp.d.ts +1 -0
  221. package/dist/ui/load-csp.js +28 -0
  222. package/dist/ui/read-handlers.d.ts +8 -0
  223. package/dist/ui/read-handlers.js +247 -0
  224. package/dist/ui/routes.d.ts +36 -0
  225. package/dist/ui/routes.js +129 -0
  226. package/dist/ui/run-engine.d.ts +20 -0
  227. package/dist/ui/run-engine.js +345 -0
  228. package/dist/ui/run-handlers.d.ts +8 -0
  229. package/dist/ui/run-handlers.js +431 -0
  230. package/dist/ui/run-request.d.ts +13 -0
  231. package/dist/ui/run-request.js +219 -0
  232. package/dist/ui/runs.d.ts +43 -0
  233. package/dist/ui/runs.js +92 -0
  234. package/dist/ui/server.d.ts +11 -0
  235. package/dist/ui/server.js +143 -0
  236. package/dist/ui/sink.d.ts +27 -0
  237. package/dist/ui/sink.js +80 -0
  238. package/dist/ui/sse.d.ts +7 -0
  239. package/dist/ui/sse.js +27 -0
  240. package/dist/ui/static/404.html +1 -0
  241. package/dist/ui/static/_next/static/ca-A01hy9W98aRvMZKdAw/_buildManifest.js +1 -0
  242. package/dist/ui/static/_next/static/ca-A01hy9W98aRvMZKdAw/_ssgManifest.js +1 -0
  243. package/dist/ui/static/_next/static/chunks/255-d47fd57964443afe.js +1 -0
  244. package/dist/ui/static/_next/static/chunks/4-be1fef693af8e088.js +1 -0
  245. package/dist/ui/static/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +1 -0
  246. package/dist/ui/static/_next/static/chunks/app/_not-found/page-75825b09bcecad97.js +1 -0
  247. package/dist/ui/static/_next/static/chunks/app/launch/page-9c86a13c29884245.js +1 -0
  248. package/dist/ui/static/_next/static/chunks/app/layout-bdea63fe87947d50.js +1 -0
  249. package/dist/ui/static/_next/static/chunks/app/page-4168c12c68b7a853.js +1 -0
  250. package/dist/ui/static/_next/static/chunks/framework-a6e0b7e30f98059a.js +1 -0
  251. package/dist/ui/static/_next/static/chunks/main-778a50aebff02192.js +1 -0
  252. package/dist/ui/static/_next/static/chunks/main-app-30679af7240d63e9.js +1 -0
  253. package/dist/ui/static/_next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
  254. package/dist/ui/static/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
  255. package/dist/ui/static/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  256. package/dist/ui/static/_next/static/chunks/webpack-4a462cecab786e93.js +1 -0
  257. package/dist/ui/static/_next/static/css/be7cb54d5c5673b6.css +1 -0
  258. package/dist/ui/static/assets/editors/goland.svg +35 -0
  259. package/dist/ui/static/assets/editors/intellij.svg +39 -0
  260. package/dist/ui/static/assets/editors/pycharm.svg +58 -0
  261. package/dist/ui/static/assets/editors/rustrover.svg +19 -0
  262. package/dist/ui/static/assets/editors/vscode.svg +1 -0
  263. package/dist/ui/static/assets/editors/webstorm.svg +21 -0
  264. package/dist/ui/static/assets/icons/anthropic.svg +1 -0
  265. package/dist/ui/static/assets/icons/brave.svg +1 -0
  266. package/dist/ui/static/assets/icons/css3.svg +1 -0
  267. package/dist/ui/static/assets/icons/docker.svg +1 -0
  268. package/dist/ui/static/assets/icons/git.svg +1 -0
  269. package/dist/ui/static/assets/icons/github.svg +1 -0
  270. package/dist/ui/static/assets/icons/go.svg +1 -0
  271. package/dist/ui/static/assets/icons/gradle.svg +1 -0
  272. package/dist/ui/static/assets/icons/grafana.svg +1 -0
  273. package/dist/ui/static/assets/icons/graphql.svg +1 -0
  274. package/dist/ui/static/assets/icons/html5.svg +1 -0
  275. package/dist/ui/static/assets/icons/image.svg +1 -0
  276. package/dist/ui/static/assets/icons/java.svg +1 -0
  277. package/dist/ui/static/assets/icons/javascript.svg +1 -0
  278. package/dist/ui/static/assets/icons/json.svg +1 -0
  279. package/dist/ui/static/assets/icons/kafka.svg +1 -0
  280. package/dist/ui/static/assets/icons/kubernetes.svg +1 -0
  281. package/dist/ui/static/assets/icons/linear.svg +1 -0
  282. package/dist/ui/static/assets/icons/markdown.svg +1 -0
  283. package/dist/ui/static/assets/icons/nginx.svg +1 -0
  284. package/dist/ui/static/assets/icons/nodejs.svg +1 -0
  285. package/dist/ui/static/assets/icons/notion.svg +1 -0
  286. package/dist/ui/static/assets/icons/openai.svg +1 -0
  287. package/dist/ui/static/assets/icons/playwright.svg +1 -0
  288. package/dist/ui/static/assets/icons/postgresql.svg +1 -0
  289. package/dist/ui/static/assets/icons/prometheus.svg +1 -0
  290. package/dist/ui/static/assets/icons/properties.svg +1 -0
  291. package/dist/ui/static/assets/icons/puppeteer.svg +1 -0
  292. package/dist/ui/static/assets/icons/python.svg +1 -0
  293. package/dist/ui/static/assets/icons/react.svg +1 -0
  294. package/dist/ui/static/assets/icons/redis.svg +1 -0
  295. package/dist/ui/static/assets/icons/rust.svg +1 -0
  296. package/dist/ui/static/assets/icons/sentry.svg +1 -0
  297. package/dist/ui/static/assets/icons/slack.svg +1 -0
  298. package/dist/ui/static/assets/icons/spring.svg +1 -0
  299. package/dist/ui/static/assets/icons/typescript.svg +1 -0
  300. package/dist/ui/static/assets/icons/upstash.svg +1 -0
  301. package/dist/ui/static/assets/icons/yaml.svg +1 -0
  302. package/dist/ui/static/assets/keiko-logo.svg +10 -0
  303. package/dist/ui/static/index.html +1 -0
  304. package/dist/ui/static/index.txt +19 -0
  305. package/dist/ui/static/keiko-logo.svg +10 -0
  306. package/dist/ui/static/launch.html +1 -0
  307. package/dist/ui/static/launch.txt +19 -0
  308. package/dist/ui/static.d.ts +3 -0
  309. package/dist/ui/static.js +72 -0
  310. package/dist/ui/store/chats.d.ts +14 -0
  311. package/dist/ui/store/chats.js +110 -0
  312. package/dist/ui/store/db.d.ts +6 -0
  313. package/dist/ui/store/db.js +182 -0
  314. package/dist/ui/store/errors.d.ts +12 -0
  315. package/dist/ui/store/errors.js +30 -0
  316. package/dist/ui/store/index.d.ts +6 -0
  317. package/dist/ui/store/index.js +6 -0
  318. package/dist/ui/store/messages.d.ts +5 -0
  319. package/dist/ui/store/messages.js +137 -0
  320. package/dist/ui/store/paths.d.ts +4 -0
  321. package/dist/ui/store/paths.js +69 -0
  322. package/dist/ui/store/projects.d.ts +7 -0
  323. package/dist/ui/store/projects.js +61 -0
  324. package/dist/ui/store/schema.d.ts +3 -0
  325. package/dist/ui/store/schema.js +77 -0
  326. package/dist/ui/store/types.d.ts +80 -0
  327. package/dist/ui/store/types.js +3 -0
  328. package/dist/ui/store/validation.d.ts +4 -0
  329. package/dist/ui/store/validation.js +72 -0
  330. package/dist/ui/store-handlers.d.ts +16 -0
  331. package/dist/ui/store-handlers.js +465 -0
  332. package/dist/ui/terminal-errors.d.ts +21 -0
  333. package/dist/ui/terminal-errors.js +45 -0
  334. package/dist/ui/terminal-evidence.d.ts +20 -0
  335. package/dist/ui/terminal-evidence.js +65 -0
  336. package/dist/ui/terminal-routes.d.ts +9 -0
  337. package/dist/ui/terminal-routes.js +219 -0
  338. package/dist/ui/terminal.d.ts +67 -0
  339. package/dist/ui/terminal.js +835 -0
  340. package/dist/verification/classify.d.ts +10 -0
  341. package/dist/verification/classify.js +53 -0
  342. package/dist/verification/detect.d.ts +4 -0
  343. package/dist/verification/detect.js +81 -0
  344. package/dist/verification/errors.d.ts +11 -0
  345. package/dist/verification/errors.js +21 -0
  346. package/dist/verification/index.d.ts +17 -0
  347. package/dist/verification/index.js +13 -0
  348. package/dist/verification/limits.d.ts +3 -0
  349. package/dist/verification/limits.js +40 -0
  350. package/dist/verification/monitor.d.ts +4 -0
  351. package/dist/verification/monitor.js +58 -0
  352. package/dist/verification/orchestrator.d.ts +16 -0
  353. package/dist/verification/orchestrator.js +363 -0
  354. package/dist/verification/plan.d.ts +9 -0
  355. package/dist/verification/plan.js +125 -0
  356. package/dist/verification/summary.d.ts +40 -0
  357. package/dist/verification/summary.js +67 -0
  358. package/dist/verification/types.d.ts +63 -0
  359. package/dist/verification/types.js +13 -0
  360. package/dist/workflows/bug-investigation/context.d.ts +7 -0
  361. package/dist/workflows/bug-investigation/context.js +119 -0
  362. package/dist/workflows/bug-investigation/descriptor.d.ts +3 -0
  363. package/dist/workflows/bug-investigation/descriptor.js +46 -0
  364. package/dist/workflows/bug-investigation/emit.d.ts +12 -0
  365. package/dist/workflows/bug-investigation/emit.js +35 -0
  366. package/dist/workflows/bug-investigation/events.d.ts +81 -0
  367. package/dist/workflows/bug-investigation/events.js +9 -0
  368. package/dist/workflows/bug-investigation/failure-parse.d.ts +3 -0
  369. package/dist/workflows/bug-investigation/failure-parse.js +154 -0
  370. package/dist/workflows/bug-investigation/guard.d.ts +2 -0
  371. package/dist/workflows/bug-investigation/guard.js +69 -0
  372. package/dist/workflows/bug-investigation/index.d.ts +7 -0
  373. package/dist/workflows/bug-investigation/index.js +13 -0
  374. package/dist/workflows/bug-investigation/internal.d.ts +37 -0
  375. package/dist/workflows/bug-investigation/internal.js +64 -0
  376. package/dist/workflows/bug-investigation/model-loop.d.ts +4 -0
  377. package/dist/workflows/bug-investigation/model-loop.js +223 -0
  378. package/dist/workflows/bug-investigation/parse.d.ts +3 -0
  379. package/dist/workflows/bug-investigation/parse.js +123 -0
  380. package/dist/workflows/bug-investigation/prompt.d.ts +4 -0
  381. package/dist/workflows/bug-investigation/prompt.js +107 -0
  382. package/dist/workflows/bug-investigation/report.d.ts +23 -0
  383. package/dist/workflows/bug-investigation/report.js +151 -0
  384. package/dist/workflows/bug-investigation/stages.d.ts +13 -0
  385. package/dist/workflows/bug-investigation/stages.js +242 -0
  386. package/dist/workflows/bug-investigation/types.d.ts +91 -0
  387. package/dist/workflows/bug-investigation/types.js +14 -0
  388. package/dist/workflows/bug-investigation/verify-stage.d.ts +10 -0
  389. package/dist/workflows/bug-investigation/verify-stage.js +91 -0
  390. package/dist/workflows/bug-investigation/workflow.d.ts +2 -0
  391. package/dist/workflows/bug-investigation/workflow.js +74 -0
  392. package/dist/workflows/descriptor.d.ts +20 -0
  393. package/dist/workflows/descriptor.js +8 -0
  394. package/dist/workflows/index.d.ts +3 -0
  395. package/dist/workflows/index.js +2 -0
  396. package/dist/workflows/unit-tests/context.d.ts +7 -0
  397. package/dist/workflows/unit-tests/context.js +129 -0
  398. package/dist/workflows/unit-tests/conventions.d.ts +4 -0
  399. package/dist/workflows/unit-tests/conventions.js +87 -0
  400. package/dist/workflows/unit-tests/descriptor.d.ts +4 -0
  401. package/dist/workflows/unit-tests/descriptor.js +43 -0
  402. package/dist/workflows/unit-tests/emit.d.ts +12 -0
  403. package/dist/workflows/unit-tests/emit.js +35 -0
  404. package/dist/workflows/unit-tests/events.d.ts +78 -0
  405. package/dist/workflows/unit-tests/events.js +7 -0
  406. package/dist/workflows/unit-tests/index.d.ts +6 -0
  407. package/dist/workflows/unit-tests/index.js +10 -0
  408. package/dist/workflows/unit-tests/internal.d.ts +35 -0
  409. package/dist/workflows/unit-tests/internal.js +43 -0
  410. package/dist/workflows/unit-tests/model-loop.d.ts +4 -0
  411. package/dist/workflows/unit-tests/model-loop.js +95 -0
  412. package/dist/workflows/unit-tests/parse.d.ts +6 -0
  413. package/dist/workflows/unit-tests/parse.js +68 -0
  414. package/dist/workflows/unit-tests/prompt.d.ts +4 -0
  415. package/dist/workflows/unit-tests/prompt.js +71 -0
  416. package/dist/workflows/unit-tests/report.d.ts +21 -0
  417. package/dist/workflows/unit-tests/report.js +90 -0
  418. package/dist/workflows/unit-tests/stages.d.ts +9 -0
  419. package/dist/workflows/unit-tests/stages.js +155 -0
  420. package/dist/workflows/unit-tests/types.d.ts +70 -0
  421. package/dist/workflows/unit-tests/types.js +11 -0
  422. package/dist/workflows/unit-tests/verify-stage.d.ts +9 -0
  423. package/dist/workflows/unit-tests/verify-stage.js +56 -0
  424. package/dist/workflows/unit-tests/workflow.d.ts +2 -0
  425. package/dist/workflows/unit-tests/workflow.js +58 -0
  426. package/dist/workspace/contextPack.d.ts +9 -0
  427. package/dist/workspace/contextPack.js +94 -0
  428. package/dist/workspace/detect.d.ts +3 -0
  429. package/dist/workspace/detect.js +135 -0
  430. package/dist/workspace/discovery.d.ts +9 -0
  431. package/dist/workspace/discovery.js +167 -0
  432. package/dist/workspace/errors.d.ts +39 -0
  433. package/dist/workspace/errors.js +66 -0
  434. package/dist/workspace/fs.d.ts +21 -0
  435. package/dist/workspace/fs.js +36 -0
  436. package/dist/workspace/ignore.d.ts +14 -0
  437. package/dist/workspace/ignore.js +176 -0
  438. package/dist/workspace/index.d.ts +11 -0
  439. package/dist/workspace/index.js +13 -0
  440. package/dist/workspace/paths.d.ts +2 -0
  441. package/dist/workspace/paths.js +38 -0
  442. package/dist/workspace/realpath.d.ts +7 -0
  443. package/dist/workspace/realpath.js +72 -0
  444. package/dist/workspace/retrieval.d.ts +9 -0
  445. package/dist/workspace/retrieval.js +74 -0
  446. package/dist/workspace/summary.d.ts +3 -0
  447. package/dist/workspace/summary.js +54 -0
  448. package/dist/workspace/types.d.ts +103 -0
  449. package/dist/workspace/types.js +27 -0
  450. package/package.json +58 -0
@@ -0,0 +1,345 @@
1
+ // The run engine (ADR-0011 D7/D8): it starts a dry-run-first run in the BACKGROUND and bridges it to
2
+ // the registry + streaming sink. It maps a validated RunRequest to the existing workflow / harness
3
+ // entry points UNCHANGED — generateUnitTests / investigateBug / createSession — and never calls a
4
+ // model directly or reimplements a guard. The BFF owns the runId (injected via the workflow idSource
5
+ // / read from the harness session) and a fingerprint so the 202 response is synchronous; completion
6
+ // is captured into the registry asynchronously. `apply` defaults false; the only place apply becomes
7
+ // true is the gated apply path (run-handlers), which re-invokes this engine with apply:true.
8
+ import { createHash, randomUUID } from "node:crypto";
9
+ import { DryRunToolPort } from "../harness/index.js";
10
+ import { canonicalise, createSession, HARNESS_VERSION, } from "../harness/index.js";
11
+ import { generateUnitTests, investigateBug } from "../workflows/index.js";
12
+ import { buildVerificationPlan, detectScripts, runVerification, } from "../verification/index.js";
13
+ import { detectWorkspace, readWorkspaceFile } from "../workspace/index.js";
14
+ import { DEFAULT_LIMITS } from "../harness/index.js";
15
+ import { QueueEventSink } from "./sink.js";
16
+ import { persistWorkflowEvidence, persistExplainEvidence, persistVerifyEvidence, } from "./evidence.js";
17
+ const KIND_TO_TASK_TYPE = {
18
+ "unit-tests": "generate-unit-tests",
19
+ "bug-investigation": "investigate-bug",
20
+ "explain-plan": "explain-plan",
21
+ verify: "verify",
22
+ };
23
+ // Assembles the workflow/task input by overlaying the request-level fields onto the client `input`
24
+ // object. The workflow validates the shape at its own boundary; the cast is the single typed
25
+ // boundary (no `any` — the value is built from validated primitives plus the passthrough record).
26
+ function unitTestInput(request) {
27
+ return {
28
+ ...request.input,
29
+ modelId: request.modelId,
30
+ apply: request.apply,
31
+ ...(request.limits === undefined ? {} : { limits: request.limits }),
32
+ };
33
+ }
34
+ function bugInput(request) {
35
+ return {
36
+ ...request.input,
37
+ modelId: request.modelId,
38
+ apply: request.apply,
39
+ ...(request.limits === undefined ? {} : { limits: request.limits }),
40
+ };
41
+ }
42
+ function explainTask(request) {
43
+ const root = workspaceRoot(request);
44
+ const filePath = request.input.filePath;
45
+ if (typeof filePath !== "string" || filePath.length === 0) {
46
+ return { taskType: "explain-plan", input: request.input };
47
+ }
48
+ const workspace = detectWorkspace(root);
49
+ const file = readWorkspaceFile(workspace, filePath, { maxBytes: 32_768 });
50
+ const context = [
51
+ `--- ${file.relativePath}${file.truncated ? " (truncated)" : ""} ---`,
52
+ file.text,
53
+ ].join("\n");
54
+ return { taskType: "explain-plan", input: { ...request.input, context } };
55
+ }
56
+ function workspaceRoot(request) {
57
+ const root = request.input.workspaceRoot;
58
+ if (typeof root !== "string" || root.length === 0) {
59
+ throw new Error("validated RunRequest is missing workspaceRoot");
60
+ }
61
+ return root;
62
+ }
63
+ function workflowFingerprint(request) {
64
+ const taskType = KIND_TO_TASK_TYPE[request.kind];
65
+ const canonical = canonicalise({
66
+ taskType,
67
+ taskInput: { taskType, input: request.input },
68
+ limits: request.limits ?? {},
69
+ modelId: request.modelId,
70
+ workingDirectory: workspaceRoot(request),
71
+ dryRun: true,
72
+ harnessVersion: HARNESS_VERSION,
73
+ });
74
+ return createHash("sha256").update(canonical, "utf8").digest("hex");
75
+ }
76
+ // dry-run-success (appliable) states per workflow. Only these produce an appliable snapshot for the
77
+ // gated apply path; any other terminal state is non-appliable (409 on apply).
78
+ function unitTestStatusToRun(status) {
79
+ return status === "completed" || status === "dry-run" ? "completed" : statusOrFailed(status);
80
+ }
81
+ function bugStatusToRun(status) {
82
+ if (status === "fix-applied" || status === "fix-proposed" || status === "investigation-only") {
83
+ return "completed";
84
+ }
85
+ return statusOrFailed(status);
86
+ }
87
+ function statusOrFailed(status) {
88
+ return status === "cancelled" ? "cancelled" : "failed";
89
+ }
90
+ function unitTestAppliable(request, report) {
91
+ return report.status === "dry-run" && report.proposedDiff !== undefined
92
+ ? { kind: "unit-tests", payload: request.input, limits: request.limits }
93
+ : undefined;
94
+ }
95
+ function bugAppliable(request, report) {
96
+ return report.status === "fix-proposed" && report.proposedDiff !== undefined
97
+ ? { kind: "bug-investigation", payload: request.input, limits: request.limits }
98
+ : undefined;
99
+ }
100
+ // Starts the underlying run for a workflow request: an AbortController drives cancellation (the
101
+ // workflow honours deps.signal), and the BFF-owned runId is injected as the workflow idSource so the
102
+ // streamed events carry the same runId the registry/SSE key on.
103
+ function dispatchWorkflow(ctx, sink, runId) {
104
+ const controller = new AbortController();
105
+ const commonDeps = {
106
+ model: ctx.model,
107
+ sink,
108
+ signal: controller.signal,
109
+ idSource: () => runId,
110
+ };
111
+ if (ctx.request.kind === "unit-tests") {
112
+ const result = generateUnitTests(unitTestInput(ctx.request), commonDeps).then((report) => ({
113
+ status: unitTestStatusToRun(report.status),
114
+ report,
115
+ appliable: unitTestAppliable(ctx.request, report),
116
+ }));
117
+ return {
118
+ result,
119
+ cancel: (reason) => {
120
+ controller.abort(reason);
121
+ },
122
+ };
123
+ }
124
+ const result = investigateBug(bugInput(ctx.request), commonDeps).then((report) => ({
125
+ status: bugStatusToRun(report.status),
126
+ report,
127
+ appliable: bugAppliable(ctx.request, report),
128
+ }));
129
+ return {
130
+ result,
131
+ cancel: (reason) => {
132
+ controller.abort(reason);
133
+ },
134
+ };
135
+ }
136
+ // Starts an explain-plan harness run. createSession returns the runId/fingerprint synchronously and
137
+ // exposes its own cancel(); the BFF reuses those rather than injecting an id.
138
+ function dispatchExplain(ctx, sink, reservedRunId) {
139
+ const config = {
140
+ model: ctx.request.modelId,
141
+ workingDirectory: workspaceRoot(ctx.request),
142
+ dryRun: true,
143
+ ...(ctx.request.limits === undefined ? {} : { limits: ctx.request.limits }),
144
+ };
145
+ const session = createSession(explainTask(ctx.request), config, {
146
+ model: ctx.model,
147
+ tools: new DryRunToolPort(),
148
+ sink,
149
+ ...(reservedRunId === undefined
150
+ ? {}
151
+ : { idSource: { newRunId: () => reservedRunId } }),
152
+ });
153
+ const result = session.result.then((runResult) => ({
154
+ status: runResult.outcome === "completed" ? "completed" : statusOrFailed(runResult.outcome),
155
+ report: runResult.report ?? { status: runResult.outcome },
156
+ appliable: undefined,
157
+ result: runResult,
158
+ }));
159
+ return {
160
+ dispatched: {
161
+ result,
162
+ cancel: (reason) => {
163
+ session.cancel(reason);
164
+ },
165
+ },
166
+ runId: session.runId,
167
+ fingerprint: session.fingerprint,
168
+ };
169
+ }
170
+ // Maps a VerificationStatus to the BFF RunStatus. Verify has no "appliable" snapshot — the gates
171
+ // either pass, fail/skip/deny (terminal), or are cancelled. `passed` → completed; `cancelled` →
172
+ // cancelled; every other terminal status (failed/skipped/denied/timed-out/resource-exceeded) is
173
+ // surfaced as `failed` so the registry stays in a known terminal state.
174
+ function verifyStatusToRun(status) {
175
+ if (status === "passed") {
176
+ return "completed";
177
+ }
178
+ if (status === "cancelled") {
179
+ return "cancelled";
180
+ }
181
+ return "failed";
182
+ }
183
+ // Builds a structurally-valid HarnessEvent envelope for a verify run's run:started/run:completed
184
+ // SSE events. Verify never enters the harness loop, but the SSE consumer keys on `type` and the
185
+ // shared envelope (`schemaVersion`/`runId`/`fingerprint`/`seq`/`ts`) so a deterministic shape lets
186
+ // the UI render a synthetic timeline alongside the workflow runs.
187
+ function emitVerifyStart(sink, runId, fingerprint, modelId) {
188
+ const event = {
189
+ schemaVersion: "1",
190
+ runId,
191
+ fingerprint,
192
+ seq: 0,
193
+ ts: Date.now(),
194
+ type: "run:started",
195
+ taskType: "verify",
196
+ modelId,
197
+ limits: DEFAULT_LIMITS,
198
+ };
199
+ sink.emit(event);
200
+ }
201
+ function emitVerifyComplete(sink, runId, fingerprint, report) {
202
+ const event = {
203
+ schemaVersion: "1",
204
+ runId,
205
+ fingerprint,
206
+ seq: 1,
207
+ ts: Date.now(),
208
+ type: "run:completed",
209
+ report: `verify overall=${report.overallStatus}`,
210
+ };
211
+ sink.emit(event);
212
+ }
213
+ // Starts a deterministic verify run via the verification orchestrator. No model loop is entered;
214
+ // the AbortController bridges the BFF cancel path to the orchestrator's signal. The two SSE events
215
+ // (`run:started`, `run:completed`) frame the run for any attached UI subscriber.
216
+ function dispatchVerify(ctx, sink, runId) {
217
+ const controller = new AbortController();
218
+ const fingerprint = workflowFingerprint(ctx.request);
219
+ const root = workspaceRoot(ctx.request);
220
+ emitVerifyStart(sink, runId, fingerprint, ctx.request.modelId);
221
+ const result = runVerify(ctx, controller.signal, root).then((report) => {
222
+ emitVerifyComplete(sink, runId, fingerprint, report);
223
+ return {
224
+ status: verifyStatusToRun(report.overallStatus),
225
+ report,
226
+ appliable: undefined,
227
+ };
228
+ });
229
+ return {
230
+ result,
231
+ cancel: (reason) => {
232
+ controller.abort(reason);
233
+ },
234
+ };
235
+ }
236
+ async function runVerify(ctx, signal, root) {
237
+ const workspace = detectWorkspace(root);
238
+ const catalog = detectScripts(workspace);
239
+ const targetFiles = readTargetFiles(ctx.request.input.targetFiles);
240
+ const plan = buildVerificationPlan(workspace, catalog, {
241
+ ...(targetFiles === undefined ? {} : { changedFiles: targetFiles }),
242
+ });
243
+ return runVerification(plan, { workspace, signal });
244
+ }
245
+ function readTargetFiles(value) {
246
+ if (!Array.isArray(value)) {
247
+ return undefined;
248
+ }
249
+ return value.filter((entry) => typeof entry === "string" && entry.length > 0);
250
+ }
251
+ // Registers the run, wires completion capture, and returns the synchronous {runId, fingerprint}. The
252
+ // caller (POST /api/runs) has already validated the request and resolved the ModelPort. Throws
253
+ // ActiveRunLimitError when the registry is at capacity (mapped to 429 upstream).
254
+ export function startRun(ctx, redactReport, options = {}) {
255
+ const sink = new QueueEventSink();
256
+ const startedAt = Date.now();
257
+ if (ctx.request.kind === "explain-plan") {
258
+ const { dispatched, runId, fingerprint } = dispatchExplain(ctx, sink, options.runId);
259
+ registerAndCapture(ctx, { runId, fingerprint, sink, startedAt }, dispatched, redactReport);
260
+ return { runId, fingerprint };
261
+ }
262
+ if (ctx.request.kind === "verify") {
263
+ const runId = options.runId ?? randomUUID();
264
+ const fingerprint = workflowFingerprint(ctx.request);
265
+ const dispatched = dispatchVerify(ctx, sink, runId);
266
+ registerAndCapture(ctx, { runId, fingerprint, sink, startedAt }, dispatched, redactReport);
267
+ return { runId, fingerprint };
268
+ }
269
+ const runId = options.runId ?? randomUUID();
270
+ const fingerprint = workflowFingerprint(ctx.request);
271
+ const dispatched = dispatchWorkflow(ctx, sink, runId);
272
+ registerAndCapture(ctx, { runId, fingerprint, sink, startedAt }, dispatched, redactReport);
273
+ return { runId, fingerprint };
274
+ }
275
+ function registerAndCapture(ctx, identity, dispatched, redactReport) {
276
+ ctx.registry.register({
277
+ runId: identity.runId,
278
+ fingerprint: identity.fingerprint,
279
+ modelId: ctx.request.modelId,
280
+ sink: identity.sink,
281
+ cancel: dispatched.cancel,
282
+ });
283
+ void dispatched.result
284
+ .then((outcome) => {
285
+ const evidence = persistOutcome(ctx, identity, outcome);
286
+ ctx.registry.complete(identity.runId, outcome.status, redactReport(attachEvidenceReport(outcome.report, evidence)), outcome.appliable);
287
+ })
288
+ .catch((error) => {
289
+ ctx.registry.complete(identity.runId, "failed", redactReport({ error: String(error) }), undefined);
290
+ })
291
+ .finally(() => {
292
+ identity.sink.closeAll();
293
+ });
294
+ }
295
+ // Persists a terminated run's redacted evidence manifest (AC5). Persistence errors intentionally
296
+ // surface to the final registry payload so a terminal UI run cannot silently omit required evidence.
297
+ function persistOutcome(ctx, identity, outcome) {
298
+ if (ctx.evidence === undefined) {
299
+ return undefined;
300
+ }
301
+ const runIdentity = {
302
+ runId: identity.runId,
303
+ fingerprint: identity.fingerprint,
304
+ modelId: ctx.request.modelId,
305
+ kind: ctx.request.kind,
306
+ status: outcome.status,
307
+ startedAt: identity.startedAt,
308
+ finishedAt: Date.now(),
309
+ workspaceRoot: workspaceRoot(ctx.request),
310
+ };
311
+ if (ctx.request.kind === "explain-plan" && outcome.result !== undefined) {
312
+ return persistExplainEvidence(runIdentity, outcome.result, ctx.evidence);
313
+ }
314
+ if (ctx.request.kind === "verify") {
315
+ return persistVerifyEvidence(runIdentity, ctx.evidence);
316
+ }
317
+ return persistWorkflowEvidence(runIdentity, outcome.report, identity.sink.buffered(), ctx.evidence);
318
+ }
319
+ function attachEvidenceReport(report, evidence) {
320
+ if (evidence === undefined) {
321
+ return report;
322
+ }
323
+ if (isRecord(report)) {
324
+ return { ...report, evidence };
325
+ }
326
+ return { report, evidence };
327
+ }
328
+ // Re-invokes a workflow with apply:true through the SAME gated entry point (D8). This is the only
329
+ // place the engine sets apply:true; it does not construct a patch or write a file — the workflow's
330
+ // own guards (isSensitivePath, patch limits, #6 applyEnabled) fire at its boundary. Awaits the
331
+ // apply+verify result and returns the redacted report. The model is resolved by the caller.
332
+ export async function applyRun(snapshot, model, modelId, redactReport) {
333
+ const input = isRecord(snapshot.payload) ? snapshot.payload : {};
334
+ const limitsOverride = snapshot.limits !== undefined ? { limits: snapshot.limits } : {};
335
+ const deps = { model };
336
+ if (snapshot.kind === "unit-tests") {
337
+ const report = await generateUnitTests({ ...input, modelId, apply: true, ...limitsOverride }, deps);
338
+ return redactReport(report);
339
+ }
340
+ const report = await investigateBug({ ...input, modelId, apply: true, ...limitsOverride }, deps);
341
+ return redactReport(report);
342
+ }
343
+ function isRecord(value) {
344
+ return typeof value === "object" && value !== null && !Array.isArray(value);
345
+ }
@@ -0,0 +1,8 @@
1
+ import type { RouteContext, RouteResult, HandlerOutcome } from "./routes.js";
2
+ import type { UiHandlerDeps } from "./deps.js";
3
+ export declare function handleCreateRun(ctx: RouteContext, deps: UiHandlerDeps): Promise<RouteResult>;
4
+ export declare function handleCreateChatRun(ctx: RouteContext, deps: UiHandlerDeps): Promise<RouteResult>;
5
+ export declare function handleRunEvents(ctx: RouteContext, deps: UiHandlerDeps): HandlerOutcome;
6
+ export declare function handleCancelRun(ctx: RouteContext, deps: UiHandlerDeps): RouteResult;
7
+ export declare function handleGetRun(ctx: RouteContext, deps: UiHandlerDeps): RouteResult;
8
+ export declare function handleApplyRun(ctx: RouteContext, deps: UiHandlerDeps): Promise<RouteResult>;