@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,121 @@
1
+ // PURE sandbox logic: the trust boundary's decision functions. No filesystem, no spawn, no
2
+ // node:child_process imports — every effect lives in exec.ts/writer.ts. These functions are
3
+ // individually unit-testable so the security invariants (env isolation, deny-by-default) are
4
+ // pinned down. Only node:path (a pure string utility) is imported here.
5
+ import { basename } from "node:path";
6
+ // Builds the child env by copying ONLY allowlisted names that are present in the parent.
7
+ // NEVER spreads `...processEnv`, so no credential-bearing variable can leak into the child.
8
+ export function buildSandboxEnv(processEnv, allowlist) {
9
+ const env = {};
10
+ for (const name of allowlist) {
11
+ const value = processEnv[name];
12
+ if (value !== undefined) {
13
+ env[name] = value;
14
+ }
15
+ }
16
+ return env;
17
+ }
18
+ // Collects the values of every parent env var that is NOT on the allowlist, so the command's
19
+ // captured stdout/stderr can be scrubbed of any secret a child still managed to print (e.g. a
20
+ // tool that reads a token from its own config and echoes it). Empty/short values are skipped to
21
+ // avoid over-redaction. The allowlisted, non-secret values (PATH, HOME, …) are deliberately kept.
22
+ export function collectSensitiveEnvValues(processEnv, allowlist) {
23
+ const allowed = new Set(allowlist);
24
+ const values = [];
25
+ for (const [name, value] of Object.entries(processEnv)) {
26
+ if (allowed.has(name)) {
27
+ continue;
28
+ }
29
+ if (value !== undefined && value.length >= 6) {
30
+ values.push(value);
31
+ }
32
+ }
33
+ return values;
34
+ }
35
+ function hasPathSeparator(value) {
36
+ return value.includes("/") || value.includes("\\");
37
+ }
38
+ function hasNul(value) {
39
+ return value.includes("\u0000");
40
+ }
41
+ // Resolves the subcommand: the first non-flag token, skipping leading flags AND the value of any
42
+ // value-taking flag (`--prefix DIR`, `-C DIR`). This is the S-H2 fix — a value can no longer
43
+ // masquerade as the subcommand. `--flag=value` carries its value inline, so only the flag token is
44
+ // consumed. Returns undefined when no subcommand token is present.
45
+ function resolveSubcommand(rule, args) {
46
+ const valueFlags = new Set(rule.valueFlags ?? []);
47
+ let skipNext = false;
48
+ for (const arg of args) {
49
+ if (skipNext) {
50
+ skipNext = false; // this token is the value of the preceding value-flag; skip it
51
+ continue;
52
+ }
53
+ if (!arg.startsWith("-")) {
54
+ return arg;
55
+ }
56
+ // A `-f=value` / `--flag=value` token carries its own value; consume just this token.
57
+ if (!arg.includes("=") && valueFlags.has(arg)) {
58
+ skipNext = true; // the following token is this flag's value
59
+ }
60
+ }
61
+ return undefined;
62
+ }
63
+ // Denies the whole invocation if any denied flag (e.g. npm/npx `-c`/`--call`) appears anywhere in
64
+ // args, in either `--call x` or `--call=x` form. These execute a transitive shell (S-H2).
65
+ function hasDeniedFlag(rule, args) {
66
+ const denied = rule.denyFlags;
67
+ if (denied === undefined) {
68
+ return false;
69
+ }
70
+ return args.some((arg) => {
71
+ const flag = arg.includes("=") ? arg.slice(0, arg.indexOf("=")) : arg;
72
+ return denied.includes(flag);
73
+ });
74
+ }
75
+ function checkAllowlistMode(rule, allowed, sub) {
76
+ if (sub === undefined || !allowed.includes(sub)) {
77
+ return { allowed: false, reason: `subcommand not allowed: ${rule.executable} ${sub ?? ""}` };
78
+ }
79
+ return { allowed: true };
80
+ }
81
+ function checkDenylistMode(rule, sub) {
82
+ // Deny-by-default on the subcommand: when a known-subcommand set is declared, an unrecognized
83
+ // first non-flag token (e.g. a stray path from a value-flag bypass) is denied.
84
+ if (rule.knownSubcommands !== undefined &&
85
+ (sub === undefined || !rule.knownSubcommands.includes(sub))) {
86
+ return { allowed: false, reason: `unrecognized subcommand: ${rule.executable} ${sub ?? ""}` };
87
+ }
88
+ if (rule.deniedSubcommands !== undefined &&
89
+ sub !== undefined &&
90
+ rule.deniedSubcommands.includes(sub)) {
91
+ return { allowed: false, reason: `subcommand denied: ${rule.executable} ${sub}` };
92
+ }
93
+ return { allowed: true };
94
+ }
95
+ function checkSubcommand(rule, args) {
96
+ if (hasDeniedFlag(rule, args)) {
97
+ return { allowed: false, reason: `denied flag for ${rule.executable}` };
98
+ }
99
+ const sub = resolveSubcommand(rule, args);
100
+ if (rule.allowedSubcommands !== undefined) {
101
+ return checkAllowlistMode(rule, rule.allowedSubcommands, sub);
102
+ }
103
+ return checkDenylistMode(rule, sub);
104
+ }
105
+ // PURE deny-by-default decision. The executable must be a BARE name (no path separators, no
106
+ // NUL): we match by basename against the rules and reject anything unlisted. This is evaluated
107
+ // BEFORE any spawn, so a denied command never reaches child_process.
108
+ export function isCommandAllowed(rules, executable, args) {
109
+ if (executable.length === 0 || hasNul(executable)) {
110
+ return { allowed: false, reason: "empty or NUL-containing executable" };
111
+ }
112
+ if (hasPathSeparator(executable)) {
113
+ return { allowed: false, reason: "executable must be a bare PATH-resolved name" };
114
+ }
115
+ const name = basename(executable);
116
+ const rule = rules.find((candidate) => candidate.executable === name);
117
+ if (rule === undefined) {
118
+ return { allowed: false, reason: `executable not allowlisted: ${name}` };
119
+ }
120
+ return checkSubcommand(rule, args);
121
+ }
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from "../gateway/types.js";
2
+ export declare const TOOL_DEFINITIONS: readonly ToolDefinition[];
@@ -0,0 +1,51 @@
1
+ // The model-facing tool contract: 6 ToolDefinitions with JSON-Schema `parameters`. Kept apart
2
+ // from registry.ts so the dispatch logic stays small and the schema table is a single frozen
3
+ // surface the gateway/model see. No runtime logic — just the frozen definitions.
4
+ function obj(properties, required) {
5
+ return { type: "object", properties, required, additionalProperties: false };
6
+ }
7
+ export const TOOL_DEFINITIONS = Object.freeze([
8
+ {
9
+ name: "read_file",
10
+ description: "Read a UTF-8 file inside the workspace. Output is redacted; files above the byte cap are rejected.",
11
+ parameters: obj({
12
+ path: { type: "string", description: "Workspace-relative file path." },
13
+ maxBytes: { type: "number", description: "Optional read cap in bytes." },
14
+ }, ["path"]),
15
+ },
16
+ {
17
+ name: "list_files",
18
+ description: "List workspace files (deny-list and optional .gitignore applied).",
19
+ parameters: obj({
20
+ maxDepth: { type: "number", description: "Optional recursion depth cap." },
21
+ maxFiles: { type: "number", description: "Optional result count cap." },
22
+ applyGitignore: { type: "boolean", description: "Apply the .gitignore subset." },
23
+ }, []),
24
+ },
25
+ {
26
+ name: "inspect_package_scripts",
27
+ description: "Return the `scripts` object from a package.json inside the workspace.",
28
+ parameters: obj({ path: { type: "string", description: "Optional path; defaults to package.json." } }, []),
29
+ },
30
+ {
31
+ name: "run_command",
32
+ description: "Run an allowlisted read-only command (npm/git by default) with no shell, a clean env, " +
33
+ "a trusted executable path, a workspace cwd, a timeout, and capped redacted output.",
34
+ parameters: obj({
35
+ command: { type: "string", description: "Bare executable name (PATH-resolved)." },
36
+ args: { type: "array", items: { type: "string" }, description: "Argument vector." },
37
+ cwd: { type: "string", description: "Optional workspace-relative working directory." },
38
+ timeoutMs: { type: "number", description: "Optional wall-time budget in ms." },
39
+ }, ["command"]),
40
+ },
41
+ {
42
+ name: "propose_patch",
43
+ description: "Validate a unified diff and return a dry-run preview. Never writes to disk.",
44
+ parameters: obj({ diff: { type: "string", description: "Unified diff text." } }, ["diff"]),
45
+ },
46
+ {
47
+ name: "apply_patch",
48
+ description: "Apply a validated unified diff atomically. Fail-closed: refuses unless apply is enabled.",
49
+ parameters: obj({ diff: { type: "string", description: "Unified diff text." } }, ["diff"]),
50
+ },
51
+ ]);
@@ -0,0 +1,9 @@
1
+ import type { CommandRule } from "./types.js";
2
+ declare const FROZEN_NONE: readonly string[];
3
+ export declare const TERMINAL_COMMAND_RULES: readonly CommandRule[];
4
+ export interface TerminalCommandDecision {
5
+ readonly allowed: boolean;
6
+ readonly reason?: string | undefined;
7
+ }
8
+ export declare function isTerminalCommandAllowed(command: string, args: readonly string[]): TerminalCommandDecision;
9
+ export { FROZEN_NONE as TERMINAL_NO_FLAGS };
@@ -0,0 +1,313 @@
1
+ // ADR-0018 D3 — permitted-command policy for the UI terminal tool. A separate, narrower allowlist
2
+ // than the harness DEFAULT_COMMAND_RULES so the human-facing terminal cannot widen the agent surface.
3
+ // The CommandRule schema (allowedSubcommands / denyFlags / valueFlags) handles the structural
4
+ // shape; `isTerminalCommandAllowed` adds a thin Layer-2 pass for flag policies that `CommandRule`
5
+ // cannot express (node's positional-arg ban, git branch/remote mutation).
6
+ // Pure module: no IO, no spawn, no fs.
7
+ import { isCommandAllowed } from "./sandbox.js";
8
+ const FROZEN_NONE = Object.freeze([]);
9
+ // Read-only inspection commands. Each rule is conservative: omitted subcommands are denied by the
10
+ // allowlist mode; the only flag policy expressed here is what CommandRule already supports.
11
+ export const TERMINAL_COMMAND_RULES = Object.freeze([
12
+ { executable: "ls" },
13
+ { executable: "cat" },
14
+ { executable: "head" },
15
+ { executable: "tail" },
16
+ { executable: "wc", denyFlags: Object.freeze(["--files0-from"]) },
17
+ { executable: "grep" },
18
+ { executable: "pwd" },
19
+ { executable: "echo" },
20
+ {
21
+ executable: "find",
22
+ denyFlags: Object.freeze([
23
+ "-exec",
24
+ "-execdir",
25
+ "-ok",
26
+ "-okdir",
27
+ "-delete",
28
+ "-fprint",
29
+ "-fprint0",
30
+ "-fprintf",
31
+ "-fls",
32
+ "-files0-from",
33
+ ]),
34
+ },
35
+ {
36
+ executable: "tree",
37
+ denyFlags: Object.freeze(["-o", "--output"]),
38
+ },
39
+ // node: only --version/-v allowed. Enforced positionally in Layer 2 (a per-arg policy is not
40
+ // expressible in CommandRule).
41
+ { executable: "node" },
42
+ {
43
+ executable: "npm",
44
+ allowedSubcommands: Object.freeze(["ls", "list", "help"]),
45
+ denyFlags: Object.freeze([
46
+ "-c",
47
+ "--call",
48
+ "--prefix",
49
+ "--global",
50
+ "-g",
51
+ "--location",
52
+ ]),
53
+ },
54
+ {
55
+ executable: "git",
56
+ allowedSubcommands: Object.freeze([
57
+ "status",
58
+ "diff",
59
+ "log",
60
+ "show",
61
+ "rev-parse",
62
+ "ls-files",
63
+ "describe",
64
+ "blame",
65
+ "cat-file",
66
+ "branch",
67
+ "remote",
68
+ ]),
69
+ valueFlags: Object.freeze([
70
+ "-C",
71
+ "-c",
72
+ "--git-dir",
73
+ "--work-tree",
74
+ "--namespace",
75
+ "--exec-path",
76
+ ]),
77
+ denyFlags: Object.freeze([
78
+ "-C",
79
+ "-c",
80
+ "--git-dir",
81
+ "--work-tree",
82
+ "--namespace",
83
+ "--exec-path",
84
+ "--ext-diff",
85
+ "--textconv",
86
+ "--output",
87
+ "--no-index",
88
+ "--contents",
89
+ ]),
90
+ },
91
+ ]);
92
+ // Flags that delete, write, or execute via find. Any of these anywhere in args denies.
93
+ const FIND_DENY_FLAGS = new Set([
94
+ "-exec",
95
+ "-execdir",
96
+ "-ok",
97
+ "-okdir",
98
+ "-delete",
99
+ "-fprint",
100
+ "-fprint0",
101
+ "-fprintf",
102
+ "-fls",
103
+ "-files0-from",
104
+ ]);
105
+ const TREE_DENY_FLAGS = new Set(["-o", "--output"]);
106
+ // Only --version and -v are accepted for node. Every other positional or flag is denied.
107
+ const NODE_ALLOWED_ARGS = new Set(["--version", "-v"]);
108
+ // Branch mutation flags (A2). Scoped to `git branch` only — these deny branch creation, deletion,
109
+ // copy, rename, and force operations. `-c`/`-C` are included here because for `branch` they mean
110
+ // copy, not the git-global config flag (which is caught by A5 before we reach here).
111
+ const GIT_BRANCH_DENY_FLAGS = new Set([
112
+ "-D",
113
+ "-d",
114
+ "-m",
115
+ "-M",
116
+ "--delete",
117
+ "-c",
118
+ "-C",
119
+ "-f",
120
+ "--copy",
121
+ "--force",
122
+ "--set-upstream-to",
123
+ "--unset-upstream",
124
+ "--edit-description",
125
+ ]);
126
+ // Global git flags that modify git's own config, working-tree, cwd, or execution path (A5 /
127
+ // ADR-0018 S-H2). These are checked BEFORE subcommand resolution so they cannot be smuggled via a
128
+ // value-flag value that happens to look like a subcommand.
129
+ const GIT_GLOBAL_DENY_FLAGS = new Set([
130
+ "-C",
131
+ "-c",
132
+ "--git-dir",
133
+ "--work-tree",
134
+ "--namespace",
135
+ "--exec-path",
136
+ ]);
137
+ const GIT_UNSAFE_FLAGS = new Set([
138
+ "--ext-diff",
139
+ "--textconv",
140
+ "--output",
141
+ "--no-index",
142
+ "--contents",
143
+ ]);
144
+ function denied(reason) {
145
+ return { allowed: false, reason };
146
+ }
147
+ function checkFind(args) {
148
+ for (const arg of args) {
149
+ if (FIND_DENY_FLAGS.has(arg)) {
150
+ return denied(`find: denied flag ${arg}`);
151
+ }
152
+ }
153
+ return { allowed: true };
154
+ }
155
+ function checkTree(args) {
156
+ for (const arg of args) {
157
+ const flag = arg.includes("=") ? arg.slice(0, arg.indexOf("=")) : arg;
158
+ if (TREE_DENY_FLAGS.has(flag) || arg.startsWith("-o")) {
159
+ return denied(`tree: denied write flag ${flag}`);
160
+ }
161
+ }
162
+ return { allowed: true };
163
+ }
164
+ function checkNode(args) {
165
+ for (const arg of args) {
166
+ if (!NODE_ALLOWED_ARGS.has(arg)) {
167
+ return denied("node: only --version/-v is permitted");
168
+ }
169
+ }
170
+ return { allowed: true };
171
+ }
172
+ // Shared value-flags used by gitSubcommand and argsAfterSubcommand. Kept as a module-level
173
+ // constant (not re-created per call) so the hot-path doesn't allocate on every invocation.
174
+ const GIT_VALUE_FLAGS = new Set([
175
+ "-C",
176
+ "-c",
177
+ "--git-dir",
178
+ "--work-tree",
179
+ "--namespace",
180
+ "--exec-path",
181
+ ]);
182
+ // Resolves the git subcommand (first non-flag arg, skipping value-flag pairs). Returns undefined
183
+ // when the subcommand can't be determined — the caller treats that as not-a-mutation.
184
+ function gitSubcommand(args) {
185
+ let skipNext = false;
186
+ for (const arg of args) {
187
+ if (skipNext) {
188
+ skipNext = false;
189
+ continue;
190
+ }
191
+ if (!arg.startsWith("-")) {
192
+ return arg;
193
+ }
194
+ if (!arg.includes("=") && GIT_VALUE_FLAGS.has(arg)) {
195
+ skipNext = true;
196
+ }
197
+ }
198
+ return undefined;
199
+ }
200
+ // Returns the slice of args that appears AFTER the first token equal to `subcommand`, skipping
201
+ // value-flag pairs using the same walk as gitSubcommand. Returns undefined when not found.
202
+ function argsAfterSubcommand(args, subcommand) {
203
+ // Convert to a mutable array for indexed access so we can use a for...of without a C-style loop
204
+ // (avoids noUncheckedIndexedAccess while remaining tsc-clean under no-non-null-assertion).
205
+ const arr = Array.from(args);
206
+ let skipNext = false;
207
+ for (const [i, arg] of arr.entries()) {
208
+ if (skipNext) {
209
+ skipNext = false;
210
+ continue;
211
+ }
212
+ if (arg === subcommand) {
213
+ return args.slice(i + 1);
214
+ }
215
+ if (arg.startsWith("-") && !arg.includes("=") && GIT_VALUE_FLAGS.has(arg)) {
216
+ skipNext = true;
217
+ }
218
+ }
219
+ return undefined;
220
+ }
221
+ // A2 — After resolving the `branch` subcommand, walk the remaining args. Any non-flag positional
222
+ // (a branch name operand) denies creation/switching. Deny all known mutation flags.
223
+ function checkGitBranch(argsAfterBranch) {
224
+ for (const arg of argsAfterBranch) {
225
+ const flag = arg.includes("=") ? arg.slice(0, arg.indexOf("=")) : arg;
226
+ if (GIT_BRANCH_DENY_FLAGS.has(flag)) {
227
+ return denied(`git branch: denied mutation flag ${flag}`);
228
+ }
229
+ if (!arg.startsWith("-")) {
230
+ // A bare positional after `branch` is a branch name operand — implies creation or mutation.
231
+ return denied("git branch: positional operand denied (read-only listing only)");
232
+ }
233
+ }
234
+ return { allowed: true };
235
+ }
236
+ // A1 — After resolving the `remote` subcommand, walk the remaining args. No non-flag positional is
237
+ // allowed: `show`, `update`, and `prune` can contact remotes, while add/rm/rename/set-url mutate
238
+ // config. `git remote` and `git remote -v` remain local read-only inspection.
239
+ function checkGitRemote(argsAfterRemote) {
240
+ for (const arg of argsAfterRemote) {
241
+ if (arg.startsWith("-")) {
242
+ // Pure flag (e.g. -v / --verbose) — already covered by the CommandRule valueFlags/denyFlags
243
+ // at Layer 1, but we allow flags through here to avoid double-denying them.
244
+ continue;
245
+ }
246
+ return denied(`git remote: subcommand "${arg}" is denied (read-only: use flags only)`);
247
+ }
248
+ return { allowed: true };
249
+ }
250
+ function deniedGitFlag(arg) {
251
+ const flag = arg.includes("=") ? arg.slice(0, arg.indexOf("=")) : arg;
252
+ // A5 — Deny global config/env-injection and cwd-shifting flags before resolving the subcommand.
253
+ if (GIT_GLOBAL_DENY_FLAGS.has(flag) ||
254
+ arg.startsWith("-C") ||
255
+ (arg.startsWith("-c") && !arg.startsWith("--"))) {
256
+ return `git: denied global flag ${flag}`;
257
+ }
258
+ if (GIT_UNSAFE_FLAGS.has(flag)) {
259
+ return `git: denied unsafe flag ${flag}`;
260
+ }
261
+ return undefined;
262
+ }
263
+ function checkGitFlags(args) {
264
+ for (const arg of args) {
265
+ const reason = deniedGitFlag(arg);
266
+ if (reason !== undefined)
267
+ return denied(reason);
268
+ }
269
+ return { allowed: true };
270
+ }
271
+ function checkGitSubcommand(args) {
272
+ const sub = gitSubcommand(args);
273
+ if (sub === "branch") {
274
+ const rest = argsAfterSubcommand(args, "branch") ?? [];
275
+ return checkGitBranch(rest);
276
+ }
277
+ if (sub === "remote") {
278
+ const rest = argsAfterSubcommand(args, "remote") ?? [];
279
+ return checkGitRemote(rest);
280
+ }
281
+ return { allowed: true };
282
+ }
283
+ function checkGit(args) {
284
+ const flags = checkGitFlags(args);
285
+ if (!flags.allowed)
286
+ return flags;
287
+ return checkGitSubcommand(args);
288
+ }
289
+ // Pure deny-by-default decision for a terminal command. Layer 1 is the shared `isCommandAllowed`
290
+ // (validates the executable and applies CommandRule's subcommand allowlist/denyFlags/valueFlags).
291
+ // Layer 2 here adds the per-command flag policies that CommandRule cannot express (find / tree /
292
+ // node / git branch and remote mutation flags).
293
+ export function isTerminalCommandAllowed(command, args) {
294
+ const layer1 = isCommandAllowed(TERMINAL_COMMAND_RULES, command, args);
295
+ if (!layer1.allowed) {
296
+ return { allowed: false, reason: layer1.reason };
297
+ }
298
+ if (command === "find") {
299
+ return checkFind(args);
300
+ }
301
+ if (command === "tree") {
302
+ return checkTree(args);
303
+ }
304
+ if (command === "node") {
305
+ return checkNode(args);
306
+ }
307
+ if (command === "git") {
308
+ return checkGit(args);
309
+ }
310
+ return { allowed: true };
311
+ }
312
+ // Re-export so callers don't have to import from sandbox.ts directly.
313
+ export { FROZEN_NONE as TERMINAL_NO_FLAGS };
@@ -0,0 +1,99 @@
1
+ export type NetworkPolicy = "inherit" | "none";
2
+ export interface SandboxPolicy {
3
+ readonly envAllowlist: readonly string[];
4
+ readonly network: NetworkPolicy;
5
+ readonly maxOutputBytes: number;
6
+ readonly defaultTimeoutMs: number;
7
+ readonly terminationGraceMs: number;
8
+ }
9
+ export declare const DEFAULT_ENV_ALLOWLIST: readonly string[];
10
+ export declare const DEFAULT_SANDBOX_POLICY: SandboxPolicy;
11
+ export interface CommandRule {
12
+ readonly executable: string;
13
+ readonly allowedSubcommands?: readonly string[] | undefined;
14
+ readonly deniedSubcommands?: readonly string[] | undefined;
15
+ readonly valueFlags?: readonly string[] | undefined;
16
+ readonly denyFlags?: readonly string[] | undefined;
17
+ readonly knownSubcommands?: readonly string[] | undefined;
18
+ }
19
+ export declare const DEFAULT_COMMAND_RULES: readonly CommandRule[];
20
+ export interface CommandRunInput {
21
+ readonly command: string;
22
+ readonly args?: readonly string[] | undefined;
23
+ readonly cwd?: string | undefined;
24
+ readonly timeoutMs?: number | undefined;
25
+ readonly signal: AbortSignal;
26
+ }
27
+ export interface CommandResult {
28
+ readonly command: string;
29
+ readonly args: readonly string[];
30
+ readonly exitCode: number | null;
31
+ readonly signal: string | null;
32
+ readonly stdout: string;
33
+ readonly stderr: string;
34
+ readonly durationMs: number;
35
+ readonly timedOut: boolean;
36
+ readonly truncated: boolean;
37
+ }
38
+ export type PatchChangeKind = "create" | "modify" | "delete";
39
+ export interface PatchHunk {
40
+ readonly oldStart: number;
41
+ readonly oldLines: number;
42
+ readonly newStart: number;
43
+ readonly newLines: number;
44
+ readonly lines: readonly string[];
45
+ }
46
+ export interface PatchFileChange {
47
+ readonly path: string;
48
+ readonly kind: PatchChangeKind;
49
+ readonly hunks: readonly PatchHunk[];
50
+ readonly addedLines: number;
51
+ readonly removedLines: number;
52
+ }
53
+ export type PatchRejectionCode = "size-limit" | "binary" | "path-unsafe" | "path-denied" | "line-limit" | "file-limit" | "malformed";
54
+ export interface PatchRejection {
55
+ readonly code: PatchRejectionCode;
56
+ readonly message: string;
57
+ readonly path?: string | undefined;
58
+ }
59
+ export interface PatchConflict {
60
+ readonly path: string;
61
+ readonly hunkIndex: number;
62
+ readonly reason: string;
63
+ }
64
+ export interface PatchValidation {
65
+ readonly ok: boolean;
66
+ readonly files: readonly PatchFileChange[];
67
+ readonly totalChangedLines: number;
68
+ readonly totalBytes: number;
69
+ readonly normalizedDiff?: string | undefined;
70
+ readonly reasons: readonly PatchRejection[];
71
+ readonly conflicts: readonly PatchConflict[];
72
+ }
73
+ export interface PatchLimits {
74
+ readonly maxPatchBytes: number;
75
+ readonly maxChangedLines: number;
76
+ readonly maxFilesChanged: number;
77
+ }
78
+ export declare const DEFAULT_PATCH_LIMITS: PatchLimits;
79
+ export interface PatchApplyResult {
80
+ readonly changedFiles: readonly string[];
81
+ readonly created: readonly string[];
82
+ readonly deleted: readonly string[];
83
+ }
84
+ export interface ToolHostConfig {
85
+ readonly sandbox: SandboxPolicy;
86
+ readonly commandRules: readonly CommandRule[];
87
+ readonly patchLimits: PatchLimits;
88
+ readonly applyEnabled: boolean;
89
+ readonly maxReadBytes: number;
90
+ }
91
+ export declare const DEFAULT_TOOL_HOST_CONFIG: ToolHostConfig;
92
+ export interface ToolHostConfigInput {
93
+ readonly sandbox?: Partial<SandboxPolicy> | undefined;
94
+ readonly commandRules?: readonly CommandRule[] | undefined;
95
+ readonly patchLimits?: Partial<PatchLimits> | undefined;
96
+ readonly applyEnabled?: boolean | undefined;
97
+ readonly maxReadBytes?: number | undefined;
98
+ }
99
+ export declare function resolveToolHostConfig(input: ToolHostConfigInput | undefined): ToolHostConfig;