@pensar/apex 2.5.0 → 2.6.1-canary.025b1ecf

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 (1509) hide show
  1. package/README.md +38 -0
  2. package/bin/pensar.js +12 -4
  3. package/build/agent-b37fm1yh.js +13 -0
  4. package/build/{agent-m30a62kh.js → agent-f8rpt4sb.js} +48 -50
  5. package/build/agent-gqexqg2q.js +13 -0
  6. package/build/agent-qk30vqmf.js +15 -0
  7. package/build/agent-runs-nw7dwp1d.js +313 -0
  8. package/build/{apps-x4ef2gpc.js → apps-zeqbjbs4.js} +50 -58
  9. package/build/{auth-7ay8qgxm.js → auth-038hsg1s.js} +61 -68
  10. package/build/blackboxAgent-fjrv4q3d.js +13 -0
  11. package/build/blackboxPentest-6dtb7vnq.js +59 -0
  12. package/build/{cli-73k43t1r.js → cli-17ndymmb.js} +53 -78
  13. package/build/{cli-3py0a0wg.js → cli-1rwe9a9v.js} +206 -136
  14. package/build/{cli-y3dpm18e.js → cli-2tfnaeca.js} +75 -92
  15. package/build/{cli-ee3axgts.js → cli-3gt761d2.js} +7 -1
  16. package/build/cli-3qznjsnr.js +14 -0
  17. package/build/{cli-sx3jkv7p.js → cli-3w0mx2mv.js} +28872 -25951
  18. package/build/cli-5qq1655n.js +175 -0
  19. package/build/{cli-53rm0rrz.js → cli-8w8k4dph.js} +1 -1
  20. package/build/{cli-68260ckj.js → cli-91gs9whc.js} +1658 -1606
  21. package/build/cli-99gxp2yb.js +62 -0
  22. package/build/cli-ayqhdajr.js +22 -0
  23. package/build/{cli-knd276ed.js → cli-bb02pjt0.js} +31 -31
  24. package/build/{cli-p4r7q012.js → cli-bw31v3z7.js} +16743 -13352
  25. package/build/{cli-j54qa6tm.js → cli-c2k4xxaw.js} +42 -42
  26. package/build/{cli-z5c0ypg1.js → cli-czwr2xmh.js} +4 -4
  27. package/build/{cli-k71t434r.js → cli-ec2hwkv3.js} +34 -76
  28. package/build/{cli-vkbzcnw1.js → cli-fxmref08.js} +43 -40
  29. package/build/cli-g06s7edq.js +11 -0
  30. package/build/cli-gsaf4jk3.js +280 -0
  31. package/build/{cli-bc05qbss.js → cli-h6y3bt60.js} +13 -21
  32. package/build/cli-jdrx44ge.js +14 -0
  33. package/build/{cli-x92fkt2f.js → cli-m3btkdbx.js} +55 -97
  34. package/build/cli-mdk51kby.js +429 -0
  35. package/build/{cli-bw2ddttk.js → cli-mnpzhtg6.js} +4730 -267
  36. package/build/cli-mz5pk30x.js +5508 -0
  37. package/build/cli-pwm29ks7.js +6337 -0
  38. package/build/cli-retw3rw5.js +12 -0
  39. package/build/{cli-kff2bbq7.js → cli-rxj14t82.js} +43 -43
  40. package/build/cli-se8ae8z3.js +2250 -0
  41. package/build/cli-skedjgqy.js +186 -0
  42. package/build/{cli-dm0fc0bm.js → cli-v1sarr4y.js} +5 -9
  43. package/build/cli-vfzpbv3g.js +355 -0
  44. package/build/cli-xcy2vxj2.js +1732 -0
  45. package/build/{cli-zav1yx5k.js → cli-yn4sj3z1.js} +990 -632
  46. package/build/{cli-7vg06q5r.js → cli-zsq8kfgc.js} +135 -125
  47. package/build/cli.js +769 -195
  48. package/build/{config-4kzh88xz.js → config-4emx9c35.js} +16 -19
  49. package/build/{doctor-rz7sx6ev.js → doctor-z94afr10.js} +26 -15
  50. package/build/export-trajectory-rt4tf07k.js +112 -0
  51. package/build/{fastStrike-a54atjc8.js → fastStrike-mnn8g4ay.js} +56 -31
  52. package/build/{fixes-fv66yn1z.js → fixes-hm5569vq.js} +22 -30
  53. package/build/{getMachineId-bsd-xj3bn2fv.js → getMachineId-bsd-zr67nd9p.js} +5 -5
  54. package/build/{getMachineId-darwin-07jzjcx6.js → getMachineId-darwin-fd1d562d.js} +5 -5
  55. package/build/{getMachineId-linux-ahngynxd.js → getMachineId-linux-kjmg243j.js} +4 -4
  56. package/build/{getMachineId-unsupported-vy43b44z.js → getMachineId-unsupported-n4r58vke.js} +4 -4
  57. package/build/{getMachineId-win-8x66cynz.js → getMachineId-win-yzgpfsrb.js} +5 -5
  58. package/build/index-0yfxwj9h.js +25 -0
  59. package/build/{index-kyd1jm89.js → index-1qjwwg4x.js} +159 -169
  60. package/build/index-939ypn8a.js +12 -0
  61. package/build/index-a0bxw5zq.js +17477 -0
  62. package/build/{index-cbwn03kz.js → index-a2xycbjs.js} +12 -31
  63. package/build/{index-psqjpw5m.js → index-c1h0g35p.js} +11 -11
  64. package/build/{index-fpwr10qm.js → index-f2xpfw4x.js} +5106 -3803
  65. package/build/index-g9akqryt.js +9 -0
  66. package/build/index-mrrfbsyz.js +17 -0
  67. package/build/index-qnyevb6q.js +1563 -0
  68. package/build/index-ttwhf2se.js +36 -0
  69. package/build/index-vy2pm5zf.js +121 -0
  70. package/build/index-x8ab8x86.js +102 -0
  71. package/build/{issues-019678t0.js → issues-wxd3ca1d.js} +51 -47
  72. package/build/knowledge-rvcpbak8.js +139 -0
  73. package/build/lib/chunk-0y40tebt.js +102 -0
  74. package/build/lib/chunk-0ydfy4hq.js +510 -0
  75. package/build/lib/chunk-2njv7wz3.js +178 -0
  76. package/build/lib/chunk-3q89v4xv.js +21 -0
  77. package/build/lib/chunk-4p2n69vn.js +62 -0
  78. package/build/lib/chunk-7gjdygcx.js +171 -0
  79. package/build/lib/chunk-8d8w07a9.js +431 -0
  80. package/build/lib/chunk-8dqz8cwa.js +27 -0
  81. package/build/lib/chunk-8vhr65w3.js +272 -0
  82. package/build/lib/chunk-8xnzgfs0.js +56 -0
  83. package/build/lib/chunk-9nsrd4xg.js +12 -0
  84. package/build/lib/chunk-a3gxgj9r.js +317 -0
  85. package/build/lib/chunk-afef65e0.js +7150 -0
  86. package/build/lib/chunk-b8eq85d2.js +143 -0
  87. package/build/lib/chunk-bqrmw2tn.js +439 -0
  88. package/build/lib/chunk-bx94rwt5.js +24 -0
  89. package/build/lib/chunk-c2b0hxs7.js +143 -0
  90. package/build/lib/chunk-cwj17b1f.js +345 -0
  91. package/build/lib/chunk-cx7yrzh1.js +2429 -0
  92. package/build/lib/chunk-eb4h4k1f.js +213 -0
  93. package/build/lib/chunk-esymacwg.js +14 -0
  94. package/build/lib/chunk-fy3bbbqy.js +7896 -0
  95. package/build/lib/chunk-gdrv2h1p.js +11157 -0
  96. package/build/lib/chunk-ja7j565c.js +743 -0
  97. package/build/lib/chunk-jdjagvgr.js +85 -0
  98. package/build/lib/chunk-k4rz1yvj.js +31 -0
  99. package/build/lib/chunk-kfvq4m1s.js +685 -0
  100. package/build/lib/chunk-mgppdr6j.js +980 -0
  101. package/build/lib/chunk-mhxe717m.js +572 -0
  102. package/build/lib/chunk-mv74mq5n.js +59 -0
  103. package/build/lib/chunk-n0ba7khr.js +64 -0
  104. package/build/lib/chunk-q5e23acz.js +52 -0
  105. package/build/lib/chunk-q8bk9dys.js +922 -0
  106. package/build/lib/chunk-sgd2126b.js +9294 -0
  107. package/build/lib/chunk-t5bt5vn1.js +146 -0
  108. package/build/lib/chunk-v2q8anzw.js +120 -0
  109. package/build/lib/chunk-vd6hr8pm.js +212 -0
  110. package/build/lib/chunk-ve7m90fb.js +317 -0
  111. package/build/lib/chunk-vx228eeq.js +82 -0
  112. package/build/lib/chunk-wchtd611.js +186 -0
  113. package/build/lib/chunk-ws86wx87.js +1412 -0
  114. package/build/lib/chunk-xpfg2fbk.js +90 -0
  115. package/build/lib/chunk-zrbqn62x.js +697 -0
  116. package/build/lib/core/agents/agentRuntime.d.ts +47 -0
  117. package/build/lib/core/agents/defineAgent.d.ts +82 -0
  118. package/build/lib/core/agents/offSecAgent/index.d.ts +9 -0
  119. package/build/lib/core/agents/offSecAgent/index.js +225 -0
  120. package/build/lib/core/agents/offSecAgent/interruptedStepFinalization.d.ts +23 -0
  121. package/build/lib/core/agents/offSecAgent/interruptedStepMessages.d.ts +42 -0
  122. package/build/lib/core/agents/offSecAgent/messagePersistence.d.ts +39 -0
  123. package/build/lib/core/agents/offSecAgent/offensiveSecurityAgent.d.ts +233 -0
  124. package/build/lib/core/agents/offSecAgent/prompt.d.ts +35 -0
  125. package/build/lib/core/agents/offSecAgent/recordedTools.d.ts +11 -0
  126. package/build/lib/core/agents/offSecAgent/runtimeContext.d.ts +43 -0
  127. package/build/lib/core/agents/offSecAgent/streamDiagnostics.d.ts +67 -0
  128. package/build/lib/core/agents/offSecAgent/subagentSpawner.d.ts +223 -0
  129. package/build/lib/core/agents/offSecAgent/subagentSpawner.js +19 -0
  130. package/build/lib/core/agents/offSecAgent/toolLifecycle.d.ts +54 -0
  131. package/build/lib/core/agents/offSecAgent/tools/__tests__/sandboxScript.d.ts +1 -0
  132. package/build/lib/core/agents/offSecAgent/tools/addMemory.d.ts +16 -0
  133. package/build/lib/core/agents/offSecAgent/tools/agentScratch.d.ts +17 -0
  134. package/build/lib/core/agents/offSecAgent/tools/applyPatch.d.ts +8 -0
  135. package/build/lib/core/agents/offSecAgent/tools/applyPatchImpl.d.ts +24 -0
  136. package/build/lib/core/agents/offSecAgent/tools/askUserQuestions.d.ts +42 -0
  137. package/build/lib/core/agents/offSecAgent/tools/browserHeaderRouting.d.ts +9 -0
  138. package/build/lib/core/agents/offSecAgent/tools/browserToolFactories.d.ts +40 -0
  139. package/build/lib/core/agents/offSecAgent/tools/browserTools.d.ts +96 -0
  140. package/build/lib/core/agents/offSecAgent/tools/callbackListener.d.ts +212 -0
  141. package/build/lib/core/agents/offSecAgent/tools/camoufox.d.ts +106 -0
  142. package/build/lib/core/agents/offSecAgent/tools/checkpointState.d.ts +17 -0
  143. package/build/lib/core/agents/offSecAgent/tools/completeAuthentication.d.ts +39 -0
  144. package/build/lib/core/agents/offSecAgent/tools/crawlAuthenticated.d.ts +36 -0
  145. package/build/lib/core/agents/offSecAgent/tools/createAttackSurfaceReport.d.ts +31 -0
  146. package/build/lib/core/agents/offSecAgent/tools/createFile.d.ts +12 -0
  147. package/build/lib/core/agents/offSecAgent/tools/createTask.d.ts +20 -0
  148. package/build/lib/core/agents/offSecAgent/tools/delegateAuth.d.ts +72 -0
  149. package/build/lib/core/agents/offSecAgent/tools/deleteFile.d.ts +10 -0
  150. package/build/lib/core/agents/offSecAgent/tools/destructiveGuard.d.ts +94 -0
  151. package/build/lib/core/agents/offSecAgent/tools/detectAuthScheme.d.ts +72 -0
  152. package/build/lib/core/agents/offSecAgent/tools/documentApp.d.ts +38 -0
  153. package/build/lib/core/agents/offSecAgent/tools/documentEndpoint.d.ts +111 -0
  154. package/build/lib/core/agents/offSecAgent/tools/documentFinding.d.ts +285 -0
  155. package/build/lib/core/agents/offSecAgent/tools/email/adapters.d.ts +45 -0
  156. package/build/lib/core/agents/offSecAgent/tools/email/adapters.js +8 -0
  157. package/build/lib/core/agents/offSecAgent/tools/email/getAttachments.d.ts +33 -0
  158. package/build/lib/core/agents/offSecAgent/tools/email/getMessage.d.ts +20 -0
  159. package/build/lib/core/agents/offSecAgent/tools/email/index.d.ts +145 -0
  160. package/build/lib/core/agents/offSecAgent/tools/email/listInboxes.d.ts +23 -0
  161. package/build/lib/core/agents/offSecAgent/tools/email/listMessages.d.ts +22 -0
  162. package/build/lib/core/agents/offSecAgent/tools/email/markRead.d.ts +20 -0
  163. package/build/lib/core/agents/offSecAgent/tools/email/searchMessages.d.ts +24 -0
  164. package/build/lib/core/agents/offSecAgent/tools/email/sendEmail.d.ts +28 -0
  165. package/build/lib/core/agents/offSecAgent/tools/email/types.d.ts +40 -0
  166. package/build/lib/core/agents/offSecAgent/tools/email/types.js +0 -0
  167. package/build/lib/core/agents/offSecAgent/tools/executeCommand.d.ts +84 -0
  168. package/build/lib/core/agents/offSecAgent/tools/extractJsEndpoints.d.ts +13 -0
  169. package/build/lib/core/agents/offSecAgent/tools/fileWorkspace.d.ts +21 -0
  170. package/build/lib/core/agents/offSecAgent/tools/fileWorkspaceRemote.d.ts +13 -0
  171. package/build/lib/core/agents/offSecAgent/tools/getMemory.d.ts +12 -0
  172. package/build/lib/core/agents/offSecAgent/tools/getPage.d.ts +17 -0
  173. package/build/lib/core/agents/offSecAgent/tools/gitDiff.d.ts +12 -0
  174. package/build/lib/core/agents/offSecAgent/tools/gitStatus.d.ts +10 -0
  175. package/build/lib/core/agents/offSecAgent/tools/glob.d.ts +8 -0
  176. package/build/lib/core/agents/offSecAgent/tools/globImpl.d.ts +13 -0
  177. package/build/lib/core/agents/offSecAgent/tools/globPattern.d.ts +7 -0
  178. package/build/lib/core/agents/offSecAgent/tools/grep.d.ts +10 -0
  179. package/build/lib/core/agents/offSecAgent/tools/grepImpl.d.ts +34 -0
  180. package/build/lib/core/agents/offSecAgent/tools/httpRequest.d.ts +70 -0
  181. package/build/lib/core/agents/offSecAgent/tools/index.d.ts +466 -0
  182. package/build/lib/core/agents/offSecAgent/tools/index.js +262 -0
  183. package/build/lib/core/agents/offSecAgent/tools/listFiles.d.ts +9 -0
  184. package/build/lib/core/agents/offSecAgent/tools/listFilesImpl.d.ts +27 -0
  185. package/build/lib/core/agents/offSecAgent/tools/listMemories.d.ts +13 -0
  186. package/build/lib/core/agents/offSecAgent/tools/listPromptInjections.d.ts +18 -0
  187. package/build/lib/core/agents/offSecAgent/tools/listTasks.d.ts +24 -0
  188. package/build/lib/core/agents/offSecAgent/tools/patchApply.d.ts +24 -0
  189. package/build/lib/core/agents/offSecAgent/tools/patchParse.d.ts +24 -0
  190. package/build/lib/core/agents/offSecAgent/tools/perCommandShell.d.ts +82 -0
  191. package/build/lib/core/agents/offSecAgent/tools/playwrightMcp.d.ts +369 -0
  192. package/build/lib/core/agents/offSecAgent/tools/probeAuthEndpoints.d.ts +28 -0
  193. package/build/lib/core/agents/offSecAgent/tools/profileCodebase.d.ts +33 -0
  194. package/build/lib/core/agents/offSecAgent/tools/provideComparisonResults.d.ts +31 -0
  195. package/build/lib/core/agents/offSecAgent/tools/queryWhiteboxCatalog.d.ts +17 -0
  196. package/build/lib/core/agents/offSecAgent/tools/readFile.d.ts +11 -0
  197. package/build/lib/core/agents/offSecAgent/tools/readFileImpl.d.ts +31 -0
  198. package/build/lib/core/agents/offSecAgent/tools/readSkill.d.ts +15 -0
  199. package/build/lib/core/agents/offSecAgent/tools/reportError.d.ts +31 -0
  200. package/build/lib/core/agents/offSecAgent/tools/response.d.ts +15 -0
  201. package/build/lib/core/agents/offSecAgent/tools/runAttackSurface.d.ts +81 -0
  202. package/build/lib/core/agents/offSecAgent/tools/runCodeQuery.d.ts +44 -0
  203. package/build/lib/core/agents/offSecAgent/tools/runPentestWorkflow.d.ts +32 -0
  204. package/build/lib/core/agents/offSecAgent/tools/runWhiteboxScan.d.ts +52 -0
  205. package/build/lib/core/agents/offSecAgent/tools/sandbox.d.ts +30 -0
  206. package/build/lib/core/agents/offSecAgent/tools/sandboxPlaywright.d.ts +137 -0
  207. package/build/lib/core/agents/offSecAgent/tools/sandboxScript.d.ts +6 -0
  208. package/build/lib/core/agents/offSecAgent/tools/scopeGuard.d.ts +91 -0
  209. package/build/lib/core/agents/offSecAgent/tools/scriptSyntaxCheck.d.ts +45 -0
  210. package/build/lib/core/agents/offSecAgent/tools/smsInbox.d.ts +67 -0
  211. package/build/lib/core/agents/offSecAgent/tools/smsInbox.js +6 -0
  212. package/build/lib/core/agents/offSecAgent/tools/smsListMessages.d.ts +29 -0
  213. package/build/lib/core/agents/offSecAgent/tools/spawnCodingAgent.d.ts +43 -0
  214. package/build/lib/core/agents/offSecAgent/tools/spawnPentestAgent.d.ts +51 -0
  215. package/build/lib/core/agents/offSecAgent/tools/spawnPentestSwarm.d.ts +52 -0
  216. package/build/lib/core/agents/offSecAgent/tools/submitPlan.d.ts +12 -0
  217. package/build/lib/core/agents/offSecAgent/tools/testEndpointVariations.d.ts +34 -0
  218. package/build/lib/core/agents/offSecAgent/tools/threatModelGenerator.d.ts +32 -0
  219. package/build/lib/core/agents/offSecAgent/tools/toolOutput.d.ts +23 -0
  220. package/build/lib/core/agents/offSecAgent/tools/types.d.ts +215 -0
  221. package/build/lib/core/agents/offSecAgent/tools/updateFile.d.ts +14 -0
  222. package/build/lib/core/agents/offSecAgent/tools/updateTask.d.ts +20 -0
  223. package/build/lib/core/agents/offSecAgent/tools/validateDiscovery.d.ts +24 -0
  224. package/build/lib/core/agents/offSecAgent/tools/webSearch.d.ts +16 -0
  225. package/build/lib/core/agents/offSecAgent/tools/whiteboxCandidates.d.ts +108 -0
  226. package/build/lib/core/agents/offSecAgent/tools/whiteboxJobs.d.ts +157 -0
  227. package/build/lib/core/agents/offSecAgent/tools/windowsCurl.d.ts +20 -0
  228. package/build/lib/core/agents/offSecAgent/tools/workspaceApps.d.ts +120 -0
  229. package/build/lib/core/agents/offSecAgent/tools/workspaceDomains.d.ts +22 -0
  230. package/build/lib/core/agents/offSecAgent/tools/workspaceFailure.d.ts +6 -0
  231. package/build/lib/core/agents/offSecAgent/tools/writePlan.d.ts +13 -0
  232. package/build/lib/core/agents/offSecAgent/trace.d.ts +268 -0
  233. package/build/lib/core/agents/offSecAgent/types.d.ts +543 -0
  234. package/build/lib/core/agents/offSecAgent/types.js +7 -0
  235. package/build/lib/core/agents/specialized/attackSurface/blackboxAgent.d.ts +66 -0
  236. package/build/lib/core/agents/specialized/attackSurface/blackboxAgent.js +33 -0
  237. package/build/lib/core/agents/specialized/attackSurface/blackboxRiskScoring.d.ts +30 -0
  238. package/build/lib/core/agents/specialized/attackSurface/grpcSchema.d.ts +93 -0
  239. package/build/lib/core/agents/specialized/attackSurface/jsExtraction.d.ts +42 -0
  240. package/build/lib/core/agents/specialized/attackSurface/prompts.d.ts +1 -0
  241. package/build/lib/core/agents/specialized/attackSurface/schemas.d.ts +284 -0
  242. package/build/lib/core/agents/specialized/attackSurface/schemas.js +144 -0
  243. package/build/lib/core/agents/specialized/attackSurface/types.d.ts +32 -0
  244. package/build/lib/core/agents/specialized/authenticationAgent/agent.d.ts +73 -0
  245. package/build/lib/core/agents/specialized/authenticationAgent/index.d.ts +4 -0
  246. package/build/lib/core/agents/specialized/authenticationAgent/index.js +71 -0
  247. package/build/lib/core/agents/specialized/authenticationAgent/prompts.d.ts +10 -0
  248. package/build/lib/core/agents/specialized/authenticationAgent/types.d.ts +620 -0
  249. package/build/lib/core/agents/specialized/benchmark/comparisonAgent.d.ts +10 -0
  250. package/build/lib/core/agents/specialized/benchmark/docker-utils.d.ts +17 -0
  251. package/build/lib/core/agents/specialized/benchmark/flag-detector.d.ts +60 -0
  252. package/build/lib/core/agents/specialized/benchmark/index.d.ts +8 -0
  253. package/build/lib/core/agents/specialized/benchmark/prompts.d.ts +1 -0
  254. package/build/lib/core/agents/specialized/benchmark/remote/circuit-breaker.d.ts +22 -0
  255. package/build/lib/core/agents/specialized/benchmark/remote/daytona-wrapper.d.ts +33 -0
  256. package/build/lib/core/agents/specialized/benchmark/remote/index.d.ts +2 -0
  257. package/build/lib/core/agents/specialized/benchmark/types.d.ts +92 -0
  258. package/build/lib/core/agents/specialized/benchmarkComparisonAgent.d.ts +27 -0
  259. package/build/lib/core/agents/specialized/codeAgent/agent.d.ts +50 -0
  260. package/build/lib/core/agents/specialized/codeAgent/agent.js +31 -0
  261. package/build/lib/core/agents/specialized/codeAgent/prompts.d.ts +1 -0
  262. package/build/lib/core/agents/specialized/codeAgent/schemas.d.ts +11 -0
  263. package/build/lib/core/agents/specialized/codeAgent/schemas.js +10 -0
  264. package/build/lib/core/agents/specialized/cvssScorer/index.d.ts +56 -0
  265. package/build/lib/core/agents/specialized/environment/agent.d.ts +43 -0
  266. package/build/lib/core/agents/specialized/environment/index.d.ts +4 -0
  267. package/build/lib/core/agents/specialized/environment/prompts.d.ts +10 -0
  268. package/build/lib/core/agents/specialized/environment/types.d.ts +37 -0
  269. package/build/lib/core/agents/specialized/findingJudge/agent.d.ts +22 -0
  270. package/build/lib/core/agents/specialized/findingJudge/agent.js +224 -0
  271. package/build/lib/core/agents/specialized/findingJudge/index.d.ts +31 -0
  272. package/build/lib/core/agents/specialized/findingJudge/index.js +13 -0
  273. package/build/lib/core/agents/specialized/findingJudge/prompts.d.ts +3 -0
  274. package/build/lib/core/agents/specialized/findingJudge/types.d.ts +77 -0
  275. package/build/lib/core/agents/specialized/googleSignInPrompt.d.ts +4 -0
  276. package/build/lib/core/agents/specialized/mobileOtpPrompt.d.ts +1 -0
  277. package/build/lib/core/agents/specialized/patching/agent.d.ts +64 -0
  278. package/build/lib/core/agents/specialized/patching/index.d.ts +4 -0
  279. package/build/lib/core/agents/specialized/patching/index.js +44 -0
  280. package/build/lib/core/agents/specialized/patching/prompts.d.ts +17 -0
  281. package/build/lib/core/agents/specialized/patching/types.d.ts +40 -0
  282. package/build/lib/core/agents/specialized/pentest/agent.d.ts +172 -0
  283. package/build/lib/core/agents/specialized/pentest/agent.js +43 -0
  284. package/build/lib/core/agents/specialized/pentest/helperWorkspace.d.ts +16 -0
  285. package/build/lib/core/agents/specialized/pentest/planPrompt.d.ts +13 -0
  286. package/build/lib/core/agents/specialized/utils.d.ts +7 -0
  287. package/build/lib/core/agents/specialized/vulnerabilityReproduction/agent.d.ts +94 -0
  288. package/build/lib/core/agents/specialized/whiteboxAttackSurface/agent.d.ts +148 -0
  289. package/build/lib/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.d.ts +61 -0
  290. package/build/lib/core/agents/specialized/whiteboxAttackSurface/index.d.ts +5 -0
  291. package/build/lib/core/agents/specialized/whiteboxAttackSurface/index.js +47 -0
  292. package/build/lib/core/agents/specialized/whiteboxAttackSurface/prompts.d.ts +34 -0
  293. package/build/lib/core/agents/specialized/whiteboxAttackSurface/types.d.ts +382 -0
  294. package/build/lib/core/agents/specialized/whiteboxAttackSurface/types.js +21 -0
  295. package/build/lib/core/ai/ai.d.ts +342 -0
  296. package/build/lib/core/ai/ai.js +68 -0
  297. package/build/lib/core/ai/caching.d.ts +26 -0
  298. package/build/lib/core/ai/compactionEvidence.d.ts +15 -0
  299. package/build/lib/core/ai/compactionTelemetry.d.ts +55 -0
  300. package/build/lib/core/ai/contextManagement.d.ts +85 -0
  301. package/build/lib/core/ai/index.d.ts +10 -0
  302. package/build/lib/core/ai/index.js +72 -0
  303. package/build/lib/core/ai/inference-attempt/adapters.d.ts +15 -0
  304. package/build/lib/core/ai/inference-attempt/builder.d.ts +31 -0
  305. package/build/lib/core/ai/inference-attempt/envelope.d.ts +120 -0
  306. package/build/lib/core/ai/inference-attempt/errors.d.ts +6 -0
  307. package/build/lib/core/ai/inference-attempt/identity.d.ts +13 -0
  308. package/build/lib/core/ai/inference-attempt/index.d.ts +36 -0
  309. package/build/lib/core/ai/inference-attempt/project.d.ts +21 -0
  310. package/build/lib/core/ai/inference-attempt/recording.d.ts +23 -0
  311. package/build/lib/core/ai/inference-attempt/tokens.d.ts +13 -0
  312. package/build/lib/core/ai/inference-attempt/validate.d.ts +2 -0
  313. package/build/lib/core/ai/mantle.d.ts +28 -0
  314. package/build/lib/core/ai/model-history.d.ts +4 -0
  315. package/build/lib/core/ai/models/anthropic.d.ts +2 -0
  316. package/build/lib/core/ai/models/bedrock.d.ts +2 -0
  317. package/build/lib/core/ai/models/claude-capabilities.d.ts +7 -0
  318. package/build/lib/core/ai/models/concentrate.d.ts +2 -0
  319. package/build/lib/core/ai/models/google.d.ts +2 -0
  320. package/build/lib/core/ai/models/inception.d.ts +2 -0
  321. package/build/lib/core/ai/models/index.d.ts +29 -0
  322. package/build/lib/core/ai/models/mantle.d.ts +2 -0
  323. package/build/lib/core/ai/models/openai.d.ts +2 -0
  324. package/build/lib/core/ai/models/openrouter.d.ts +2 -0
  325. package/build/lib/core/ai/models/pensar.d.ts +2 -0
  326. package/build/lib/core/ai/native-rollout-evidence/capture.d.ts +31 -0
  327. package/build/lib/core/ai/native-rollout-evidence/content.d.ts +14 -0
  328. package/build/lib/core/ai/native-rollout-evidence/index.d.ts +9 -0
  329. package/build/lib/core/ai/native-rollout-evidence/provider-metadata.d.ts +15 -0
  330. package/build/lib/core/ai/native-rollout-evidence/schema.d.ts +554 -0
  331. package/build/lib/core/ai/native-rollout-evidence/validate.d.ts +8 -0
  332. package/build/lib/core/ai/providers/anthropic.d.ts +2 -0
  333. package/build/lib/core/ai/providers/concentrate.d.ts +9 -0
  334. package/build/lib/core/ai/providers/custom.d.ts +3 -0
  335. package/build/lib/core/ai/providers/hoonify.d.ts +6 -0
  336. package/build/lib/core/ai/providers/openai-pro-fetch.d.ts +2 -0
  337. package/build/lib/core/ai/providers/pensar.d.ts +34 -0
  338. package/build/lib/core/ai/providers/pensarFormatters.d.ts +2 -0
  339. package/build/lib/core/ai/providers/pensarResponsesStream.d.ts +15 -0
  340. package/build/lib/core/ai/providers/pensarSSE.d.ts +23 -0
  341. package/build/lib/core/ai/providers/pensarSigning.d.ts +1 -0
  342. package/build/lib/core/ai/providers/pensarStreamUsage.d.ts +19 -0
  343. package/build/lib/core/ai/streamTelemetry.d.ts +22 -0
  344. package/build/lib/core/ai/utils.d.ts +90 -0
  345. package/build/lib/core/ai/utils.js +22 -0
  346. package/build/lib/core/api/apiClient.d.ts +7 -0
  347. package/build/lib/core/api/apps.d.ts +213 -0
  348. package/build/lib/core/api/attackSurface.d.ts +14 -0
  349. package/build/lib/core/api/authentication.d.ts +3 -0
  350. package/build/lib/core/api/benchmark.d.ts +5 -0
  351. package/build/lib/core/api/blackboxPentest.d.ts +11 -0
  352. package/build/lib/core/api/clientIdentity.d.ts +10 -0
  353. package/build/lib/core/api/constants.d.ts +5 -0
  354. package/build/lib/core/api/domains.d.ts +19 -0
  355. package/build/lib/core/api/environment.d.ts +16 -0
  356. package/build/lib/core/api/index.d.ts +41 -0
  357. package/build/lib/core/api/index.js +187 -0
  358. package/build/lib/core/api/issues.d.ts +273 -0
  359. package/build/lib/core/api/knowledge.d.ts +33 -0
  360. package/build/lib/core/api/localWorker.d.ts +4 -0
  361. package/build/lib/core/api/offesecAgent.d.ts +34 -0
  362. package/build/lib/core/api/patching.d.ts +15 -0
  363. package/build/lib/core/api/recordedRun.d.ts +36 -0
  364. package/build/lib/core/api/targetedPentest.d.ts +15 -0
  365. package/build/lib/core/api/targetedPentest.js +32 -0
  366. package/build/lib/core/api/threatModel.d.ts +1 -0
  367. package/build/lib/core/api/trajectoryExport.d.ts +38 -0
  368. package/build/lib/core/api/vulnerabilityReproduction.d.ts +10 -0
  369. package/build/lib/core/assets/wordlists.d.ts +31 -0
  370. package/build/lib/core/atif/convert.d.ts +27 -0
  371. package/build/lib/core/atif/index.d.ts +7 -0
  372. package/build/lib/core/atif/schema.d.ts +459 -0
  373. package/build/lib/core/atif/serialize.d.ts +2 -0
  374. package/build/lib/core/atif/test-fixtures.d.ts +28 -0
  375. package/build/lib/core/atif/validate.d.ts +12 -0
  376. package/build/lib/core/auth/connection.d.ts +12 -0
  377. package/build/lib/core/auth/device-flow.d.ts +38 -0
  378. package/build/lib/core/auth/gateway.d.ts +25 -0
  379. package/build/lib/core/auth/index.d.ts +8 -0
  380. package/build/lib/core/auth/signing.d.ts +14 -0
  381. package/build/lib/core/auth/token.d.ts +17 -0
  382. package/build/lib/core/auth/types.d.ts +85 -0
  383. package/build/lib/core/auth/workspaces.d.ts +34 -0
  384. package/build/lib/core/benchmark/index.d.ts +3 -0
  385. package/build/lib/core/benchmark/report.d.ts +3 -0
  386. package/build/lib/core/benchmark/runner.d.ts +3 -0
  387. package/build/lib/core/benchmark/types.d.ts +80 -0
  388. package/build/lib/core/cli/logLevelArgs.d.ts +18 -0
  389. package/build/lib/core/cli/model.d.ts +9 -0
  390. package/build/lib/core/cli/pentestMode.d.ts +5 -0
  391. package/build/lib/core/cli/tuiArgs.d.ts +5 -0
  392. package/build/lib/core/config/config.d.ts +86 -0
  393. package/build/lib/core/config/customProviders.d.ts +62 -0
  394. package/build/lib/core/config/index.d.ts +6 -0
  395. package/build/lib/core/config/index.js +6 -0
  396. package/build/lib/core/credentials/index.d.ts +2 -0
  397. package/build/lib/core/credentials/manager.d.ts +85 -0
  398. package/build/lib/core/credentials/types.d.ts +79 -0
  399. package/build/lib/core/doctor.d.ts +1 -0
  400. package/build/lib/core/eventBus.d.ts +195 -0
  401. package/build/lib/core/eventBus.js +6 -0
  402. package/build/lib/core/findings/attackSurfaceRegistry.d.ts +88 -0
  403. package/build/lib/core/findings/attackSurfaceRegistry.js +6 -0
  404. package/build/lib/core/findings/registry.d.ts +177 -0
  405. package/build/lib/core/findings/registry.js +21 -0
  406. package/build/lib/core/history.d.ts +23 -0
  407. package/build/lib/core/hoonify.d.ts +8 -0
  408. package/build/lib/core/http/parse.d.ts +50 -0
  409. package/build/lib/core/http/redirects.d.ts +23 -0
  410. package/build/lib/core/http/targetHeaders.d.ts +30 -0
  411. package/build/lib/core/http/targetScope.d.ts +12 -0
  412. package/build/lib/core/http/types.d.ts +11 -0
  413. package/build/lib/core/id/id.d.ts +60 -0
  414. package/build/lib/core/id/id.js +28 -0
  415. package/build/lib/core/installation/index.d.ts +25 -0
  416. package/build/lib/core/integrations/herdr.d.ts +13 -0
  417. package/build/lib/core/integrations/surface/index.d.ts +37 -0
  418. package/build/lib/core/integrations/surface/types.d.ts +22 -0
  419. package/build/lib/core/integrations/wandb/client.d.ts +23 -0
  420. package/build/lib/core/integrations/wandb/upload.d.ts +36 -0
  421. package/build/lib/core/logger/index.d.ts +62 -0
  422. package/build/lib/core/logger/structured.d.ts +30 -0
  423. package/build/lib/core/memory/index.d.ts +92 -0
  424. package/build/lib/core/memory/index.js +21 -0
  425. package/build/lib/core/messages/types.d.ts +96 -0
  426. package/build/lib/core/obfuscation/engine.d.ts +51 -0
  427. package/build/lib/core/obfuscation/index.d.ts +20 -0
  428. package/build/lib/core/observability/active-root-spans.d.ts +5 -0
  429. package/build/lib/core/observability/active-spans.d.ts +22 -0
  430. package/build/lib/core/observability/index.d.ts +36 -0
  431. package/build/lib/core/observability/index.js +27 -0
  432. package/build/lib/core/observability/runtime.d.ts +63 -0
  433. package/build/lib/core/observability/telemetry.d.ts +52 -0
  434. package/build/lib/core/observability/testkit.d.ts +24 -0
  435. package/build/lib/core/operator/approvalGate.d.ts +61 -0
  436. package/build/lib/core/operator/index.d.ts +9 -0
  437. package/build/lib/core/operator/types.d.ts +167 -0
  438. package/build/lib/core/plan/index.d.ts +16 -0
  439. package/build/lib/core/prompt-injections/index.d.ts +111 -0
  440. package/build/lib/core/prompt-injections/index.js +24 -0
  441. package/build/lib/core/providers/index.d.ts +5 -0
  442. package/build/lib/core/providers/types.d.ts +13 -0
  443. package/build/lib/core/providers/utils.d.ts +15 -0
  444. package/build/lib/core/providers/verify.d.ts +11 -0
  445. package/build/lib/core/report/builder.d.ts +9 -0
  446. package/build/lib/core/report/index.d.ts +7 -0
  447. package/build/lib/core/report/renderers/json.d.ts +2 -0
  448. package/build/lib/core/report/renderers/markdown.d.ts +2 -0
  449. package/build/lib/core/report/schemas.d.ts +115 -0
  450. package/build/lib/core/runtime/agentExecution.d.ts +15 -0
  451. package/build/lib/core/runtime/launchLocalWorker.d.ts +33 -0
  452. package/build/lib/core/runtime/localRunLock.d.ts +9 -0
  453. package/build/lib/core/runtime/localRunWorker.d.ts +18 -0
  454. package/build/lib/core/runtime/localWorkerEndpoint.d.ts +14 -0
  455. package/build/lib/core/runtime/localWorkerProtocol.d.ts +294 -0
  456. package/build/lib/core/runtime/localWorkerTransport.d.ts +30 -0
  457. package/build/lib/core/runtime/persistenceError.d.ts +9 -0
  458. package/build/lib/core/runtime/recordedExecution.d.ts +6 -0
  459. package/build/lib/core/runtime/recordedRunClient.d.ts +34 -0
  460. package/build/lib/core/runtime/runCheckpointStore.d.ts +11 -0
  461. package/build/lib/core/runtime/runContext.d.ts +48 -0
  462. package/build/lib/core/runtime/runControl.d.ts +44 -0
  463. package/build/lib/core/runtime/runControlStore.d.ts +83 -0
  464. package/build/lib/core/runtime/runDeadline.d.ts +4 -0
  465. package/build/lib/core/runtime/runEvidence.d.ts +37 -0
  466. package/build/lib/core/runtime/runInference.d.ts +9 -0
  467. package/build/lib/core/runtime/runModelStore.d.ts +27 -0
  468. package/build/lib/core/runtime/runObservation.d.ts +19 -0
  469. package/build/lib/core/runtime/runRecoveryContext.d.ts +20 -0
  470. package/build/lib/core/runtime/runRecoveryPlan.d.ts +38 -0
  471. package/build/lib/core/runtime/runRecoveryStore.d.ts +77 -0
  472. package/build/lib/core/runtime/runStore.d.ts +133 -0
  473. package/build/lib/core/runtime/runStorePath.d.ts +1 -0
  474. package/build/lib/core/runtime/runToolStore.d.ts +50 -0
  475. package/build/lib/core/runtime/runTools.d.ts +16 -0
  476. package/build/lib/core/runtime/sqliteControlStore.d.ts +41 -0
  477. package/build/lib/core/runtime/sqliteModelStore.d.ts +20 -0
  478. package/build/lib/core/runtime/sqliteRecoveryStore.d.ts +35 -0
  479. package/build/lib/core/runtime/sqliteRunStore.d.ts +8 -0
  480. package/build/lib/core/runtime/sqliteToolStore.d.ts +30 -0
  481. package/build/lib/core/runtime/testfixtures/localWorkerChild.d.ts +1 -0
  482. package/build/lib/core/runtime/testfixtures/localWorkerLauncher.d.ts +1 -0
  483. package/build/lib/core/runtime/testfixtures/recoveryChild.d.ts +1 -0
  484. package/build/lib/core/services/rateLimiter/index.d.ts +36 -0
  485. package/build/lib/core/services/rateLimiter/types.d.ts +10 -0
  486. package/build/lib/core/session/execution-metrics.d.ts +37 -0
  487. package/build/lib/core/session/index.d.ts +586 -0
  488. package/build/lib/core/session/index.js +36 -0
  489. package/build/lib/core/session/loader.d.ts +30 -0
  490. package/build/lib/core/session/persistence.d.ts +215 -0
  491. package/build/lib/core/session/persistence.js +35 -0
  492. package/build/lib/core/session/types.d.ts +59 -0
  493. package/build/lib/core/session/usage.d.ts +37 -0
  494. package/build/lib/core/skills/builtins/index.d.ts +13 -0
  495. package/build/lib/core/skills/builtins/pentest.d.ts +19 -0
  496. package/build/lib/core/skills/builtins/promptInjection.d.ts +2 -0
  497. package/build/lib/core/skills/builtins/threatModel.d.ts +11 -0
  498. package/build/lib/core/skills/index.d.ts +5 -0
  499. package/build/lib/core/skills/parser.d.ts +11 -0
  500. package/build/lib/core/skills/registry.d.ts +30 -0
  501. package/build/lib/core/skills/scanner.d.ts +12 -0
  502. package/build/lib/core/skills/types.d.ts +44 -0
  503. package/build/lib/core/skills/utils.d.ts +6 -0
  504. package/build/lib/core/storage/index.d.ts +248 -0
  505. package/build/lib/core/tasks/index.d.ts +78 -0
  506. package/build/lib/core/tools/backends/capture.d.ts +10 -0
  507. package/build/lib/core/tools/backends/collectCommand.d.ts +9 -0
  508. package/build/lib/core/tools/backends/helpers.d.ts +43 -0
  509. package/build/lib/core/tools/backends/httpTransport.d.ts +18 -0
  510. package/build/lib/core/tools/backends/index.d.ts +8 -0
  511. package/build/lib/core/tools/backends/index.js +31 -0
  512. package/build/lib/core/tools/backends/local.d.ts +11 -0
  513. package/build/lib/core/tools/backends/policy.d.ts +39 -0
  514. package/build/lib/core/tools/backends/resolve.d.ts +25 -0
  515. package/build/lib/core/tools/backends/types.d.ts +240 -0
  516. package/build/lib/core/tools/backends/whitebox.d.ts +6 -0
  517. package/build/lib/core/tools/backends/whiteboxJobs.d.ts +18 -0
  518. package/build/lib/core/tools/backends/windowsProgram.d.ts +4 -0
  519. package/build/lib/core/tools/daytonaSandbox.d.ts +14 -0
  520. package/build/lib/core/toolset/index.d.ts +28 -0
  521. package/build/lib/core/util/lazyLogger.d.ts +16 -0
  522. package/build/lib/core/utils/concurrency.d.ts +16 -0
  523. package/build/lib/core/utils/prompt.d.ts +12 -0
  524. package/build/lib/core/whitebox/adapters.d.ts +29 -0
  525. package/build/lib/core/whitebox/artifacts.d.ts +32 -0
  526. package/build/lib/core/whitebox/boundedProcess.d.ts +35 -0
  527. package/build/lib/core/whitebox/candidates.d.ts +29 -0
  528. package/build/lib/core/whitebox/catalog.d.ts +10 -0
  529. package/build/lib/core/whitebox/index.d.ts +9 -0
  530. package/build/lib/core/whitebox/jobKernel.d.ts +33 -0
  531. package/build/lib/core/whitebox/jobSupervisor.d.ts +14 -0
  532. package/build/lib/core/whitebox/jobs.d.ts +17 -0
  533. package/build/lib/core/whitebox/paths.d.ts +22 -0
  534. package/build/lib/core/whitebox/profileTransport.d.ts +10 -0
  535. package/build/lib/core/whitebox/profiles.d.ts +3 -0
  536. package/build/lib/core/whitebox/repoProfile.d.ts +4 -0
  537. package/build/lib/core/whitebox/types.d.ts +108 -0
  538. package/build/lib/core/workflows/fastStrike.d.ts +4 -0
  539. package/build/lib/core/workflows/pentest.d.ts +167 -0
  540. package/build/lib/core/workflows/pentest.js +42 -0
  541. package/build/lib/core/workflows/seams.d.ts +102 -0
  542. package/build/lib/core/workflows/seams.js +37 -0
  543. package/build/lib/core/workflows/threatModel.d.ts +26 -0
  544. package/build/lib/core/workflows/whiteboxAttackSurface.d.ts +142 -0
  545. package/build/lib/core/workflows/whiteboxAttackSurface.js +36 -0
  546. package/build/lib/index.d.ts +26 -0
  547. package/build/lib/index.js +96 -0
  548. package/build/lib/lib/attack-path/types.d.ts +9 -0
  549. package/build/lib/lib/cvss/calculator.d.ts +31 -0
  550. package/build/lib/lib/cvss/index.d.ts +24 -0
  551. package/build/lib/lib/cvss/index.js +24 -0
  552. package/build/lib/lib/cvss/macrovector-scores.d.ts +59 -0
  553. package/build/lib/lib/cvss/types.d.ts +114 -0
  554. package/build/lib/lib/cvss/types.js +8 -0
  555. package/build/lib/lib/cwe/cwe-catalog.d.ts +13 -0
  556. package/build/lib/lib/cwe/types.d.ts +28 -0
  557. package/build/lib/lib/cwe/validate.d.ts +15 -0
  558. package/build/lib/lib/evidence/types.d.ts +12 -0
  559. package/build/lib/util/errors.d.ts +186 -0
  560. package/build/lib/util/lock.d.ts +2 -0
  561. package/build/lib/util/name.d.ts +14 -0
  562. package/build/lib/util/url.d.ts +40 -0
  563. package/build/{logs-wzr5176k.js → logs-v5503qqk.js} +22 -30
  564. package/build/{multipart-parser-g2xxkezz.js → multipart-parser-vjjdbpd1.js} +10 -10
  565. package/build/native-rollout-evidence-1qwze8nm.js +135 -0
  566. package/build/offesecAgent-w5a2r0wa.js +22 -0
  567. package/build/{parse-rtccymzn.js → parse-cqecqrc5.js} +0 -4
  568. package/build/pentest-fxya42cg.js +22 -0
  569. package/build/pentests-6qntz6wz.js +143 -0
  570. package/build/recordedRunClient-rtdeagzx.js +11 -0
  571. package/build/{targetedPentest-tdwtgmxm.js → targetedPentest-khnxcvmb.js} +22 -22
  572. package/build/{targets-763n91t7.js → targets-ty7dahv4.js} +24 -32
  573. package/build/threatModel-28ayxe0n.js +21 -0
  574. package/build/{token-3bbp59y6.js → token-mk7t8y0y.js} +2 -2
  575. package/build/{token-util-6xjme11b.js → token-util-vd776hrv.js} +1 -2
  576. package/build/{uninstall-d33159cz.js → uninstall-nrhvt32a.js} +3 -3
  577. package/build/{upload-9qj1kpt9.js → upload-sx9gth59.js} +8 -14
  578. package/build/{utils-t7gc2903.js → utils-qetcfvgg.js} +29 -29
  579. package/package.json +230 -5
  580. package/src/cli/agent-runs.attach.test.ts +359 -0
  581. package/src/cli/agent-runs.test.ts +1172 -0
  582. package/src/cli/agent-runs.ts +430 -0
  583. package/src/cli/apps.test.ts +63 -0
  584. package/src/cli/apps.ts +526 -0
  585. package/src/cli/auth.ts +375 -0
  586. package/src/cli/command-exit.test.ts +15 -0
  587. package/src/cli/command-exit.ts +3 -0
  588. package/src/cli/config.ts +210 -0
  589. package/src/cli/export-trajectory.test.ts +224 -0
  590. package/src/cli/export-trajectory.ts +119 -0
  591. package/src/cli/fixes.ts +56 -0
  592. package/src/cli/issues.test.ts +214 -0
  593. package/src/cli/issues.ts +242 -0
  594. package/src/cli/json-output.test.ts +62 -0
  595. package/src/cli/knowledge.test.ts +140 -0
  596. package/src/cli/knowledge.ts +146 -0
  597. package/src/cli/launcher.test.ts +81 -0
  598. package/src/cli/logs.ts +111 -0
  599. package/src/cli/native-rollout-evidence.test.ts +322 -0
  600. package/src/cli/native-rollout-evidence.ts +206 -0
  601. package/src/cli/pentests.test.ts +194 -0
  602. package/src/cli/pentests.ts +159 -0
  603. package/src/cli/resume.test.ts +107 -0
  604. package/src/cli/targets.ts +125 -0
  605. package/src/cli/uninstall.ts +302 -0
  606. package/src/cli.ts +882 -0
  607. package/src/core/agents/agentRuntime.test.ts +242 -0
  608. package/src/core/agents/agentRuntime.ts +120 -0
  609. package/src/core/agents/defineAgent.ts +134 -0
  610. package/src/core/agents/offSecAgent/index.ts +162 -0
  611. package/src/core/agents/offSecAgent/interruptedStepFinalization.test.ts +295 -0
  612. package/src/core/agents/offSecAgent/interruptedStepFinalization.ts +162 -0
  613. package/src/core/agents/offSecAgent/interruptedStepMessages.test.ts +296 -0
  614. package/src/core/agents/offSecAgent/interruptedStepMessages.ts +137 -0
  615. package/src/core/agents/offSecAgent/messagePersistence.test.ts +281 -0
  616. package/src/core/agents/offSecAgent/messagePersistence.ts +111 -0
  617. package/src/core/agents/offSecAgent/offensiveSecurityAgent.runtimeContext.test.ts +689 -0
  618. package/src/core/agents/offSecAgent/offensiveSecurityAgent.test.ts +2899 -0
  619. package/src/core/agents/offSecAgent/offensiveSecurityAgent.ts +1610 -0
  620. package/src/core/agents/offSecAgent/prompt.test.ts +72 -0
  621. package/src/core/agents/offSecAgent/prompt.ts +368 -0
  622. package/src/core/agents/offSecAgent/recordedTools.test.ts +580 -0
  623. package/src/core/agents/offSecAgent/recordedTools.ts +162 -0
  624. package/src/core/agents/offSecAgent/runtimeContext.test.ts +531 -0
  625. package/src/core/agents/offSecAgent/runtimeContext.ts +387 -0
  626. package/src/core/agents/offSecAgent/selectiveConstruction.publicPath.test.ts +295 -0
  627. package/src/core/agents/offSecAgent/selectiveConstruction.test.ts +498 -0
  628. package/src/core/agents/offSecAgent/streamDiagnostics.test.ts +310 -0
  629. package/src/core/agents/offSecAgent/streamDiagnostics.ts +237 -0
  630. package/src/core/agents/offSecAgent/subagentSpawner.hooks.test.ts +102 -0
  631. package/src/core/agents/offSecAgent/subagentSpawner.test.ts +384 -0
  632. package/src/core/agents/offSecAgent/subagentSpawner.ts +664 -0
  633. package/src/core/agents/offSecAgent/toolLifecycle.test.ts +199 -0
  634. package/src/core/agents/offSecAgent/toolLifecycle.ts +171 -0
  635. package/src/core/agents/offSecAgent/tools/__tests__/sandboxScript.ts +14 -0
  636. package/src/core/agents/offSecAgent/tools/addMemory.ts +87 -0
  637. package/src/core/agents/offSecAgent/tools/agentScratch.test.ts +36 -0
  638. package/src/core/agents/offSecAgent/tools/agentScratch.ts +23 -0
  639. package/src/core/agents/offSecAgent/tools/applyPatch.test.ts +546 -0
  640. package/src/core/agents/offSecAgent/tools/applyPatch.ts +58 -0
  641. package/src/core/agents/offSecAgent/tools/applyPatchImpl.ts +300 -0
  642. package/src/core/agents/offSecAgent/tools/askUserQuestions.ts +81 -0
  643. package/src/core/agents/offSecAgent/tools/authBackendStatus.test.ts +112 -0
  644. package/src/core/agents/offSecAgent/tools/browserHeaderRouting.test.ts +136 -0
  645. package/src/core/agents/offSecAgent/tools/browserHeaderRouting.ts +81 -0
  646. package/src/core/agents/offSecAgent/tools/browserToolFactories.ts +372 -0
  647. package/src/core/agents/offSecAgent/tools/browserTools.test.ts +243 -0
  648. package/src/core/agents/offSecAgent/tools/browserTools.ts +285 -0
  649. package/src/core/agents/offSecAgent/tools/callbackListener.test.ts +1011 -0
  650. package/src/core/agents/offSecAgent/tools/callbackListener.ts +1038 -0
  651. package/src/core/agents/offSecAgent/tools/camoufox.test.ts +119 -0
  652. package/src/core/agents/offSecAgent/tools/camoufox.ts +199 -0
  653. package/src/core/agents/offSecAgent/tools/checkpointState.ts +79 -0
  654. package/src/core/agents/offSecAgent/tools/codingTools.windows.test.ts +625 -0
  655. package/src/core/agents/offSecAgent/tools/completeAuthentication.ts +136 -0
  656. package/src/core/agents/offSecAgent/tools/crawlAuthenticated.test.ts +267 -0
  657. package/src/core/agents/offSecAgent/tools/crawlAuthenticated.ts +170 -0
  658. package/src/core/agents/offSecAgent/tools/createAttackSurfaceReport.ts +75 -0
  659. package/src/core/agents/offSecAgent/tools/createFile.test.ts +111 -0
  660. package/src/core/agents/offSecAgent/tools/createFile.ts +44 -0
  661. package/src/core/agents/offSecAgent/tools/createTask.ts +118 -0
  662. package/src/core/agents/offSecAgent/tools/delegateAuth.ts +391 -0
  663. package/src/core/agents/offSecAgent/tools/deleteFile.test.ts +102 -0
  664. package/src/core/agents/offSecAgent/tools/deleteFile.ts +39 -0
  665. package/src/core/agents/offSecAgent/tools/destructiveGuard.test.ts +827 -0
  666. package/src/core/agents/offSecAgent/tools/destructiveGuard.ts +747 -0
  667. package/src/core/agents/offSecAgent/tools/detectAuthScheme.ts +191 -0
  668. package/src/core/agents/offSecAgent/tools/documentApp.ts +242 -0
  669. package/src/core/agents/offSecAgent/tools/documentEndpoint.ts +291 -0
  670. package/src/core/agents/offSecAgent/tools/documentFinding.test.ts +2091 -0
  671. package/src/core/agents/offSecAgent/tools/documentFinding.ts +1240 -0
  672. package/src/core/agents/offSecAgent/tools/email/adapters.test.ts +279 -0
  673. package/src/core/agents/offSecAgent/tools/email/adapters.ts +1121 -0
  674. package/src/core/agents/offSecAgent/tools/email/getAttachments.ts +73 -0
  675. package/src/core/agents/offSecAgent/tools/email/getMessage.ts +56 -0
  676. package/src/core/agents/offSecAgent/tools/email/inboxBackend.test.ts +137 -0
  677. package/src/core/agents/offSecAgent/tools/email/index.ts +55 -0
  678. package/src/core/agents/offSecAgent/tools/email/listInboxes.ts +47 -0
  679. package/src/core/agents/offSecAgent/tools/email/listMessages.ts +67 -0
  680. package/src/core/agents/offSecAgent/tools/email/markRead.ts +57 -0
  681. package/src/core/agents/offSecAgent/tools/email/searchMessages.ts +76 -0
  682. package/src/core/agents/offSecAgent/tools/email/sendEmail.ts +165 -0
  683. package/src/core/agents/offSecAgent/tools/email/types.ts +45 -0
  684. package/src/core/agents/offSecAgent/tools/executeCommand.backends.test.ts +171 -0
  685. package/src/core/agents/offSecAgent/tools/executeCommand.test.ts +1153 -0
  686. package/src/core/agents/offSecAgent/tools/executeCommand.ts +604 -0
  687. package/src/core/agents/offSecAgent/tools/extractJsEndpoints.ts +44 -0
  688. package/src/core/agents/offSecAgent/tools/fileBackends.test.ts +66 -0
  689. package/src/core/agents/offSecAgent/tools/fileMutations.test.ts +159 -0
  690. package/src/core/agents/offSecAgent/tools/fileToolBackendPurity.test.ts +72 -0
  691. package/src/core/agents/offSecAgent/tools/fileWorkspace.test.ts +357 -0
  692. package/src/core/agents/offSecAgent/tools/fileWorkspace.ts +434 -0
  693. package/src/core/agents/offSecAgent/tools/fileWorkspaceRemote.ts +263 -0
  694. package/src/core/agents/offSecAgent/tools/getMemory.ts +69 -0
  695. package/src/core/agents/offSecAgent/tools/getPage.test.ts +1127 -0
  696. package/src/core/agents/offSecAgent/tools/getPage.ts +70 -0
  697. package/src/core/agents/offSecAgent/tools/gitDiff.ts +67 -0
  698. package/src/core/agents/offSecAgent/tools/gitStatus.ts +61 -0
  699. package/src/core/agents/offSecAgent/tools/gitTools.test.ts +237 -0
  700. package/src/core/agents/offSecAgent/tools/glob.test.ts +695 -0
  701. package/src/core/agents/offSecAgent/tools/glob.ts +51 -0
  702. package/src/core/agents/offSecAgent/tools/globImpl.ts +313 -0
  703. package/src/core/agents/offSecAgent/tools/globPattern.ts +203 -0
  704. package/src/core/agents/offSecAgent/tools/grep.test.ts +922 -0
  705. package/src/core/agents/offSecAgent/tools/grep.ts +73 -0
  706. package/src/core/agents/offSecAgent/tools/grepImpl.ts +718 -0
  707. package/src/core/agents/offSecAgent/tools/httpBackends.test.ts +534 -0
  708. package/src/core/agents/offSecAgent/tools/httpRequest.test.ts +2409 -0
  709. package/src/core/agents/offSecAgent/tools/httpRequest.ts +425 -0
  710. package/src/core/agents/offSecAgent/tools/index.ts +787 -0
  711. package/src/core/agents/offSecAgent/tools/listFiles.bounded.test.ts +514 -0
  712. package/src/core/agents/offSecAgent/tools/listFiles.public-counters.test.ts +163 -0
  713. package/src/core/agents/offSecAgent/tools/listFiles.test.ts +521 -0
  714. package/src/core/agents/offSecAgent/tools/listFiles.ts +49 -0
  715. package/src/core/agents/offSecAgent/tools/listFilesImpl.ts +351 -0
  716. package/src/core/agents/offSecAgent/tools/listMemories.ts +71 -0
  717. package/src/core/agents/offSecAgent/tools/listPromptInjections.test.ts +201 -0
  718. package/src/core/agents/offSecAgent/tools/listPromptInjections.ts +78 -0
  719. package/src/core/agents/offSecAgent/tools/listTasks.ts +100 -0
  720. package/src/core/agents/offSecAgent/tools/patchApply.test.ts +573 -0
  721. package/src/core/agents/offSecAgent/tools/patchApply.ts +430 -0
  722. package/src/core/agents/offSecAgent/tools/patchParse.test.ts +383 -0
  723. package/src/core/agents/offSecAgent/tools/patchParse.ts +354 -0
  724. package/src/core/agents/offSecAgent/tools/perCommandShell.drain.test.ts +109 -0
  725. package/src/core/agents/offSecAgent/tools/perCommandShell.test.ts +565 -0
  726. package/src/core/agents/offSecAgent/tools/perCommandShell.ts +516 -0
  727. package/src/core/agents/offSecAgent/tools/perCommandShell.windows.test.ts +142 -0
  728. package/src/core/agents/offSecAgent/tools/playwrightMcp.test.ts +778 -0
  729. package/src/core/agents/offSecAgent/tools/playwrightMcp.ts +1426 -0
  730. package/src/core/agents/offSecAgent/tools/probeAuthEndpoints.ts +262 -0
  731. package/src/core/agents/offSecAgent/tools/profileCodebase.ts +110 -0
  732. package/src/core/agents/offSecAgent/tools/provideComparisonResults.ts +106 -0
  733. package/src/core/agents/offSecAgent/tools/queryWhiteboxCatalog.coalescing-cost.test.ts +108 -0
  734. package/src/core/agents/offSecAgent/tools/queryWhiteboxCatalog.test.ts +183 -0
  735. package/src/core/agents/offSecAgent/tools/queryWhiteboxCatalog.ts +143 -0
  736. package/src/core/agents/offSecAgent/tools/readFile.test.ts +1242 -0
  737. package/src/core/agents/offSecAgent/tools/readFile.ts +89 -0
  738. package/src/core/agents/offSecAgent/tools/readFileImpl.ts +956 -0
  739. package/src/core/agents/offSecAgent/tools/readSkill.ts +38 -0
  740. package/src/core/agents/offSecAgent/tools/reportError.test.ts +48 -0
  741. package/src/core/agents/offSecAgent/tools/reportError.ts +65 -0
  742. package/src/core/agents/offSecAgent/tools/response.ts +27 -0
  743. package/src/core/agents/offSecAgent/tools/runAttackSurface.ts +198 -0
  744. package/src/core/agents/offSecAgent/tools/runCodeQuery.test.ts +82 -0
  745. package/src/core/agents/offSecAgent/tools/runCodeQuery.ts +237 -0
  746. package/src/core/agents/offSecAgent/tools/runPentestWorkflow.ts +122 -0
  747. package/src/core/agents/offSecAgent/tools/runWhiteboxScan.ts +189 -0
  748. package/src/core/agents/offSecAgent/tools/runtimeBackendConsumers.test.ts +143 -0
  749. package/src/core/agents/offSecAgent/tools/sandbox.ts +37 -0
  750. package/src/core/agents/offSecAgent/tools/sandboxPlaywright.test.ts +235 -0
  751. package/src/core/agents/offSecAgent/tools/sandboxPlaywright.ts +1029 -0
  752. package/src/core/agents/offSecAgent/tools/sandboxScript.test.ts +31 -0
  753. package/src/core/agents/offSecAgent/tools/sandboxScript.ts +60 -0
  754. package/src/core/agents/offSecAgent/tools/scopeGuard.test.ts +574 -0
  755. package/src/core/agents/offSecAgent/tools/scopeGuard.ts +317 -0
  756. package/src/core/agents/offSecAgent/tools/scriptSyntaxCheck.test.ts +566 -0
  757. package/src/core/agents/offSecAgent/tools/scriptSyntaxCheck.ts +240 -0
  758. package/src/core/agents/offSecAgent/tools/selectiveFactories.test.ts +476 -0
  759. package/src/core/agents/offSecAgent/tools/smsInbox.ts +130 -0
  760. package/src/core/agents/offSecAgent/tools/smsListMessages.test.ts +443 -0
  761. package/src/core/agents/offSecAgent/tools/smsListMessages.ts +123 -0
  762. package/src/core/agents/offSecAgent/tools/spawnCodingAgent.ts +229 -0
  763. package/src/core/agents/offSecAgent/tools/spawnPentestAgent.test.ts +413 -0
  764. package/src/core/agents/offSecAgent/tools/spawnPentestAgent.ts +266 -0
  765. package/src/core/agents/offSecAgent/tools/spawnPentestSwarm.ts +146 -0
  766. package/src/core/agents/offSecAgent/tools/submitPlan.ts +51 -0
  767. package/src/core/agents/offSecAgent/tools/testEndpointVariations.ts +127 -0
  768. package/src/core/agents/offSecAgent/tools/threatModelGenerator.ts +664 -0
  769. package/src/core/agents/offSecAgent/tools/toolOutput.test.ts +480 -0
  770. package/src/core/agents/offSecAgent/tools/toolOutput.ts +160 -0
  771. package/src/core/agents/offSecAgent/tools/types.ts +267 -0
  772. package/src/core/agents/offSecAgent/tools/updateFile.ts +121 -0
  773. package/src/core/agents/offSecAgent/tools/updateTask.ts +107 -0
  774. package/src/core/agents/offSecAgent/tools/validateDiscovery.ts +123 -0
  775. package/src/core/agents/offSecAgent/tools/webSearch.ts +265 -0
  776. package/src/core/agents/offSecAgent/tools/whiteboxCandidates.ts +197 -0
  777. package/src/core/agents/offSecAgent/tools/whiteboxJobs.ts +312 -0
  778. package/src/core/agents/offSecAgent/tools/windowsCurl.test.ts +801 -0
  779. package/src/core/agents/offSecAgent/tools/windowsCurl.ts +202 -0
  780. package/src/core/agents/offSecAgent/tools/workspaceApps.test.ts +257 -0
  781. package/src/core/agents/offSecAgent/tools/workspaceApps.ts +334 -0
  782. package/src/core/agents/offSecAgent/tools/workspaceDomains.test.ts +113 -0
  783. package/src/core/agents/offSecAgent/tools/workspaceDomains.ts +57 -0
  784. package/src/core/agents/offSecAgent/tools/workspaceFailure.ts +11 -0
  785. package/src/core/agents/offSecAgent/tools/writePlan.ts +65 -0
  786. package/src/core/agents/offSecAgent/trace.test.ts +796 -0
  787. package/src/core/agents/offSecAgent/trace.ts +633 -0
  788. package/src/core/agents/offSecAgent/types.test.ts +224 -0
  789. package/src/core/agents/offSecAgent/types.ts +676 -0
  790. package/src/core/agents/specialized/attackSurface/blackboxAgent.test.ts +31 -0
  791. package/src/core/agents/specialized/attackSurface/blackboxAgent.ts +272 -0
  792. package/src/core/agents/specialized/attackSurface/blackboxRiskScoring.ts +276 -0
  793. package/src/core/agents/specialized/attackSurface/grpcSchema.ts +142 -0
  794. package/src/core/agents/specialized/attackSurface/jsExtraction.test.ts +237 -0
  795. package/src/core/agents/specialized/attackSurface/jsExtraction.ts +174 -0
  796. package/src/core/agents/specialized/attackSurface/prompts.ts +349 -0
  797. package/src/core/agents/specialized/attackSurface/schemas.ts +300 -0
  798. package/src/core/agents/specialized/attackSurface/types.ts +100 -0
  799. package/src/core/agents/specialized/authenticationAgent/agent.test.ts +111 -0
  800. package/src/core/agents/specialized/authenticationAgent/agent.ts +300 -0
  801. package/src/core/agents/specialized/authenticationAgent/index.ts +74 -0
  802. package/src/core/agents/specialized/authenticationAgent/prompts.test.ts +36 -0
  803. package/src/core/agents/specialized/authenticationAgent/prompts.ts +645 -0
  804. package/src/core/agents/specialized/authenticationAgent/types.ts +833 -0
  805. package/src/core/agents/specialized/benchmark/comparisonAgent.ts +344 -0
  806. package/src/core/agents/specialized/benchmark/docker-utils.ts +257 -0
  807. package/src/core/agents/specialized/benchmark/flag-detector.ts +686 -0
  808. package/src/core/agents/specialized/benchmark/index.ts +28 -0
  809. package/src/core/agents/specialized/benchmark/prompts.ts +257 -0
  810. package/src/core/agents/specialized/benchmark/remote/circuit-breaker.ts +108 -0
  811. package/src/core/agents/specialized/benchmark/remote/daytona-wrapper.ts +1005 -0
  812. package/src/core/agents/specialized/benchmark/remote/index.ts +2 -0
  813. package/src/core/agents/specialized/benchmark/types.ts +98 -0
  814. package/src/core/agents/specialized/benchmarkComparisonAgent.test.ts +111 -0
  815. package/src/core/agents/specialized/benchmarkComparisonAgent.ts +203 -0
  816. package/src/core/agents/specialized/codeAgent/agent.test.ts +89 -0
  817. package/src/core/agents/specialized/codeAgent/agent.ts +134 -0
  818. package/src/core/agents/specialized/codeAgent/prompts.ts +48 -0
  819. package/src/core/agents/specialized/codeAgent/schemas.ts +33 -0
  820. package/src/core/agents/specialized/cvssScorer/index.test.ts +87 -0
  821. package/src/core/agents/specialized/cvssScorer/index.ts +546 -0
  822. package/src/core/agents/specialized/environment/agent.ts +75 -0
  823. package/src/core/agents/specialized/environment/index.ts +16 -0
  824. package/src/core/agents/specialized/environment/prompts.ts +194 -0
  825. package/src/core/agents/specialized/environment/types.ts +48 -0
  826. package/src/core/agents/specialized/findingJudge/agent.test.ts +114 -0
  827. package/src/core/agents/specialized/findingJudge/agent.ts +59 -0
  828. package/src/core/agents/specialized/findingJudge/index.test.ts +155 -0
  829. package/src/core/agents/specialized/findingJudge/index.ts +166 -0
  830. package/src/core/agents/specialized/findingJudge/prompts.ts +140 -0
  831. package/src/core/agents/specialized/findingJudge/types.ts +115 -0
  832. package/src/core/agents/specialized/googleSignInPrompt.test.ts +29 -0
  833. package/src/core/agents/specialized/googleSignInPrompt.ts +18 -0
  834. package/src/core/agents/specialized/mobileOtpPrompt.ts +9 -0
  835. package/src/core/agents/specialized/patching/agent.test.ts +220 -0
  836. package/src/core/agents/specialized/patching/agent.ts +146 -0
  837. package/src/core/agents/specialized/patching/index.ts +20 -0
  838. package/src/core/agents/specialized/patching/prompts.test.ts +172 -0
  839. package/src/core/agents/specialized/patching/prompts.ts +396 -0
  840. package/src/core/agents/specialized/patching/types.ts +49 -0
  841. package/src/core/agents/specialized/pentest/agent.test.ts +1046 -0
  842. package/src/core/agents/specialized/pentest/agent.ts +1482 -0
  843. package/src/core/agents/specialized/pentest/helperLifecycle.test.ts +425 -0
  844. package/src/core/agents/specialized/pentest/helperWorkspace.test.ts +84 -0
  845. package/src/core/agents/specialized/pentest/helperWorkspace.ts +33 -0
  846. package/src/core/agents/specialized/pentest/planPrompt.ts +68 -0
  847. package/src/core/agents/specialized/pentest/results.test.ts +198 -0
  848. package/src/core/agents/specialized/utils.test.ts +16 -0
  849. package/src/core/agents/specialized/utils.ts +28 -0
  850. package/src/core/agents/specialized/vulnerabilityReproduction/agent.test.ts +195 -0
  851. package/src/core/agents/specialized/vulnerabilityReproduction/agent.ts +159 -0
  852. package/src/core/agents/specialized/whiteboxAttackSurface/agent.test.ts +39 -0
  853. package/src/core/agents/specialized/whiteboxAttackSurface/agent.ts +227 -0
  854. package/src/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.concurrency.test.ts +138 -0
  855. package/src/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.test.ts +199 -0
  856. package/src/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.ts +330 -0
  857. package/src/core/agents/specialized/whiteboxAttackSurface/index.ts +24 -0
  858. package/src/core/agents/specialized/whiteboxAttackSurface/prompts.ts +345 -0
  859. package/src/core/agents/specialized/whiteboxAttackSurface/types.test.ts +67 -0
  860. package/src/core/agents/specialized/whiteboxAttackSurface/types.ts +234 -0
  861. package/src/core/ai/ai.contract.test.ts +43 -0
  862. package/src/core/ai/ai.durability-hooks.test.ts +527 -0
  863. package/src/core/ai/ai.effective-tools.test.ts +739 -0
  864. package/src/core/ai/ai.native-rollout-evidence.test.ts +373 -0
  865. package/src/core/ai/ai.outer-catch-recovery.test.ts +82 -0
  866. package/src/core/ai/ai.proactive-recovery.test.ts +69 -0
  867. package/src/core/ai/ai.recorded-attempts.test.ts +621 -0
  868. package/src/core/ai/ai.recorded-context.test.ts +448 -0
  869. package/src/core/ai/ai.recorded-tools.test.ts +850 -0
  870. package/src/core/ai/ai.request-retention.test.ts +296 -0
  871. package/src/core/ai/ai.test.ts +690 -0
  872. package/src/core/ai/ai.ts +2377 -0
  873. package/src/core/ai/caching.test.ts +179 -0
  874. package/src/core/ai/caching.ts +119 -0
  875. package/src/core/ai/compactionEvidence.test.ts +52 -0
  876. package/src/core/ai/compactionEvidence.ts +101 -0
  877. package/src/core/ai/compactionTelemetry.test.ts +621 -0
  878. package/src/core/ai/compactionTelemetry.ts +287 -0
  879. package/src/core/ai/concentrate.test.ts +28 -0
  880. package/src/core/ai/contextManagement.test.ts +350 -0
  881. package/src/core/ai/contextManagement.ts +594 -0
  882. package/src/core/ai/index.ts +73 -0
  883. package/src/core/ai/inference-attempt/adapters.test.ts +84 -0
  884. package/src/core/ai/inference-attempt/adapters.ts +391 -0
  885. package/src/core/ai/inference-attempt/attempt.test.ts +198 -0
  886. package/src/core/ai/inference-attempt/builder.ts +171 -0
  887. package/src/core/ai/inference-attempt/envelope.ts +120 -0
  888. package/src/core/ai/inference-attempt/errors.ts +15 -0
  889. package/src/core/ai/inference-attempt/fixtures/anthropic-messages-cache-create.json +18 -0
  890. package/src/core/ai/inference-attempt/fixtures/anthropic-messages-cache-read.json +18 -0
  891. package/src/core/ai/inference-attempt/fixtures/anthropic-messages-incomplete.json +16 -0
  892. package/src/core/ai/inference-attempt/fixtures/anthropic-messages-mixed.json +22 -0
  893. package/src/core/ai/inference-attempt/fixtures/anthropic-messages-non-cache.json +26 -0
  894. package/src/core/ai/inference-attempt/fixtures/bedrock-converse-cache-create.json +18 -0
  895. package/src/core/ai/inference-attempt/fixtures/bedrock-converse-cache-read.json +26 -0
  896. package/src/core/ai/inference-attempt/fixtures/bedrock-converse-incomplete.json +19 -0
  897. package/src/core/ai/inference-attempt/fixtures/bedrock-converse-mixed.json +20 -0
  898. package/src/core/ai/inference-attempt/fixtures/bedrock-converse-non-cache.json +24 -0
  899. package/src/core/ai/inference-attempt/fixtures/openai-responses-cache-read.json +17 -0
  900. package/src/core/ai/inference-attempt/fixtures/openai-responses-incomplete.json +16 -0
  901. package/src/core/ai/inference-attempt/fixtures/openai-responses-non-cache.json +23 -0
  902. package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-rest-incomplete.json +21 -0
  903. package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-rest-native.json +16 -0
  904. package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-stream-cache-create.json +20 -0
  905. package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-stream-cache-read.json +20 -0
  906. package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-stream-incomplete.json +16 -0
  907. package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-stream-mixed.json +21 -0
  908. package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-stream-non-cache.json +19 -0
  909. package/src/core/ai/inference-attempt/fixtures/reject-cache-read-exceeds-inclusive.json +11 -0
  910. package/src/core/ai/inference-attempt/fixtures/reject-components-exceed-inclusive.json +12 -0
  911. package/src/core/ai/inference-attempt/fixtures/reject-identity-mismatch.json +13 -0
  912. package/src/core/ai/inference-attempt/fixtures/reject-negative-token.json +9 -0
  913. package/src/core/ai/inference-attempt/fixtures/reject-non-integer-token.json +8 -0
  914. package/src/core/ai/inference-attempt/fixtures/sdk-normalized-cache-read.json +19 -0
  915. package/src/core/ai/inference-attempt/fixtures/sdk-normalized-incomplete.json +15 -0
  916. package/src/core/ai/inference-attempt/fixtures/sdk-normalized-mixed.json +20 -0
  917. package/src/core/ai/inference-attempt/fixtures/sdk-normalized-non-cache.json +16 -0
  918. package/src/core/ai/inference-attempt/identity.ts +25 -0
  919. package/src/core/ai/inference-attempt/index.ts +70 -0
  920. package/src/core/ai/inference-attempt/project.test.ts +118 -0
  921. package/src/core/ai/inference-attempt/project.ts +60 -0
  922. package/src/core/ai/inference-attempt/recording.ts +46 -0
  923. package/src/core/ai/inference-attempt/tokens.ts +165 -0
  924. package/src/core/ai/inference-attempt/validate.ts +20 -0
  925. package/src/core/ai/mantle.test.ts +50 -0
  926. package/src/core/ai/mantle.ts +45 -0
  927. package/src/core/ai/model-history.test.ts +53 -0
  928. package/src/core/ai/model-history.ts +38 -0
  929. package/src/core/ai/models/anthropic.ts +151 -0
  930. package/src/core/ai/models/bedrock.ts +618 -0
  931. package/src/core/ai/models/claude-capabilities.ts +43 -0
  932. package/src/core/ai/models/concentrate.ts +192 -0
  933. package/src/core/ai/models/google.ts +154 -0
  934. package/src/core/ai/models/inception.ts +10 -0
  935. package/src/core/ai/models/index.ts +253 -0
  936. package/src/core/ai/models/mantle.ts +14 -0
  937. package/src/core/ai/models/models.test.ts +313 -0
  938. package/src/core/ai/models/openai.ts +409 -0
  939. package/src/core/ai/models/openrouter.ts +342 -0
  940. package/src/core/ai/models/pensar.ts +66 -0
  941. package/src/core/ai/native-rollout-evidence/capture.test.ts +1836 -0
  942. package/src/core/ai/native-rollout-evidence/capture.ts +1572 -0
  943. package/src/core/ai/native-rollout-evidence/content.test.ts +55 -0
  944. package/src/core/ai/native-rollout-evidence/content.ts +129 -0
  945. package/src/core/ai/native-rollout-evidence/index.ts +68 -0
  946. package/src/core/ai/native-rollout-evidence/provider-metadata.test.ts +85 -0
  947. package/src/core/ai/native-rollout-evidence/provider-metadata.ts +129 -0
  948. package/src/core/ai/native-rollout-evidence/recording.test.ts +398 -0
  949. package/src/core/ai/native-rollout-evidence/schema.test.ts +210 -0
  950. package/src/core/ai/native-rollout-evidence/schema.ts +353 -0
  951. package/src/core/ai/native-rollout-evidence/validate.ts +141 -0
  952. package/src/core/ai/providers/anthropic-models.test.ts +348 -0
  953. package/src/core/ai/providers/anthropic.ts +73 -0
  954. package/src/core/ai/providers/bedrock-models.test.ts +81 -0
  955. package/src/core/ai/providers/concentrate.live.test.ts +71 -0
  956. package/src/core/ai/providers/concentrate.test.ts +160 -0
  957. package/src/core/ai/providers/concentrate.ts +145 -0
  958. package/src/core/ai/providers/custom.live.test.ts +42 -0
  959. package/src/core/ai/providers/custom.test.ts +474 -0
  960. package/src/core/ai/providers/custom.ts +70 -0
  961. package/src/core/ai/providers/gateway-models.test.ts +648 -0
  962. package/src/core/ai/providers/hoonify.live.test.ts +72 -0
  963. package/src/core/ai/providers/hoonify.test.ts +284 -0
  964. package/src/core/ai/providers/hoonify.ts +32 -0
  965. package/src/core/ai/providers/openai-models.test.ts +356 -0
  966. package/src/core/ai/providers/openai-pro-fetch.test.ts +64 -0
  967. package/src/core/ai/providers/openai-pro-fetch.ts +32 -0
  968. package/src/core/ai/providers/pensar.ts +645 -0
  969. package/src/core/ai/providers/pensarFormatters.test.ts +272 -0
  970. package/src/core/ai/providers/pensarFormatters.ts +533 -0
  971. package/src/core/ai/providers/pensarResponsesStream.test.ts +191 -0
  972. package/src/core/ai/providers/pensarResponsesStream.ts +294 -0
  973. package/src/core/ai/providers/pensarSSE.test.ts +83 -0
  974. package/src/core/ai/providers/pensarSSE.ts +128 -0
  975. package/src/core/ai/providers/pensarSigning.ts +2 -0
  976. package/src/core/ai/providers/pensarStreamUsage.test.ts +79 -0
  977. package/src/core/ai/providers/pensarStreamUsage.ts +62 -0
  978. package/src/core/ai/stepContext.test.ts +61 -0
  979. package/src/core/ai/streamIdleTimeout.test.ts +390 -0
  980. package/src/core/ai/streamTelemetry.ts +90 -0
  981. package/src/core/ai/usage-callback.test.ts +511 -0
  982. package/src/core/ai/utils.native-rollout-evidence.test.ts +135 -0
  983. package/src/core/ai/utils.pensar.test.ts +59 -0
  984. package/src/core/ai/utils.ts +795 -0
  985. package/src/core/api/apiClient.test.ts +58 -0
  986. package/src/core/api/apiClient.ts +73 -0
  987. package/src/core/api/apps.test.ts +78 -0
  988. package/src/core/api/apps.ts +388 -0
  989. package/src/core/api/attackSurface.test.ts +24 -0
  990. package/src/core/api/attackSurface.ts +89 -0
  991. package/src/core/api/authentication.ts +8 -0
  992. package/src/core/api/benchmark.ts +35 -0
  993. package/src/core/api/blackboxPentest.test.ts +89 -0
  994. package/src/core/api/blackboxPentest.ts +64 -0
  995. package/src/core/api/clientIdentity.test.ts +61 -0
  996. package/src/core/api/clientIdentity.ts +57 -0
  997. package/src/core/api/comments.test.ts +69 -0
  998. package/src/core/api/constants.ts +15 -0
  999. package/src/core/api/domains.test.ts +35 -0
  1000. package/src/core/api/domains.ts +32 -0
  1001. package/src/core/api/environment.ts +47 -0
  1002. package/src/core/api/index.ts +219 -0
  1003. package/src/core/api/issues.test.ts +82 -0
  1004. package/src/core/api/issues.ts +439 -0
  1005. package/src/core/api/knowledge.ts +70 -0
  1006. package/src/core/api/localWorker.ts +29 -0
  1007. package/src/core/api/offesecAgent.test.ts +289 -0
  1008. package/src/core/api/offesecAgent.ts +77 -0
  1009. package/src/core/api/patching.ts +44 -0
  1010. package/src/core/api/recordedRun.control.test.ts +830 -0
  1011. package/src/core/api/recordedRun.inference.test.ts +529 -0
  1012. package/src/core/api/recordedRun.loop.test.ts +290 -0
  1013. package/src/core/api/recordedRun.recovery.test.ts +651 -0
  1014. package/src/core/api/recordedRun.test.ts +646 -0
  1015. package/src/core/api/recordedRun.ts +542 -0
  1016. package/src/core/api/targetedPentest.test.ts +177 -0
  1017. package/src/core/api/targetedPentest.ts +83 -0
  1018. package/src/core/api/threatModel.ts +5 -0
  1019. package/src/core/api/trajectoryExport.test.ts +299 -0
  1020. package/src/core/api/trajectoryExport.ts +362 -0
  1021. package/src/core/api/vulnerabilityReproduction.test.ts +56 -0
  1022. package/src/core/api/vulnerabilityReproduction.ts +54 -0
  1023. package/src/core/assets/wordlists.test.ts +85 -0
  1024. package/src/core/assets/wordlists.ts +111 -0
  1025. package/src/core/atif/compatibility.test.ts +107 -0
  1026. package/src/core/atif/convert.test.ts +815 -0
  1027. package/src/core/atif/convert.ts +1658 -0
  1028. package/src/core/atif/fixtures/portable-bundle-v1.json +813 -0
  1029. package/src/core/atif/index.ts +34 -0
  1030. package/src/core/atif/schema.ts +345 -0
  1031. package/src/core/atif/serialize.test.ts +244 -0
  1032. package/src/core/atif/serialize.ts +419 -0
  1033. package/src/core/atif/test-fixtures.ts +184 -0
  1034. package/src/core/atif/validate.test.ts +188 -0
  1035. package/src/core/atif/validate.ts +289 -0
  1036. package/src/core/auth/connection.ts +26 -0
  1037. package/src/core/auth/device-flow.ts +203 -0
  1038. package/src/core/auth/gateway.ts +66 -0
  1039. package/src/core/auth/index.ts +29 -0
  1040. package/src/core/auth/signing.ts +25 -0
  1041. package/src/core/auth/token.ts +140 -0
  1042. package/src/core/auth/types.ts +106 -0
  1043. package/src/core/auth/workspaces.ts +192 -0
  1044. package/src/core/benchmark/index.ts +11 -0
  1045. package/src/core/benchmark/report.ts +257 -0
  1046. package/src/core/benchmark/runner.ts +698 -0
  1047. package/src/core/benchmark/types.ts +80 -0
  1048. package/src/core/cli/logLevelArgs.test.ts +83 -0
  1049. package/src/core/cli/logLevelArgs.ts +62 -0
  1050. package/src/core/cli/model.ts +35 -0
  1051. package/src/core/cli/pentestMode.test.ts +24 -0
  1052. package/src/core/cli/pentestMode.ts +23 -0
  1053. package/src/core/cli/tuiArgs.test.ts +58 -0
  1054. package/src/core/cli/tuiArgs.ts +28 -0
  1055. package/src/core/config/config.test.ts +183 -0
  1056. package/src/core/config/config.ts +201 -0
  1057. package/src/core/config/customProviders.test.ts +183 -0
  1058. package/src/core/config/customProviders.ts +190 -0
  1059. package/src/core/config/index.ts +7 -0
  1060. package/src/core/credentials/index.ts +6 -0
  1061. package/src/core/credentials/manager.ts +313 -0
  1062. package/src/core/credentials/types.ts +112 -0
  1063. package/src/core/doctor.ts +138 -0
  1064. package/src/core/eventBus.test.ts +374 -0
  1065. package/src/core/eventBus.ts +410 -0
  1066. package/src/core/findings/attackSurfaceRegistry.ts +294 -0
  1067. package/src/core/findings/registry.test.ts +1680 -0
  1068. package/src/core/findings/registry.ts +800 -0
  1069. package/src/core/history.ts +82 -0
  1070. package/src/core/hoonify.test.ts +250 -0
  1071. package/src/core/hoonify.ts +163 -0
  1072. package/src/core/http/headers.contract.test.ts +1161 -0
  1073. package/src/core/http/parse.ts +257 -0
  1074. package/src/core/http/redirects.test.ts +207 -0
  1075. package/src/core/http/redirects.ts +145 -0
  1076. package/src/core/http/targetHeaders.ts +604 -0
  1077. package/src/core/http/targetScope.ts +52 -0
  1078. package/src/core/http/types.ts +39 -0
  1079. package/src/core/id/id.test.ts +88 -0
  1080. package/src/core/id/id.ts +138 -0
  1081. package/src/core/installation/index.ts +222 -0
  1082. package/src/core/installation/installation.test.ts +415 -0
  1083. package/src/core/integrations/herdr.test.ts +335 -0
  1084. package/src/core/integrations/herdr.ts +163 -0
  1085. package/src/core/integrations/surface/index.test.ts +534 -0
  1086. package/src/core/integrations/surface/index.ts +224 -0
  1087. package/src/core/integrations/surface/types.ts +29 -0
  1088. package/src/core/integrations/wandb/client.ts +167 -0
  1089. package/src/core/integrations/wandb/upload.test.ts +415 -0
  1090. package/src/core/integrations/wandb/upload.ts +76 -0
  1091. package/src/core/logger/errorLog.test.ts +98 -0
  1092. package/src/core/logger/index.ts +214 -0
  1093. package/src/core/logger/structured.test.ts +212 -0
  1094. package/src/core/logger/structured.ts +207 -0
  1095. package/src/core/memory/backend.test.ts +186 -0
  1096. package/src/core/memory/index.ts +279 -0
  1097. package/src/core/memory/memory.test.ts +362 -0
  1098. package/src/core/messages/types.ts +141 -0
  1099. package/src/core/obfuscation/engine.test.ts +314 -0
  1100. package/src/core/obfuscation/engine.ts +647 -0
  1101. package/src/core/obfuscation/index.ts +27 -0
  1102. package/src/core/observability/active-root-spans.ts +30 -0
  1103. package/src/core/observability/active-spans.ts +80 -0
  1104. package/src/core/observability/index.ts +91 -0
  1105. package/src/core/observability/log-correlation.test.ts +276 -0
  1106. package/src/core/observability/payload-capture.test.ts +59 -0
  1107. package/src/core/observability/runtime.test.ts +743 -0
  1108. package/src/core/observability/runtime.ts +371 -0
  1109. package/src/core/observability/shutdown.test.ts +551 -0
  1110. package/src/core/observability/telemetry.test.ts +895 -0
  1111. package/src/core/observability/telemetry.ts +220 -0
  1112. package/src/core/observability/testkit.test.ts +66 -0
  1113. package/src/core/observability/testkit.ts +97 -0
  1114. package/src/core/observability/trace-contract.test.ts +1031 -0
  1115. package/src/core/observability.test.ts +135 -0
  1116. package/src/core/operator/approvalGate.test.ts +300 -0
  1117. package/src/core/operator/approvalGate.ts +287 -0
  1118. package/src/core/operator/index.ts +30 -0
  1119. package/src/core/operator/types.ts +355 -0
  1120. package/src/core/plan/index.ts +44 -0
  1121. package/src/core/prompt-injections/index.test.ts +248 -0
  1122. package/src/core/prompt-injections/index.ts +350 -0
  1123. package/src/core/providers/index.ts +5 -0
  1124. package/src/core/providers/types.ts +87 -0
  1125. package/src/core/providers/utils.test.ts +189 -0
  1126. package/src/core/providers/utils.ts +183 -0
  1127. package/src/core/providers/verify.test.ts +49 -0
  1128. package/src/core/providers/verify.ts +198 -0
  1129. package/src/core/report/builder.test.ts +229 -0
  1130. package/src/core/report/builder.ts +58 -0
  1131. package/src/core/report/index.ts +13 -0
  1132. package/src/core/report/renderers/json.test.ts +76 -0
  1133. package/src/core/report/renderers/json.ts +5 -0
  1134. package/src/core/report/renderers/markdown.test.ts +366 -0
  1135. package/src/core/report/renderers/markdown.ts +133 -0
  1136. package/src/core/report/schemas.ts +48 -0
  1137. package/src/core/runtime/agentExecution.test.ts +94 -0
  1138. package/src/core/runtime/agentExecution.ts +27 -0
  1139. package/src/core/runtime/launchLocalWorker.test.ts +707 -0
  1140. package/src/core/runtime/launchLocalWorker.ts +273 -0
  1141. package/src/core/runtime/localRunLock.ts +118 -0
  1142. package/src/core/runtime/localRunWorker.test.ts +381 -0
  1143. package/src/core/runtime/localRunWorker.ts +287 -0
  1144. package/src/core/runtime/localWorker.acceptance.test.ts +548 -0
  1145. package/src/core/runtime/localWorkerEndpoint.test.ts +145 -0
  1146. package/src/core/runtime/localWorkerEndpoint.ts +82 -0
  1147. package/src/core/runtime/localWorkerProtocol.ts +176 -0
  1148. package/src/core/runtime/localWorkerTransport.test.ts +841 -0
  1149. package/src/core/runtime/localWorkerTransport.ts +434 -0
  1150. package/src/core/runtime/persistenceError.ts +14 -0
  1151. package/src/core/runtime/recordedExecution.ts +43 -0
  1152. package/src/core/runtime/recordedRunClient.integration.test.ts +106 -0
  1153. package/src/core/runtime/recordedRunClient.test.ts +677 -0
  1154. package/src/core/runtime/recordedRunClient.ts +303 -0
  1155. package/src/core/runtime/runCheckpointStore.ts +23 -0
  1156. package/src/core/runtime/runContext.test.ts +445 -0
  1157. package/src/core/runtime/runContext.ts +184 -0
  1158. package/src/core/runtime/runControl.test.ts +923 -0
  1159. package/src/core/runtime/runControl.ts +419 -0
  1160. package/src/core/runtime/runControlStore.ts +106 -0
  1161. package/src/core/runtime/runDeadline.test.ts +44 -0
  1162. package/src/core/runtime/runDeadline.ts +28 -0
  1163. package/src/core/runtime/runEvidence.test.ts +384 -0
  1164. package/src/core/runtime/runEvidence.ts +267 -0
  1165. package/src/core/runtime/runInference.test.ts +408 -0
  1166. package/src/core/runtime/runInference.ts +125 -0
  1167. package/src/core/runtime/runModelStore.ts +55 -0
  1168. package/src/core/runtime/runObservation.ts +24 -0
  1169. package/src/core/runtime/runRecoveryContext.test.ts +602 -0
  1170. package/src/core/runtime/runRecoveryContext.ts +195 -0
  1171. package/src/core/runtime/runRecoveryPlan.test.ts +851 -0
  1172. package/src/core/runtime/runRecoveryPlan.ts +540 -0
  1173. package/src/core/runtime/runRecoveryStore.ts +78 -0
  1174. package/src/core/runtime/runStore.ts +148 -0
  1175. package/src/core/runtime/runStorePath.ts +13 -0
  1176. package/src/core/runtime/runToolStore.ts +66 -0
  1177. package/src/core/runtime/runTools.crash.test.ts +414 -0
  1178. package/src/core/runtime/runTools.test.ts +689 -0
  1179. package/src/core/runtime/runTools.ts +208 -0
  1180. package/src/core/runtime/sqliteControlStore.test.ts +917 -0
  1181. package/src/core/runtime/sqliteControlStore.ts +555 -0
  1182. package/src/core/runtime/sqliteModelStore.test.ts +619 -0
  1183. package/src/core/runtime/sqliteModelStore.ts +286 -0
  1184. package/src/core/runtime/sqliteRecoveryStore.public.test.ts +374 -0
  1185. package/src/core/runtime/sqliteRecoveryStore.test.ts +836 -0
  1186. package/src/core/runtime/sqliteRecoveryStore.ts +435 -0
  1187. package/src/core/runtime/sqliteRunContext.test.ts +1000 -0
  1188. package/src/core/runtime/sqliteRunObservation.test.ts +432 -0
  1189. package/src/core/runtime/sqliteRunStore.test.ts +698 -0
  1190. package/src/core/runtime/sqliteRunStore.ts +593 -0
  1191. package/src/core/runtime/sqliteToolStore.test.ts +1231 -0
  1192. package/src/core/runtime/sqliteToolStore.ts +419 -0
  1193. package/src/core/runtime/testfixtures/localWorkerChild.ts +254 -0
  1194. package/src/core/runtime/testfixtures/localWorkerLauncher.ts +15 -0
  1195. package/src/core/runtime/testfixtures/recoveryChild.ts +159 -0
  1196. package/src/core/services/rateLimiter/index.test.ts +106 -0
  1197. package/src/core/services/rateLimiter/index.ts +157 -0
  1198. package/src/core/services/rateLimiter/types.ts +10 -0
  1199. package/src/core/session/admitted-config.test.ts +50 -0
  1200. package/src/core/session/deprecated-headers-shim.test.ts +111 -0
  1201. package/src/core/session/execution-metrics.test.ts +297 -0
  1202. package/src/core/session/execution-metrics.ts +176 -0
  1203. package/src/core/session/index.ts +1085 -0
  1204. package/src/core/session/loader.ts +212 -0
  1205. package/src/core/session/persistence.test.ts +1210 -0
  1206. package/src/core/session/persistence.ts +1076 -0
  1207. package/src/core/session/rehydrate.test.ts +393 -0
  1208. package/src/core/session/types.ts +139 -0
  1209. package/src/core/session/usage.test.ts +99 -0
  1210. package/src/core/session/usage.ts +84 -0
  1211. package/src/core/skills/builtins/index.ts +22 -0
  1212. package/src/core/skills/builtins/pentest.ts +135 -0
  1213. package/src/core/skills/builtins/promptInjection.ts +44 -0
  1214. package/src/core/skills/builtins/threatModel.ts +336 -0
  1215. package/src/core/skills/index.ts +15 -0
  1216. package/src/core/skills/parser.test.ts +120 -0
  1217. package/src/core/skills/parser.ts +106 -0
  1218. package/src/core/skills/registry.test.ts +202 -0
  1219. package/src/core/skills/registry.ts +109 -0
  1220. package/src/core/skills/scanner.test.ts +157 -0
  1221. package/src/core/skills/scanner.ts +115 -0
  1222. package/src/core/skills/types.ts +45 -0
  1223. package/src/core/skills/utils.ts +16 -0
  1224. package/src/core/storage/index.ts +150 -0
  1225. package/src/core/tasks/index.ts +242 -0
  1226. package/src/core/tools/backends/capture.ts +38 -0
  1227. package/src/core/tools/backends/collectCommand.test.ts +33 -0
  1228. package/src/core/tools/backends/collectCommand.ts +28 -0
  1229. package/src/core/tools/backends/helpers.ts +140 -0
  1230. package/src/core/tools/backends/httpTransport.ts +534 -0
  1231. package/src/core/tools/backends/index.ts +61 -0
  1232. package/src/core/tools/backends/local.test.ts +307 -0
  1233. package/src/core/tools/backends/local.ts +820 -0
  1234. package/src/core/tools/backends/policy.test.ts +137 -0
  1235. package/src/core/tools/backends/policy.ts +129 -0
  1236. package/src/core/tools/backends/resolve.test.ts +309 -0
  1237. package/src/core/tools/backends/resolve.ts +152 -0
  1238. package/src/core/tools/backends/types.ts +279 -0
  1239. package/src/core/tools/backends/whitebox.test.ts +275 -0
  1240. package/src/core/tools/backends/whitebox.ts +14 -0
  1241. package/src/core/tools/backends/whiteboxJobs.test.ts +375 -0
  1242. package/src/core/tools/backends/whiteboxJobs.ts +157 -0
  1243. package/src/core/tools/backends/windowsProgram.ts +36 -0
  1244. package/src/core/tools/daytonaSandbox.test.ts +491 -0
  1245. package/src/core/tools/daytonaSandbox.ts +232 -0
  1246. package/src/core/toolset/index.ts +583 -0
  1247. package/src/core/util/lazyLogger.ts +32 -0
  1248. package/src/core/utils/concurrency.test.ts +204 -0
  1249. package/src/core/utils/concurrency.ts +75 -0
  1250. package/src/core/utils/prompt.ts +28 -0
  1251. package/src/core/whitebox/adapters.ts +277 -0
  1252. package/src/core/whitebox/artifacts.ts +128 -0
  1253. package/src/core/whitebox/boundedProcess.ts +265 -0
  1254. package/src/core/whitebox/candidates.ts +268 -0
  1255. package/src/core/whitebox/catalog.ts +82 -0
  1256. package/src/core/whitebox/index.ts +53 -0
  1257. package/src/core/whitebox/jobKernel.test.ts +91 -0
  1258. package/src/core/whitebox/jobKernel.ts +347 -0
  1259. package/src/core/whitebox/jobSupervisor.ts +264 -0
  1260. package/src/core/whitebox/jobs.ts +21 -0
  1261. package/src/core/whitebox/paths.ts +94 -0
  1262. package/src/core/whitebox/profileTransport.ts +225 -0
  1263. package/src/core/whitebox/profiles.ts +294 -0
  1264. package/src/core/whitebox/repoProfile.test.ts +217 -0
  1265. package/src/core/whitebox/repoProfile.ts +256 -0
  1266. package/src/core/whitebox/types.ts +189 -0
  1267. package/src/core/whitebox/whitebox.test.ts +789 -0
  1268. package/src/core/workflows/fastStrike.seams.test.ts +217 -0
  1269. package/src/core/workflows/fastStrike.test.ts +29 -0
  1270. package/src/core/workflows/fastStrike.ts +239 -0
  1271. package/src/core/workflows/pentest.test.ts +575 -0
  1272. package/src/core/workflows/pentest.ts +1022 -0
  1273. package/src/core/workflows/seams.test.ts +386 -0
  1274. package/src/core/workflows/seams.ts +276 -0
  1275. package/src/core/workflows/threatModel.ts +108 -0
  1276. package/src/core/workflows/usage-forwarding.test.ts +203 -0
  1277. package/src/core/workflows/whiteboxAttackSurface.test.ts +695 -0
  1278. package/src/core/workflows/whiteboxAttackSurface.ts +1740 -0
  1279. package/src/index.ts +49 -0
  1280. package/src/lib/attack-path/types.ts +13 -0
  1281. package/src/lib/cvss/calculator.test.ts +2090 -0
  1282. package/src/lib/cvss/calculator.ts +643 -0
  1283. package/src/lib/cvss/index.ts +65 -0
  1284. package/src/lib/cvss/macrovector-scores.ts +402 -0
  1285. package/src/lib/cvss/types.ts +241 -0
  1286. package/src/lib/cwe/cwe-catalog.ts +444 -0
  1287. package/src/lib/cwe/types.test.ts +142 -0
  1288. package/src/lib/cwe/types.ts +37 -0
  1289. package/src/lib/cwe/validate.test.ts +110 -0
  1290. package/src/lib/cwe/validate.ts +53 -0
  1291. package/src/lib/evidence/types.ts +9 -0
  1292. package/src/tests/agentWorkingDirectory.test.ts +175 -0
  1293. package/src/tests/attackSurface.test.ts +35 -0
  1294. package/src/tests/auth.test.ts +196 -0
  1295. package/src/tests/authCookieExport.test.ts +143 -0
  1296. package/src/tests/authPentestHandoff.test.ts +231 -0
  1297. package/src/tests/browserCookies.test.ts +128 -0
  1298. package/src/tests/credentialManager.test.ts +657 -0
  1299. package/src/tests/data/console.openapi.json +1037 -0
  1300. package/src/tests/data/console.sitemap.xml +348 -0
  1301. package/src/tests/delegateAuthMerge.test.ts +48 -0
  1302. package/src/tui/auto-copy.ts +36 -0
  1303. package/src/tui/clipboard.ts +65 -0
  1304. package/src/tui/command-registry.test.ts +124 -0
  1305. package/src/tui/command-registry.ts +645 -0
  1306. package/src/tui/command-router.ts +81 -0
  1307. package/src/tui/components/agent-display.tsx +480 -0
  1308. package/src/tui/components/ascii-art.tsx +225 -0
  1309. package/src/tui/components/chat/approval-inline.tsx +51 -0
  1310. package/src/tui/components/chat/config-view.tsx +279 -0
  1311. package/src/tui/components/chat/home-view.tsx +288 -0
  1312. package/src/tui/components/chat/index.tsx +161 -0
  1313. package/src/tui/components/chat/input-area.tsx +529 -0
  1314. package/src/tui/components/chat/lib/play-core/num.ts +102 -0
  1315. package/src/tui/components/chat/lib/wave-simulation.ts +124 -0
  1316. package/src/tui/components/chat/loading-indicator.test.ts +33 -0
  1317. package/src/tui/components/chat/loading-indicator.tsx +131 -0
  1318. package/src/tui/components/chat/message-list.tsx +265 -0
  1319. package/src/tui/components/chat/petri-animation.tsx +175 -0
  1320. package/src/tui/components/chat/plan-review-message.tsx +49 -0
  1321. package/src/tui/components/chat/questions-form.tsx +756 -0
  1322. package/src/tui/components/commands/__tests__/recorded-runs-lifecycle.tsx +907 -0
  1323. package/src/tui/components/commands/advanced-settings.tsx +94 -0
  1324. package/src/tui/components/commands/api-key-input.tsx +122 -0
  1325. package/src/tui/components/commands/auth-flow-logic.test.ts +58 -0
  1326. package/src/tui/components/commands/auth-flow-logic.ts +30 -0
  1327. package/src/tui/components/commands/auth-flow.tsx +702 -0
  1328. package/src/tui/components/commands/credits-flow.tsx +210 -0
  1329. package/src/tui/components/commands/help-dialog.tsx +238 -0
  1330. package/src/tui/components/commands/models-display.tsx +111 -0
  1331. package/src/tui/components/commands/operator-wizard.tsx +328 -0
  1332. package/src/tui/components/commands/provider-manager.tsx +241 -0
  1333. package/src/tui/components/commands/provider-selection.tsx +129 -0
  1334. package/src/tui/components/commands/recorded-runs.test.ts +40 -0
  1335. package/src/tui/components/commands/recorded-runs.tsx +793 -0
  1336. package/src/tui/components/commands/sessions-display.tsx +365 -0
  1337. package/src/tui/components/commands/shortcuts-dialog.tsx +52 -0
  1338. package/src/tui/components/commands/skills-dialog.tsx +308 -0
  1339. package/src/tui/components/commands/theme-picker.tsx +177 -0
  1340. package/src/tui/components/commands/web-wizard.tsx +965 -0
  1341. package/src/tui/components/dialog-layout.tsx +73 -0
  1342. package/src/tui/components/error-boundary.tsx +82 -0
  1343. package/src/tui/components/footer.tsx +101 -0
  1344. package/src/tui/components/input.tsx +43 -0
  1345. package/src/tui/components/loaders.tsx +784 -0
  1346. package/src/tui/components/model-picker/ModelPicker.tsx +907 -0
  1347. package/src/tui/components/model-picker/ModelPickerDialog.tsx +75 -0
  1348. package/src/tui/components/model-picker/index.ts +2 -0
  1349. package/src/tui/components/model-picker/model-navigation.test.ts +102 -0
  1350. package/src/tui/components/model-picker/model-navigation.ts +54 -0
  1351. package/src/tui/components/model-picker/model-search.test.ts +62 -0
  1352. package/src/tui/components/model-picker/model-search.ts +42 -0
  1353. package/src/tui/components/model-picker/model-visibility.test.ts +65 -0
  1354. package/src/tui/components/model-picker/model-visibility.ts +59 -0
  1355. package/src/tui/components/operator-dashboard/conversation.test.ts +431 -0
  1356. package/src/tui/components/operator-dashboard/conversation.ts +179 -0
  1357. package/src/tui/components/operator-dashboard/display-state.test.ts +369 -0
  1358. package/src/tui/components/operator-dashboard/display-state.ts +163 -0
  1359. package/src/tui/components/operator-dashboard/herdr-state.test.ts +162 -0
  1360. package/src/tui/components/operator-dashboard/herdr-state.ts +81 -0
  1361. package/src/tui/components/operator-dashboard/index.tsx +2044 -0
  1362. package/src/tui/components/operator-dashboard/logic.test.ts +753 -0
  1363. package/src/tui/components/operator-dashboard/logic.ts +465 -0
  1364. package/src/tui/components/operator-dashboard/queue.test.ts +147 -0
  1365. package/src/tui/components/operator-dashboard/queue.ts +55 -0
  1366. package/src/tui/components/operator-dashboard/queued-messages.tsx +50 -0
  1367. package/src/tui/components/operator-dashboard/run-events.test.ts +915 -0
  1368. package/src/tui/components/operator-dashboard/run-events.ts +507 -0
  1369. package/src/tui/components/operator-dashboard/run-tracing.test.ts +206 -0
  1370. package/src/tui/components/operator-dashboard/run-tracing.ts +105 -0
  1371. package/src/tui/components/operator-dashboard/subagent-detail-view.tsx +51 -0
  1372. package/src/tui/components/operator-dashboard/subagent-dialog.tsx +142 -0
  1373. package/src/tui/components/operator-dashboard/subagent-hub.test.ts +162 -0
  1374. package/src/tui/components/operator-dashboard/subagent-hub.tsx +266 -0
  1375. package/src/tui/components/operator-dashboard/subagent-state.test.ts +431 -0
  1376. package/src/tui/components/operator-dashboard/subagent-state.ts +404 -0
  1377. package/src/tui/components/operator-dashboard/subagent-status-bar.tsx +80 -0
  1378. package/src/tui/components/operator-dashboard/tool-argument-buffer.test.ts +317 -0
  1379. package/src/tui/components/operator-dashboard/tool-arguments.perf.test.ts +121 -0
  1380. package/src/tui/components/operator-dashboard/welcome-logo.tsx +79 -0
  1381. package/src/tui/components/operator-dashboard/workflow-data.test.ts +291 -0
  1382. package/src/tui/components/operator-dashboard/workflow-data.ts +130 -0
  1383. package/src/tui/components/report-viewer-dialog.tsx +98 -0
  1384. package/src/tui/components/responsible-use-disclosure.tsx +55 -0
  1385. package/src/tui/components/screenshot-modal.tsx +204 -0
  1386. package/src/tui/components/shared/__tests__/prompt-input-lifecycle.tsx +64 -0
  1387. package/src/tui/components/shared/__tests__/tool-renderer-lifecycle.tsx +87 -0
  1388. package/src/tui/components/shared/action-label.test.ts +142 -0
  1389. package/src/tui/components/shared/action-label.ts +18 -0
  1390. package/src/tui/components/shared/ascii-spinner.tsx +40 -0
  1391. package/src/tui/components/shared/compacting-icon.tsx +18 -0
  1392. package/src/tui/components/shared/dialog-controls.tsx +76 -0
  1393. package/src/tui/components/shared/index.ts +38 -0
  1394. package/src/tui/components/shared/markdown-viewer.tsx +188 -0
  1395. package/src/tui/components/shared/markdown.ts +239 -0
  1396. package/src/tui/components/shared/message-renderer.tsx +178 -0
  1397. package/src/tui/components/shared/message-utils.ts +175 -0
  1398. package/src/tui/components/shared/pentest-workflow-display.tsx +330 -0
  1399. package/src/tui/components/shared/prompt-input-lifecycle.test.ts +22 -0
  1400. package/src/tui/components/shared/prompt-input-logic.test.ts +782 -0
  1401. package/src/tui/components/shared/prompt-input-logic.ts +423 -0
  1402. package/src/tui/components/shared/prompt-input.tsx +782 -0
  1403. package/src/tui/components/shared/result-registry.test.ts +90 -0
  1404. package/src/tui/components/shared/result-registry.ts +900 -0
  1405. package/src/tui/components/shared/syntax-highlight.ts +242 -0
  1406. package/src/tui/components/shared/tool-registry.test.ts +59 -0
  1407. package/src/tui/components/shared/tool-registry.ts +280 -0
  1408. package/src/tui/components/shared/tool-renderer.test.ts +13 -0
  1409. package/src/tui/components/shared/tool-renderer.tsx +237 -0
  1410. package/src/tui/components/shared/type-guards.ts +64 -0
  1411. package/src/tui/components/shared/use-paste-extmarks.ts +109 -0
  1412. package/src/tui/components/switch.tsx +81 -0
  1413. package/src/tui/components/terminal-focus-handler.tsx +34 -0
  1414. package/src/tui/components/toast.tsx +82 -0
  1415. package/src/tui/components/usage-labels.test.ts +191 -0
  1416. package/src/tui/components/usage-labels.ts +78 -0
  1417. package/src/tui/console-theme.ts +59 -0
  1418. package/src/tui/context/agent.tsx +251 -0
  1419. package/src/tui/context/command.tsx +291 -0
  1420. package/src/tui/context/config.tsx +59 -0
  1421. package/src/tui/context/dialog.tsx +206 -0
  1422. package/src/tui/context/dimensions.tsx +31 -0
  1423. package/src/tui/context/focus-ownership.test.ts +26 -0
  1424. package/src/tui/context/focus-ownership.ts +12 -0
  1425. package/src/tui/context/focus.tsx +86 -0
  1426. package/src/tui/context/herdr.tsx +28 -0
  1427. package/src/tui/context/input.tsx +45 -0
  1428. package/src/tui/context/keybinding.tsx +92 -0
  1429. package/src/tui/context/obfuscation.tsx +114 -0
  1430. package/src/tui/context/route.tsx +127 -0
  1431. package/src/tui/context/session-usage.test.ts +295 -0
  1432. package/src/tui/context/session-usage.ts +204 -0
  1433. package/src/tui/context/session.tsx +62 -0
  1434. package/src/tui/context/toast.tsx +66 -0
  1435. package/src/tui/generated-ascii-art.json +1 -0
  1436. package/src/tui/generated-ascii-art.json.d.ts +2 -0
  1437. package/src/tui/herdr-startup.test.ts +157 -0
  1438. package/src/tui/hooks/use-sessions-list.ts +165 -0
  1439. package/src/tui/index.tsx +838 -0
  1440. package/src/tui/keybindings/index.ts +126 -0
  1441. package/src/tui/keybindings/registry.ts +146 -0
  1442. package/src/tui/keybindings-registry.ts +43 -0
  1443. package/src/tui/obfuscation/patch.ts +139 -0
  1444. package/src/tui/terminal-focus.ts +218 -0
  1445. package/src/tui/theme/colors.ts +43 -0
  1446. package/src/tui/theme/context.tsx +137 -0
  1447. package/src/tui/theme/detect-mode.ts +56 -0
  1448. package/src/tui/theme/index.ts +75 -0
  1449. package/src/tui/theme/registry.ts +29 -0
  1450. package/src/tui/theme/themes/apex.ts +190 -0
  1451. package/src/tui/theme/themes/ayu.ts +189 -0
  1452. package/src/tui/theme/themes/catppuccin.ts +189 -0
  1453. package/src/tui/theme/themes/dracula.ts +190 -0
  1454. package/src/tui/theme/themes/everforest.ts +189 -0
  1455. package/src/tui/theme/themes/flexoki.ts +190 -0
  1456. package/src/tui/theme/themes/github.ts +189 -0
  1457. package/src/tui/theme/themes/gruvbox.ts +189 -0
  1458. package/src/tui/theme/themes/index.ts +54 -0
  1459. package/src/tui/theme/themes/kanagawa.ts +189 -0
  1460. package/src/tui/theme/themes/material.ts +190 -0
  1461. package/src/tui/theme/themes/monokai.ts +190 -0
  1462. package/src/tui/theme/themes/nightfox.ts +189 -0
  1463. package/src/tui/theme/themes/nord.ts +190 -0
  1464. package/src/tui/theme/themes/onedark.ts +190 -0
  1465. package/src/tui/theme/themes/rose-pine.ts +189 -0
  1466. package/src/tui/theme/themes/solarized.ts +189 -0
  1467. package/src/tui/theme/themes/tokyonight.ts +189 -0
  1468. package/src/tui/theme/themes/vesper.ts +191 -0
  1469. package/src/tui/theme/types.ts +143 -0
  1470. package/src/tui/utils/command-flags.test.ts +269 -0
  1471. package/src/tui/utils/command-flags.ts +377 -0
  1472. package/src/tui/utils/kitty-graphics.ts +76 -0
  1473. package/src/tui/utils/open-file.ts +37 -0
  1474. package/src/tui/utils/open-report.ts +34 -0
  1475. package/src/tui/utils/open-url.ts +39 -0
  1476. package/src/tui/utils/paste.ts +8 -0
  1477. package/src/tui/utils/scroll.ts +81 -0
  1478. package/src/util/errors.ts +58 -0
  1479. package/src/util/lock.ts +100 -0
  1480. package/src/util/name.ts +148 -0
  1481. package/src/util/url.test.ts +162 -0
  1482. package/src/util/url.ts +107 -0
  1483. package/build/agent-13rrhp8d.js +0 -20
  1484. package/build/agent-zbj2331s.js +0 -30
  1485. package/build/authentication-f4j3w5vs.js +0 -20
  1486. package/build/blackboxAgent-v2vx9ws4.js +0 -20
  1487. package/build/blackboxPentest-w5nwzpvk.js +0 -70
  1488. package/build/cli-5wemv37a.js +0 -194
  1489. package/build/cli-7s062hr6.js +0 -22
  1490. package/build/cli-9qbxkhye.js +0 -55
  1491. package/build/cli-avmhkjtv.js +0 -22961
  1492. package/build/cli-g3czc3jz.js +0 -204
  1493. package/build/cli-ww7hbazg.js +0 -88
  1494. package/build/index-18vyy6mj.js +0 -19
  1495. package/build/index-5wh7gq37.js +0 -12858
  1496. package/build/index-e23zc8g4.js +0 -34
  1497. package/build/index-hnwhswqj.js +0 -213
  1498. package/build/index-wkmnr4nm.js +0 -39
  1499. package/build/index-ywmfnd30.js +0 -12
  1500. package/build/offesecAgent-c97pqzcn.js +0 -27
  1501. package/build/pentest-4p5jt7gj.js +0 -30
  1502. package/build/pentests-v98eg8n3.js +0 -92
  1503. package/build/threatModel-81d4rcbk.js +0 -29
  1504. /package/build/{cli-c8131c4q.js → cli-0wsh8j2t.js} +0 -0
  1505. /package/build/{cli-9pbk8m32.js → cli-ag6jtndp.js} +0 -0
  1506. /package/build/{cli-e08r86zk.js → cli-b3dvxjgk.js} +0 -0
  1507. /package/build/{cli-fw5r7pfj.js → cli-q126f6ef.js} +0 -0
  1508. /package/build/{cli-9fsre5pt.js → cli-qba2x69h.js} +0 -0
  1509. /package/build/{cli-7q3ae3ft.js → cli-z82n3qk1.js} +0 -0
@@ -0,0 +1,1610 @@
1
+ import { existsSync, mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { SpanStatusCode } from "@opentelemetry/api";
4
+ import type {
5
+ ModelMessage,
6
+ StopCondition,
7
+ StreamTextResult,
8
+ TextStreamPart,
9
+ ToolSet,
10
+ } from "ai";
11
+ import { hasToolCall } from "ai";
12
+ import { normalizeStepUsage, streamResponse } from "../../ai";
13
+ import { AgentEventBus, type StreamIdContext } from "../../eventBus";
14
+ import { newMessageId, newPartId } from "../../id/id";
15
+ import { createLogger } from "../../logger/structured";
16
+ import {
17
+ getApexTracer,
18
+ registerActiveRootSpan,
19
+ shouldRecordAiPayloads,
20
+ unregisterActiveRootSpan,
21
+ withSubagentSessionBaggage,
22
+ } from "../../observability";
23
+ import type { ApprovalGate } from "../../operator";
24
+ import { ApprovalDeniedError } from "../../operator";
25
+ import type { RunContextRecorder } from "../../runtime/runContext";
26
+ import { create as createSession, type SessionInfo } from "../../session";
27
+ import { scopedLogger } from "../../util/lazyLogger";
28
+ import {
29
+ createInterruptedStepFinalizer,
30
+ type FinalizeInterruptedStepInput,
31
+ } from "./interruptedStepFinalization";
32
+ import { AgentMessageWriter } from "./messagePersistence";
33
+ import { buildBaseSystemPrompt, buildSessionWorkspaceSection } from "./prompt";
34
+ import { wrapRecordedTools } from "./recordedTools";
35
+ import {
36
+ buildBundledAssetsSection,
37
+ buildRuntimeContextSection,
38
+ peekSettledRuntimeFacts,
39
+ probeRuntimeFacts,
40
+ type RuntimeExecutionFacts,
41
+ resolveCommandPlatform,
42
+ UNKNOWN_FACTS,
43
+ } from "./runtimeContext";
44
+ import { responseArgBytes, StreamDiagnostics } from "./streamDiagnostics";
45
+ import { inProcessSubagentSpawner } from "./subagentSpawner";
46
+ import { ToolLifecycleTracker } from "./toolLifecycle";
47
+ import {
48
+ ASK_USER_QUESTIONS_TOOL_NAME,
49
+ CallbackListenerRegistry,
50
+ createResponseTool,
51
+ createToolsForNames,
52
+ EMAIL_TOOL_NAMES_ACTIVE,
53
+ FAST_STRIKE_EXCLUDED_TOOL_NAMES,
54
+ listToolRegistryNames,
55
+ PerCommandShell,
56
+ PLAN_MODE_TOOL_NAMES,
57
+ PlaywrightMcpSession,
58
+ RESPONSE_TOOL_NAME,
59
+ resolveBrowserHeaderPolicy,
60
+ SEND_EMAIL_TOOL_NAME,
61
+ SMS_TOOL_NAMES_ACTIVE,
62
+ sessionHasSmsPasswordless,
63
+ WORKSPACE_TOOL_NAMES,
64
+ WORKSPACE_WRITE_TOOL_NAMES,
65
+ } from "./tools";
66
+ import type { ToolContext } from "./tools/types";
67
+ import { StepTraceWriter } from "./trace";
68
+ import type {
69
+ AgentMode,
70
+ CreateAgentInput,
71
+ OffensiveSecurityAgentInput,
72
+ StreamIdFactory,
73
+ } from "./types";
74
+
75
+ function isGenericAbortError(error: unknown): boolean {
76
+ return (
77
+ error instanceof Error &&
78
+ error.name === "AbortError" &&
79
+ error.cause === undefined &&
80
+ /^(?:Aborted|Agent aborted by user|(?:This|The) operation was aborted|The user aborted a request)\.?$/.test(
81
+ error.message,
82
+ )
83
+ );
84
+ }
85
+
86
+ function agentAbortReason(signal: AbortSignal): unknown {
87
+ const reason: unknown = signal.reason;
88
+ return reason === undefined || isGenericAbortError(reason)
89
+ ? new DOMException("Agent aborted by user", "AbortError")
90
+ : reason;
91
+ }
92
+
93
+ const log = scopedLogger(() => createLogger("approval-gate"));
94
+
95
+ // Opt-in `response` tool lifecycle tracer (RESPONSE_DEBUG=1) for the empty-`{}` / "Tool call did not complete" loop on threat-model sub-agents.
96
+ const RESPONSE_DEBUG =
97
+ process.env.RESPONSE_DEBUG === "1" || process.env.RESPONSE_DEBUG === "true";
98
+ const rlog = scopedLogger(() => createLogger("response-debug"));
99
+
100
+ const WORKSPACE_TOOL_NAME_SET = new Set<string>(WORKSPACE_TOOL_NAMES);
101
+ const WORKSPACE_WRITE_TOOL_NAME_SET = new Set<string>(
102
+ WORKSPACE_WRITE_TOOL_NAMES,
103
+ );
104
+
105
+ // Tools whose presence means backend-probed execution facts can change what
106
+ // the agent should attempt: command execution, native file tools, and PoC
107
+ // runs. Agents holding none of these skip the runtime probe entirely.
108
+ const RUNTIME_CAPABLE_TOOL_NAMES = new Set<string>([
109
+ "execute_command",
110
+ "read_file",
111
+ "list_files",
112
+ "glob",
113
+ "grep",
114
+ "create_file",
115
+ "update_file",
116
+ "delete_file",
117
+ "apply_patch",
118
+ "document_vulnerability",
119
+ ]);
120
+
121
+ const WORKSPACE_TARGET_RE = /\b(?:console|workspace)\b/i;
122
+ const WORKSPACE_NOUN_RE =
123
+ /\b(?:domains?|apps?|applications?|endpoints?|threat\s+models?|attack\s+surfaces?)\b/i;
124
+ const WORKSPACE_READ_REQUEST_RE =
125
+ /(?:\b(?:list|show|find|search|get)\s+(?:(?:me|a|an|the|my|our|all|any|list|of|for|in|within|registered|existing|available|console|workspace|which)\s+){0,8}(?:domains?|apps?|applications?|endpoints?)\b|\b(?:what|which)\s+(?:(?:of|a|an|the|my|our|all|any|are|is|do|does|we|i|have|has|there|registered|existing|available|console|workspace)\s+){0,8}(?:domains?|apps?|applications?|endpoints?)\b)/i;
126
+ const WORKSPACE_WRITE_ACTION = String.raw`(?:add|create|register|import|update|edit|change|set|correct|repair|link|unlink|rename|break\s+down)`;
127
+ const WORKSPACE_EXPLICIT_WRITE_REQUEST_RE = new RegExp(
128
+ String.raw`(?:^\s*|[.?!;\n]\s*|\b(?:please|kindly)\s+|\b(?:can|could|would|will)\s+you\s+|\b(?:i|we)\s+(?:want|need)\s+(?:you\s+)?to\s+|\bi(?:['’]d| would)\s+like\s+(?:you\s+)?to\s+|\blet['’]s\s+|\bgo\s+ahead\s+and\s+)${WORKSPACE_WRITE_ACTION}\b`,
129
+ "i",
130
+ );
131
+ const WORKSPACE_NEGATED_WRITE_REQUEST_RE = new RegExp(
132
+ String.raw`\b(?:do\s+not|don't|never|avoid)\b[^.?!;\n]{0,40}\b${WORKSPACE_WRITE_ACTION}\b`,
133
+ "i",
134
+ );
135
+ const WORKSPACE_CLAUSE_BOUNDARY_RE = new RegExp(
136
+ String.raw`(?:[.!?;]+(?=\s|$)\s*|\n+|\s+(?:but|however)\s+|\s+and\s+(?=(?:(?:do\s+not|don't|never|avoid)\s+)?${WORKSPACE_WRITE_ACTION}\b))`,
137
+ "i",
138
+ );
139
+ // Sentence delimiters only (never splits `example.com`), so a leading
140
+ // capability question can be scoped to the whole sentence before the
141
+ // clause-level `and`/`but` split runs.
142
+ const WORKSPACE_SENTENCE_BOUNDARY_RE = /(?:[.!?;]+(?=\s|$)\s*|\n+)/;
143
+ // Capability/permission questions ("Can I … and create …", "How do I …")
144
+ // stay read-only: the interrogative governs every coordinated clause, so the
145
+ // clause split must not let a trailing bare write verb pass as an imperative.
146
+ // Requests aimed at the agent ("Can you …", "Please …", "I'd like to …") are
147
+ // not questions and are handled by WORKSPACE_EXPLICIT_WRITE_REQUEST_RE.
148
+ const WORKSPACE_CAPABILITY_QUESTION_RE =
149
+ /^\s*(?:(?:so|and|also|then|ok|okay|well|hey|hi|actually|but)[,\s]+)*(?:is\s+it\s+possible\b|what\s+if\b|how\s+(?:do|can|could|should|would|shall|might)\s+(?:i|we)\b|(?:can|could|should|would|may|will|do|does|did|am|are|is|shall|have|has)\s+(?:i|we)\b)/i;
150
+ const WORKSPACE_CREATE_REQUEST_RE =
151
+ /\b(?:add|create|register|import)\s+(?:(?:the|this|that|a|an|my|our|existing|new|current|connected|authenticated|console|workspace|attached|provided)\s+){0,4}(?:domains?|apps?|applications?|endpoints?|threat\s+models?|attack\s+surfaces?)\b/i;
152
+ const WORKSPACE_DOMAIN_HOST_WRITE_RE =
153
+ /\b(?:add|create|register|import|link)\s+(?:https?:\/\/)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}(?::\d+)?(?:\/\S*)?\s+(?:to|in|under)\s+(?:(?:the|my|our|connected|authenticated)\s+)?(?:console|workspace)\b/i;
154
+ const WORKSPACE_APP_FIELD_UPDATE_RE =
155
+ /\b(?:update|edit|change|set|correct|repair)\s+(?:(?:the|this|that|my|our|existing|current|connected|authenticated|console|workspace)\s+){0,4}(?:apps?|applications?)(?:['’]s)?\s+(?:name|description|type|framework|domain|disallowed\s+actions?)\s+(?:(?:to|as|with|from)\b|[:=])/i;
156
+ const WORKSPACE_ENDPOINT_FIELD_UPDATE_RE =
157
+ /\b(?:update|edit|change|set|correct|repair)\s+(?:(?:the|this|that|my|our|existing|current|connected|authenticated|console|workspace)\s+){0,4}endpoints?(?:['’]s)?\s+(?:path|route|url|description|type|transport|location|source(?:\s+location)?|start\s+line|end\s+line|line\s+numbers?|objectives?|authentication(?:\s+requirements?)?|business\s+logic|threat\s+model|parent\s+application)\s+(?:(?:to|as|with|from)\b|[:=])/i;
158
+ const WORKSPACE_LINK_CLAUSE_GAP = String.raw`[^.?!;\n]{0,80}`;
159
+ const WORKSPACE_APP_RESOURCE = String.raw`\b(?:apps?|applications?)\b`;
160
+ const WORKSPACE_DOMAIN_RESOURCE = String.raw`\b(?:domains?|(?:https?:\/\/)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,})\b`;
161
+ const WORKSPACE_APP_DOMAIN_LINK_RE = new RegExp(
162
+ String.raw`(?:\blink\b${WORKSPACE_LINK_CLAUSE_GAP}${WORKSPACE_APP_RESOURCE}${WORKSPACE_LINK_CLAUSE_GAP}\bto\b${WORKSPACE_LINK_CLAUSE_GAP}${WORKSPACE_DOMAIN_RESOURCE}|\blink\b${WORKSPACE_LINK_CLAUSE_GAP}${WORKSPACE_DOMAIN_RESOURCE}${WORKSPACE_LINK_CLAUSE_GAP}\bto\b${WORKSPACE_LINK_CLAUSE_GAP}${WORKSPACE_APP_RESOURCE}|\bunlink\b${WORKSPACE_LINK_CLAUSE_GAP}${WORKSPACE_APP_RESOURCE}${WORKSPACE_LINK_CLAUSE_GAP}\bfrom\b${WORKSPACE_LINK_CLAUSE_GAP}${WORKSPACE_DOMAIN_RESOURCE}|\bunlink\b${WORKSPACE_LINK_CLAUSE_GAP}${WORKSPACE_DOMAIN_RESOURCE}${WORKSPACE_LINK_CLAUSE_GAP}\bfrom\b${WORKSPACE_LINK_CLAUSE_GAP}${WORKSPACE_APP_RESOURCE})`,
163
+ "i",
164
+ );
165
+ const WORKSPACE_APP_RENAME_RE =
166
+ /\brename\s+(?:(?:the|this|that|my|our|existing|current|connected|authenticated|console|workspace)\s+){0,4}(?:apps?|applications?)\b[^.?!;\n]{0,60}\b(?:to|as)\b/i;
167
+ const WORKSPACE_BREAK_DOWN_IMPORT_RE =
168
+ /\bbreak\s+down\b[^.?!;\n]{0,100}\b(?:threat\s+models?|attack\s+surfaces?)\b[^.?!;\n]{0,100}\b(?:into|as)\b[^.?!;\n]{0,40}\b(?:apps?|applications?|endpoints?)\b/i;
169
+
170
+ function hasExplicitWorkspaceWriteRequest(
171
+ prompt: string,
172
+ targetsWorkspace: boolean,
173
+ ): boolean {
174
+ return prompt.split(WORKSPACE_SENTENCE_BOUNDARY_RE).some((sentence) => {
175
+ // A capability question governs its whole sentence, so its clauses stay
176
+ // read-only even when `and`/`but` splits a bare write verb off the front.
177
+ if (WORKSPACE_CAPABILITY_QUESTION_RE.test(sentence)) return false;
178
+
179
+ return sentence.split(WORKSPACE_CLAUSE_BOUNDARY_RE).some((clause) => {
180
+ if (
181
+ !WORKSPACE_EXPLICIT_WRITE_REQUEST_RE.test(clause) ||
182
+ WORKSPACE_NEGATED_WRITE_REQUEST_RE.test(clause)
183
+ ) {
184
+ return false;
185
+ }
186
+
187
+ return (
188
+ WORKSPACE_DOMAIN_HOST_WRITE_RE.test(clause) ||
189
+ (targetsWorkspace &&
190
+ (WORKSPACE_CREATE_REQUEST_RE.test(clause) ||
191
+ WORKSPACE_APP_FIELD_UPDATE_RE.test(clause) ||
192
+ WORKSPACE_ENDPOINT_FIELD_UPDATE_RE.test(clause) ||
193
+ WORKSPACE_APP_DOMAIN_LINK_RE.test(clause) ||
194
+ WORKSPACE_APP_RENAME_RE.test(clause) ||
195
+ WORKSPACE_BREAK_DOWN_IMPORT_RE.test(clause)))
196
+ );
197
+ });
198
+ });
199
+ }
200
+
201
+ // ponytail: current-message opt-in avoids persistent workspace capability state.
202
+ //
203
+ // Read (`list_*`) and write (`create_*` / `update_*`) tools are gated
204
+ // separately: recon phrasing (find/search/show/list a domain, app, or endpoint on the "console"/
205
+ // "workspace") is common in ordinary Operator pentests, so it must never
206
+ // expose mutation tools. Write tools require an explicit mutation request —
207
+ // a write verb, a "break down …" import, or a direct tool-name mention.
208
+ export function filterWorkspaceToolsForRun(
209
+ activeTools: string[],
210
+ prompt: string,
211
+ hasInteractiveApprovalGate: boolean,
212
+ ): string[] {
213
+ const gated =
214
+ hasInteractiveApprovalGate && !prompt.trimStart().startsWith("<skill ");
215
+
216
+ if (!gated) {
217
+ return activeTools.filter((name) => !WORKSPACE_TOOL_NAME_SET.has(name));
218
+ }
219
+
220
+ const targetsWorkspace =
221
+ WORKSPACE_TARGET_RE.test(prompt) && WORKSPACE_NOUN_RE.test(prompt);
222
+
223
+ const writeRequested =
224
+ WORKSPACE_WRITE_TOOL_NAMES.some((name) => prompt.includes(name)) ||
225
+ hasExplicitWorkspaceWriteRequest(prompt, targetsWorkspace);
226
+
227
+ const readRequested =
228
+ writeRequested ||
229
+ WORKSPACE_TOOL_NAMES.some((name) => prompt.includes(name)) ||
230
+ (targetsWorkspace && WORKSPACE_READ_REQUEST_RE.test(prompt));
231
+
232
+ return activeTools.filter((name) => {
233
+ if (WORKSPACE_WRITE_TOOL_NAME_SET.has(name)) return writeRequested;
234
+ if (WORKSPACE_TOOL_NAME_SET.has(name)) return readRequested;
235
+ return true;
236
+ });
237
+ }
238
+
239
+ /**
240
+ * General-purpose offensive security agent harness.
241
+ *
242
+ * The agent **owns tool creation** — all available tools are built from
243
+ * the session context, and specific agents select which ones to activate
244
+ * via the `activeTools` array (passed through to the AI SDK).
245
+ *
246
+ * The stream is created lazily on first consumption (see {@link streamReady}
247
+ * and {@link streamResult}) — after backend-probed runtime facts settle —
248
+ * so the AI SDK telemetry nests under this agent's span — no separate `.run()`.
249
+ *
250
+ * @typeParam TResult - The type returned by {@link consume}. When the input
251
+ * includes a `resolveResult` function, `consume()` awaits it after the
252
+ * stream finishes and returns the value. Defaults to `void`.
253
+ *
254
+ * ## Consumption (pick one — stream is single-read)
255
+ *
256
+ * **1. Emit to EventBus via `.consume()` → `TResult`**
257
+ * ```ts
258
+ * const bus = new AgentEventBus();
259
+ * bus.on("text-delta", (e) => process.stdout.write(e.text));
260
+ * bus.on("tool-call-complete", (e) => console.log(`→ ${e.toolName}`));
261
+ * const agent = new OffensiveSecurityAgent({ ..., eventBus: bus });
262
+ * const result = await agent.consume();
263
+ * ```
264
+ *
265
+ * **2. `for await` directly on the agent**
266
+ * ```ts
267
+ * for await (const chunk of agent) { ... }
268
+ * ```
269
+ *
270
+ * **3. Raw stream access**
271
+ * ```ts
272
+ * for await (const chunk of agent.fullStream) { ... }
273
+ * ```
274
+ */
275
+ export class OffensiveSecurityAgent<TResult = void> {
276
+ /** The real SDK stream result — created exactly once, with backend-probed facts via {@link streamReady} or settled-or-unknown facts via the sync escape hatch. */
277
+ private _streamResult: StreamTextResult<ToolSet, never> | null = null;
278
+
279
+ /** Composes the final system prompt, writes the trace init record, and calls `streamResponse`. Invoked at most once; both creation paths guard on `_streamResult`. */
280
+ private readonly createStream: (
281
+ facts: RuntimeExecutionFacts | null,
282
+ ) => StreamTextResult<ToolSet, never>;
283
+
284
+ /** Lazy runtime probe, then `createStream`; memoized by {@link streamInit}. */
285
+ private readonly initializeStreamOnce: () => Promise<void>;
286
+
287
+ /** Memoized {@link streamReady} promise; initialization runs at most once. */
288
+ private streamInit: Promise<void> | null = null;
289
+
290
+ /** True when this agent's tool selection can use backend-probed execution facts. */
291
+ private readonly probesRuntime: boolean;
292
+
293
+ /** The tool context whose runtime scope keys fact discovery and the sync fallback. */
294
+ private readonly toolCtx: ToolContext;
295
+
296
+ /** The event bus for this agent's streaming output. */
297
+ public readonly eventBus: AgentEventBus;
298
+
299
+ private readonly resolveResult?: (
300
+ streamResult: StreamTextResult<ToolSet, never>,
301
+ ) => TResult | Promise<TResult>;
302
+
303
+ /** The structured result captured by the `response` tool, or `null` until it fires. */
304
+ private _capturedResponse: TResult | null = null;
305
+
306
+ /** Set synchronously when `response` fires, ahead of any async `resolveResult`, to distinguish a clean finish from an abort. */
307
+ private _responseToolFired = false;
308
+
309
+ /** Raw structured result submitted to the response tool, retained for root-span output. */
310
+ private _responseToolResult: unknown;
311
+
312
+ /** Resolves the instant `response` captures the result, so {@link consume} can return early and drain in the background. */
313
+ private _resolveResponseCaptured!: (result: TResult) => void;
314
+ private _rejectResponseCaptured!: (err: unknown) => void;
315
+ public readonly responseCaptured: Promise<TResult> = new Promise(
316
+ (resolve, reject) => {
317
+ this._resolveResponseCaptured = resolve;
318
+ this._rejectResponseCaptured = reject;
319
+ },
320
+ );
321
+
322
+ /** Rejects when the background drain errors, so a custom resolver racing `streamResult.response` isn't blocked by a wedged stream. */
323
+ private _drainRejection: Promise<never> = new Promise<never>(() => {});
324
+
325
+ /** Settles when the background drain (including its synthetic-close finally) has fully finished. */
326
+ public drained: Promise<void> = Promise.resolve();
327
+
328
+ /** Identifier for this agent when it is running as a subagent. */
329
+ private readonly subagentId?: string;
330
+
331
+ /** Display label for span name / `gen_ai.agent.name`; the id stays the join key. */
332
+ private readonly subagentName?: string;
333
+ /** Operating mode (tools surface); used for run-span attribution. */
334
+ private readonly agentMode: AgentMode;
335
+ /** The current open assistant message id (`msg_…`); minted on `start-step` in {@link consume}, `null` between steps. */
336
+ private currentMessageId: string | null = null;
337
+
338
+ /** Per-run stream counters for deterministic id derivation via {@link streamIdFactory}. */
339
+ private streamStepIndex = -1;
340
+
341
+ private streamTextPartIndex = 0;
342
+
343
+ /** Per-command executor for local-mode command execution; disposed on consume() completion. */
344
+ private readonly commandShell?: PerCommandShell;
345
+
346
+ /**
347
+ * This agent's Playwright MCP browser session. Either constructed fresh
348
+ * by this agent (when no `browserSession` was passed in) or supplied by
349
+ * the caller (e.g. `spawn_pentest_agent` constructs a fresh, isolated
350
+ * session for each worker, seeds it with a snapshot of the orchestrator's
351
+ * cookies + localStorage, and hands the seeded session in here so this
352
+ * agent's browser tools operate against an authenticated-but-isolated
353
+ * Chromium).
354
+ *
355
+ * Exposed publicly so spawn tools can read this agent's session (e.g.
356
+ * the pentest orchestrator's `browserSession` is what `spawn_pentest_agent`
357
+ * snapshots when it builds the worker's seeded clone). The session
358
+ * object is NOT shared between agents at runtime — each agent gets its
359
+ * own isolated Chromium so a sub-agent can't clobber its parent's DOM,
360
+ * cookies, or navigation state.
361
+ *
362
+ * Only populated for non-sandbox (local MCP) mode. In sandbox mode,
363
+ * browser state is already shared via the sandbox's per-sandbox
364
+ * Playwright user-data directory, so no host-side session object is
365
+ * needed.
366
+ */
367
+ public readonly browserSession?: PlaywrightMcpSession;
368
+
369
+ /**
370
+ * True when this agent constructed its own {@link browserSession} (no
371
+ * `browserSession` was passed in). Only the owner disconnects it on
372
+ * `consume()` completion — an inherited session is torn down by whoever
373
+ * created it (e.g. `spawn_pentest_agent` for worker clones), so we must
374
+ * never disconnect a session we don't own.
375
+ */
376
+ private readonly ownsBrowserSession: boolean;
377
+
378
+ /** Guards against double force-kill across the drain-finally and result-capture paths. */
379
+ private browserDisconnected = false;
380
+ private shellDisposed = false;
381
+
382
+ /** Listeners started by this agent's callback helper tools; drained on finalization. */
383
+ private readonly callbackListeners = new CallbackListenerRegistry();
384
+ // Cached dispose barrier — repeat disposeOwnedShell() calls return the
385
+ // same settlement wait instead of a fire-and-forget.
386
+ private shellDisposeBarrier: Promise<void> | null = null;
387
+
388
+ private readonly abortSignal?: AbortSignal;
389
+
390
+ private readonly streamIdFactory?: StreamIdFactory;
391
+
392
+ /** Recorded-run durable context authority; flushed (and failing) in finalizeRun. */
393
+ private readonly contextRecorder?: RunContextRecorder;
394
+
395
+ /** The user-facing prompt passed to the model. */
396
+ public readonly userPrompt: string;
397
+
398
+ /** The session this agent is operating within. */
399
+ private readonly _session: SessionInfo;
400
+
401
+ /** Agent-local message persistence (debounce + serialized writes). */
402
+ private readonly writer!: AgentMessageWriter;
403
+
404
+ /** Closes an interrupted step: synthetic results, reconstruction, write. */
405
+ private readonly finalizeInterruptedStep!: (
406
+ input: FinalizeInterruptedStepInput,
407
+ ) => Promise<void>;
408
+
409
+ private messagesPath: string | null = null;
410
+
411
+ /** Serializes agent-owned messages.json writes in enqueue order. */
412
+ /**
413
+ * Async factory that creates a session when one is not provided,
414
+ * then constructs the agent. Use this instead of `new` when you
415
+ * want the agent to own session lifecycle.
416
+ *
417
+ * Pass an existing `session` to reuse one (console integration,
418
+ * subagent spawning, etc.).
419
+ */
420
+ static async create<TResult = void>(
421
+ input: CreateAgentInput<TResult>,
422
+ ): Promise<OffensiveSecurityAgent<TResult>> {
423
+ let session = input.session;
424
+ if (!session) {
425
+ session = await createSession({
426
+ targets: input.target ? [input.target] : [],
427
+ config: input.sessionConfig,
428
+ model: input.model,
429
+ authConfig: input.authConfig,
430
+ userMessage: input.prompt,
431
+ onNameGenerated: input.onNameGenerated,
432
+ });
433
+ }
434
+ return new OffensiveSecurityAgent({ ...input, session });
435
+ }
436
+
437
+ /** The session this agent is operating within. */
438
+ get session(): SessionInfo {
439
+ return this._session;
440
+ }
441
+
442
+ /** This agent's identity on the event bus (subagent's session id, or the root session's id). */
443
+ private get busSessionId(): string {
444
+ return this.subagentId ?? this._session.id;
445
+ }
446
+
447
+ constructor(input: OffensiveSecurityAgentInput<TResult>) {
448
+ this._session = input.session;
449
+ this.subagentId = input.subagentId;
450
+ this.subagentName = input.subagentName;
451
+ this.agentMode = input.mode ?? "default";
452
+ this.abortSignal = input.abortSignal;
453
+ this.streamIdFactory = input.streamIdFactory;
454
+ this.contextRecorder = input.contextRecorder;
455
+ this.userPrompt = input.prompt;
456
+ this.eventBus = input.eventBus ?? new AgentEventBus();
457
+
458
+ // -- Resolve agent working directory ----------------------------------------
459
+ // Explicit input wins over session config; command cwd and file-tool
460
+ // scoping (fileWorkspaceRoot) are independent and resolved separately.
461
+ const agentCwd =
462
+ input.agentCwd ??
463
+ input.session.config?.agentCwd ??
464
+ input.session.rootPath;
465
+ // Same precedence for the file-tool workspace: an explicit root (e.g. a
466
+ // child agent's helper directory) wins over the session's remote root.
467
+ const fileWorkspaceRoot =
468
+ input.fileWorkspaceRoot ?? input.session.config?.remoteFileWorkspaceRoot;
469
+
470
+ // -- Per-command executor (local mode only) -------------------------------
471
+ // Shell survives command cancellation; only disposed in consume() after the
472
+ // stream ends, or when the agent is fully killed.
473
+ if (!input.sandbox) {
474
+ this.commandShell = new PerCommandShell({
475
+ cwd: agentCwd,
476
+ env: input.environmentVariables,
477
+ });
478
+ if (input.commandCancelHandle) {
479
+ const shell = this.commandShell;
480
+ input.commandCancelHandle.cancel = () => shell.cancelCurrentCommand();
481
+ }
482
+ }
483
+
484
+ // -- Browser session (local MCP mode only) -------------------------------
485
+ // Either inherit from the parent agent (e.g. pentest orchestrator handing
486
+ // its authenticated context down via spawn_pentest_agent) or construct a
487
+ // fresh one. The session itself does not spawn the MCP child / Chromium
488
+ // until the first browser tool call, so eager construction is cheap even
489
+ // for agents that never use browser tools. Sandbox-mode agents already
490
+ // share browser state via the sandbox's per-sandbox Playwright user-data
491
+ // dir, so they don't need a session object on the host.
492
+ if (!input.sandbox) {
493
+ this.ownsBrowserSession = !input.browserSession;
494
+ this.browserSession =
495
+ input.browserSession ??
496
+ new PlaywrightMcpSession({
497
+ headerPolicy: resolveBrowserHeaderPolicy(input.session, input.target),
498
+ display: input.display,
499
+ engine: input.browserEngine,
500
+ });
501
+ // Owned sessions aren't wired through createBrowserTools' abort path
502
+ // (existingSession skips that listener). Disconnect on abort so timeout/
503
+ // pause reaps Camoufox even when consume()'s drain is still unwinding.
504
+ if (this.ownsBrowserSession && this.abortSignal) {
505
+ const onAbort = () => {
506
+ void this.disconnectOwnedBrowser();
507
+ };
508
+ if (this.abortSignal.aborted) onAbort();
509
+ else
510
+ this.abortSignal.addEventListener("abort", onAbort, { once: true });
511
+ }
512
+ } else {
513
+ this.ownsBrowserSession = false;
514
+ }
515
+
516
+ // -- Step trace (trace.jsonl) ---------------------------------------------
517
+ // Created before tools so the checkpoint_state tool can reference it.
518
+ const messagesDir =
519
+ input.messagesDir ??
520
+ (input.subagentId
521
+ ? join(input.session.rootPath, "subagents", input.subagentId)
522
+ : input.session.rootPath);
523
+ const tracePath = input.subagentId
524
+ ? join(
525
+ input.session.rootPath,
526
+ "subagents",
527
+ `${input.subagentId}.trace.jsonl`,
528
+ )
529
+ : join(messagesDir, "trace.jsonl");
530
+ const traceWriter = new StepTraceWriter({
531
+ tracePath,
532
+ agentId: input.subagentId ?? null,
533
+ eventBus: this.eventBus,
534
+ });
535
+
536
+ // -- Task directory (per-agent tasks, opt-in via taskDriven config) -------
537
+ const taskDriven = input.session.config?.taskDriven ?? false;
538
+ const tasksDir =
539
+ input.tasksDir ??
540
+ (taskDriven
541
+ ? input.subagentId
542
+ ? join(
543
+ input.session.rootPath,
544
+ "subagents",
545
+ `${input.subagentId}-tasks`,
546
+ )
547
+ : join(input.session.rootPath, "tasks")
548
+ : undefined);
549
+
550
+ // -- Tools ----------------------------------------------------------------
551
+ const credentialManager =
552
+ input.credentialManager ?? input.session.credentialManager;
553
+
554
+ const toolCtx = {
555
+ ...(input.attackSurfaceArtifactsPath
556
+ ? { attackSurfaceArtifactsPath: input.attackSurfaceArtifactsPath }
557
+ : {}),
558
+ session: input.session,
559
+ agentCwd,
560
+ fileWorkspaceRoot,
561
+ target: input.target,
562
+ grpc: input.grpc,
563
+ systemScope: input.systemScope,
564
+ abortSignal: input.abortSignal,
565
+ model: input.model,
566
+ authConfig: input.authConfig,
567
+ eventBus: this.eventBus,
568
+ onStepFinish: input.forwardUsageCallbacksToSpawnedAgents
569
+ ? input.onStepFinish
570
+ : undefined,
571
+ onCacheMetrics: input.forwardUsageCallbacksToSpawnedAgents
572
+ ? input.onCacheMetrics
573
+ : undefined,
574
+ sandbox: input.sandbox,
575
+ backends: input.backends,
576
+ findingsRegistry: input.findingsRegistry,
577
+ attackSurfaceRegistry: input.attackSurfaceRegistry,
578
+ credentialManager,
579
+ secretValues: input.secretValues,
580
+ environmentVariables: input.environmentVariables,
581
+ commandShell: this.commandShell,
582
+ skillsRegistry: input.skillsRegistry,
583
+ promptInjectionLibrary: input.promptInjectionLibrary,
584
+ promptInjectionLibrarySource:
585
+ input.promptInjectionLibrarySource ??
586
+ input.session.config?.promptInjectionLibrarySource,
587
+ traceWriter,
588
+ tasksDir,
589
+ enableThinking: input.enableThinking,
590
+ thinkingEffort: input.thinkingEffort,
591
+ openAIReasoningEffort: input.openAIReasoningEffort,
592
+ surfaceIntegrationEnabled: input.surfaceIntegrationEnabled,
593
+ projectThreatModel: input.projectThreatModel,
594
+ planSubagentId: input.planSubagentId,
595
+ subagentId: input.subagentId,
596
+ browserSession: this.browserSession,
597
+ // Propagate this agent's display so spawned workers run on the SAME
598
+ // virtual desktop (their browsers belong to the same endpoint's stream),
599
+ // rather than falling back to the process-wide DISPLAY (:0).
600
+ display: input.display,
601
+ // Spawn seam + durable hooks inherited by any sub-agent this agent spawns.
602
+ // Resolve the default once here so every tool sees a guaranteed spawner.
603
+ subagentSpawner: input.subagentSpawner ?? inProcessSubagentSpawner,
604
+ // Owned-listener cleanup seam: drained by finalizeRun/abortAndDrain.
605
+ callbackListeners: this.callbackListeners,
606
+ smsInbox: input.smsInbox,
607
+ emailAdapterFor: input.emailAdapterFor,
608
+ languageModelMiddleware: input.languageModelMiddleware,
609
+ usageRecorder: input.usageRecorder,
610
+ streamIdFactory: input.streamIdFactory,
611
+ };
612
+
613
+ // -- Effective tool selection (names only — factories run below) ---------
614
+ // Resolved BEFORE construction so inactive factories never run. Fast
615
+ // strike enumerates the live registry (conditional availability plus
616
+ // any extra tools) exactly as Object.keys on the merged map did.
617
+ const hasEmail =
618
+ (input.session.config?.emailIntegration?.inboxes?.length ?? 0) > 0;
619
+ const hasSmtp = !!input.session.config?.smtpConfig;
620
+ const emailToolSet = new Set<string>(EMAIL_TOOL_NAMES_ACTIVE);
621
+ const smsToolSet = new Set<string>(SMS_TOOL_NAMES_ACTIVE);
622
+ const hasSms = sessionHasSmsPasswordless(input.session);
623
+ const passesEmailSmsGates = (t: string): boolean => {
624
+ if (smsToolSet.has(t)) return hasSms;
625
+ if (!emailToolSet.has(t)) return true;
626
+ if (t === SEND_EMAIL_TOOL_NAME) return hasSmtp;
627
+ return hasEmail;
628
+ };
629
+
630
+ let activeTools = (input.activeTools as string[]).filter(
631
+ passesEmailSmsGates,
632
+ );
633
+ if (input.mode === "plan") {
634
+ const planSet = new Set<string>(PLAN_MODE_TOOL_NAMES);
635
+ activeTools = activeTools.filter((t) => planSet.has(t));
636
+ } else if (input.mode === "fast-strike") {
637
+ const excluded = new Set<string>(FAST_STRIKE_EXCLUDED_TOOL_NAMES);
638
+ // Mirror Object.keys({...builtins, ...extras}): an own extra replaces
639
+ // the builtin's value but keeps its insertion position; new extras
640
+ // append. Object.keys already yields own enumerable keys only.
641
+ const mergedNames = input.extraTools
642
+ ? Object.keys({
643
+ ...Object.fromEntries(
644
+ listToolRegistryNames(toolCtx).map((n) => [n, null]),
645
+ ),
646
+ ...input.extraTools,
647
+ })
648
+ : listToolRegistryNames(toolCtx);
649
+ activeTools = mergedNames.filter((t) => {
650
+ if (excluded.has(t)) return false;
651
+ return passesEmailSmsGates(t);
652
+ });
653
+ // Baseline enumerated Object.keys(tools) AFTER response injection, so
654
+ // fast-strike + responseSchema activates the injected response tool
655
+ // even when the input list omits it. Default mode stays caller-explicit.
656
+ if (input.responseSchema && !activeTools.includes(RESPONSE_TOOL_NAME)) {
657
+ activeTools = [...activeTools, RESPONSE_TOOL_NAME];
658
+ }
659
+ }
660
+
661
+ activeTools = filterWorkspaceToolsForRun(
662
+ activeTools,
663
+ input.prompt,
664
+ input.approvalGate !== undefined,
665
+ );
666
+
667
+ const builtinTools = createToolsForNames(toolCtx, activeTools);
668
+
669
+ let tools: ToolSet = input.extraTools
670
+ ? { ...builtinTools, ...input.extraTools }
671
+ : { ...builtinTools };
672
+
673
+ // Only approved calls may reach the execution journal.
674
+ if (input.toolExecutionRecorder) {
675
+ tools = wrapRecordedTools(tools, input.toolExecutionRecorder);
676
+ }
677
+
678
+ // -- Approval gate wrapping -----------------------------------------------
679
+ if (input.approvalGate) {
680
+ tools = wrapToolsWithApprovalGate(
681
+ tools,
682
+ input.approvalGate,
683
+ AGENT_PAUSE_TOOLS,
684
+ );
685
+ }
686
+
687
+ // -- Response schema → auto capture / stop / resolve ----------------------
688
+ if (input.responseSchema) {
689
+ tools = {
690
+ ...tools,
691
+ [RESPONSE_TOOL_NAME]: createResponseTool(
692
+ input.responseSchema,
693
+ (result) => {
694
+ this._responseToolFired = true;
695
+ this._responseToolResult = result;
696
+ if (RESPONSE_DEBUG) {
697
+ rlog.warn(
698
+ `[response-debug] response tool EXECUTED (captured) session=${this.busSessionId} ` +
699
+ `resultBytes=${responseArgBytes(result)} — happy path`,
700
+ );
701
+ }
702
+ // With a custom resolveResult (e.g. TargetedPentestAgent), the raw schema result must be funnelled through it before fulfilling consume()'s race.
703
+ const customResolve = input.resolveResult;
704
+ if (customResolve) {
705
+ void Promise.resolve()
706
+ .then(() => {
707
+ // Race .response against _drainRejection so a wedged stream can't hang a resolver awaiting it.
708
+ const sr = this.streamResult;
709
+ const guarded = Object.create(sr, {
710
+ response: {
711
+ get: () =>
712
+ Promise.race([sr.response, this._drainRejection]),
713
+ },
714
+ });
715
+ return customResolve(guarded);
716
+ })
717
+ .then((resolved) => {
718
+ this._capturedResponse = resolved;
719
+ this._resolveResponseCaptured(resolved);
720
+ })
721
+ .catch((err) => {
722
+ this._rejectResponseCaptured(err);
723
+ });
724
+ return;
725
+ }
726
+ this._capturedResponse = result as TResult;
727
+ this._resolveResponseCaptured(result as TResult);
728
+ },
729
+ ),
730
+ };
731
+ }
732
+
733
+ if (input.resolveResult) {
734
+ this.resolveResult = input.resolveResult;
735
+ } else if (input.responseSchema) {
736
+ this.resolveResult = () => {
737
+ if (this._capturedResponse !== null) return this._capturedResponse;
738
+ return undefined as TResult;
739
+ };
740
+ }
741
+
742
+ let stopWhen = input.stopWhen;
743
+ if (input.responseSchema) {
744
+ const responseStop = hasToolCall(
745
+ RESPONSE_TOOL_NAME,
746
+ ) as StopCondition<ToolSet>;
747
+ if (!stopWhen) {
748
+ stopWhen = responseStop;
749
+ } else if (Array.isArray(stopWhen)) {
750
+ stopWhen = [...stopWhen, responseStop];
751
+ } else {
752
+ stopWhen = [stopWhen, responseStop];
753
+ }
754
+ }
755
+
756
+ // -- Messages persistence -------------------------------------------------
757
+ if (!existsSync(messagesDir)) {
758
+ mkdirSync(messagesDir, { recursive: true });
759
+ }
760
+ this.messagesPath = join(messagesDir, "messages.json");
761
+
762
+ // Mutable so that summarization can clear stale history.
763
+ const initialMessagesRef: { current: ModelMessage[] } = {
764
+ current: input.messages
765
+ ? [...input.messages]
766
+ : [
767
+ {
768
+ role: "user" as const,
769
+ content: [{ type: "text", text: input.prompt }],
770
+ },
771
+ ],
772
+ };
773
+
774
+ // Agent-local persistence: debounce, latest snapshot, and the
775
+ // serialized write queue live in the writer (see ./messagePersistence).
776
+ this.writer = new AgentMessageWriter({ messagesPath: this.messagesPath });
777
+ this.finalizeInterruptedStep = createInterruptedStepFinalizer({
778
+ eventBus: this.eventBus,
779
+ sessionId: this.busSessionId,
780
+ subagentId: this.subagentId,
781
+ writer: this.writer,
782
+ responseToolName: RESPONSE_TOOL_NAME,
783
+ responseToolFired: () => this._responseToolFired,
784
+ ...(RESPONSE_DEBUG
785
+ ? { debugLog: (message: string) => rlog.warn(message) }
786
+ : {}),
787
+ });
788
+ const schedulePersist = () => this.writer.schedulePersist();
789
+
790
+ // -- System prompt ---------------------------------------------------------
791
+ // Persona first; execution facts and the workspace section are appended by
792
+ // the harness for every persona, so custom prompts no longer bypass them.
793
+ // Facts are probed through the agent's actual command backend (see
794
+ // ./runtimeContext) — asynchronous, so the stream is created once they settle.
795
+ const baseSystemPrompt =
796
+ input.system ??
797
+ buildBaseSystemPrompt({
798
+ sandboxMode: agentCwd === input.session.rootPath,
799
+ });
800
+ const commandPlatform = resolveCommandPlatform(toolCtx);
801
+ const workspaceSection = buildSessionWorkspaceSection(
802
+ input.session,
803
+ agentCwd,
804
+ activeTools,
805
+ fileWorkspaceRoot,
806
+ );
807
+ // Bundled wordlist paths are host-local: advertise them only when
808
+ // commands execute locally.
809
+ const bundledAssets =
810
+ input.backends || input.sandbox ? null : buildBundledAssetsSection();
811
+ const assembleBaseSystemPrompt = (
812
+ facts: RuntimeExecutionFacts | null,
813
+ ): string => {
814
+ const sections: string[] = [baseSystemPrompt];
815
+ if (facts) {
816
+ sections.push(
817
+ buildRuntimeContextSection(facts, { platform: commandPlatform }),
818
+ );
819
+ }
820
+ if (bundledAssets) sections.push(bundledAssets);
821
+ return sections.join("\n\n");
822
+ };
823
+ this.toolCtx = toolCtx;
824
+ // Only agents whose tools can execute commands, touch files, or run
825
+ // PoCs get a runtime probe — for anyone else the facts are noise and the
826
+ // probe is a wasted subprocess.
827
+ this.probesRuntime = activeTools.some((name) =>
828
+ RUNTIME_CAPABLE_TOOL_NAMES.has(name),
829
+ );
830
+
831
+ // -- Init record + stream --------------------------------------------------
832
+ // Created by async initialization (streamReady) so the AI SDK telemetry
833
+ // binds to the span active at first consumption (this agent's
834
+ // invoke_agent span in consume()) and the system prompt can embed
835
+ // backend-probed facts. The synchronous escape hatch calls the same
836
+ // factory with settled-or-unknown facts — never host facts — guarded so
837
+ // exactly one model stream exists either way.
838
+ this.createStream = (facts) => {
839
+ // Hash only the base system prompt (excluding session workspace paths)
840
+ // so the hash is stable across runs with identical prompt versions. No
841
+ // step record can precede this init line: steps only originate from the
842
+ // stream created below.
843
+ const baseWithFacts = assembleBaseSystemPrompt(facts);
844
+ traceWriter.writeInit({
845
+ model: input.model,
846
+ systemPrompt: baseWithFacts,
847
+ activeTools,
848
+ sessionId: input.session.id,
849
+ target: input.target,
850
+ });
851
+ return streamResponse({
852
+ prompt: input.prompt,
853
+ system: baseWithFacts + workspaceSection,
854
+ model: input.model,
855
+ messages: input.messages,
856
+ tools,
857
+ activeTools,
858
+ stopWhen,
859
+ toolChoice: "auto",
860
+ languageModelMiddleware: input.languageModelMiddleware,
861
+ usageRecorder: input.usageRecorder,
862
+ contextRecorder: input.contextRecorder,
863
+ inferenceRecorder: input.inferenceRecorder,
864
+ // Per-subagent so the overflow tool-result dumps land next to this
865
+ // agent's messages.json (`subagents/{id}/tool-results/`) and a host
866
+ // can reclaim them when the subagent finishes, instead of piling up
867
+ // at the shared session root for the whole scan (ENOSPC). Falls back
868
+ // to the session root for the root/operator agent.
869
+ sessionPath: messagesDir,
870
+ sessionId: this.busSessionId,
871
+ onStepFinish: async (event) => {
872
+ const auxiliaryModelEvent =
873
+ event.response.id === "summarization" ||
874
+ event.response.id === "tool-repair";
875
+ const stepUsage = normalizeStepUsage(event);
876
+
877
+ if (auxiliaryModelEvent) {
878
+ traceWriter.recordStep([], stepUsage, { usageOnly: true });
879
+ await input.onStepFinish?.(event);
880
+ return;
881
+ }
882
+
883
+ // Recorded runs project the canonical committed context; the
884
+ // legacy path reconstructs from the (possibly stale after a fit)
885
+ // initial prefix. Canonical latest() already includes this step's
886
+ // messages — committing happens upstream in the ai layer's
887
+ // onStepFinish wrapper, before this user callback runs.
888
+ const canonical = input.contextRecorder?.latest() ?? [
889
+ ...initialMessagesRef.current,
890
+ ...event.response.messages,
891
+ ];
892
+ this.writer.setLatest(canonical);
893
+ schedulePersist();
894
+ traceWriter.recordStep(
895
+ event.response.messages as ModelMessage[],
896
+ stepUsage,
897
+ );
898
+ this.eventBus.emit("step-finish", {
899
+ messages: event.response.messages,
900
+ subagentId: this.subagentId,
901
+ sessionId: this.busSessionId,
902
+ messageId: this.currentMessageId ?? undefined,
903
+ });
904
+ this.currentMessageId = null;
905
+ await input.onStepFinish?.(event);
906
+ },
907
+ onSummarized: () => {
908
+ // Context was reset by summarization — discard the old history so
909
+ // subsequent onStepFinish writes only persist post-summary messages.
910
+ initialMessagesRef.current = [];
911
+ traceWriter.markSummarized();
912
+ },
913
+ onFinish: async (event) => {
914
+ // Flush any pending persistence before finishing
915
+ this.writer.cancelTimer();
916
+ // Skip if the interrupted-step finalizer already wrote the abort snapshot.
917
+ if (!this.writer.syntheticsPersisted) {
918
+ const finalMessages = input.contextRecorder?.latest() ??
919
+ this.writer.latest ?? [
920
+ ...initialMessagesRef.current,
921
+ ...event.response.messages,
922
+ ];
923
+ this.writer.setLatest(finalMessages);
924
+ await this.writer.enqueueWrite(finalMessages).catch(() => {});
925
+ }
926
+ await input.onFinish?.(event);
927
+ },
928
+ abortSignal: input.abortSignal,
929
+ authConfig: input.authConfig,
930
+ onCacheMetrics: input.onCacheMetrics,
931
+ enableThinking: input.enableThinking,
932
+ thinkingEffort: input.thinkingEffort,
933
+ openAIReasoningEffort: input.openAIReasoningEffort,
934
+ silent: true,
935
+ });
936
+ };
937
+ this.initializeStreamOnce = async () => {
938
+ // The sync escape hatch may have created the stream while discovery was
939
+ // pending — never a second model stream.
940
+ if (this._streamResult !== null) return;
941
+ // Abort-before-start skips the probe but still creates the stream so the
942
+ // SDK surfaces the abort normally; a probe failure degrades the prompt
943
+ // to unknown facts rather than failing the stream.
944
+ const facts =
945
+ this.probesRuntime && !this.abortSignal?.aborted
946
+ ? await probeRuntimeFacts(toolCtx).catch(
947
+ (): RuntimeExecutionFacts => UNKNOWN_FACTS,
948
+ )
949
+ : null;
950
+ // Re-check after the await: the escape hatch may have raced the probe.
951
+ if (this._streamResult !== null) return;
952
+ this._streamResult = this.createStream(facts);
953
+ };
954
+ }
955
+
956
+ // ---------------------------------------------------------------------------
957
+ // Stream access
958
+ // ---------------------------------------------------------------------------
959
+
960
+ /**
961
+ * Asynchronous initialization seam: probe runtime facts through this
962
+ * agent's command backend (only when its selected tools can use them), then
963
+ * create the stream. Idempotent; every consumption entry point awaits it,
964
+ * so the AI layer's prompt budgeting and recovery see the actual final
965
+ * system text.
966
+ */
967
+ streamReady(): Promise<void> {
968
+ this.streamInit ??= this.initializeStreamOnce();
969
+ return this.streamInit;
970
+ }
971
+
972
+ /**
973
+ * The underlying Vercel AI SDK stream result — synchronous escape hatch.
974
+ * Always a real SDK result. Cold access creates it immediately with facts
975
+ * already settled for this runtime scope, else explicit unknown facts —
976
+ * never host facts; callers needing freshly probed facts await
977
+ * {@link streamReady}, `consume()`, or `fullStream` iteration instead.
978
+ * Guarded so a cold access racing an in-flight probe never creates a
979
+ * second model stream.
980
+ */
981
+ get streamResult(): StreamTextResult<ToolSet, never> {
982
+ if (this._streamResult === null) {
983
+ const facts = this.probesRuntime
984
+ ? (peekSettledRuntimeFacts(this.toolCtx) ?? UNKNOWN_FACTS)
985
+ : null;
986
+ this._streamResult = this.createStream(facts);
987
+ }
988
+ return this._streamResult;
989
+ }
990
+
991
+ /**
992
+ * The raw async-iterable stream of chunks.
993
+ * Equivalent to `streamResult.fullStream`; before initialization it
994
+ * settles {@link streamReady} on first iteration, then delegates to the
995
+ * real stream.
996
+ */
997
+ get fullStream(): AsyncIterable<TextStreamPart<ToolSet>> {
998
+ if (this._streamResult !== null) {
999
+ return this._streamResult.fullStream;
1000
+ }
1001
+ const self = this;
1002
+ return (async function* () {
1003
+ await self.streamReady();
1004
+ const stream = self._streamResult;
1005
+ if (stream === null) {
1006
+ throw new Error("Stream initialization did not produce a stream");
1007
+ }
1008
+ yield* stream.fullStream;
1009
+ })();
1010
+ }
1011
+
1012
+ /**
1013
+ * Makes the agent instance itself async-iterable so callers can write:
1014
+ * ```ts
1015
+ * for await (const chunk of agent) { ... }
1016
+ * ```
1017
+ *
1018
+ * **Note:** The underlying stream can only be consumed once.
1019
+ */
1020
+ async *[Symbol.asyncIterator](): AsyncIterator<TextStreamPart<ToolSet>> {
1021
+ await this.streamReady();
1022
+ for await (const chunk of this.streamResult.fullStream) {
1023
+ yield chunk;
1024
+ }
1025
+ }
1026
+
1027
+ // ---------------------------------------------------------------------------
1028
+ // Convenience helpers
1029
+ // ---------------------------------------------------------------------------
1030
+
1031
+ /**
1032
+ * Consume the stream, emitting each chunk on the {@link eventBus}, then
1033
+ * resolve the final result.
1034
+ *
1035
+ * Each AI SDK stream part is forwarded to the bus via
1036
+ * {@link AgentEventBus.emitStreamPart}, tagged with this agent's
1037
+ * `subagentId` when present.
1038
+ *
1039
+ * @returns The value produced by `resolveResult`, or `void` if none was provided.
1040
+ */
1041
+ async consume(): Promise<TResult> {
1042
+ const sid = this.subagentId;
1043
+ const bus = this.eventBus;
1044
+
1045
+ const runConsume = async (): Promise<TResult> => {
1046
+ // Reset per-run stream counters so a replayed run derives the same ids.
1047
+ this.streamStepIndex = -1;
1048
+ this.streamTextPartIndex = 0;
1049
+ // Tool-call part ids are minted once and reused for the WHOLE session, never reset per step.
1050
+ const toolParts = new Map<string, string>();
1051
+ const ids: StreamIdContext = {
1052
+ // The TUI routes any event with a subagentId into a subagent panel, so
1053
+ // the orchestrator must leave it undefined; only real subagents set it.
1054
+ subagentId: this.subagentId,
1055
+ sessionId: this.busSessionId,
1056
+ messageId: undefined,
1057
+ textPartId: undefined,
1058
+ toolPartId: (toolCallId: string) => {
1059
+ let p = toolParts.get(toolCallId);
1060
+ if (!p) {
1061
+ p =
1062
+ this.streamIdFactory?.({ kind: "tool-part", toolCallId }) ??
1063
+ newPartId();
1064
+ toolParts.set(toolCallId, p);
1065
+ }
1066
+ return p;
1067
+ },
1068
+ };
1069
+
1070
+ // Tool lifecycle state: in-flight calls awaiting a result, completed but
1071
+ // unpersisted results (PR #779), streamed arg text, and deferred tool
1072
+ // errors — all owned by the tracker (see ./toolLifecycle).
1073
+ const tracker = new ToolLifecycleTracker();
1074
+ let streamError: unknown;
1075
+ let hasStreamError = false;
1076
+
1077
+ // Opt-in stall watchdog + response-tool tracer (see ./streamDiagnostics).
1078
+ const diagnostics = new StreamDiagnostics({
1079
+ sessionId: this._session.id,
1080
+ subagentId: sid,
1081
+ inFlightTools: () => tracker.inFlightTools,
1082
+ responseToolFired: () => this._responseToolFired,
1083
+ responseToolName: RESPONSE_TOOL_NAME,
1084
+ });
1085
+ diagnostics.start();
1086
+
1087
+ try {
1088
+ // Initialize (runtime probe + stream creation) inside the span so
1089
+ // telemetry binds to this agent's invoke_agent span.
1090
+ await this.streamReady();
1091
+ // 1–3. Iterate the stream: observe diagnostics, apply the part (id
1092
+ // bookkeeping, tracker updates, step-close emissions), forward it.
1093
+ for await (const chunk of this.streamResult.fullStream) {
1094
+ diagnostics.observeChunk(chunk);
1095
+ this.applyStreamPart(chunk, { ids, tracker, diagnostics });
1096
+ bus.emitStreamPart(chunk, ids);
1097
+ }
1098
+ // The tracker keeps completed results: an abort with no trailing
1099
+ // finish-step needs them for the finalization snapshot.
1100
+ } catch (err) {
1101
+ // 4. Capture the error; finalization below still runs.
1102
+ streamError =
1103
+ this.abortSignal?.aborted && isGenericAbortError(err)
1104
+ ? agentAbortReason(this.abortSignal)
1105
+ : err;
1106
+ hasStreamError = true;
1107
+ } finally {
1108
+ // Preserve an already-observed abort if cleanup subsequently fails.
1109
+ if (!hasStreamError && this.abortSignal?.aborted) {
1110
+ streamError = agentAbortReason(this.abortSignal);
1111
+ hasStreamError = true;
1112
+ }
1113
+ // 5–7. Close the interrupted step, dispose owned resources, settle.
1114
+ const finalizeError = await this.finalizeRun({
1115
+ tracker,
1116
+ diagnostics,
1117
+ ids,
1118
+ streamError,
1119
+ });
1120
+ // Teardown failures must not replace the originating run failure.
1121
+ if (!hasStreamError && finalizeError !== null) {
1122
+ streamError = finalizeError;
1123
+ hasStreamError = true;
1124
+ }
1125
+ }
1126
+
1127
+ if (hasStreamError) {
1128
+ throw streamError;
1129
+ }
1130
+
1131
+ if (this.abortSignal?.aborted) {
1132
+ throw agentAbortReason(this.abortSignal);
1133
+ }
1134
+
1135
+ if (this.resolveResult) {
1136
+ if (this._responseToolFired) {
1137
+ return undefined as TResult;
1138
+ }
1139
+ return this.resolveResult(this.streamResult);
1140
+ }
1141
+ return undefined as TResult;
1142
+ };
1143
+
1144
+ // One invoke_agent span per execution. The conversation/root id stays
1145
+ // stable across the tree while each span identifies its current agent.
1146
+ const isSubagent = Boolean(sid);
1147
+ const spanLabel = isSubagent
1148
+ ? (this.subagentName ?? sid ?? "subagent")
1149
+ : this.agentMode;
1150
+ const rootSessionId = this._session.id;
1151
+ const agentSessionId = this.busSessionId;
1152
+ const runSpanAttributes: Record<string, string> = {
1153
+ "gen_ai.operation.name": "invoke_agent",
1154
+ "gen_ai.agent.id": agentSessionId,
1155
+ "gen_ai.agent.name": spanLabel,
1156
+ "gen_ai.conversation.id": rootSessionId,
1157
+ "session.id": rootSessionId,
1158
+ "pensar.session.id": agentSessionId,
1159
+ "pensar.root_session.id": rootSessionId,
1160
+ ...(!isSubagent ? { "pensar.agent.mode": this.agentMode } : {}),
1161
+ };
1162
+
1163
+ const runInSpan = () =>
1164
+ getApexTracer().startActiveSpan(
1165
+ `invoke_agent ${spanLabel}`,
1166
+ { attributes: runSpanAttributes },
1167
+ async (span) => {
1168
+ // Root runs register so process-exit shutdown can end an
1169
+ // in-flight run's span before the final flush.
1170
+ if (!isSubagent) registerActiveRootSpan(span);
1171
+ // Root-level input/output for trace previews — ONLY under full
1172
+ // payload capture (sensitive: objectives can name internal hosts).
1173
+ // Fast Strike uses a synthetic subagent id for UI routing but is the
1174
+ // primary run in that workflow.
1175
+ const recordRootIO =
1176
+ (!isSubagent || this.agentMode === "fast-strike") &&
1177
+ shouldRecordAiPayloads();
1178
+ if (recordRootIO && this.userPrompt) {
1179
+ span.setAttribute("gen_ai.prompt", this.userPrompt);
1180
+ }
1181
+ try {
1182
+ const result = await runConsume();
1183
+ const completedResult =
1184
+ result === undefined && this._responseToolFired
1185
+ ? this._responseToolResult
1186
+ : result;
1187
+ if (
1188
+ recordRootIO &&
1189
+ completedResult !== undefined &&
1190
+ completedResult !== null
1191
+ ) {
1192
+ span.setAttribute(
1193
+ "gen_ai.completion",
1194
+ safePreview(completedResult),
1195
+ );
1196
+ }
1197
+ return result;
1198
+ } catch (err) {
1199
+ // Record once, keep the cardinality low, preserve the original.
1200
+ span.recordException(err as Error);
1201
+ span.setStatus({ code: SpanStatusCode.ERROR });
1202
+ span.setAttribute(
1203
+ "error.type",
1204
+ err instanceof Error ? err.name : "Error",
1205
+ );
1206
+ if (recordRootIO) {
1207
+ span.setAttribute(
1208
+ "gen_ai.completion",
1209
+ this._responseToolFired
1210
+ ? safePreview(this._responseToolResult)
1211
+ : `Failure: ${err instanceof Error ? err.message : String(err)}`,
1212
+ );
1213
+ }
1214
+ throw err;
1215
+ } finally {
1216
+ unregisterActiveRootSpan(span);
1217
+ // Ends only after runConsume's finalization (persistence +
1218
+ // owned-resource disposal) has settled. Shutdown may have already
1219
+ // ended it while that finalization was still in flight.
1220
+ if (span.isRecording()) span.end();
1221
+ }
1222
+ },
1223
+ );
1224
+
1225
+ const drain = !isSubagent
1226
+ ? runInSpan()
1227
+ : withSubagentSessionBaggage(sid, runInSpan);
1228
+
1229
+ // Decouple the result from stream teardown: with a `response` schema, return as soon as it's captured rather than waiting for the stream to close (which can wedge).
1230
+ let rejectDrain: ((err: unknown) => void) | undefined;
1231
+ this._drainRejection = new Promise<never>((_, reject) => {
1232
+ rejectDrain = reject;
1233
+ });
1234
+ this._drainRejection.catch(() => {});
1235
+
1236
+ // Lets a caller that aborts after capturing the result await the drain's finally (in-flight tool closes) before completing.
1237
+ this.drained = drain.then(
1238
+ () => {},
1239
+ () => {},
1240
+ );
1241
+
1242
+ // Don't let drain's settle (reject OR resolve) mask an already-captured
1243
+ // response; unblock the resolver's streamResult.response wait either way.
1244
+ const guardedDrain = drain
1245
+ .then((result) => {
1246
+ if (this._responseToolFired) {
1247
+ rejectDrain?.(new Error("drain resolved"));
1248
+ return this.responseCaptured;
1249
+ }
1250
+ return result;
1251
+ })
1252
+ .catch((err) => {
1253
+ rejectDrain?.(err);
1254
+ if (!this._responseToolFired) throw err;
1255
+ return this.responseCaptured;
1256
+ });
1257
+ guardedDrain.catch(() => {});
1258
+
1259
+ const result = await Promise.race([guardedDrain, this.responseCaptured]);
1260
+ // Free the browser on result capture; the drain can wedge and leak camoufox.
1261
+ await this.disconnectOwnedBrowser();
1262
+ return result;
1263
+ }
1264
+
1265
+ /**
1266
+ * Apply one stream part: part-id bookkeeping, lifecycle-tracker updates,
1267
+ * and the finish-step close-out emissions. Pure projection of the part
1268
+ * onto run state; forwarding to the bus is the caller's job.
1269
+ */
1270
+ private applyStreamPart(
1271
+ chunk: TextStreamPart<ToolSet>,
1272
+ ctx: {
1273
+ ids: StreamIdContext;
1274
+ tracker: ToolLifecycleTracker;
1275
+ diagnostics: StreamDiagnostics;
1276
+ },
1277
+ ): void {
1278
+ const { ids, tracker, diagnostics } = ctx;
1279
+ const sid = this.subagentId;
1280
+ const bus = this.eventBus;
1281
+ switch (chunk.type) {
1282
+ case "start-step":
1283
+ this.streamStepIndex++;
1284
+ this.streamTextPartIndex = 0;
1285
+ ids.messageId =
1286
+ this.streamIdFactory?.({
1287
+ kind: "message",
1288
+ stepIndex: this.streamStepIndex,
1289
+ }) ?? newMessageId();
1290
+ this.currentMessageId = ids.messageId;
1291
+ ids.textPartId = undefined;
1292
+ break;
1293
+ case "text-start":
1294
+ ids.textPartId =
1295
+ this.streamIdFactory?.({
1296
+ kind: "text-part",
1297
+ stepIndex: this.streamStepIndex,
1298
+ textPartIndex: this.streamTextPartIndex,
1299
+ }) ?? newPartId();
1300
+ this.streamTextPartIndex++;
1301
+ break;
1302
+ case "text-end":
1303
+ ids.textPartId = undefined;
1304
+ break;
1305
+ case "finish-step": {
1306
+ tracker.onStepPersisted();
1307
+ const finishReason = (chunk as { finishReason?: string }).finishReason;
1308
+ const truncated = finishReason === "length";
1309
+
1310
+ for (const [toolCallId, info] of tracker.toolErrors) {
1311
+ diagnostics.logSurfacedToolError({
1312
+ toolCallId,
1313
+ toolName: info.toolName,
1314
+ message: info.message,
1315
+ streamedArgChars: (tracker.streamedArgText.get(toolCallId) ?? "")
1316
+ .length,
1317
+ finishReason,
1318
+ truncated,
1319
+ });
1320
+ bus.emit("tool-result", {
1321
+ toolCallId,
1322
+ toolName: info.toolName,
1323
+ result: {
1324
+ type: "error-text",
1325
+ value: truncated
1326
+ ? `Tool call failed: the model's output was truncated at its max output tokens before the "${info.toolName}" arguments were complete. ${info.message}`
1327
+ : `Tool call failed: ${info.message}`,
1328
+ },
1329
+ sessionId: this.busSessionId,
1330
+ subagentId: sid,
1331
+ partId: ids.toolPartId?.(toolCallId),
1332
+ messageId: ids.messageId,
1333
+ });
1334
+ }
1335
+ tracker.clearToolErrors();
1336
+
1337
+ // Close any call still in flight (args never finalized) so it doesn't render stuck "running".
1338
+ for (const [toolCallId, toolName] of tracker.inFlightTools) {
1339
+ diagnostics.logClosingInFlightTool({
1340
+ toolCallId,
1341
+ toolName,
1342
+ finishReason,
1343
+ truncated,
1344
+ });
1345
+ // Already-fired response: mark submitted, not "did not complete".
1346
+ const result =
1347
+ toolName === RESPONSE_TOOL_NAME && this._responseToolFired
1348
+ ? { type: "text" as const, value: "Response submitted." }
1349
+ : {
1350
+ type: "error-text" as const,
1351
+ value: truncated
1352
+ ? "Tool call did not complete: the model's output was truncated at its max output tokens before the arguments were finalized."
1353
+ : "Tool call did not complete",
1354
+ };
1355
+ bus.emit("tool-result", {
1356
+ toolCallId,
1357
+ toolName,
1358
+ result,
1359
+ sessionId: this.busSessionId,
1360
+ subagentId: sid,
1361
+ partId: ids.toolPartId?.(toolCallId),
1362
+ messageId: ids.messageId,
1363
+ });
1364
+ }
1365
+ tracker.clearInFlight();
1366
+ break;
1367
+ }
1368
+ default:
1369
+ // Tool-input/delta, tool-call, tool-error, tool-result → tracker.
1370
+ tracker.observePart(chunk);
1371
+ }
1372
+ }
1373
+
1374
+ /**
1375
+ * Finalize a finished (or failed) run: stop diagnostics, dispose the owned
1376
+ * shell, surface deferred tool errors, close the interrupted step, and
1377
+ * disconnect the owned browser on every path. Returns the first
1378
+ * finalization error (or null) — the caller keeps the stream error
1379
+ * primary.
1380
+ */
1381
+ private async finalizeRun(input: {
1382
+ tracker: ToolLifecycleTracker;
1383
+ diagnostics: StreamDiagnostics;
1384
+ ids: StreamIdContext;
1385
+ streamError: unknown;
1386
+ }): Promise<unknown> {
1387
+ const { tracker, diagnostics, ids, streamError } = input;
1388
+ const sid = this.subagentId;
1389
+ const bus = this.eventBus;
1390
+
1391
+ // Stop the stall watchdog so it never leaks past stream end / throw.
1392
+ diagnostics.stop();
1393
+ let finalizationError: unknown;
1394
+ let hasFinalizationError = false;
1395
+ const recordFinalizationError = (error: unknown) => {
1396
+ if (hasFinalizationError) return;
1397
+ finalizationError = error;
1398
+ hasFinalizationError = true;
1399
+ };
1400
+
1401
+ try {
1402
+ // Dispose first — the 3s kill protocol is awaited, never
1403
+ // fire-and-forget: hosts rely on drained before closeout, so an
1404
+ // active command must settle (bounded) before finalization continues.
1405
+ try {
1406
+ await this.disposeOwnedShell();
1407
+ } catch (error) {
1408
+ recordFinalizationError(error);
1409
+ }
1410
+ // Stop this agent's callback listeners (each outcome independent;
1411
+ // the seam clears the abort signal so cleanup still runs post-abort).
1412
+ try {
1413
+ const outcomes = await this.callbackListeners.stopAll();
1414
+ const failed = outcomes.find((o) => o.error);
1415
+ if (failed) {
1416
+ recordFinalizationError(
1417
+ new Error(
1418
+ `callback listener cleanup failed for ${failed.jobId}: ${failed.error}`,
1419
+ ),
1420
+ );
1421
+ }
1422
+ } catch (error) {
1423
+ recordFinalizationError(error);
1424
+ }
1425
+ // Flush after disposal: surfaces the latched step-commit failure (the
1426
+ // SDK swallows onStepFinish errors) without skipping owned cleanup.
1427
+ if (this.contextRecorder) {
1428
+ try {
1429
+ await this.contextRecorder.flush();
1430
+ } catch (error) {
1431
+ recordFinalizationError(error);
1432
+ }
1433
+ }
1434
+ // Flush tool-errors that never reached a finish-step into the snapshot.
1435
+ for (const [toolCallId, info] of tracker.flushToolErrorsToResults()) {
1436
+ const result = {
1437
+ type: "error-text" as const,
1438
+ value: `Tool call failed: ${info.message}`,
1439
+ };
1440
+ try {
1441
+ bus.emit("tool-result", {
1442
+ toolCallId,
1443
+ toolName: info.toolName,
1444
+ result,
1445
+ sessionId: this.busSessionId,
1446
+ subagentId: sid,
1447
+ partId: ids.toolPartId?.(toolCallId),
1448
+ messageId: ids.messageId,
1449
+ });
1450
+ } catch (error) {
1451
+ recordFinalizationError(error);
1452
+ }
1453
+ }
1454
+ // Snapshot unpersisted step state: open tools get synthetic closes,
1455
+ // completed/errored results get written.
1456
+ if (tracker.hasUnpersistedState()) {
1457
+ const failure =
1458
+ streamError ??
1459
+ (this.abortSignal?.aborted
1460
+ ? agentAbortReason(this.abortSignal)
1461
+ : undefined);
1462
+ const reason =
1463
+ failure instanceof Error && failure.message
1464
+ ? failure.message
1465
+ : failure !== undefined
1466
+ ? String(failure)
1467
+ : "Stream terminated unexpectedly";
1468
+ try {
1469
+ await this.finalizeInterruptedStep({
1470
+ snapshot: tracker.snapshot(),
1471
+ reason,
1472
+ partIdFor: ids.toolPartId,
1473
+ messageId: ids.messageId,
1474
+ });
1475
+ } catch (error) {
1476
+ recordFinalizationError(error);
1477
+ }
1478
+ }
1479
+ } catch (error) {
1480
+ recordFinalizationError(error);
1481
+ } finally {
1482
+ // Tear down the Chromium child process we own. Without this, a
1483
+ // naturally-finishing agent leaks its Playwright MCP browser — over a
1484
+ // long single-process scan (many endpoints) the leaked Chromium
1485
+ // processes exhaust memory and OOM the run. disconnect() force-kills
1486
+ // and never hangs, so awaiting here is safe.
1487
+ await this.disconnectOwnedBrowser();
1488
+ }
1489
+ return hasFinalizationError ? finalizationError : null;
1490
+ }
1491
+
1492
+ // ---------------------------------------------------------------------------
1493
+ // Owned-resource disposal — explicit idempotent operations; the
1494
+ // finalization path and host teardown (abortAndDrain) coordinate them
1495
+ // without knowing the shell/browser implementations.
1496
+ // ---------------------------------------------------------------------------
1497
+
1498
+ /**
1499
+ * Disposes the owned per-command executor exactly once; safe to call from
1500
+ * multiple teardown paths. Returns the same cached barrier on repeat
1501
+ * calls; the barrier resolves once a killed invocation's bounded
1502
+ * termination protocol has settled, so closeout never races an active
1503
+ * command.
1504
+ */
1505
+ disposeOwnedShell(): Promise<void> {
1506
+ if (this.shellDisposed) {
1507
+ return this.shellDisposeBarrier ?? Promise.resolve();
1508
+ }
1509
+ this.shellDisposed = true;
1510
+ this.shellDisposeBarrier =
1511
+ this.commandShell?.dispose() ?? Promise.resolve();
1512
+ return this.shellDisposeBarrier;
1513
+ }
1514
+
1515
+ /** Force-kills the owned Chromium child process exactly once; safe to call from multiple teardown paths. */
1516
+ private async disconnectOwnedBrowser(): Promise<void> {
1517
+ if (this.browserDisconnected) return;
1518
+ if (!this.ownsBrowserSession || !this.browserSession) return;
1519
+ this.browserDisconnected = true;
1520
+ await this.browserSession.disconnect().catch(() => {});
1521
+ }
1522
+
1523
+ /**
1524
+ * Idempotent teardown for hosts that abort before `consume()` settles
1525
+ * (Console `settleOnAbort` on timeout/pause). Force-disconnects the owned
1526
+ * browser, awaits the shell's bounded kill barrier, then awaits the drain
1527
+ * so owned work settles before the host starts closeout.
1528
+ */
1529
+ async abortAndDrain(): Promise<void> {
1530
+ await this.disconnectOwnedBrowser();
1531
+ await this.disposeOwnedShell().catch(() => {});
1532
+ await this.callbackListeners.stopAll().catch(() => {});
1533
+ await this.drained.catch(() => {});
1534
+ }
1535
+
1536
+ /**
1537
+ * Promise that resolves to the final response metadata once the stream
1538
+ * has been fully consumed. Await this *after* iterating the stream.
1539
+ */
1540
+ get response() {
1541
+ return this.streamReady().then(() => this.streamResult.response);
1542
+ }
1543
+ }
1544
+
1545
+ // These tools pause the agent and surface their own UI to the operator.
1546
+ // Gating them through the approval gate would double-prompt.
1547
+ const AGENT_PAUSE_TOOLS = new Set<string>([ASK_USER_QUESTIONS_TOOL_NAME]);
1548
+
1549
+ function wrapToolsWithApprovalGate(
1550
+ tools: ToolSet,
1551
+ gate: ApprovalGate,
1552
+ exemptToolNames?: Set<string>,
1553
+ ): ToolSet {
1554
+ const wrapped: ToolSet = {};
1555
+
1556
+ for (const [name, coreTool] of Object.entries(tools)) {
1557
+ if (exemptToolNames?.has(name)) {
1558
+ wrapped[name] = coreTool;
1559
+ continue;
1560
+ }
1561
+
1562
+ // biome-ignore lint/suspicious/noExplicitAny: ai-sdk CoreTool is a discriminated union that requires runtime narrowing for the approval gate wrapper.
1563
+ const t = coreTool as any;
1564
+
1565
+ if (!t.execute) {
1566
+ wrapped[name] = coreTool;
1567
+ continue;
1568
+ }
1569
+
1570
+ const originalExecute = t.execute;
1571
+
1572
+ wrapped[name] = {
1573
+ ...t,
1574
+ // biome-ignore lint/suspicious/noExplicitAny: ai-sdk tool execute receives an opaque ExecuteContext we don't need to narrow.
1575
+ execute: async (args: Record<string, unknown>, options: any) => {
1576
+ const toolCallId =
1577
+ args.toolCallId ??
1578
+ `tc_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
1579
+
1580
+ log.debug(`${name} (${toolCallId}): checking`);
1581
+ try {
1582
+ await gate.check(name, String(toolCallId), args);
1583
+ } catch (err) {
1584
+ if (err instanceof ApprovalDeniedError) {
1585
+ log.debug(`${name} (${toolCallId}): denied`);
1586
+ return { blocked: true, reason: "Denied by operator" };
1587
+ }
1588
+ throw err;
1589
+ }
1590
+ log.debug(`${name} (${toolCallId}): approved, executing`);
1591
+
1592
+ const result = await originalExecute(args, options);
1593
+ log.debug(`${name} (${toolCallId}): execute finished`);
1594
+ return result;
1595
+ },
1596
+ };
1597
+ }
1598
+
1599
+ return wrapped;
1600
+ }
1601
+
1602
+ /** Bounded, crash-safe JSON preview of a run result for span output. */
1603
+ function safePreview(value: unknown): string {
1604
+ try {
1605
+ const text = JSON.stringify(value);
1606
+ return text === undefined ? String(value) : text.slice(0, 2000);
1607
+ } catch {
1608
+ return "[unserializable result]";
1609
+ }
1610
+ }