@pensar/apex 2.5.0 → 2.6.1-canary.0cc77dcc

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 (1507) hide show
  1. package/README.md +38 -0
  2. package/bin/pensar.js +12 -4
  3. package/build/agent-6mzhkzxj.js +13 -0
  4. package/build/agent-9ymr36jt.js +13 -0
  5. package/build/{agent-m30a62kh.js → agent-fb1d2x2a.js} +48 -50
  6. package/build/agent-h8z7zb26.js +15 -0
  7. package/build/agent-runs-awgj4sat.js +313 -0
  8. package/build/{apps-x4ef2gpc.js → apps-d50kkp3g.js} +50 -58
  9. package/build/{auth-7ay8qgxm.js → auth-396rc66q.js} +61 -68
  10. package/build/blackboxAgent-j3ncq55f.js +13 -0
  11. package/build/blackboxPentest-aw69ect4.js +59 -0
  12. package/build/cli-0ym9qz7r.js +175 -0
  13. package/build/{cli-zav1yx5k.js → cli-2dqvgkh8.js} +990 -632
  14. package/build/cli-38j2jc0m.js +62 -0
  15. package/build/{cli-ee3axgts.js → cli-3gt761d2.js} +7 -1
  16. package/build/{cli-sx3jkv7p.js → cli-3p4gyc9m.js} +28872 -25951
  17. package/build/cli-3qznjsnr.js +14 -0
  18. package/build/cli-5ppxe6qz.js +355 -0
  19. package/build/cli-691cfgdy.js +186 -0
  20. package/build/{cli-x92fkt2f.js → cli-6y2mzdz2.js} +55 -97
  21. package/build/{cli-73k43t1r.js → cli-8s4ew1hv.js} +53 -78
  22. package/build/{cli-53rm0rrz.js → cli-8w8k4dph.js} +1 -1
  23. package/build/{cli-68260ckj.js → cli-91gs9whc.js} +1658 -1606
  24. package/build/{cli-7vg06q5r.js → cli-9s7snz6x.js} +135 -125
  25. package/build/{cli-bw2ddttk.js → cli-a1m3pmke.js} +4730 -267
  26. package/build/{cli-knd276ed.js → cli-bb02pjt0.js} +31 -31
  27. package/build/{cli-p4r7q012.js → cli-c0ha5wh1.js} +16072 -12743
  28. package/build/{cli-j54qa6tm.js → cli-c2k4xxaw.js} +42 -42
  29. package/build/{cli-k71t434r.js → cli-ec2hwkv3.js} +34 -76
  30. package/build/{cli-vkbzcnw1.js → cli-fapvkkbh.js} +43 -40
  31. package/build/cli-g06s7edq.js +11 -0
  32. package/build/cli-gsaf4jk3.js +280 -0
  33. package/build/{cli-bc05qbss.js → cli-h6y3bt60.js} +13 -21
  34. package/build/cli-jdrx44ge.js +14 -0
  35. package/build/{cli-z5c0ypg1.js → cli-jp6wytx1.js} +4 -4
  36. package/build/cli-mz5pk30x.js +5508 -0
  37. package/build/{cli-kff2bbq7.js → cli-nmg32cfd.js} +43 -43
  38. package/build/cli-pckpvwbd.js +22 -0
  39. package/build/cli-pwm29ks7.js +6337 -0
  40. package/build/cli-retw3rw5.js +12 -0
  41. package/build/cli-se8ae8z3.js +2250 -0
  42. package/build/{cli-dm0fc0bm.js → cli-v1sarr4y.js} +5 -9
  43. package/build/cli-v9rrvh12.js +429 -0
  44. package/build/{cli-3py0a0wg.js → cli-vfta27tv.js} +206 -136
  45. package/build/cli-xcy2vxj2.js +1732 -0
  46. package/build/{cli-y3dpm18e.js → cli-xn12g67s.js} +75 -92
  47. package/build/cli.js +769 -195
  48. package/build/{config-4kzh88xz.js → config-hddxxr27.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-mgws2nav.js} +56 -31
  52. package/build/{fixes-fv66yn1z.js → fixes-9qtsvwxx.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-0d05xcz4.js +25 -0
  59. package/build/index-0ef0j7yp.js +12 -0
  60. package/build/index-557xary4.js +121 -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-cfbd4zej.js +17 -0
  65. package/build/index-mqaw1ac6.js +9 -0
  66. package/build/{index-kyd1jm89.js → index-nfhetcq8.js} +159 -169
  67. package/build/index-qnyevb6q.js +1563 -0
  68. package/build/{index-fpwr10qm.js → index-wyn4g2c1.js} +5048 -3786
  69. package/build/index-zbq3rvwx.js +36 -0
  70. package/build/index-zhr65sg3.js +102 -0
  71. package/build/{issues-019678t0.js → issues-9zdszfq8.js} +51 -47
  72. package/build/knowledge-r6rmer3d.js +139 -0
  73. package/build/lib/chunk-02awpt3c.js +431 -0
  74. package/build/lib/chunk-0me4mrrd.js +7150 -0
  75. package/build/lib/chunk-2j49k090.js +922 -0
  76. package/build/lib/chunk-2njv7wz3.js +178 -0
  77. package/build/lib/chunk-2t65f749.js +1412 -0
  78. package/build/lib/chunk-3502z798.js +9232 -0
  79. package/build/lib/chunk-3q89v4xv.js +21 -0
  80. package/build/lib/chunk-3w05jmk6.js +685 -0
  81. package/build/lib/chunk-48zms2q1.js +572 -0
  82. package/build/lib/chunk-4ydrmwd9.js +980 -0
  83. package/build/lib/chunk-517rf135.js +143 -0
  84. package/build/lib/chunk-5cp1fp0x.js +186 -0
  85. package/build/lib/chunk-7gjdygcx.js +171 -0
  86. package/build/lib/chunk-8vhr65w3.js +272 -0
  87. package/build/lib/chunk-9nsrd4xg.js +12 -0
  88. package/build/lib/chunk-asbemhm5.js +56 -0
  89. package/build/lib/chunk-b8eq85d2.js +143 -0
  90. package/build/lib/chunk-bx94rwt5.js +24 -0
  91. package/build/lib/chunk-eb4h4k1f.js +213 -0
  92. package/build/lib/chunk-ebkq3bcq.js +102 -0
  93. package/build/lib/chunk-esymacwg.js +14 -0
  94. package/build/lib/chunk-f04pr76h.js +317 -0
  95. package/build/lib/chunk-fy3bbbqy.js +7896 -0
  96. package/build/lib/chunk-g8d2x00m.js +2429 -0
  97. package/build/lib/chunk-ja7j565c.js +743 -0
  98. package/build/lib/chunk-jah67hkt.js +120 -0
  99. package/build/lib/chunk-jdjagvgr.js +85 -0
  100. package/build/lib/chunk-k5m5rasy.js +439 -0
  101. package/build/lib/chunk-mp1czx2y.js +510 -0
  102. package/build/lib/chunk-mrjbsaf4.js +31 -0
  103. package/build/lib/chunk-mv74mq5n.js +59 -0
  104. package/build/lib/chunk-n0ba7khr.js +64 -0
  105. package/build/lib/chunk-ngp6p527.js +317 -0
  106. package/build/lib/chunk-q5e23acz.js +52 -0
  107. package/build/lib/chunk-sk8xnywf.js +212 -0
  108. package/build/lib/chunk-t5bt5vn1.js +146 -0
  109. package/build/lib/chunk-tsnk2k9x.js +345 -0
  110. package/build/lib/chunk-vt9spgd1.js +62 -0
  111. package/build/lib/chunk-vx228eeq.js +82 -0
  112. package/build/lib/chunk-wr6ke041.js +11157 -0
  113. package/build/lib/chunk-xcdtrzk5.js +27 -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 +332 -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 +6 -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-1r7nkzhg.js} +22 -30
  564. package/build/{multipart-parser-g2xxkezz.js → multipart-parser-vjjdbpd1.js} +10 -10
  565. package/build/native-rollout-evidence-y0vdtjje.js +135 -0
  566. package/build/offesecAgent-dfj42jkj.js +22 -0
  567. package/build/{parse-rtccymzn.js → parse-cqecqrc5.js} +0 -4
  568. package/build/pentest-n8k0dd5q.js +22 -0
  569. package/build/pentests-jh9az51h.js +143 -0
  570. package/build/recordedRunClient-mvendk9n.js +11 -0
  571. package/build/{targetedPentest-tdwtgmxm.js → targetedPentest-rgffxsgd.js} +22 -22
  572. package/build/{targets-763n91t7.js → targets-wn0gmdhe.js} +24 -32
  573. package/build/threatModel-6efzjpbv.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-cmv057jn.js} +3 -3
  577. package/build/{upload-9qj1kpt9.js → upload-vkkj6h54.js} +8 -14
  578. package/build/{utils-t7gc2903.js → utils-b1kae4f3.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 +636 -0
  872. package/src/core/ai/ai.ts +2349 -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 +145 -0
  930. package/src/core/ai/models/bedrock.ts +600 -0
  931. package/src/core/ai/models/claude-capabilities.ts +22 -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 +250 -0
  936. package/src/core/ai/models/mantle.ts +14 -0
  937. package/src/core/ai/models/models.test.ts +290 -0
  938. package/src/core/ai/models/openai.ts +409 -0
  939. package/src/core/ai/models/openrouter.ts +336 -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 +289 -0
  953. package/src/core/ai/providers/anthropic.ts +73 -0
  954. package/src/core/ai/providers/concentrate.live.test.ts +71 -0
  955. package/src/core/ai/providers/concentrate.test.ts +160 -0
  956. package/src/core/ai/providers/concentrate.ts +145 -0
  957. package/src/core/ai/providers/custom.live.test.ts +42 -0
  958. package/src/core/ai/providers/custom.test.ts +474 -0
  959. package/src/core/ai/providers/custom.ts +70 -0
  960. package/src/core/ai/providers/gateway-models.test.ts +638 -0
  961. package/src/core/ai/providers/hoonify.live.test.ts +72 -0
  962. package/src/core/ai/providers/hoonify.test.ts +284 -0
  963. package/src/core/ai/providers/hoonify.ts +32 -0
  964. package/src/core/ai/providers/openai-models.test.ts +356 -0
  965. package/src/core/ai/providers/openai-pro-fetch.test.ts +64 -0
  966. package/src/core/ai/providers/openai-pro-fetch.ts +32 -0
  967. package/src/core/ai/providers/pensar.ts +645 -0
  968. package/src/core/ai/providers/pensarFormatters.test.ts +272 -0
  969. package/src/core/ai/providers/pensarFormatters.ts +533 -0
  970. package/src/core/ai/providers/pensarResponsesStream.test.ts +191 -0
  971. package/src/core/ai/providers/pensarResponsesStream.ts +294 -0
  972. package/src/core/ai/providers/pensarSSE.test.ts +83 -0
  973. package/src/core/ai/providers/pensarSSE.ts +128 -0
  974. package/src/core/ai/providers/pensarSigning.ts +2 -0
  975. package/src/core/ai/providers/pensarStreamUsage.test.ts +79 -0
  976. package/src/core/ai/providers/pensarStreamUsage.ts +62 -0
  977. package/src/core/ai/stepContext.test.ts +61 -0
  978. package/src/core/ai/streamIdleTimeout.test.ts +390 -0
  979. package/src/core/ai/streamTelemetry.ts +90 -0
  980. package/src/core/ai/usage-callback.test.ts +511 -0
  981. package/src/core/ai/utils.native-rollout-evidence.test.ts +135 -0
  982. package/src/core/ai/utils.pensar.test.ts +59 -0
  983. package/src/core/ai/utils.ts +796 -0
  984. package/src/core/api/apiClient.test.ts +58 -0
  985. package/src/core/api/apiClient.ts +73 -0
  986. package/src/core/api/apps.test.ts +78 -0
  987. package/src/core/api/apps.ts +388 -0
  988. package/src/core/api/attackSurface.test.ts +24 -0
  989. package/src/core/api/attackSurface.ts +89 -0
  990. package/src/core/api/authentication.ts +8 -0
  991. package/src/core/api/benchmark.ts +35 -0
  992. package/src/core/api/blackboxPentest.test.ts +89 -0
  993. package/src/core/api/blackboxPentest.ts +64 -0
  994. package/src/core/api/clientIdentity.test.ts +61 -0
  995. package/src/core/api/clientIdentity.ts +57 -0
  996. package/src/core/api/comments.test.ts +69 -0
  997. package/src/core/api/constants.ts +15 -0
  998. package/src/core/api/domains.test.ts +35 -0
  999. package/src/core/api/domains.ts +32 -0
  1000. package/src/core/api/environment.ts +47 -0
  1001. package/src/core/api/index.ts +219 -0
  1002. package/src/core/api/issues.test.ts +82 -0
  1003. package/src/core/api/issues.ts +439 -0
  1004. package/src/core/api/knowledge.ts +70 -0
  1005. package/src/core/api/localWorker.ts +29 -0
  1006. package/src/core/api/offesecAgent.test.ts +289 -0
  1007. package/src/core/api/offesecAgent.ts +77 -0
  1008. package/src/core/api/patching.ts +44 -0
  1009. package/src/core/api/recordedRun.control.test.ts +830 -0
  1010. package/src/core/api/recordedRun.inference.test.ts +529 -0
  1011. package/src/core/api/recordedRun.loop.test.ts +290 -0
  1012. package/src/core/api/recordedRun.recovery.test.ts +651 -0
  1013. package/src/core/api/recordedRun.test.ts +646 -0
  1014. package/src/core/api/recordedRun.ts +542 -0
  1015. package/src/core/api/targetedPentest.test.ts +177 -0
  1016. package/src/core/api/targetedPentest.ts +83 -0
  1017. package/src/core/api/threatModel.ts +5 -0
  1018. package/src/core/api/trajectoryExport.test.ts +299 -0
  1019. package/src/core/api/trajectoryExport.ts +362 -0
  1020. package/src/core/api/vulnerabilityReproduction.test.ts +56 -0
  1021. package/src/core/api/vulnerabilityReproduction.ts +54 -0
  1022. package/src/core/assets/wordlists.test.ts +85 -0
  1023. package/src/core/assets/wordlists.ts +111 -0
  1024. package/src/core/atif/compatibility.test.ts +107 -0
  1025. package/src/core/atif/convert.test.ts +815 -0
  1026. package/src/core/atif/convert.ts +1658 -0
  1027. package/src/core/atif/fixtures/portable-bundle-v1.json +813 -0
  1028. package/src/core/atif/index.ts +34 -0
  1029. package/src/core/atif/schema.ts +345 -0
  1030. package/src/core/atif/serialize.test.ts +244 -0
  1031. package/src/core/atif/serialize.ts +419 -0
  1032. package/src/core/atif/test-fixtures.ts +184 -0
  1033. package/src/core/atif/validate.test.ts +188 -0
  1034. package/src/core/atif/validate.ts +289 -0
  1035. package/src/core/auth/connection.ts +26 -0
  1036. package/src/core/auth/device-flow.ts +203 -0
  1037. package/src/core/auth/gateway.ts +66 -0
  1038. package/src/core/auth/index.ts +29 -0
  1039. package/src/core/auth/signing.ts +25 -0
  1040. package/src/core/auth/token.ts +140 -0
  1041. package/src/core/auth/types.ts +106 -0
  1042. package/src/core/auth/workspaces.ts +192 -0
  1043. package/src/core/benchmark/index.ts +11 -0
  1044. package/src/core/benchmark/report.ts +257 -0
  1045. package/src/core/benchmark/runner.ts +698 -0
  1046. package/src/core/benchmark/types.ts +80 -0
  1047. package/src/core/cli/logLevelArgs.test.ts +83 -0
  1048. package/src/core/cli/logLevelArgs.ts +62 -0
  1049. package/src/core/cli/model.ts +35 -0
  1050. package/src/core/cli/pentestMode.test.ts +24 -0
  1051. package/src/core/cli/pentestMode.ts +23 -0
  1052. package/src/core/cli/tuiArgs.test.ts +58 -0
  1053. package/src/core/cli/tuiArgs.ts +28 -0
  1054. package/src/core/config/config.test.ts +183 -0
  1055. package/src/core/config/config.ts +201 -0
  1056. package/src/core/config/customProviders.test.ts +183 -0
  1057. package/src/core/config/customProviders.ts +190 -0
  1058. package/src/core/config/index.ts +7 -0
  1059. package/src/core/credentials/index.ts +6 -0
  1060. package/src/core/credentials/manager.ts +313 -0
  1061. package/src/core/credentials/types.ts +112 -0
  1062. package/src/core/doctor.ts +138 -0
  1063. package/src/core/eventBus.test.ts +374 -0
  1064. package/src/core/eventBus.ts +410 -0
  1065. package/src/core/findings/attackSurfaceRegistry.ts +294 -0
  1066. package/src/core/findings/registry.test.ts +1680 -0
  1067. package/src/core/findings/registry.ts +800 -0
  1068. package/src/core/history.ts +82 -0
  1069. package/src/core/hoonify.test.ts +250 -0
  1070. package/src/core/hoonify.ts +163 -0
  1071. package/src/core/http/headers.contract.test.ts +1161 -0
  1072. package/src/core/http/parse.ts +257 -0
  1073. package/src/core/http/redirects.test.ts +207 -0
  1074. package/src/core/http/redirects.ts +145 -0
  1075. package/src/core/http/targetHeaders.ts +604 -0
  1076. package/src/core/http/targetScope.ts +52 -0
  1077. package/src/core/http/types.ts +39 -0
  1078. package/src/core/id/id.test.ts +88 -0
  1079. package/src/core/id/id.ts +138 -0
  1080. package/src/core/installation/index.ts +222 -0
  1081. package/src/core/installation/installation.test.ts +415 -0
  1082. package/src/core/integrations/herdr.test.ts +335 -0
  1083. package/src/core/integrations/herdr.ts +163 -0
  1084. package/src/core/integrations/surface/index.test.ts +534 -0
  1085. package/src/core/integrations/surface/index.ts +224 -0
  1086. package/src/core/integrations/surface/types.ts +29 -0
  1087. package/src/core/integrations/wandb/client.ts +167 -0
  1088. package/src/core/integrations/wandb/upload.test.ts +415 -0
  1089. package/src/core/integrations/wandb/upload.ts +76 -0
  1090. package/src/core/logger/errorLog.test.ts +98 -0
  1091. package/src/core/logger/index.ts +214 -0
  1092. package/src/core/logger/structured.test.ts +212 -0
  1093. package/src/core/logger/structured.ts +207 -0
  1094. package/src/core/memory/backend.test.ts +186 -0
  1095. package/src/core/memory/index.ts +279 -0
  1096. package/src/core/memory/memory.test.ts +362 -0
  1097. package/src/core/messages/types.ts +141 -0
  1098. package/src/core/obfuscation/engine.test.ts +314 -0
  1099. package/src/core/obfuscation/engine.ts +647 -0
  1100. package/src/core/obfuscation/index.ts +27 -0
  1101. package/src/core/observability/active-root-spans.ts +30 -0
  1102. package/src/core/observability/active-spans.ts +80 -0
  1103. package/src/core/observability/index.ts +91 -0
  1104. package/src/core/observability/log-correlation.test.ts +276 -0
  1105. package/src/core/observability/payload-capture.test.ts +59 -0
  1106. package/src/core/observability/runtime.test.ts +743 -0
  1107. package/src/core/observability/runtime.ts +371 -0
  1108. package/src/core/observability/shutdown.test.ts +551 -0
  1109. package/src/core/observability/telemetry.test.ts +895 -0
  1110. package/src/core/observability/telemetry.ts +220 -0
  1111. package/src/core/observability/testkit.test.ts +66 -0
  1112. package/src/core/observability/testkit.ts +97 -0
  1113. package/src/core/observability/trace-contract.test.ts +1031 -0
  1114. package/src/core/observability.test.ts +135 -0
  1115. package/src/core/operator/approvalGate.test.ts +300 -0
  1116. package/src/core/operator/approvalGate.ts +287 -0
  1117. package/src/core/operator/index.ts +30 -0
  1118. package/src/core/operator/types.ts +355 -0
  1119. package/src/core/plan/index.ts +44 -0
  1120. package/src/core/prompt-injections/index.test.ts +248 -0
  1121. package/src/core/prompt-injections/index.ts +350 -0
  1122. package/src/core/providers/index.ts +5 -0
  1123. package/src/core/providers/types.ts +87 -0
  1124. package/src/core/providers/utils.test.ts +189 -0
  1125. package/src/core/providers/utils.ts +183 -0
  1126. package/src/core/providers/verify.test.ts +49 -0
  1127. package/src/core/providers/verify.ts +198 -0
  1128. package/src/core/report/builder.test.ts +229 -0
  1129. package/src/core/report/builder.ts +58 -0
  1130. package/src/core/report/index.ts +13 -0
  1131. package/src/core/report/renderers/json.test.ts +76 -0
  1132. package/src/core/report/renderers/json.ts +5 -0
  1133. package/src/core/report/renderers/markdown.test.ts +366 -0
  1134. package/src/core/report/renderers/markdown.ts +133 -0
  1135. package/src/core/report/schemas.ts +48 -0
  1136. package/src/core/runtime/agentExecution.test.ts +94 -0
  1137. package/src/core/runtime/agentExecution.ts +27 -0
  1138. package/src/core/runtime/launchLocalWorker.test.ts +707 -0
  1139. package/src/core/runtime/launchLocalWorker.ts +273 -0
  1140. package/src/core/runtime/localRunLock.ts +118 -0
  1141. package/src/core/runtime/localRunWorker.test.ts +381 -0
  1142. package/src/core/runtime/localRunWorker.ts +287 -0
  1143. package/src/core/runtime/localWorker.acceptance.test.ts +548 -0
  1144. package/src/core/runtime/localWorkerEndpoint.test.ts +145 -0
  1145. package/src/core/runtime/localWorkerEndpoint.ts +82 -0
  1146. package/src/core/runtime/localWorkerProtocol.ts +176 -0
  1147. package/src/core/runtime/localWorkerTransport.test.ts +841 -0
  1148. package/src/core/runtime/localWorkerTransport.ts +434 -0
  1149. package/src/core/runtime/persistenceError.ts +14 -0
  1150. package/src/core/runtime/recordedExecution.ts +43 -0
  1151. package/src/core/runtime/recordedRunClient.integration.test.ts +106 -0
  1152. package/src/core/runtime/recordedRunClient.test.ts +677 -0
  1153. package/src/core/runtime/recordedRunClient.ts +303 -0
  1154. package/src/core/runtime/runCheckpointStore.ts +23 -0
  1155. package/src/core/runtime/runContext.test.ts +445 -0
  1156. package/src/core/runtime/runContext.ts +184 -0
  1157. package/src/core/runtime/runControl.test.ts +923 -0
  1158. package/src/core/runtime/runControl.ts +419 -0
  1159. package/src/core/runtime/runControlStore.ts +106 -0
  1160. package/src/core/runtime/runDeadline.test.ts +44 -0
  1161. package/src/core/runtime/runDeadline.ts +28 -0
  1162. package/src/core/runtime/runEvidence.test.ts +384 -0
  1163. package/src/core/runtime/runEvidence.ts +267 -0
  1164. package/src/core/runtime/runInference.test.ts +408 -0
  1165. package/src/core/runtime/runInference.ts +125 -0
  1166. package/src/core/runtime/runModelStore.ts +55 -0
  1167. package/src/core/runtime/runObservation.ts +24 -0
  1168. package/src/core/runtime/runRecoveryContext.test.ts +602 -0
  1169. package/src/core/runtime/runRecoveryContext.ts +195 -0
  1170. package/src/core/runtime/runRecoveryPlan.test.ts +851 -0
  1171. package/src/core/runtime/runRecoveryPlan.ts +540 -0
  1172. package/src/core/runtime/runRecoveryStore.ts +78 -0
  1173. package/src/core/runtime/runStore.ts +148 -0
  1174. package/src/core/runtime/runStorePath.ts +13 -0
  1175. package/src/core/runtime/runToolStore.ts +66 -0
  1176. package/src/core/runtime/runTools.crash.test.ts +414 -0
  1177. package/src/core/runtime/runTools.test.ts +689 -0
  1178. package/src/core/runtime/runTools.ts +208 -0
  1179. package/src/core/runtime/sqliteControlStore.test.ts +917 -0
  1180. package/src/core/runtime/sqliteControlStore.ts +555 -0
  1181. package/src/core/runtime/sqliteModelStore.test.ts +619 -0
  1182. package/src/core/runtime/sqliteModelStore.ts +286 -0
  1183. package/src/core/runtime/sqliteRecoveryStore.public.test.ts +374 -0
  1184. package/src/core/runtime/sqliteRecoveryStore.test.ts +836 -0
  1185. package/src/core/runtime/sqliteRecoveryStore.ts +435 -0
  1186. package/src/core/runtime/sqliteRunContext.test.ts +1000 -0
  1187. package/src/core/runtime/sqliteRunObservation.test.ts +432 -0
  1188. package/src/core/runtime/sqliteRunStore.test.ts +698 -0
  1189. package/src/core/runtime/sqliteRunStore.ts +593 -0
  1190. package/src/core/runtime/sqliteToolStore.test.ts +1231 -0
  1191. package/src/core/runtime/sqliteToolStore.ts +419 -0
  1192. package/src/core/runtime/testfixtures/localWorkerChild.ts +254 -0
  1193. package/src/core/runtime/testfixtures/localWorkerLauncher.ts +15 -0
  1194. package/src/core/runtime/testfixtures/recoveryChild.ts +159 -0
  1195. package/src/core/services/rateLimiter/index.test.ts +106 -0
  1196. package/src/core/services/rateLimiter/index.ts +157 -0
  1197. package/src/core/services/rateLimiter/types.ts +10 -0
  1198. package/src/core/session/admitted-config.test.ts +50 -0
  1199. package/src/core/session/deprecated-headers-shim.test.ts +111 -0
  1200. package/src/core/session/execution-metrics.test.ts +297 -0
  1201. package/src/core/session/execution-metrics.ts +176 -0
  1202. package/src/core/session/index.ts +1085 -0
  1203. package/src/core/session/loader.ts +212 -0
  1204. package/src/core/session/persistence.test.ts +1210 -0
  1205. package/src/core/session/persistence.ts +1076 -0
  1206. package/src/core/session/rehydrate.test.ts +393 -0
  1207. package/src/core/session/types.ts +139 -0
  1208. package/src/core/session/usage.test.ts +99 -0
  1209. package/src/core/session/usage.ts +84 -0
  1210. package/src/core/skills/builtins/index.ts +22 -0
  1211. package/src/core/skills/builtins/pentest.ts +135 -0
  1212. package/src/core/skills/builtins/promptInjection.ts +44 -0
  1213. package/src/core/skills/builtins/threatModel.ts +336 -0
  1214. package/src/core/skills/index.ts +15 -0
  1215. package/src/core/skills/parser.test.ts +120 -0
  1216. package/src/core/skills/parser.ts +106 -0
  1217. package/src/core/skills/registry.test.ts +202 -0
  1218. package/src/core/skills/registry.ts +109 -0
  1219. package/src/core/skills/scanner.test.ts +157 -0
  1220. package/src/core/skills/scanner.ts +115 -0
  1221. package/src/core/skills/types.ts +45 -0
  1222. package/src/core/skills/utils.ts +16 -0
  1223. package/src/core/storage/index.ts +150 -0
  1224. package/src/core/tasks/index.ts +242 -0
  1225. package/src/core/tools/backends/capture.ts +38 -0
  1226. package/src/core/tools/backends/collectCommand.test.ts +33 -0
  1227. package/src/core/tools/backends/collectCommand.ts +28 -0
  1228. package/src/core/tools/backends/helpers.ts +140 -0
  1229. package/src/core/tools/backends/httpTransport.ts +534 -0
  1230. package/src/core/tools/backends/index.ts +61 -0
  1231. package/src/core/tools/backends/local.test.ts +307 -0
  1232. package/src/core/tools/backends/local.ts +820 -0
  1233. package/src/core/tools/backends/policy.test.ts +137 -0
  1234. package/src/core/tools/backends/policy.ts +129 -0
  1235. package/src/core/tools/backends/resolve.test.ts +309 -0
  1236. package/src/core/tools/backends/resolve.ts +152 -0
  1237. package/src/core/tools/backends/types.ts +279 -0
  1238. package/src/core/tools/backends/whitebox.test.ts +275 -0
  1239. package/src/core/tools/backends/whitebox.ts +14 -0
  1240. package/src/core/tools/backends/whiteboxJobs.test.ts +375 -0
  1241. package/src/core/tools/backends/whiteboxJobs.ts +157 -0
  1242. package/src/core/tools/backends/windowsProgram.ts +36 -0
  1243. package/src/core/tools/daytonaSandbox.test.ts +491 -0
  1244. package/src/core/tools/daytonaSandbox.ts +232 -0
  1245. package/src/core/toolset/index.ts +583 -0
  1246. package/src/core/util/lazyLogger.ts +32 -0
  1247. package/src/core/utils/concurrency.test.ts +204 -0
  1248. package/src/core/utils/concurrency.ts +75 -0
  1249. package/src/core/utils/prompt.ts +28 -0
  1250. package/src/core/whitebox/adapters.ts +277 -0
  1251. package/src/core/whitebox/artifacts.ts +128 -0
  1252. package/src/core/whitebox/boundedProcess.ts +265 -0
  1253. package/src/core/whitebox/candidates.ts +268 -0
  1254. package/src/core/whitebox/catalog.ts +82 -0
  1255. package/src/core/whitebox/index.ts +53 -0
  1256. package/src/core/whitebox/jobKernel.test.ts +91 -0
  1257. package/src/core/whitebox/jobKernel.ts +347 -0
  1258. package/src/core/whitebox/jobSupervisor.ts +264 -0
  1259. package/src/core/whitebox/jobs.ts +21 -0
  1260. package/src/core/whitebox/paths.ts +94 -0
  1261. package/src/core/whitebox/profileTransport.ts +225 -0
  1262. package/src/core/whitebox/profiles.ts +294 -0
  1263. package/src/core/whitebox/repoProfile.test.ts +217 -0
  1264. package/src/core/whitebox/repoProfile.ts +256 -0
  1265. package/src/core/whitebox/types.ts +189 -0
  1266. package/src/core/whitebox/whitebox.test.ts +789 -0
  1267. package/src/core/workflows/fastStrike.seams.test.ts +217 -0
  1268. package/src/core/workflows/fastStrike.test.ts +29 -0
  1269. package/src/core/workflows/fastStrike.ts +239 -0
  1270. package/src/core/workflows/pentest.test.ts +575 -0
  1271. package/src/core/workflows/pentest.ts +1022 -0
  1272. package/src/core/workflows/seams.test.ts +386 -0
  1273. package/src/core/workflows/seams.ts +276 -0
  1274. package/src/core/workflows/threatModel.ts +108 -0
  1275. package/src/core/workflows/usage-forwarding.test.ts +203 -0
  1276. package/src/core/workflows/whiteboxAttackSurface.test.ts +695 -0
  1277. package/src/core/workflows/whiteboxAttackSurface.ts +1740 -0
  1278. package/src/index.ts +49 -0
  1279. package/src/lib/attack-path/types.ts +13 -0
  1280. package/src/lib/cvss/calculator.test.ts +2090 -0
  1281. package/src/lib/cvss/calculator.ts +643 -0
  1282. package/src/lib/cvss/index.ts +65 -0
  1283. package/src/lib/cvss/macrovector-scores.ts +402 -0
  1284. package/src/lib/cvss/types.ts +241 -0
  1285. package/src/lib/cwe/cwe-catalog.ts +444 -0
  1286. package/src/lib/cwe/types.test.ts +142 -0
  1287. package/src/lib/cwe/types.ts +37 -0
  1288. package/src/lib/cwe/validate.test.ts +110 -0
  1289. package/src/lib/cwe/validate.ts +53 -0
  1290. package/src/lib/evidence/types.ts +9 -0
  1291. package/src/tests/agentWorkingDirectory.test.ts +175 -0
  1292. package/src/tests/attackSurface.test.ts +35 -0
  1293. package/src/tests/auth.test.ts +196 -0
  1294. package/src/tests/authCookieExport.test.ts +143 -0
  1295. package/src/tests/authPentestHandoff.test.ts +231 -0
  1296. package/src/tests/browserCookies.test.ts +128 -0
  1297. package/src/tests/credentialManager.test.ts +657 -0
  1298. package/src/tests/data/console.openapi.json +1037 -0
  1299. package/src/tests/data/console.sitemap.xml +348 -0
  1300. package/src/tests/delegateAuthMerge.test.ts +48 -0
  1301. package/src/tui/auto-copy.ts +36 -0
  1302. package/src/tui/clipboard.ts +65 -0
  1303. package/src/tui/command-registry.test.ts +124 -0
  1304. package/src/tui/command-registry.ts +645 -0
  1305. package/src/tui/command-router.ts +81 -0
  1306. package/src/tui/components/agent-display.tsx +480 -0
  1307. package/src/tui/components/ascii-art.tsx +225 -0
  1308. package/src/tui/components/chat/approval-inline.tsx +51 -0
  1309. package/src/tui/components/chat/config-view.tsx +279 -0
  1310. package/src/tui/components/chat/home-view.tsx +288 -0
  1311. package/src/tui/components/chat/index.tsx +161 -0
  1312. package/src/tui/components/chat/input-area.tsx +529 -0
  1313. package/src/tui/components/chat/lib/play-core/num.ts +102 -0
  1314. package/src/tui/components/chat/lib/wave-simulation.ts +124 -0
  1315. package/src/tui/components/chat/loading-indicator.test.ts +33 -0
  1316. package/src/tui/components/chat/loading-indicator.tsx +115 -0
  1317. package/src/tui/components/chat/message-list.tsx +264 -0
  1318. package/src/tui/components/chat/petri-animation.tsx +175 -0
  1319. package/src/tui/components/chat/plan-review-message.tsx +49 -0
  1320. package/src/tui/components/chat/questions-form.tsx +756 -0
  1321. package/src/tui/components/commands/__tests__/recorded-runs-lifecycle.tsx +907 -0
  1322. package/src/tui/components/commands/advanced-settings.tsx +94 -0
  1323. package/src/tui/components/commands/api-key-input.tsx +122 -0
  1324. package/src/tui/components/commands/auth-flow-logic.test.ts +58 -0
  1325. package/src/tui/components/commands/auth-flow-logic.ts +30 -0
  1326. package/src/tui/components/commands/auth-flow.tsx +702 -0
  1327. package/src/tui/components/commands/credits-flow.tsx +210 -0
  1328. package/src/tui/components/commands/help-dialog.tsx +238 -0
  1329. package/src/tui/components/commands/models-display.tsx +111 -0
  1330. package/src/tui/components/commands/operator-wizard.tsx +328 -0
  1331. package/src/tui/components/commands/provider-manager.tsx +241 -0
  1332. package/src/tui/components/commands/provider-selection.tsx +129 -0
  1333. package/src/tui/components/commands/recorded-runs.test.ts +40 -0
  1334. package/src/tui/components/commands/recorded-runs.tsx +793 -0
  1335. package/src/tui/components/commands/sessions-display.tsx +365 -0
  1336. package/src/tui/components/commands/shortcuts-dialog.tsx +52 -0
  1337. package/src/tui/components/commands/skills-dialog.tsx +308 -0
  1338. package/src/tui/components/commands/theme-picker.tsx +177 -0
  1339. package/src/tui/components/commands/web-wizard.tsx +965 -0
  1340. package/src/tui/components/dialog-layout.tsx +73 -0
  1341. package/src/tui/components/error-boundary.tsx +82 -0
  1342. package/src/tui/components/footer.tsx +101 -0
  1343. package/src/tui/components/input.tsx +43 -0
  1344. package/src/tui/components/loaders.tsx +784 -0
  1345. package/src/tui/components/model-picker/ModelPicker.tsx +907 -0
  1346. package/src/tui/components/model-picker/ModelPickerDialog.tsx +75 -0
  1347. package/src/tui/components/model-picker/index.ts +2 -0
  1348. package/src/tui/components/model-picker/model-navigation.test.ts +102 -0
  1349. package/src/tui/components/model-picker/model-navigation.ts +54 -0
  1350. package/src/tui/components/model-picker/model-search.test.ts +62 -0
  1351. package/src/tui/components/model-picker/model-search.ts +42 -0
  1352. package/src/tui/components/model-picker/model-visibility.test.ts +65 -0
  1353. package/src/tui/components/model-picker/model-visibility.ts +59 -0
  1354. package/src/tui/components/operator-dashboard/conversation.test.ts +431 -0
  1355. package/src/tui/components/operator-dashboard/conversation.ts +179 -0
  1356. package/src/tui/components/operator-dashboard/display-state.test.ts +369 -0
  1357. package/src/tui/components/operator-dashboard/display-state.ts +163 -0
  1358. package/src/tui/components/operator-dashboard/herdr-state.test.ts +162 -0
  1359. package/src/tui/components/operator-dashboard/herdr-state.ts +81 -0
  1360. package/src/tui/components/operator-dashboard/index.tsx +2044 -0
  1361. package/src/tui/components/operator-dashboard/logic.test.ts +753 -0
  1362. package/src/tui/components/operator-dashboard/logic.ts +465 -0
  1363. package/src/tui/components/operator-dashboard/queue.test.ts +147 -0
  1364. package/src/tui/components/operator-dashboard/queue.ts +55 -0
  1365. package/src/tui/components/operator-dashboard/queued-messages.tsx +50 -0
  1366. package/src/tui/components/operator-dashboard/run-events.test.ts +913 -0
  1367. package/src/tui/components/operator-dashboard/run-events.ts +507 -0
  1368. package/src/tui/components/operator-dashboard/run-tracing.test.ts +206 -0
  1369. package/src/tui/components/operator-dashboard/run-tracing.ts +105 -0
  1370. package/src/tui/components/operator-dashboard/subagent-detail-view.tsx +51 -0
  1371. package/src/tui/components/operator-dashboard/subagent-dialog.tsx +142 -0
  1372. package/src/tui/components/operator-dashboard/subagent-hub.test.ts +162 -0
  1373. package/src/tui/components/operator-dashboard/subagent-hub.tsx +266 -0
  1374. package/src/tui/components/operator-dashboard/subagent-state.test.ts +431 -0
  1375. package/src/tui/components/operator-dashboard/subagent-state.ts +404 -0
  1376. package/src/tui/components/operator-dashboard/subagent-status-bar.tsx +80 -0
  1377. package/src/tui/components/operator-dashboard/tool-argument-buffer.test.ts +317 -0
  1378. package/src/tui/components/operator-dashboard/tool-arguments.perf.test.ts +121 -0
  1379. package/src/tui/components/operator-dashboard/welcome-logo.tsx +79 -0
  1380. package/src/tui/components/operator-dashboard/workflow-data.test.ts +291 -0
  1381. package/src/tui/components/operator-dashboard/workflow-data.ts +130 -0
  1382. package/src/tui/components/report-viewer-dialog.tsx +98 -0
  1383. package/src/tui/components/responsible-use-disclosure.tsx +55 -0
  1384. package/src/tui/components/screenshot-modal.tsx +204 -0
  1385. package/src/tui/components/shared/__tests__/prompt-input-lifecycle.tsx +64 -0
  1386. package/src/tui/components/shared/__tests__/tool-renderer-lifecycle.tsx +69 -0
  1387. package/src/tui/components/shared/action-label.test.ts +133 -0
  1388. package/src/tui/components/shared/action-label.ts +18 -0
  1389. package/src/tui/components/shared/ascii-spinner.tsx +40 -0
  1390. package/src/tui/components/shared/dialog-controls.tsx +76 -0
  1391. package/src/tui/components/shared/index.ts +37 -0
  1392. package/src/tui/components/shared/markdown-viewer.tsx +188 -0
  1393. package/src/tui/components/shared/markdown.ts +239 -0
  1394. package/src/tui/components/shared/message-renderer.tsx +178 -0
  1395. package/src/tui/components/shared/message-utils.ts +175 -0
  1396. package/src/tui/components/shared/pentest-workflow-display.tsx +330 -0
  1397. package/src/tui/components/shared/prompt-input-lifecycle.test.ts +22 -0
  1398. package/src/tui/components/shared/prompt-input-logic.test.ts +782 -0
  1399. package/src/tui/components/shared/prompt-input-logic.ts +423 -0
  1400. package/src/tui/components/shared/prompt-input.tsx +782 -0
  1401. package/src/tui/components/shared/result-registry.test.ts +90 -0
  1402. package/src/tui/components/shared/result-registry.ts +900 -0
  1403. package/src/tui/components/shared/syntax-highlight.ts +242 -0
  1404. package/src/tui/components/shared/tool-registry.test.ts +59 -0
  1405. package/src/tui/components/shared/tool-registry.ts +279 -0
  1406. package/src/tui/components/shared/tool-renderer.test.ts +13 -0
  1407. package/src/tui/components/shared/tool-renderer.tsx +223 -0
  1408. package/src/tui/components/shared/type-guards.ts +64 -0
  1409. package/src/tui/components/shared/use-paste-extmarks.ts +109 -0
  1410. package/src/tui/components/switch.tsx +81 -0
  1411. package/src/tui/components/terminal-focus-handler.tsx +34 -0
  1412. package/src/tui/components/toast.tsx +82 -0
  1413. package/src/tui/components/usage-labels.test.ts +191 -0
  1414. package/src/tui/components/usage-labels.ts +78 -0
  1415. package/src/tui/console-theme.ts +59 -0
  1416. package/src/tui/context/agent.tsx +251 -0
  1417. package/src/tui/context/command.tsx +291 -0
  1418. package/src/tui/context/config.tsx +59 -0
  1419. package/src/tui/context/dialog.tsx +206 -0
  1420. package/src/tui/context/dimensions.tsx +31 -0
  1421. package/src/tui/context/focus-ownership.test.ts +26 -0
  1422. package/src/tui/context/focus-ownership.ts +12 -0
  1423. package/src/tui/context/focus.tsx +86 -0
  1424. package/src/tui/context/herdr.tsx +28 -0
  1425. package/src/tui/context/input.tsx +45 -0
  1426. package/src/tui/context/keybinding.tsx +92 -0
  1427. package/src/tui/context/obfuscation.tsx +114 -0
  1428. package/src/tui/context/route.tsx +127 -0
  1429. package/src/tui/context/session-usage.test.ts +295 -0
  1430. package/src/tui/context/session-usage.ts +204 -0
  1431. package/src/tui/context/session.tsx +62 -0
  1432. package/src/tui/context/toast.tsx +66 -0
  1433. package/src/tui/generated-ascii-art.json +1 -0
  1434. package/src/tui/generated-ascii-art.json.d.ts +2 -0
  1435. package/src/tui/herdr-startup.test.ts +157 -0
  1436. package/src/tui/hooks/use-sessions-list.ts +165 -0
  1437. package/src/tui/index.tsx +838 -0
  1438. package/src/tui/keybindings/index.ts +126 -0
  1439. package/src/tui/keybindings/registry.ts +146 -0
  1440. package/src/tui/keybindings-registry.ts +43 -0
  1441. package/src/tui/obfuscation/patch.ts +139 -0
  1442. package/src/tui/terminal-focus.ts +218 -0
  1443. package/src/tui/theme/colors.ts +43 -0
  1444. package/src/tui/theme/context.tsx +137 -0
  1445. package/src/tui/theme/detect-mode.ts +56 -0
  1446. package/src/tui/theme/index.ts +75 -0
  1447. package/src/tui/theme/registry.ts +29 -0
  1448. package/src/tui/theme/themes/apex.ts +190 -0
  1449. package/src/tui/theme/themes/ayu.ts +189 -0
  1450. package/src/tui/theme/themes/catppuccin.ts +189 -0
  1451. package/src/tui/theme/themes/dracula.ts +190 -0
  1452. package/src/tui/theme/themes/everforest.ts +189 -0
  1453. package/src/tui/theme/themes/flexoki.ts +190 -0
  1454. package/src/tui/theme/themes/github.ts +189 -0
  1455. package/src/tui/theme/themes/gruvbox.ts +189 -0
  1456. package/src/tui/theme/themes/index.ts +54 -0
  1457. package/src/tui/theme/themes/kanagawa.ts +189 -0
  1458. package/src/tui/theme/themes/material.ts +190 -0
  1459. package/src/tui/theme/themes/monokai.ts +190 -0
  1460. package/src/tui/theme/themes/nightfox.ts +189 -0
  1461. package/src/tui/theme/themes/nord.ts +190 -0
  1462. package/src/tui/theme/themes/onedark.ts +190 -0
  1463. package/src/tui/theme/themes/rose-pine.ts +189 -0
  1464. package/src/tui/theme/themes/solarized.ts +189 -0
  1465. package/src/tui/theme/themes/tokyonight.ts +189 -0
  1466. package/src/tui/theme/themes/vesper.ts +191 -0
  1467. package/src/tui/theme/types.ts +143 -0
  1468. package/src/tui/utils/command-flags.test.ts +269 -0
  1469. package/src/tui/utils/command-flags.ts +377 -0
  1470. package/src/tui/utils/kitty-graphics.ts +76 -0
  1471. package/src/tui/utils/open-file.ts +37 -0
  1472. package/src/tui/utils/open-report.ts +34 -0
  1473. package/src/tui/utils/open-url.ts +39 -0
  1474. package/src/tui/utils/paste.ts +8 -0
  1475. package/src/tui/utils/scroll.ts +81 -0
  1476. package/src/util/errors.ts +58 -0
  1477. package/src/util/lock.ts +100 -0
  1478. package/src/util/name.ts +148 -0
  1479. package/src/util/url.test.ts +162 -0
  1480. package/src/util/url.ts +107 -0
  1481. package/build/agent-13rrhp8d.js +0 -20
  1482. package/build/agent-zbj2331s.js +0 -30
  1483. package/build/authentication-f4j3w5vs.js +0 -20
  1484. package/build/blackboxAgent-v2vx9ws4.js +0 -20
  1485. package/build/blackboxPentest-w5nwzpvk.js +0 -70
  1486. package/build/cli-5wemv37a.js +0 -194
  1487. package/build/cli-7s062hr6.js +0 -22
  1488. package/build/cli-9qbxkhye.js +0 -55
  1489. package/build/cli-avmhkjtv.js +0 -22961
  1490. package/build/cli-g3czc3jz.js +0 -204
  1491. package/build/cli-ww7hbazg.js +0 -88
  1492. package/build/index-18vyy6mj.js +0 -19
  1493. package/build/index-5wh7gq37.js +0 -12858
  1494. package/build/index-e23zc8g4.js +0 -34
  1495. package/build/index-hnwhswqj.js +0 -213
  1496. package/build/index-wkmnr4nm.js +0 -39
  1497. package/build/index-ywmfnd30.js +0 -12
  1498. package/build/offesecAgent-c97pqzcn.js +0 -27
  1499. package/build/pentest-4p5jt7gj.js +0 -30
  1500. package/build/pentests-v98eg8n3.js +0 -92
  1501. package/build/threatModel-81d4rcbk.js +0 -29
  1502. /package/build/{cli-c8131c4q.js → cli-0wsh8j2t.js} +0 -0
  1503. /package/build/{cli-9pbk8m32.js → cli-ag6jtndp.js} +0 -0
  1504. /package/build/{cli-e08r86zk.js → cli-b3dvxjgk.js} +0 -0
  1505. /package/build/{cli-fw5r7pfj.js → cli-q126f6ef.js} +0 -0
  1506. /package/build/{cli-9fsre5pt.js → cli-qba2x69h.js} +0 -0
  1507. /package/build/{cli-7q3ae3ft.js → cli-z82n3qk1.js} +0 -0
@@ -0,0 +1,2349 @@
1
+ import { AsyncLocalStorage, AsyncResource } from "node:async_hooks";
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ import type { AnthropicMessagesModelId } from "@ai-sdk/anthropic/internal";
4
+ import type { OpenAIResponsesProviderOptions } from "@ai-sdk/openai";
5
+ import type { OpenAIChatModelId } from "@ai-sdk/openai/internal";
6
+ import {
7
+ generateText,
8
+ type LanguageModel,
9
+ type LanguageModelMiddleware,
10
+ type ModelMessage,
11
+ Output,
12
+ type StopCondition,
13
+ type StreamTextOnFinishCallback,
14
+ type StreamTextOnStepFinishCallback,
15
+ type StreamTextResult,
16
+ streamText,
17
+ type TextStreamPart,
18
+ type ToolChoice,
19
+ type ToolSet,
20
+ wrapLanguageModel,
21
+ } from "ai";
22
+ import type { z } from "zod";
23
+ import {
24
+ type CustomProviders,
25
+ parseCustomModelId,
26
+ resolveCustomModel,
27
+ } from "../config/customProviders";
28
+ import { type HoonifyModel, resolveHoonifyModel } from "../hoonify";
29
+ import { createLogger } from "../logger/structured";
30
+ import {
31
+ type AiTelemetryOperation,
32
+ createAiTelemetrySettings,
33
+ createGenerationSpanTracker,
34
+ type GenerationSpanTracker,
35
+ withModelCallDiagnostics,
36
+ } from "../observability";
37
+ import { RunPersistenceError } from "../runtime/persistenceError";
38
+ import type { RunContextRecorder } from "../runtime/runContext";
39
+ import { RunControlInterruption } from "../runtime/runControlStore";
40
+ import { RunLimitError } from "../runtime/runModelStore";
41
+ import { scopedLogger } from "../util/lazyLogger";
42
+ import {
43
+ cacheBreakpointFor,
44
+ withCachedLastMessage,
45
+ withCachedSystemPrompt,
46
+ } from "./caching";
47
+ import {
48
+ beginCompaction,
49
+ type CompactionLink,
50
+ type CompactionTrigger,
51
+ } from "./compactionTelemetry";
52
+ import {
53
+ estimateMessageTokens,
54
+ fitMessagesToContext,
55
+ truncateWithMarker,
56
+ } from "./contextManagement";
57
+ import {
58
+ getInferenceRecorder,
59
+ type InferenceRecorder,
60
+ runWithInferenceRecorder,
61
+ } from "./inference-attempt";
62
+ import {
63
+ getClaudeCapabilities,
64
+ getMaxOutputTokens,
65
+ getModelInfo,
66
+ prefersSequentialToolCalls,
67
+ } from "./models";
68
+ import {
69
+ runWithNativeRolloutOperation,
70
+ withNativeRolloutEvidenceModel,
71
+ } from "./native-rollout-evidence";
72
+ import { CONCENTRATE_GLM_5_3_MODEL_ID } from "./providers/concentrate";
73
+ import { OPENAI_PRO_TIMEOUT_MS } from "./providers/openai-pro-fetch";
74
+ import { STREAM_DEBUG } from "./streamTelemetry";
75
+ import {
76
+ type AIAuthConfig,
77
+ checkIfContextLengthError,
78
+ createSummarizationStream,
79
+ getProviderModel,
80
+ isAnthropicProvider,
81
+ } from "./utils";
82
+
83
+ const log = scopedLogger(() => createLogger("ai"));
84
+
85
+ // Opt-in debug logging for the empty-`{}` / looping response failure; bypasses `silent`.
86
+ const RESPONSE_DEBUG =
87
+ process.env.RESPONSE_DEBUG === "1" || process.env.RESPONSE_DEBUG === "true";
88
+ const RESPONSE_TOOL_NAME = "response";
89
+
90
+ function nativeRolloutOperation(
91
+ operation?: AiTelemetryOperation,
92
+ ): "structured.generate" | "context.summarize" | "tool.repair" {
93
+ if (operation === "apex.context.summarize") return "context.summarize";
94
+ if (operation === "apex.tool.repair") return "tool.repair";
95
+ return "structured.generate";
96
+ }
97
+
98
+ /**
99
+ * Tools whose arguments carry a security-authorization boundary the model must
100
+ * never have re-synthesized by tool-call repair. Repair asks a model to invent
101
+ * schema-valid arguments from a failed call; for these tools a fabricated value
102
+ * (e.g. a default/localhost `target`) would silently bypass deterministic scope
103
+ * enforcement. Repair therefore FAILS CLOSED for them — it returns `null` and
104
+ * the original invalid call is never executed.
105
+ *
106
+ * Result-submission tools (`submit_results`, `document_vulnerability`) are
107
+ * deliberately NOT listed: they carry no authorization boundary, so repair is
108
+ * safe and desirable — it re-prompts the model to fix a mis-shaped field (e.g.
109
+ * `method` sent as an array) instead of dropping a completed recon or a
110
+ * confirmed finding.
111
+ */
112
+ const REPAIR_FAIL_CLOSED_TOOLS: ReadonlySet<string> = new Set([
113
+ "spawn_pentest_agent",
114
+ ]);
115
+
116
+ /**
117
+ * Whether tool-call repair must fail closed (no argument synthesis) for a tool.
118
+ * Exported for regression tests covering the repaired-invalid-call path.
119
+ */
120
+ export function isRepairFailClosedTool(toolName: string): boolean {
121
+ return REPAIR_FAIL_CLOSED_TOOLS.has(toolName);
122
+ }
123
+
124
+ export type AIModel = AnthropicMessagesModelId | OpenAIChatModelId | string; // For gateway and Bedrock model IDs
125
+
126
+ export type OpenAIReasoningEffort =
127
+ | "none"
128
+ | "low"
129
+ | "medium"
130
+ | "high"
131
+ | "xhigh"
132
+ | "max"
133
+ | "ultra";
134
+
135
+ export const DEFAULT_OPENAI_REASONING_EFFORT: OpenAIReasoningEffort = "medium";
136
+
137
+ /**
138
+ * Anthropic adaptive-thinking effort hint. Soft guidance for how much the model
139
+ * reasons (see AWS "adaptive thinking"): `low` minimizes thinking, `max`
140
+ * reasons hardest (`high` is the model default). Only meaningful for models that
141
+ * support adaptive thinking (Claude Opus/Sonnet 4.6+); ignored elsewhere.
142
+ */
143
+ export type ThinkingEffort = "low" | "medium" | "high" | "xhigh" | "max";
144
+
145
+ const OPENAI_REASONING_MODEL_IDS = new Set([
146
+ "gpt-6.1-sol",
147
+ "gpt-6-luna",
148
+ "gpt-6-sol",
149
+ "gpt-6-astra",
150
+ "gpt-5.5-pro",
151
+ "gpt-5.5-pro-2026-04-23",
152
+ "gpt-5.4-nano",
153
+ "gpt-5.4-nano-2026-03-17",
154
+ "gpt-5.4-mini",
155
+ "gpt-5.4-mini-2026-03-17",
156
+ "gpt-5",
157
+ "gpt-5-2025-08-07",
158
+ "gpt-5.1",
159
+ "gpt-5.1-2025-11-13",
160
+ "gpt-5.2",
161
+ "gpt-5.2-2025-12-11",
162
+ "gpt-5.2-pro",
163
+ "gpt-5.2-pro-2025-12-11",
164
+ "gpt-5.4",
165
+ "gpt-5.4-2026-03-05",
166
+ "gpt-5.4-pro",
167
+ "gpt-5.4-pro-2026-03-05",
168
+ "gpt-5.5",
169
+ "gpt-5.5-2026-04-23",
170
+ "gpt-5.6-sol",
171
+ "gpt-5.6-terra",
172
+ "gpt-5.6-luna",
173
+ ]);
174
+
175
+ /** Per-step billing context attached to a usage report, attributing cost to a specific `(sessionId, stepSeq)`. */
176
+ export interface UsageStepContext {
177
+ sessionId?: string;
178
+ stepSeq?: number;
179
+ }
180
+
181
+ /**
182
+ * Context attached to every usage report. The cache counters are always
183
+ * present — zero when the provider supplies none — and are already included
184
+ * in `inputTokens`:
185
+ * `uncachedInputTokens = inputTokens - cacheReadTokens - cacheWriteTokens`.
186
+ */
187
+ export interface UsageCallbackContext extends UsageStepContext {
188
+ cacheReadTokens: number;
189
+ cacheWriteTokens: number;
190
+ }
191
+
192
+ /** Callback for reporting token usage from AI operations. */
193
+ export type UsageCallback = (
194
+ modelId: string,
195
+ inputTokens: number,
196
+ outputTokens: number,
197
+ context: UsageCallbackContext,
198
+ ) => void | Promise<void>;
199
+
200
+ /**
201
+ * Per-run usage recorder threaded through {@link StreamResponseOpts}. When set
202
+ * it replaces the ALS run sink and the ambient {@link onUsage} callback for
203
+ * that call. Async work is awaited before the next model step. Receives the
204
+ * same cache-aware {@link UsageCallbackContext} as the global callback, so
205
+ * the cached/uncached split travels on the usage event itself.
206
+ */
207
+ export type UsageRecorder = (
208
+ model: string,
209
+ inputTokens: number,
210
+ outputTokens: number,
211
+ context?: UsageCallbackContext,
212
+ ) => void | Promise<void>;
213
+
214
+ let _usageCallback: UsageCallback | null = null;
215
+
216
+ /** Ambient default usage sink when no run-context sink is set. */
217
+ export function onUsage(cb: UsageCallback | null): void {
218
+ _usageCallback = cb;
219
+ }
220
+
221
+ /** Normalized per-step usage: input/output plus cache buckets, provider-agnostic. */
222
+ export interface NormalizedStepUsage {
223
+ inputTokens: number;
224
+ outputTokens: number;
225
+ cacheReadTokens: number;
226
+ cacheWriteTokens: number;
227
+ }
228
+
229
+ /**
230
+ * Extract normalized usage from one completed model step. A single function
231
+ * feeds both `onCacheMetrics` and the usage callback so provider metadata is
232
+ * never parsed twice. Anthropic's `providerMetadata.anthropic` wins; the
233
+ * SDK's normalized `usage.inputTokenDetails` is the fallback (Pensar
234
+ * provider). Input stays inclusive of cached tokens.
235
+ */
236
+ export function normalizeStepUsage(step: {
237
+ usage?: {
238
+ inputTokens?: number;
239
+ outputTokens?: number;
240
+ inputTokenDetails?: {
241
+ cacheReadTokens?: number;
242
+ cacheWriteTokens?: number;
243
+ };
244
+ };
245
+ providerMetadata?: unknown;
246
+ }): NormalizedStepUsage {
247
+ const inputTokens = step.usage?.inputTokens ?? 0;
248
+ const outputTokens = step.usage?.outputTokens ?? 0;
249
+
250
+ // Extract Anthropic cache metrics from providerMetadata (direct Anthropic / Bedrock SDK)
251
+ const meta = (
252
+ step.providerMetadata as
253
+ | { anthropic?: Record<string, unknown> }
254
+ | null
255
+ | undefined
256
+ )?.anthropic;
257
+ let cacheRead = (meta?.cacheReadInputTokens as number) ?? 0;
258
+ let cacheWrite = (meta?.cacheCreationInputTokens as number) ?? 0;
259
+
260
+ // Pensar provider doesn't populate providerMetadata.anthropic;
261
+ // fall back to the SDK's normalized usage.inputTokenDetails.
262
+ const details = step.usage?.inputTokenDetails;
263
+ if (cacheRead === 0) {
264
+ cacheRead = details?.cacheReadTokens ?? 0;
265
+ }
266
+ if (cacheWrite === 0) {
267
+ cacheWrite = details?.cacheWriteTokens ?? 0;
268
+ }
269
+
270
+ return {
271
+ inputTokens,
272
+ outputTokens,
273
+ cacheReadTokens: cacheRead,
274
+ cacheWriteTokens: cacheWrite,
275
+ };
276
+ }
277
+
278
+ // Per-run step counter for billing attribution, scoped via AsyncLocalStorage so
279
+ // concurrent runs never race a shared index. Not a strict global sequence —
280
+ // the DB `stepSeq` on `agent_messages` remains authoritative; this only labels
281
+ // live usage reports.
282
+
283
+ interface StepContext {
284
+ sessionId?: string;
285
+ /** Next step index to hand out; mutated in place as steps finish. */
286
+ next: number;
287
+ /** Per-run usage sink; wins over the ambient {@link onUsage} callback. */
288
+ usageSink?: UsageCallback;
289
+ }
290
+
291
+ const stepContextStore = new AsyncLocalStorage<StepContext>();
292
+
293
+ /** Runs `fn` in a per-run step-counting context; `streamResponse` steps inside it report usage tagged with `sessionId` and an increasing `stepSeq` starting at `seedStepSeq`. */
294
+ export function runWithStepContext<T>(
295
+ opts: {
296
+ sessionId?: string;
297
+ seedStepSeq?: number;
298
+ usageSink?: UsageCallback;
299
+ },
300
+ fn: () => T,
301
+ ): T {
302
+ const parent = stepContextStore.getStore();
303
+ return stepContextStore.run(
304
+ {
305
+ sessionId: opts.sessionId,
306
+ next: opts.seedStepSeq ?? 0,
307
+ usageSink: opts.usageSink ?? parent?.usageSink,
308
+ },
309
+ fn,
310
+ );
311
+ }
312
+
313
+ /** Takes and advances the next `stepSeq` for the current run; returns `undefined` outside any run context. */
314
+ export function takeStepContext(): UsageStepContext | undefined {
315
+ const store = stepContextStore.getStore();
316
+ if (!store) return undefined;
317
+ const stepSeq = store.next;
318
+ store.next += 1;
319
+ return { sessionId: store.sessionId, stepSeq };
320
+ }
321
+
322
+ /**
323
+ * Report one finished model call to a usage sink. Advances `stepSeq` whenever
324
+ * a sink is present (including zero-token steps) so the index stays aligned
325
+ * with the AI SDK. Skips the callback itself when both token counts are 0.
326
+ */
327
+ async function emitUsage(
328
+ model: string,
329
+ stepUsage: NormalizedStepUsage,
330
+ sink: UsageRecorder | UsageCallback | null | undefined,
331
+ ): Promise<void> {
332
+ if (!sink) return;
333
+ const stepCtx = takeStepContext();
334
+ if (stepUsage.inputTokens <= 0 && stepUsage.outputTokens <= 0) return;
335
+ await sink(model, stepUsage.inputTokens, stepUsage.outputTokens, {
336
+ ...stepCtx,
337
+ cacheReadTokens: stepUsage.cacheReadTokens,
338
+ cacheWriteTokens: stepUsage.cacheWriteTokens,
339
+ });
340
+ }
341
+
342
+ /** explicit recorder > ALS run sink > ambient {@link onUsage}. */
343
+ function resolveUsageSink(
344
+ explicit?: UsageRecorder,
345
+ ): UsageRecorder | UsageCallback | null {
346
+ return explicit ?? stepContextStore.getStore()?.usageSink ?? _usageCallback;
347
+ }
348
+
349
+ export type AIModelProvider =
350
+ | "custom"
351
+ | "anthropic"
352
+ | "openai"
353
+ | "google"
354
+ | "openrouter"
355
+ | "concentrate"
356
+ | "bedrock"
357
+ | "bedrock-mantle"
358
+ | "pensar"
359
+ | "inception"
360
+ | "hoonify"
361
+ | "local";
362
+
363
+ /** Conservative default when `getModelInfo` doesn't have a `contextLength`. */
364
+ export function getContextWindow(
365
+ modelId: string,
366
+ customProviders?: CustomProviders,
367
+ hoonifyModels?: HoonifyModel[],
368
+ ): number {
369
+ if (modelId.startsWith("hoonify:"))
370
+ return resolveHoonifyModel(modelId, hoonifyModels).contextLength;
371
+ if (parseCustomModelId(modelId))
372
+ return resolveCustomModel(modelId, customProviders).model.contextLength;
373
+ return getModelInfo(modelId).contextLength ?? 200_000;
374
+ }
375
+
376
+ function checkIfRateLimitError(error: unknown): boolean {
377
+ const errObj =
378
+ typeof error === "object" && error !== null
379
+ ? (error as Record<string, unknown>)
380
+ : {};
381
+
382
+ // Check message — works for both Error instances and plain objects
383
+ // (Bedrock streaming errors are plain { message: "..." } records)
384
+ const errorMessage = (
385
+ typeof errObj.message === "string" ? errObj.message : ""
386
+ ).toLowerCase();
387
+ const errorCode = String(
388
+ typeof errObj.code === "string" ? errObj.code : "",
389
+ ).toLowerCase();
390
+ // AWS SDK errors surface the exception type via .name
391
+ const errorName = (
392
+ typeof errObj.name === "string" ? errObj.name : ""
393
+ ).toLowerCase();
394
+ // Bedrock HTTP-level errors include $metadata.httpStatusCode
395
+ const httpStatus =
396
+ typeof errObj.$metadata === "object" && errObj.$metadata !== null
397
+ ? (errObj.$metadata as Record<string, unknown>).httpStatusCode
398
+ : undefined;
399
+ // Stringified fallback for opaque error objects (e.g. Bedrock stream records)
400
+ const errorString =
401
+ errorMessage || errorName ? "" : String(error).toLowerCase();
402
+
403
+ return (
404
+ // Message-based detection
405
+ errorMessage.includes("too many tokens") ||
406
+ errorMessage.includes("rate limit") ||
407
+ errorMessage.includes("request rate") ||
408
+ errorMessage.includes("throttl") ||
409
+ errorMessage.includes("overloaded") ||
410
+ errorMessage.includes("too many requests") ||
411
+ errorMessage.includes("please wait") ||
412
+ errorMessage.includes("service unavailable") ||
413
+ // AWS SDK exception names (ThrottlingException, TooManyRequestsException)
414
+ errorName.includes("throttl") ||
415
+ errorName.includes("toomanyrequests") ||
416
+ errorName.includes("serviceunavailable") ||
417
+ // Error codes
418
+ errorCode === "rate_limit_exceeded" ||
419
+ errorCode === "throttling" ||
420
+ errorCode === "429" ||
421
+ // HTTP status from AWS SDK $metadata
422
+ httpStatus === 429 ||
423
+ httpStatus === 529 ||
424
+ httpStatus === 503 ||
425
+ // Fallback: stringified error for opaque Bedrock stream records
426
+ errorString.includes("throttl") ||
427
+ errorString.includes("too many") ||
428
+ errorString.includes("request rate")
429
+ );
430
+ }
431
+
432
+ // Injected into the system prompt for models that mis-parse parallel tool
433
+ // calls (DeepSeek V3.1 on Bedrock). See prefersSequentialToolCalls.
434
+ const SEQUENTIAL_TOOL_CALL_INSTRUCTION =
435
+ "CRITICAL TOOL-CALLING RULE: Emit EXACTLY ONE tool call per response. " +
436
+ "Never emit more than one tool call in a single turn. After each tool call, " +
437
+ "wait for its result before making the next one. Emitting multiple tool " +
438
+ "calls in one turn corrupts their arguments.";
439
+
440
+ // Returns the system prompt that is actually sent to the provider, accounting
441
+ // for the sequential-tool-call policy appended for models that mis-parse
442
+ // parallel tool calls. Token budgeting (`fitMessagesToContext`) must use this
443
+ // value, not the raw `system`, or it underestimates the system prompt size and
444
+ // overestimates the message budget near the context limit.
445
+ function applySequentialToolCallPolicy(
446
+ system: string | undefined,
447
+ tools: ToolSet | undefined,
448
+ model: AIModel,
449
+ ): string | undefined {
450
+ if (
451
+ tools &&
452
+ Object.keys(tools).length > 0 &&
453
+ prefersSequentialToolCalls(model)
454
+ ) {
455
+ return `${system ? `${system}\n\n` : ""}${SEQUENTIAL_TOOL_CALL_INSTRUCTION}`;
456
+ }
457
+ return system;
458
+ }
459
+
460
+ // The structured-output `response` tool is injected by the caller alongside its
461
+ // own tools, so an allowlist of those tools must not hide it from the model.
462
+ // Composed into `resolveEffectiveTools` at the call site so the executable map
463
+ // keeps `response` even when a caller omits it from `activeTools`.
464
+ export function withResponseToolActive(
465
+ tools: ToolSet | undefined,
466
+ activeTools: string[] | undefined,
467
+ ): string[] | undefined {
468
+ if (
469
+ !tools ||
470
+ !activeTools ||
471
+ activeTools.length === 0 ||
472
+ !(RESPONSE_TOOL_NAME in tools) ||
473
+ activeTools.includes(RESPONSE_TOOL_NAME)
474
+ ) {
475
+ return activeTools;
476
+ }
477
+ return [...activeTools, RESPONSE_TOOL_NAME];
478
+ }
479
+
480
+ /**
481
+ * Resolve the effective toolset from `activeTools` before any context
482
+ * fitting. The AI SDK treats `activeTools` as advertise-only — it still
483
+ * parses, executes, and enumerates every tool in the full map — so the
484
+ * executable map itself must be filtered here for budgeting, provider
485
+ * exposure, execution, and repair to agree. Built with DefineOwnProperty
486
+ * semantics so prototype-shaped names like `__proto__` survive as own keys.
487
+ * Feed it `withResponseToolActive(tools, activeTools)` so the injected
488
+ * structured-output tool survives the filter.
489
+ */
490
+ export function resolveEffectiveTools(
491
+ tools: ToolSet | undefined,
492
+ activeTools: string[] | undefined,
493
+ ): Pick<StreamResponseOpts, "tools" | "activeTools"> {
494
+ if (!tools || !activeTools) return {};
495
+ if (activeTools.length === 0) return { tools: {}, activeTools: undefined };
496
+ const allow = new Set(activeTools);
497
+ return {
498
+ tools: Object.fromEntries(
499
+ Object.entries(tools).filter(([name]) => allow.has(name)),
500
+ ),
501
+ activeTools: undefined,
502
+ };
503
+ }
504
+
505
+ // Kept for callers/tests that filter a tool map without consuming `activeTools`
506
+ // (e.g. `withResponseToolActive` composition). `resolveEffectiveTools` is the
507
+ // stream-loop entry point; this is the same filter returning just the map.
508
+ export function restrictToolsToActive(
509
+ tools: ToolSet | undefined,
510
+ activeTools: string[] | undefined,
511
+ ): ToolSet | undefined {
512
+ if (!tools || !activeTools || activeTools.length === 0) {
513
+ return tools;
514
+ }
515
+ const allow = new Set(activeTools);
516
+ const restricted: ToolSet = {};
517
+ for (const [name, tool] of Object.entries(tools)) {
518
+ if (allow.has(name)) {
519
+ restricted[name] = tool;
520
+ }
521
+ }
522
+ return restricted;
523
+ }
524
+
525
+ const MAX_RATE_LIMIT_RETRIES = 20;
526
+ const MAX_IDLE_RESUME_RETRIES = 3;
527
+ const STREAM_IDLE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
528
+
529
+ // Observe the existing depth allowance only for accepted restarts.
530
+ export async function recordContextRestart(
531
+ depth: number,
532
+ opts?: Pick<StreamResponseOpts, "inferenceRecorder">,
533
+ ): Promise<void> {
534
+ if (depth > MAX_RESTART_DEPTH) return;
535
+ await getInferenceRecorder(opts)?.retry({
536
+ authority: "context-restart",
537
+ count: depth,
538
+ maxRetries: MAX_RESTART_DEPTH,
539
+ delayMs: 0,
540
+ });
541
+ }
542
+
543
+ function getStreamIdleTimeoutMs(model: AIModel): number {
544
+ // Pro cannot stream progress while reasoning; wait for its completed response.
545
+ return /^(?:openai\/)?gpt-5\.5-pro(?:-|$)/.test(model)
546
+ ? OPENAI_PRO_TIMEOUT_MS
547
+ : STREAM_IDLE_TIMEOUT_MS;
548
+ }
549
+
550
+ class StreamIdleTimeoutError extends Error {
551
+ constructor(idleMs: number) {
552
+ super(`Stream idle for ${Math.round(idleMs / 1000)}s — no chunks received`);
553
+ this.name = "StreamIdleTimeoutError";
554
+ }
555
+ }
556
+
557
+ /**
558
+ * Wraps an async iterable with a per-chunk idle timeout. If no chunk arrives
559
+ * within `idleMs`, throws a {@link StreamIdleTimeoutError} so the caller can
560
+ * resume the conversation from accumulated messages.
561
+ *
562
+ * @param isIdleTimerActive Optional predicate evaluated before awaiting each
563
+ * chunk. When it returns `false` the timer is skipped for that chunk and we
564
+ * wait indefinitely. This lets callers suppress the timeout during expected
565
+ * long pauses (e.g. while a tool call is executing) so a slow tool isn't
566
+ * misread as a stalled provider stream.
567
+ */
568
+ async function* withIdleTimeout<T>(
569
+ stream: AsyncIterable<T>,
570
+ idleMs: number,
571
+ isIdleTimerActive?: () => boolean,
572
+ ): AsyncGenerator<T> {
573
+ const iterator = stream[Symbol.asyncIterator]();
574
+ try {
575
+ while (true) {
576
+ const timerActive = isIdleTimerActive?.() ?? true;
577
+ let result: IteratorResult<T>;
578
+ if (timerActive) {
579
+ let timer: ReturnType<typeof setTimeout> | undefined;
580
+ result = await Promise.race([
581
+ iterator.next(),
582
+ new Promise<never>((_, reject) => {
583
+ timer = setTimeout(
584
+ () => reject(new StreamIdleTimeoutError(idleMs)),
585
+ idleMs,
586
+ );
587
+ if (typeof timer === "object" && "unref" in timer) timer.unref();
588
+ }),
589
+ ]);
590
+ clearTimeout(timer);
591
+ } else {
592
+ result = await iterator.next();
593
+ }
594
+
595
+ if (result.done) return;
596
+ yield result.value;
597
+ }
598
+ } finally {
599
+ // Best-effort cleanup — don't block on a stuck iterator. The underlying
600
+ // stream may be wedged (that's why we're here), so a hanging return()
601
+ // would deadlock the consumer.
602
+ iterator.return?.()?.catch?.(() => {});
603
+ }
604
+ }
605
+
606
+ function isStreamIdleTimeoutError(error: unknown): boolean {
607
+ // AI SDK may rewrap the error, so walk `cause`.
608
+ for (let e: unknown = error, depth = 0; e != null && depth < 6; depth++) {
609
+ if (e instanceof StreamIdleTimeoutError) return true;
610
+ e = (e as { cause?: unknown }).cause;
611
+ }
612
+ return false;
613
+ }
614
+
615
+ /**
616
+ * Gates the idle-timeout in {@link withIdleTimeout} so it only fires while
617
+ * we're waiting on the **model**, not while a tool is executing.
618
+ *
619
+ * The provider stream emits nothing between a `tool-call` chunk and the
620
+ * matching `tool-result`. A slow tool (e.g. `run_attack_surface`, which
621
+ * spawns a multi-minute sub-agent) would otherwise be misread as a stalled
622
+ * stream — triggering the auto-resume path and causing the model to re-issue
623
+ * the same tool call, which spawns a duplicate sub-agent.
624
+ *
625
+ * Parallel tool calls are tracked by `toolCallId`. Duplicate `tool-call`
626
+ * chunks for the same id (defensive — should never happen in practice) are
627
+ * deduplicated. Terminal chunks (`tool-result` / `tool-error`) without a
628
+ * matching open call are ignored so the counter can never go negative.
629
+ *
630
+ * EXCEPTION: `response` is never gated — its `execute` returns synchronously so
631
+ * it's not a slow tool, but a Bedrock stream wedging mid-payload while
632
+ * streaming its (often large) args would otherwise suppress the idle timeout
633
+ * forever (confirmed hang). Leaving it ungated keeps idle-timeout auto-resume working.
634
+ */
635
+ const NON_GATED_TOOLS = new Set<string>(["response"]);
636
+
637
+ function createToolExecutionGate(): {
638
+ shouldEnforceIdleTimeout: () => boolean;
639
+ observe: (chunk: {
640
+ type: string;
641
+ toolCallId?: string;
642
+ toolName?: string;
643
+ }) => void;
644
+ } {
645
+ let inFlight = 0;
646
+ const open = new Set<string>();
647
+
648
+ return {
649
+ shouldEnforceIdleTimeout: () => inFlight === 0,
650
+ observe: (chunk) => {
651
+ if (chunk.type === "tool-call") {
652
+ if (chunk.toolName && NON_GATED_TOOLS.has(chunk.toolName)) return;
653
+ const id = chunk.toolCallId;
654
+ if (id) {
655
+ if (!open.has(id)) {
656
+ open.add(id);
657
+ inFlight++;
658
+ }
659
+ } else {
660
+ inFlight++;
661
+ }
662
+ } else if (chunk.type === "tool-result" || chunk.type === "tool-error") {
663
+ // A failed tool is just as terminal for the gate as a successful one —
664
+ // without this, a tool-error leaves its slot open forever, suppressing
665
+ // the idle timeout for the rest of the run.
666
+ const id = chunk.toolCallId;
667
+ if (id) {
668
+ if (open.delete(id)) {
669
+ inFlight = Math.max(0, inFlight - 1);
670
+ }
671
+ } else if (!(chunk.toolName && NON_GATED_TOOLS.has(chunk.toolName))) {
672
+ inFlight = Math.max(0, inFlight - 1);
673
+ }
674
+ }
675
+ },
676
+ };
677
+ }
678
+
679
+ // Helper function to wrap a stream with error handling for async errors
680
+ function wrapStreamWithErrorHandler(
681
+ originalStream: StreamTextResult<ToolSet, never>,
682
+ messagesContainer: { current: ModelMessage[] },
683
+ opts: StreamResponseOpts,
684
+ model: LanguageModel,
685
+ silent?: boolean,
686
+ rateLimitRetryCount: number = 0,
687
+ idleResumeCount: number = 0,
688
+ generationSpans?: GenerationSpanTracker,
689
+ ): StreamTextResult<ToolSet, never> {
690
+ // Create a lazy getter for fullStream that wraps it with error handling
691
+ let wrappedStream: AsyncIterable<TextStreamPart<ToolSet>> | null = null;
692
+
693
+ const handler = {
694
+ get(_target: StreamTextResult<ToolSet, never>, prop: string | symbol) {
695
+ // Intercept access to fullStream
696
+ if (prop === "fullStream") {
697
+ if (!wrappedStream) {
698
+ // Tool-execution gate: keeps the idle timer paused while a tool
699
+ // is in flight (see {@link createToolExecutionGate}). The gate's
700
+ // predicate is read by `withIdleTimeout` at the top of each
701
+ // iteration — which always runs AFTER the previous chunk's body
702
+ // finished mutating the gate, so observations are always visible
703
+ // before the next idle-race begins.
704
+ const toolGate = createToolExecutionGate();
705
+
706
+ wrappedStream = (async function* () {
707
+ let streamError: unknown;
708
+ try {
709
+ for await (const chunk of withIdleTimeout(
710
+ originalStream.fullStream,
711
+ getStreamIdleTimeoutMs(opts.model),
712
+ toolGate.shouldEnforceIdleTimeout,
713
+ )) {
714
+ toolGate.observe(chunk);
715
+
716
+ // [response-debug] Log AI-SDK-level response-tool chunks / finish-step, below the consume() loop.
717
+ if (RESPONSE_DEBUG) {
718
+ const c = chunk as {
719
+ type: string;
720
+ toolName?: string;
721
+ toolCallId?: string;
722
+ finishReason?: string;
723
+ invalid?: boolean;
724
+ };
725
+ if (
726
+ (c.type === "tool-call" ||
727
+ c.type === "tool-error" ||
728
+ c.type === "tool-result") &&
729
+ c.toolName === RESPONSE_TOOL_NAME
730
+ ) {
731
+ log.warn(
732
+ `[response-debug] ai-layer chunk=${c.type} response id=${c.toolCallId} invalid=${c.invalid === true}`,
733
+ );
734
+ } else if (c.type === "finish-step") {
735
+ log.warn(
736
+ `[response-debug] ai-layer finish-step finishReason=${c.finishReason}`,
737
+ );
738
+ }
739
+ }
740
+
741
+ // Only stream-level errors are fatal; tool-level errors
742
+ // flow through so the UI renders them as failed tool results.
743
+ // Instead of throwing mid-stream, capture the error and drain
744
+ // the tail (finish-step/finish): the AI SDK's terminal
745
+ // lifecycle — root-span end included — only runs when the
746
+ // stream completes, and aborting the iteration leaks it.
747
+ if (chunk.type === "error") {
748
+ streamError = (chunk as unknown as { error: unknown }).error;
749
+ // Mark the root generation span failed NOW: the SDK's
750
+ // flush ends it mid-drain, before the loop exits — a
751
+ // later mark is a no-op on an ended span.
752
+ generationSpans?.markFailed(streamError);
753
+ continue;
754
+ }
755
+ // Drain the post-error tail silently: the terminal parts
756
+ // must be consumed for the SDK's finalization, but consumers
757
+ // must not observe step-close-out after a fatal error.
758
+ if (streamError !== undefined) {
759
+ continue;
760
+ }
761
+
762
+ yield chunk;
763
+ }
764
+ if (streamError !== undefined) {
765
+ // The tail is consumed but the SDK's finalization
766
+ // (root-span end) settles with the response promise —
767
+ // await it so the error never overtakes the span lifecycle.
768
+ await Promise.resolve(originalStream.response).catch(() => {});
769
+ throw streamError;
770
+ }
771
+ } catch (caughtError) {
772
+ // A tail-drain failure must not replace the provider error that
773
+ // put the wrapper into drain mode.
774
+ const error =
775
+ streamError !== undefined ? streamError : caughtError;
776
+ // Error-part runs complete normally inside the SDK, so nothing
777
+ // sets the root generation span failed — mark it here (the
778
+ // SDK's own thrown-error marking is guarded against below).
779
+ generationSpans?.markFailed(error);
780
+
781
+ const errorMessage =
782
+ error instanceof Error ? error.message : String(error);
783
+
784
+ // SDK RetryError can wrap a critical failure after a prior provider retry.
785
+ await getInferenceRecorder(opts)?.flush();
786
+
787
+ // Check context length FIRST — these should never be retried
788
+ // as-is; the prompt must be reduced via summarization.
789
+ const isCtxError = checkIfContextLengthError(error);
790
+
791
+ // A latched persistence failure is terminal: retrying would
792
+ // dispatch a turn whose context was never durably committed.
793
+ if (
794
+ error instanceof RunPersistenceError ||
795
+ error instanceof RunLimitError ||
796
+ error instanceof RunControlInterruption
797
+ ) {
798
+ throw error;
799
+ }
800
+
801
+ // Handle stream idle timeout — resume from accumulated messages
802
+ if (
803
+ !isCtxError &&
804
+ isStreamIdleTimeoutError(error) &&
805
+ idleResumeCount < MAX_IDLE_RESUME_RETRIES &&
806
+ messagesContainer.current.length > 0
807
+ ) {
808
+ const nextIdleCount = idleResumeCount + 1;
809
+ await getInferenceRecorder(opts)?.retry({
810
+ authority: "stream-idle",
811
+ count: nextIdleCount,
812
+ maxRetries: MAX_IDLE_RESUME_RETRIES,
813
+ delayMs: 0,
814
+ });
815
+ // Surfaced on silent sub-agents too when stream-debugging.
816
+ if (!silent || STREAM_DEBUG) {
817
+ log.warn(
818
+ `Stream stalled (attempt ${nextIdleCount}/${MAX_IDLE_RESUME_RETRIES}), resuming with ${messagesContainer.current.length} messages: ${errorMessage}`,
819
+ );
820
+ }
821
+
822
+ const retriedStream = streamResponse({
823
+ ...opts,
824
+ messages: messagesContainer.current,
825
+ });
826
+
827
+ const wrappedRetriedStream = wrapStreamWithErrorHandler(
828
+ retriedStream,
829
+ messagesContainer,
830
+ opts,
831
+ model,
832
+ silent,
833
+ rateLimitRetryCount,
834
+ nextIdleCount,
835
+ );
836
+
837
+ for await (const chunk of wrappedRetriedStream.fullStream) {
838
+ yield chunk;
839
+ }
840
+ return;
841
+ }
842
+
843
+ // Handle rate limit errors with exponential backoff retry
844
+ if (
845
+ !isCtxError &&
846
+ checkIfRateLimitError(error) &&
847
+ rateLimitRetryCount < MAX_RATE_LIMIT_RETRIES
848
+ ) {
849
+ const nextRetryCount = rateLimitRetryCount + 1;
850
+ const delayMs = Math.min(1000 * nextRetryCount, 30000);
851
+ const recorder = getInferenceRecorder(opts);
852
+ await recorder?.retry({
853
+ authority: "stream-rate-limit",
854
+ count: nextRetryCount,
855
+ maxRetries: MAX_RATE_LIMIT_RETRIES,
856
+ delayMs,
857
+ });
858
+
859
+ if (!silent) {
860
+ log.warn(
861
+ `Rate limit error (attempt ${nextRetryCount}/${MAX_RATE_LIMIT_RETRIES}), waiting ${delayMs}ms: ${errorMessage}`,
862
+ );
863
+ }
864
+
865
+ if (recorder) {
866
+ await delay(delayMs, undefined, { signal: opts.abortSignal });
867
+ } else {
868
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
869
+ }
870
+
871
+ const retriedStream = streamResponse({
872
+ ...opts,
873
+ messages:
874
+ messagesContainer.current.length > 0
875
+ ? messagesContainer.current
876
+ : undefined,
877
+ });
878
+
879
+ const wrappedRetriedStream = wrapStreamWithErrorHandler(
880
+ retriedStream,
881
+ messagesContainer,
882
+ opts,
883
+ model,
884
+ silent,
885
+ nextRetryCount,
886
+ idleResumeCount,
887
+ );
888
+
889
+ for await (const chunk of wrappedRetriedStream.fullStream) {
890
+ yield chunk;
891
+ }
892
+ return;
893
+ }
894
+
895
+ if (isCtxError) {
896
+ let currentMessages: ModelMessage[] = messagesContainer.current;
897
+ try {
898
+ const response = await originalStream.response;
899
+ if (response.messages && response.messages.length > 0) {
900
+ currentMessages = response.messages as ModelMessage[];
901
+ }
902
+ } catch {
903
+ // Fall back to container messages.
904
+ }
905
+
906
+ const fitted = fitMessagesToContext(currentMessages, {
907
+ contextWindow: getContextWindow(
908
+ opts.model,
909
+ opts.authConfig?.customProviders,
910
+ opts.authConfig?.hoonifyModels,
911
+ ),
912
+ maxOutputTokens: getMaxOutputTokens(
913
+ opts.model,
914
+ opts.authConfig?.customProviders,
915
+ opts.authConfig?.hoonifyModels,
916
+ ),
917
+ system: applySequentialToolCallPolicy(
918
+ opts.system,
919
+ opts.tools,
920
+ opts.model,
921
+ ),
922
+ tools: opts.tools,
923
+ sessionPath: opts.sessionPath,
924
+ telemetry: {
925
+ trigger: "context_overflow",
926
+ model: opts.model,
927
+ sessionId: opts.sessionId,
928
+ restartDepth: opts._restartDepth,
929
+ previous: opts._compaction?.last,
930
+ },
931
+ });
932
+
933
+ if (fitted.compaction && opts._compaction)
934
+ opts._compaction.last = fitted.compaction;
935
+
936
+ messagesContainer.current = fitted.messages;
937
+
938
+ // Track depth across the reactive paths so that a failed
939
+ // Layer 1+2 retry CONTRIBUTES to the Layer 3 budget too.
940
+ // Without this, a failed retry's increment is "lost" on
941
+ // fall-through (Layer 3 reads outer `opts._restartDepth`,
942
+ // not the post-retry value) and recovery can burn close
943
+ // to double the intended provider calls before
944
+ // `MAX_RESTART_DEPTH` finally trips.
945
+ let postReactiveDepth = opts._restartDepth ?? 0;
946
+
947
+ if (fitted.fitsBudget && fitted.modified) {
948
+ if (!silent) {
949
+ log.warn(
950
+ `Context length error — Layer 1+2 reduced to ~${fitted.estimatedInputTokens} tokens, retrying`,
951
+ );
952
+ }
953
+ try {
954
+ // Bump `_restartDepth` so a tokenizer-drift loop where
955
+ // every reactive retry trips the same provider rejection
956
+ // (fitsBudget=true by our estimator, still rejected by
957
+ // the provider) eventually exhausts the depth bound at
958
+ // the top of `streamResponse` instead of looping
959
+ // forever. Without this, only Layer-3 escalation
960
+ // increments depth and a drift-driven loop can burn
961
+ // arbitrarily many failed provider calls.
962
+ await recordContextRestart(postReactiveDepth + 1, opts);
963
+ const retried = streamResponse({
964
+ ...opts,
965
+ messages: fitted.messages,
966
+ _restartDepth: postReactiveDepth + 1,
967
+ });
968
+ const wrappedRetry = wrapStreamWithErrorHandler(
969
+ retried,
970
+ messagesContainer,
971
+ opts,
972
+ model,
973
+ silent,
974
+ rateLimitRetryCount,
975
+ idleResumeCount,
976
+ );
977
+ for await (const chunk of wrappedRetry.fullStream) {
978
+ yield chunk;
979
+ }
980
+ return;
981
+ } catch (retryError) {
982
+ // Always propagate the typed terminal error and
983
+ // cancellations — these MUST escape the cascade
984
+ // immediately. Currently `ContextLengthExhaustedError`
985
+ // propagates only by accident (its message
986
+ // "Context-length recovery exhausted…" uses a hyphen
987
+ // that doesn't match any `checkIfContextLengthError`
988
+ // pattern); the explicit `instanceof` and abort
989
+ // checks are defensive against a future message-text
990
+ // tweak that would otherwise silently swallow
991
+ // recovery exhaustion. Mirrors the Layer 3
992
+ // `summarizeError` catch below for symmetry.
993
+ if (
994
+ retryError instanceof ContextLengthExhaustedError ||
995
+ (retryError instanceof Error &&
996
+ retryError.name === "AbortError") ||
997
+ opts.abortSignal?.aborted ||
998
+ !checkIfContextLengthError(retryError)
999
+ ) {
1000
+ throw retryError;
1001
+ }
1002
+ // Account for the depth slot the failed retry just
1003
+ // consumed so the Layer 3 paths below don't grant a
1004
+ // fresh budget on top of the already-spent cycle.
1005
+ postReactiveDepth += 1;
1006
+ }
1007
+ }
1008
+
1009
+ // Layer 3: full summarization. Wrapped because
1010
+ // `summarizeConversation` itself calls `generateText` and
1011
+ // can throw — fall back to a minimal-context restart.
1012
+ const messagesForSummary = messagesContainer.current;
1013
+ if (!silent) {
1014
+ log.warn(
1015
+ `Context length error — summarizing ${messagesForSummary.length} messages`,
1016
+ );
1017
+ }
1018
+
1019
+ try {
1020
+ const summarizationStream = createSummarizationStream(
1021
+ messagesForSummary,
1022
+ {
1023
+ ...opts,
1024
+ _restartDepth: postReactiveDepth,
1025
+ _compactionTrigger: "context_overflow",
1026
+ },
1027
+ model,
1028
+ );
1029
+ for await (const chunk of summarizationStream.fullStream) {
1030
+ yield chunk;
1031
+ }
1032
+ } catch (summarizeError) {
1033
+ // Only fall through to minimal-restart for context-length
1034
+ // errors. For everything else — auth failures, network
1035
+ // errors, abort signals, the typed terminal
1036
+ // `ContextLengthExhaustedError`, or non-`Error` throws —
1037
+ // propagate immediately. Without this, an aborted call
1038
+ // would spawn a new provider request, and a transient
1039
+ // auth failure would burn an extra cycle that fails
1040
+ // identically.
1041
+ if (
1042
+ summarizeError instanceof ContextLengthExhaustedError ||
1043
+ (summarizeError instanceof Error &&
1044
+ summarizeError.name === "AbortError") ||
1045
+ opts.abortSignal?.aborted ||
1046
+ !checkIfContextLengthError(summarizeError)
1047
+ ) {
1048
+ throw summarizeError;
1049
+ }
1050
+ if (!silent) {
1051
+ const sumMsg =
1052
+ summarizeError instanceof Error
1053
+ ? summarizeError.message
1054
+ : String(summarizeError);
1055
+ log.warn(
1056
+ `Layer 3 summarization failed (${sumMsg}). Falling back to minimal-context restart.`,
1057
+ );
1058
+ }
1059
+ opts.onSummarized?.("");
1060
+ const minimalPrompt =
1061
+ typeof opts.prompt === "string" && opts.prompt.length > 0
1062
+ ? opts.prompt.slice(0, 4_000)
1063
+ : MINIMAL_RESTART_PROMPT;
1064
+ const reset = beginCompaction("reset", {
1065
+ trigger: "summary_overflow",
1066
+ model: opts.model,
1067
+ sessionId: opts.sessionId,
1068
+ restartDepth: postReactiveDepth,
1069
+ previous: opts._compaction?.last,
1070
+ });
1071
+ reset?.capture("before", () => ({
1072
+ messages: messagesForSummary,
1073
+ system: opts.system,
1074
+ prompt: opts.prompt,
1075
+ }));
1076
+ reset?.measure(
1077
+ "before",
1078
+ () => estimateMessageTokens(messagesForSummary),
1079
+ messagesForSummary.length,
1080
+ );
1081
+ reset?.measure(
1082
+ "after",
1083
+ () =>
1084
+ estimateMessageTokens([
1085
+ { role: "user", content: minimalPrompt },
1086
+ ]),
1087
+ 1,
1088
+ );
1089
+ reset?.capture("after", () => ({
1090
+ messages: [{ role: "user", content: minimalPrompt }],
1091
+ system: opts.system,
1092
+ }));
1093
+ reset?.finish("completed");
1094
+ if (reset && opts._compaction)
1095
+ opts._compaction.last = reset.link;
1096
+ await recordContextRestart(postReactiveDepth + 1, opts);
1097
+ const fallback = streamResponse({
1098
+ ...opts,
1099
+ prompt: minimalPrompt,
1100
+ messages: undefined,
1101
+ _restartDepth: postReactiveDepth + 1,
1102
+ });
1103
+ for await (const chunk of fallback.fullStream) {
1104
+ yield chunk;
1105
+ }
1106
+ }
1107
+ } else {
1108
+ if (!silent) {
1109
+ log.error("Non-recoverable stream error, re-throwing", {
1110
+ error: errorMessage,
1111
+ });
1112
+ }
1113
+ throw error;
1114
+ }
1115
+ }
1116
+ })();
1117
+ }
1118
+ return wrappedStream;
1119
+ }
1120
+
1121
+ // For all other properties, return the original
1122
+ return (originalStream as unknown as Record<string | symbol, unknown>)[
1123
+ prop
1124
+ ];
1125
+ },
1126
+ };
1127
+
1128
+ return new Proxy(originalStream, handler);
1129
+ }
1130
+
1131
+ // Available models with names
1132
+ export interface ModelInfo {
1133
+ id: AIModel;
1134
+ name: string;
1135
+ provider: AIModelProvider;
1136
+ contextLength?: number;
1137
+ }
1138
+
1139
+ export function modelRequiresThinking(modelId: string): boolean {
1140
+ return getClaudeCapabilities(modelId)?.alwaysOnThinking ?? false;
1141
+ }
1142
+
1143
+ /**
1144
+ * Check whether a model supports extended thinking based on its ID.
1145
+ *
1146
+ * Thinking is available on Claude 3.7 Sonnet and all Claude 4.x+ models
1147
+ * (Sonnet, Opus, Haiku 4.5). Works for Anthropic direct, Bedrock, and
1148
+ * Pensar provider IDs.
1149
+ */
1150
+ export function modelSupportsThinking(modelId: string): boolean {
1151
+ if (getClaudeCapabilities(modelId)) return true;
1152
+ // Normalize: strip provider prefixes so we match the base Claude model ID
1153
+ const normalized = modelId
1154
+ .replace(/^pensar:/, "")
1155
+ .replace(/^(us\.|eu\.|global\.|ap\.)?anthropic\./, "");
1156
+
1157
+ return (
1158
+ /^claude-3-7-sonnet/.test(normalized) ||
1159
+ /^claude-sonnet-4/.test(normalized) ||
1160
+ /^claude-opus-4/.test(normalized) ||
1161
+ /^claude-haiku-4-5/.test(normalized)
1162
+ );
1163
+ }
1164
+
1165
+ /**
1166
+ * Whether a model accepts the `adaptive` thinking type — Claude Opus 4.6+ and
1167
+ * Sonnet 4.6+. Pre-4.6 models (Opus 4.0–4.5, Sonnet 4.5, Haiku 4.5) support
1168
+ * extended thinking but reject `adaptive`, so we don't request thinking for
1169
+ * them at all.
1170
+ */
1171
+ export function modelSupportsAdaptiveThinking(modelId: string): boolean {
1172
+ if (getClaudeCapabilities(modelId)) return true;
1173
+ const normalized = modelId
1174
+ .replace(/^pensar:/, "")
1175
+ .replace(/^(us\.|eu\.|global\.|ap\.)?anthropic\./, "");
1176
+
1177
+ return (
1178
+ /^claude-sonnet-4-[6-9]/.test(normalized) ||
1179
+ /^claude-opus-4-[6-9]/.test(normalized)
1180
+ );
1181
+ }
1182
+
1183
+ export function modelSupportsOpenAIReasoning(modelId: string): boolean {
1184
+ if (modelId === CONCENTRATE_GLM_5_3_MODEL_ID) return true;
1185
+ const { provider } = getModelInfo(modelId);
1186
+ if (!["openai", "openrouter", "concentrate"].includes(provider)) return false;
1187
+ modelId = modelId.replace(/^(openai\/|concentrate:)/, "");
1188
+ return (
1189
+ OPENAI_REASONING_MODEL_IDS.has(modelId) || /^o[134](?:\b|-)/.test(modelId)
1190
+ );
1191
+ }
1192
+
1193
+ export function modelRequiresReasoning(modelId: string): boolean {
1194
+ return modelId === CONCENTRATE_GLM_5_3_MODEL_ID;
1195
+ }
1196
+
1197
+ export function getOpenAIReasoningEfforts(
1198
+ modelId: string,
1199
+ ): OpenAIReasoningEffort[] {
1200
+ if (!modelSupportsOpenAIReasoning(modelId)) return [];
1201
+ if (modelId === CONCENTRATE_GLM_5_3_MODEL_ID) {
1202
+ return ["low", "high", "max"];
1203
+ }
1204
+ if (/^concentrate:gpt-5\.4-(?:mini|nano)$/.test(modelId)) {
1205
+ return ["none", "low", "medium", "high"];
1206
+ }
1207
+ modelId = modelId.replace(/^(openai\/|concentrate:)/, "");
1208
+ if (modelId === "gpt-6-sol" || modelId === "gpt-6-luna") {
1209
+ return ["none", "low", "medium", "high", "xhigh", "max"];
1210
+ }
1211
+ if (/^gpt-6[.-]/.test(modelId)) {
1212
+ return ["low", "medium", "high", "xhigh", "max"];
1213
+ }
1214
+ if (/^gpt-5\.5-pro(?:-|$)/.test(modelId)) {
1215
+ return ["medium", "high", "xhigh"];
1216
+ }
1217
+ if (/^gpt-5\.4-(?:mini|nano)(?:-|$)/.test(modelId)) {
1218
+ return ["none", "low", "medium", "high", "xhigh"];
1219
+ }
1220
+ if (/^gpt-5\.6(?:\b|-)/.test(modelId)) {
1221
+ return ["low", "medium", "high", "xhigh", "max", "ultra"];
1222
+ }
1223
+ if (/^gpt-5\.5(?:\b|-)/.test(modelId)) {
1224
+ return ["none", "low", "medium", "high", "xhigh"];
1225
+ }
1226
+ return ["low", "medium", "high"];
1227
+ }
1228
+
1229
+ export function normalizeOpenAIReasoningEffort(
1230
+ modelId: string,
1231
+ effort?: OpenAIReasoningEffort | null,
1232
+ ): OpenAIReasoningEffort | undefined {
1233
+ if (modelId === CONCENTRATE_GLM_5_3_MODEL_ID) {
1234
+ switch (effort) {
1235
+ case "none":
1236
+ case "low":
1237
+ return "low";
1238
+ case "medium":
1239
+ case "high":
1240
+ return "high";
1241
+ case "xhigh":
1242
+ case "max":
1243
+ case "ultra":
1244
+ return "max";
1245
+ default:
1246
+ return "high";
1247
+ }
1248
+ }
1249
+ const efforts = getOpenAIReasoningEfforts(modelId);
1250
+ if (efforts.length === 0) return undefined;
1251
+ if (effort && efforts.includes(effort)) {
1252
+ // ponytail: OpenAI has no distinct ultra level; keep the UI choice as a max alias.
1253
+ return effort === "ultra" ? "max" : effort;
1254
+ }
1255
+ return DEFAULT_OPENAI_REASONING_EFFORT;
1256
+ }
1257
+
1258
+ /**
1259
+ * Provider-specific options passed to `streamText` to request reasoning /
1260
+ * extended thinking. Each provider reads only its own namespace:
1261
+ * - `anthropic.thinking` — direct Anthropic provider AND the Pensar gateway
1262
+ * (the gateway formatter maps it to the Bedrock `thinking` field).
1263
+ * - `bedrock.reasoningConfig` — the AWS Bedrock provider; it ignores the
1264
+ * `anthropic` namespace entirely, so Anthropic-on-Bedrock thinking is only
1265
+ * requested when this key is present. `display: 'summarized'` makes the
1266
+ * model actually return reasoning text (adaptive can otherwise omit it).
1267
+ * - `openai.reasoningEffort` — OpenAI/o-series reasoning models.
1268
+ */
1269
+ export type ReasoningProviderOptions = {
1270
+ openrouter?: {
1271
+ reasoning: { effort: OpenAIReasoningEffort; enabled?: boolean };
1272
+ };
1273
+ anthropic?: {
1274
+ thinking:
1275
+ | { type: "adaptive"; display?: "summarized" }
1276
+ | { type: "disabled" };
1277
+ // Soft effort hint for adaptive thinking; omitted when no level requested
1278
+ // (model defaults to "high"). Sibling of `thinking` per the AI SDK.
1279
+ effort?: ThinkingEffort;
1280
+ };
1281
+ bedrock?: {
1282
+ reasoningConfig: {
1283
+ type: "adaptive";
1284
+ display: "summarized";
1285
+ // Bedrock's channel for the adaptive effort hint (maps to Claude's
1286
+ // output_config.effort). Omitted when no level requested.
1287
+ maxReasoningEffort?: ThinkingEffort;
1288
+ };
1289
+ };
1290
+ openai?: OpenAIResponsesProviderOptions;
1291
+ };
1292
+
1293
+ export type OpenRouterProviderOptions = {
1294
+ openrouter?: {
1295
+ provider:
1296
+ | {
1297
+ only: ["z-ai"];
1298
+ allow_fallbacks: false;
1299
+ }
1300
+ | {
1301
+ order: ["z-ai"];
1302
+ allow_fallbacks: true;
1303
+ require_parameters: true;
1304
+ };
1305
+ };
1306
+ };
1307
+
1308
+ function isZaiPinnedModel(model: AIModel): boolean {
1309
+ return model === "z-ai/glm-5.2" || model === "z-ai/glm-5.3";
1310
+ }
1311
+
1312
+ export function buildOpenRouterProviderOptions(
1313
+ model: AIModel,
1314
+ ): OpenRouterProviderOptions | undefined {
1315
+ if (!isZaiPinnedModel(model)) return undefined;
1316
+ return {
1317
+ openrouter: {
1318
+ provider: {
1319
+ only: ["z-ai"],
1320
+ allow_fallbacks: false,
1321
+ },
1322
+ },
1323
+ };
1324
+ }
1325
+
1326
+ /**
1327
+ * Z.AI's endpoint is the only `z-ai/*` provider that does not advertise
1328
+ * `structured_outputs`, so under the hard pin above `response_format` is a soft
1329
+ * preference and nothing enforces the schema. Prefer Z.AI, but require an
1330
+ * endpoint that enforces it rather than silently returning unparseable output.
1331
+ */
1332
+ export function buildOpenRouterStructuredProviderOptions(
1333
+ model: AIModel,
1334
+ ): OpenRouterProviderOptions | undefined {
1335
+ if (!isZaiPinnedModel(model)) return undefined;
1336
+ return {
1337
+ openrouter: {
1338
+ provider: {
1339
+ order: ["z-ai"],
1340
+ allow_fallbacks: true,
1341
+ require_parameters: true,
1342
+ },
1343
+ },
1344
+ };
1345
+ }
1346
+
1347
+ /**
1348
+ * Build the `providerOptions` for a request based on the model and reasoning
1349
+ * settings. Returns `undefined` when no reasoning/thinking is requested.
1350
+ *
1351
+ * When thinking is enabled for an Anthropic-family model we set BOTH the
1352
+ * `anthropic` and `bedrock` keys: the resolved provider (direct Anthropic,
1353
+ * Pensar gateway, or Bedrock) reads only its own namespace and ignores the
1354
+ * other, so this is safe across all three and avoids brittle provider
1355
+ * branching here.
1356
+ */
1357
+ export function buildReasoningProviderOptions(
1358
+ model: AIModel,
1359
+ opts: {
1360
+ enableThinking?: boolean;
1361
+ /**
1362
+ * Adaptive-thinking effort hint for Anthropic models that support it
1363
+ * (Opus/Sonnet 4.6+). Ignored on models without adaptive support. When
1364
+ * omitted the model uses its own default (`high`).
1365
+ */
1366
+ thinkingEffort?: ThinkingEffort | null;
1367
+ openAIReasoningEffort?: OpenAIReasoningEffort | null;
1368
+ },
1369
+ ): ReasoningProviderOptions | undefined {
1370
+ const claude = getClaudeCapabilities(model);
1371
+ if (claude) {
1372
+ const provider = getModelInfo(model).provider;
1373
+ const thinking = !!opts.enableThinking || claude.alwaysOnThinking;
1374
+ if (provider === "openrouter") {
1375
+ return {
1376
+ openrouter: {
1377
+ reasoning: {
1378
+ effort: thinking ? (opts.thinkingEffort ?? "high") : "none",
1379
+ enabled: thinking,
1380
+ },
1381
+ },
1382
+ };
1383
+ }
1384
+ if (provider === "concentrate") {
1385
+ return {
1386
+ openai: {
1387
+ forceReasoning: true,
1388
+ reasoningEffort: thinking ? (opts.thinkingEffort ?? "high") : "none",
1389
+ reasoningSummary: "auto",
1390
+ },
1391
+ };
1392
+ }
1393
+ return {
1394
+ anthropic: {
1395
+ thinking:
1396
+ opts.enableThinking || claude.alwaysOnThinking
1397
+ ? { type: "adaptive", display: "summarized" }
1398
+ : { type: "disabled" },
1399
+ ...(opts.thinkingEffort ? { effort: opts.thinkingEffort } : {}),
1400
+ },
1401
+ };
1402
+ }
1403
+ const useThinking =
1404
+ !!opts.enableThinking &&
1405
+ isAnthropicProvider(model) &&
1406
+ modelSupportsAdaptiveThinking(model);
1407
+ const normalizedOpenAIEffort = normalizeOpenAIReasoningEffort(
1408
+ model,
1409
+ opts.openAIReasoningEffort,
1410
+ );
1411
+ // The effort hint only rides along when adaptive thinking is actually used.
1412
+ const effort = useThinking ? (opts.thinkingEffort ?? undefined) : undefined;
1413
+
1414
+ if (!useThinking && !normalizedOpenAIEffort) return undefined;
1415
+
1416
+ if (getModelInfo(model).provider === "openrouter" && normalizedOpenAIEffort) {
1417
+ return { openrouter: { reasoning: { effort: normalizedOpenAIEffort } } };
1418
+ }
1419
+
1420
+ return {
1421
+ ...(useThinking
1422
+ ? {
1423
+ anthropic: {
1424
+ thinking: { type: "adaptive" as const },
1425
+ ...(effort ? { effort } : {}),
1426
+ },
1427
+ bedrock: {
1428
+ reasoningConfig: {
1429
+ type: "adaptive" as const,
1430
+ display: "summarized" as const,
1431
+ ...(effort ? { maxReasoningEffort: effort } : {}),
1432
+ },
1433
+ },
1434
+ }
1435
+ : {}),
1436
+ ...(normalizedOpenAIEffort
1437
+ ? { openai: { reasoningEffort: normalizedOpenAIEffort } }
1438
+ : {}),
1439
+ };
1440
+ }
1441
+
1442
+ /** Cache token metrics extracted from Anthropic providerMetadata */
1443
+ export interface CacheMetrics {
1444
+ cacheReadInputTokens: number;
1445
+ cacheCreationInputTokens: number;
1446
+ }
1447
+
1448
+ export interface StreamResponseOpts {
1449
+ prompt: string;
1450
+ system?: string;
1451
+ model: AIModel;
1452
+ messages?: Array<ModelMessage>;
1453
+ stopWhen?:
1454
+ | StopCondition<NoInfer<ToolSet>>
1455
+ | StopCondition<NoInfer<ToolSet>>[];
1456
+ toolChoice?: ToolChoice<ToolSet>;
1457
+ tools?: ToolSet;
1458
+ onStepFinish?: StreamTextOnStepFinishCallback<ToolSet>;
1459
+ /** Provider middleware applied only to this stream's model calls. */
1460
+ languageModelMiddleware?: LanguageModelMiddleware | LanguageModelMiddleware[];
1461
+ /** Explicit undefined clears an inherited recorder for an unrecorded child. */
1462
+ inferenceRecorder?: InferenceRecorder;
1463
+ /** Per-run usage recorder; when set it replaces the global usage callback for this stream. */
1464
+ usageRecorder?: UsageRecorder;
1465
+ abortSignal?: AbortSignal;
1466
+ activeTools?: string[];
1467
+ silent?: boolean;
1468
+ authConfig?: AIAuthConfig;
1469
+ onFinish?: StreamTextOnFinishCallback<ToolSet>;
1470
+ /**
1471
+ * Called when the context window overflows and the conversation is
1472
+ * summarized. Callers should use this to discard stale message history
1473
+ * so that subsequent persistence writes only include the summary +
1474
+ * new messages (not the full pre-summarization history).
1475
+ */
1476
+ onSummarized?: (summary: string) => void;
1477
+ /**
1478
+ * Deprecated host shim: fires only when a cache counter is `> 0`.
1479
+ * Apex internals read cache from {@link normalizeStepUsage} on the step.
1480
+ */
1481
+ onCacheMetrics?: (metrics: CacheMetrics) => void;
1482
+ /** Enable extended thinking for supported models (Anthropic Claude 3.7+) */
1483
+ enableThinking?: boolean;
1484
+ /**
1485
+ * Adaptive-thinking effort hint for Anthropic models that support it
1486
+ * (Opus/Sonnet 4.6+). Ignored where unsupported; model defaults to `high`.
1487
+ */
1488
+ thinkingEffort?: ThinkingEffort | null;
1489
+ /** OpenAI reasoning effort for GPT/o-series reasoning models. */
1490
+ openAIReasoningEffort?: OpenAIReasoningEffort | null;
1491
+ /** Session root path — used by context management layers to persist truncated tool results */
1492
+ sessionPath?: string;
1493
+ /** Session id (`ses_…`) of the agent making this call; stamped onto AI-span telemetry so traces are filterable by session. */
1494
+ sessionId?: string;
1495
+ /**
1496
+ * Opt-in durable context authority for recorded runs. Turn-0 base and each
1497
+ * step's cumulative context are checkpointed before selection/dispatch;
1498
+ * unset → legacy behavior, no persistence.
1499
+ */
1500
+ contextRecorder?: RunContextRecorder;
1501
+ /**
1502
+ * Internal: recovery-recursion depth. Bumped at each summarize → resume
1503
+ * boundary; throws `ContextLengthExhaustedError` past `MAX_RESTART_DEPTH`.
1504
+ */
1505
+ _restartDepth?: number;
1506
+ /** Shared only by continuations of this stream, never across agents. */
1507
+ _compaction?: { last?: CompactionLink };
1508
+ _compactionTrigger?: CompactionTrigger;
1509
+ }
1510
+
1511
+ const NATIVE_STREAM_RECOVERY = Symbol("native-stream-recovery");
1512
+
1513
+ interface NativeStreamRecovery {
1514
+ model: LanguageModel;
1515
+ run<T>(fn: () => T): T;
1516
+ }
1517
+
1518
+ type InternalStreamResponseOpts = StreamResponseOpts & {
1519
+ [NATIVE_STREAM_RECOVERY]?: NativeStreamRecovery;
1520
+ };
1521
+
1522
+ export function streamResponse(
1523
+ opts: StreamResponseOpts,
1524
+ ): StreamTextResult<ToolSet, never> {
1525
+ opts = { ...opts, inferenceRecorder: getInferenceRecorder(opts) };
1526
+ return runWithInferenceRecorder(opts.inferenceRecorder, () => {
1527
+ const recovery = (opts as InternalStreamResponseOpts)[
1528
+ NATIVE_STREAM_RECOVERY
1529
+ ];
1530
+ if (recovery) {
1531
+ return recovery.run(() => streamResponseWithinOperation(opts, recovery));
1532
+ }
1533
+ return streamResponseWithinOperation(opts);
1534
+ });
1535
+ }
1536
+
1537
+ function streamResponseWithinOperation(
1538
+ opts: StreamResponseOpts,
1539
+ nativeRecovery?: NativeStreamRecovery,
1540
+ ): StreamTextResult<ToolSet, never> {
1541
+ const compactionState = opts._compaction ?? {};
1542
+ // One effective tool selection per stream, before any fitting: proactive
1543
+ // fit, provider schemas, execution, repair, and every continuation path
1544
+ // below spread this same opts object, so they must all see the filtered
1545
+ // map. Re-entry is identity (`activeTools` already consumed).
1546
+ opts = {
1547
+ ...opts,
1548
+ _compaction: compactionState,
1549
+ // `activeTools` is authoritative for advertisement and execution: a tool
1550
+ // (including `response`) is exposed only when the caller lists it, so the
1551
+ // structured-output tool is included when listed and inert when omitted.
1552
+ ...resolveEffectiveTools(opts.tools, opts.activeTools),
1553
+ };
1554
+ // Bound recovery recursion (summarize → resume → overflow → …).
1555
+ const restartDepth = opts._restartDepth ?? 0;
1556
+ if (restartDepth > MAX_RESTART_DEPTH) {
1557
+ throw new ContextLengthExhaustedError(
1558
+ `Context-length recovery exhausted after ${restartDepth} restart cycles`,
1559
+ restartDepth,
1560
+ );
1561
+ }
1562
+
1563
+ const {
1564
+ prompt,
1565
+ system,
1566
+ model,
1567
+ messages,
1568
+ stopWhen,
1569
+ toolChoice,
1570
+ tools,
1571
+ onStepFinish: userOnStepFinish,
1572
+ languageModelMiddleware,
1573
+ usageRecorder,
1574
+ abortSignal,
1575
+ activeTools,
1576
+ silent,
1577
+ authConfig,
1578
+ onFinish,
1579
+ onCacheMetrics,
1580
+ enableThinking,
1581
+ thinkingEffort,
1582
+ openAIReasoningEffort,
1583
+ sessionId,
1584
+ contextRecorder,
1585
+ } = opts;
1586
+
1587
+ // Recorded-run base, captured once at the first prepareStep of this
1588
+ // streamText call; only used to reconstruct cumulative prefixes in
1589
+ // onStepFinish (response.messages excludes the input base).
1590
+ let recorderBase: ModelMessage[] | undefined;
1591
+
1592
+ // Wrap onStepFinish to fire cache metrics and the usage callback for every
1593
+ // step. Must be async so that callers returning a Promise (persistence,
1594
+ // issue queuing, or the usage callback itself) are fully awaited before
1595
+ // the AI SDK starts the next step. One normalization feeds both sinks —
1596
+ // provider metadata is never parsed twice.
1597
+ const onStepFinish: typeof userOnStepFinish = async (step) => {
1598
+ const stepUsage = normalizeStepUsage(step);
1599
+ // Canonical commit precedes every downstream use; the recorder latches
1600
+ // rejections (SDK notify() swallows them) until the next turn gate or
1601
+ // agent-side flush turns the latch into a stream failure.
1602
+ // Synthetic summarization/tool-repair events re-report context that
1603
+ // already includes the base (messagesContainer.current) — committing
1604
+ // them would duplicate the prefix.
1605
+ if (
1606
+ contextRecorder &&
1607
+ step.response.id !== "summarization" &&
1608
+ step.response.id !== "tool-repair"
1609
+ ) {
1610
+ if (!recorderBase) {
1611
+ throw new Error("context recorder active without a committed base");
1612
+ }
1613
+ await contextRecorder.checkpoint({
1614
+ messages: [...recorderBase, ...step.response.messages],
1615
+ system: effectiveSystem ?? null,
1616
+ });
1617
+ }
1618
+ if (
1619
+ onCacheMetrics &&
1620
+ (stepUsage.cacheReadTokens > 0 || stepUsage.cacheWriteTokens > 0)
1621
+ ) {
1622
+ await onCacheMetrics({
1623
+ cacheReadInputTokens: stepUsage.cacheReadTokens,
1624
+ cacheCreationInputTokens: stepUsage.cacheWriteTokens,
1625
+ });
1626
+ }
1627
+ await userOnStepFinish?.(step);
1628
+ await emitUsage(model, stepUsage, resolveUsageSink(usageRecorder));
1629
+ };
1630
+ const providerModel =
1631
+ nativeRecovery?.model ??
1632
+ (() => {
1633
+ const baseProviderModel = withNativeRolloutEvidenceModel(
1634
+ withModelCallDiagnostics(getProviderModel(model, authConfig)),
1635
+ {
1636
+ requestedModelId: model,
1637
+ operationKind: "agent.stream",
1638
+ sessionId,
1639
+ },
1640
+ );
1641
+ return languageModelMiddleware
1642
+ ? wrapLanguageModel({
1643
+ model: baseProviderModel,
1644
+ middleware: languageModelMiddleware,
1645
+ })
1646
+ : baseProviderModel;
1647
+ })();
1648
+ // Undefined when the model has no cache breakpoint we can express (non-Claude
1649
+ // Bedrock models, OpenAI/Google/OpenRouter) — those run uncached.
1650
+ const cacheBreakpoint = cacheBreakpointFor(model);
1651
+
1652
+ // Models that mis-parse multiple tool calls per turn (DeepSeek V3.1 on
1653
+ // Bedrock) are constrained to one tool call per turn via system prompt —
1654
+ // single calls parse correctly, parallel calls drop/empty arguments. Only
1655
+ // applied when tools are actually bound. See prefersSequentialToolCalls.
1656
+ // Computed before context fitting so token budgeting accounts for the
1657
+ // appended instruction that is actually sent to the provider.
1658
+ const systemWithToolPolicy = applySequentialToolCallPolicy(
1659
+ system,
1660
+ tools,
1661
+ model,
1662
+ );
1663
+
1664
+ // Proactive context fit: compact before the call. Reactive recovery
1665
+ // below is a safety net for tokenizer drift the estimate doesn't catch.
1666
+ let fittedMessages = messages;
1667
+ let proactiveFitFailed = false;
1668
+ if (messages && messages.length > 0) {
1669
+ const fitted = fitMessagesToContext(messages, {
1670
+ contextWindow: getContextWindow(
1671
+ model,
1672
+ authConfig?.customProviders,
1673
+ authConfig?.hoonifyModels,
1674
+ ),
1675
+ maxOutputTokens: getMaxOutputTokens(
1676
+ model,
1677
+ authConfig?.customProviders,
1678
+ authConfig?.hoonifyModels,
1679
+ ),
1680
+ system: systemWithToolPolicy,
1681
+ tools,
1682
+ sessionPath: opts.sessionPath,
1683
+ telemetry: {
1684
+ trigger: "proactive",
1685
+ model,
1686
+ sessionId,
1687
+ restartDepth,
1688
+ previous: opts._compaction?.last,
1689
+ },
1690
+ });
1691
+ if (fitted.compaction) compactionState.last = fitted.compaction;
1692
+ fittedMessages = fitted.messages;
1693
+ proactiveFitFailed = !fitted.fitsBudget;
1694
+ if (fitted.modified && !silent) {
1695
+ log.warn(
1696
+ `Proactive context fit: compacted messages to ~${fitted.estimatedInputTokens} tokens (fits=${fitted.fitsBudget})`,
1697
+ );
1698
+ }
1699
+ }
1700
+
1701
+ // Container reference is stable; value gets reassigned by `prepareStep`
1702
+ // and the recovery paths so nested retries read the latest compacted view.
1703
+ const messagesContainer = { current: fittedMessages || [] };
1704
+
1705
+ // Layer 1+2 alone can't fit — escalate before sending a doomed request.
1706
+ // Wrap with the same error handler the streamText path uses, otherwise
1707
+ // an overflow inside the summarization call itself escapes uncaught while
1708
+ // the equivalent post-streamText path (line ~880) recovers.
1709
+ if (proactiveFitFailed && fittedMessages) {
1710
+ if (!silent) {
1711
+ log.warn(
1712
+ `Proactive context fit returned fitsBudget=false on ${fittedMessages.length} messages — escalating to summarization before send`,
1713
+ );
1714
+ }
1715
+ // Pass `opts` through unchanged. The slot for this escalation is
1716
+ // consumed by `summarizeConversation`'s internal `_restartDepth + 1`
1717
+ // bump on the resumed `streamResponse` call — pre-bumping here would
1718
+ // double-count vs the reactive Layer 3 path (which also passes
1719
+ // `opts._restartDepth` to `createSummarizationStream` after a
1720
+ // no-retry fall-through). With the post-bump, all three escalation
1721
+ // entry points (proactive, outer-catch, reactive Layer 3) consume
1722
+ // exactly one depth slot per summarization attempt — symmetric.
1723
+ return wrapStreamWithErrorHandler(
1724
+ createSummarizationStream(
1725
+ fittedMessages,
1726
+ { ...opts, _compactionTrigger: "proactive" },
1727
+ providerModel,
1728
+ ),
1729
+ messagesContainer,
1730
+ opts,
1731
+ providerModel,
1732
+ silent,
1733
+ );
1734
+ }
1735
+
1736
+ // For cacheable models, move the system prompt into messages behind a cache
1737
+ // breakpoint. This caches tools + system prompt across multi-turn
1738
+ // conversations (~90% cost reduction on cache hits).
1739
+ let effectiveSystem: string | undefined = systemWithToolPolicy;
1740
+ let effectiveMessages: ModelMessage[] | undefined = fittedMessages;
1741
+
1742
+ if (cacheBreakpoint && systemWithToolPolicy) {
1743
+ const baseMessages: ModelMessage[] = fittedMessages ?? [
1744
+ { role: "user" as const, content: prompt },
1745
+ ];
1746
+ effectiveMessages = withCachedSystemPrompt(
1747
+ systemWithToolPolicy,
1748
+ baseMessages,
1749
+ cacheBreakpoint,
1750
+ );
1751
+ effectiveSystem = undefined;
1752
+ }
1753
+
1754
+ // Build providerOptions for extended thinking when enabled on a supported model.
1755
+ // Caching uses message-level breakpoints (withCachedSystemPrompt / withCachedLastMessage),
1756
+ // not top-level providerOptions, so there is no collision.
1757
+ // Note: when thinking is enabled, temperature must not be set (Anthropic rejects it);
1758
+ // this path never sets temperature, so there is nothing to clear.
1759
+ const reasoningProviderOptions = buildReasoningProviderOptions(model, {
1760
+ enableThinking,
1761
+ thinkingEffort,
1762
+ openAIReasoningEffort,
1763
+ });
1764
+ const openRouterProviderOptions = buildOpenRouterProviderOptions(model);
1765
+ const providerOptions =
1766
+ reasoningProviderOptions || openRouterProviderOptions
1767
+ ? { ...reasoningProviderOptions, ...openRouterProviderOptions }
1768
+ : undefined;
1769
+
1770
+ let rateLimitRetryCount = 0;
1771
+
1772
+ // Make `activeTools` authoritative: advertise, execute, and enumerate only
1773
+ // the allowlisted tools. A no-op when `activeTools` is empty/undefined.
1774
+ // `resolveEffectiveTools` above already filtered the map and cleared
1775
+ // `activeTools`, so this is a no-op on the normal path; kept for callers that
1776
+ // reach streamText with an intact `activeTools` (identity when undefined).
1777
+ const allowedTools = withResponseToolActive(tools, activeTools);
1778
+ const effectiveTools = restrictToolsToActive(tools, allowedTools);
1779
+
1780
+ try {
1781
+ // Create the appropriate provider instance. The span tracker captures
1782
+ // the SDK's root generation span for error marking (see below).
1783
+ const generationSpans = createGenerationSpanTracker();
1784
+ const responseOptions: Parameters<typeof streamText>[0] = {
1785
+ model: providerModel,
1786
+ system: effectiveSystem,
1787
+ ...(effectiveMessages ? { messages: effectiveMessages } : { prompt }),
1788
+ stopWhen,
1789
+ toolChoice,
1790
+ tools: effectiveTools,
1791
+ maxRetries: 3,
1792
+ providerOptions,
1793
+ // Step history would retain a serialized request body per step, and
1794
+ // later steps re-send the whole conversation, so they accumulate.
1795
+ // Native capture reads the provider stream result, not this filter.
1796
+ experimental_include: { requestBody: false },
1797
+ // The forwarding tracer keeps a handle on the SDK's root generation
1798
+ // span: error-part runs complete normally in the SDK, so nothing
1799
+ // marks the span failed — the wrapper's catch does.
1800
+ experimental_telemetry: {
1801
+ ...createAiTelemetrySettings({
1802
+ operation: "apex.agent.stream",
1803
+ sessionId,
1804
+ compaction: opts._compaction?.last,
1805
+ }),
1806
+ tracer: generationSpans.tracer,
1807
+ },
1808
+ // Pin actual emission to the same value `fitMessagesToContext`
1809
+ // reserved for output. Without this, the SDK applies provider
1810
+ // defaults that can exceed our budget — e.g. GPT-4o defaults to
1811
+ // 16K output but our messages were sized assuming a smaller
1812
+ // reservation. Making the value explicit closes that drift class.
1813
+ maxOutputTokens: getMaxOutputTokens(
1814
+ model,
1815
+ authConfig?.customProviders,
1816
+ authConfig?.hoonifyModels,
1817
+ ),
1818
+ // Awaiting inside prepareStep keeps streamResponse synchronous; the
1819
+ // SDK awaits it before provider dispatch, so every turn and every
1820
+ // recovery re-entry commits before use.
1821
+ prepareStep: async (opts) => {
1822
+ if (contextRecorder) {
1823
+ if (recorderBase === undefined) {
1824
+ recorderBase = structuredClone(opts.messages);
1825
+ }
1826
+ // Full logical context each turn — accepted step outputs must
1827
+ // survive into every later commit, and system is explicit (when
1828
+ // cached into messages, effectiveSystem is undefined → null).
1829
+ await contextRecorder.checkpoint({
1830
+ messages: opts.messages,
1831
+ system: effectiveSystem ?? null,
1832
+ });
1833
+ }
1834
+ // Update the container with the latest messages
1835
+ messagesContainer.current = opts.messages;
1836
+ // Mark the last message so the growing conversation caches incrementally
1837
+ if (cacheBreakpoint) {
1838
+ return {
1839
+ messages: withCachedLastMessage(opts.messages, cacheBreakpoint),
1840
+ };
1841
+ }
1842
+ return undefined;
1843
+ },
1844
+ onError: async ({ error }: { error: unknown }) => {
1845
+ // Never throw here: the SDK calls this inside its stream pipeline,
1846
+ // and a thrown callback kills the pipeline's terminal lifecycle —
1847
+ // the root generation span never ends and nothing exports. Return
1848
+ // normally instead; the error part continues downstream and the
1849
+ // consumption wrapper converts it to a thrown error (after the
1850
+ // tail drains), where the retry machinery takes over.
1851
+ const errorMessage =
1852
+ error instanceof Error ? error.message : String(error);
1853
+ if (
1854
+ errorMessage.toLowerCase().includes("too many tokens") ||
1855
+ errorMessage.toLowerCase().includes("overloaded")
1856
+ ) {
1857
+ rateLimitRetryCount++;
1858
+ if (getInferenceRecorder(opts)) {
1859
+ // This SDK callback must not throw, including when cancellation ends its wait.
1860
+ await delay(1000 * rateLimitRetryCount, undefined, {
1861
+ signal: abortSignal,
1862
+ }).catch(() => {});
1863
+ } else {
1864
+ await new Promise((resolve) =>
1865
+ setTimeout(resolve, 1000 * rateLimitRetryCount),
1866
+ );
1867
+ }
1868
+ }
1869
+ },
1870
+ onStepFinish,
1871
+ abortSignal,
1872
+ activeTools: allowedTools,
1873
+ experimental_repairToolCall: async ({
1874
+ toolCall,
1875
+ inputSchema,
1876
+ tools,
1877
+ error,
1878
+ }) => {
1879
+ // [response-debug] Log when repair fires for `response` (streamed args failed Zod validation), bypassing `silent`.
1880
+ if (RESPONSE_DEBUG && toolCall.toolName === RESPONSE_TOOL_NAME) {
1881
+ const raw = toolCall.input;
1882
+ const rawLen =
1883
+ typeof raw === "string" ? raw.length : JSON.stringify(raw).length;
1884
+ log.warn(
1885
+ `[response-debug] experimental_repairToolCall FIRED for response ` +
1886
+ `rawInputChars=${rawLen} error=${(error.message || String(error)).slice(0, 200)}`,
1887
+ );
1888
+ }
1889
+
1890
+ // Fail closed for security-sensitive tools: never let repair invent or
1891
+ // replace arguments (e.g. a spawn `target`). Returning null drops the
1892
+ // invalid call instead of executing a model-synthesized one.
1893
+ if (isRepairFailClosedTool(toolCall.toolName)) {
1894
+ if (!silent) {
1895
+ log.warn(
1896
+ `Tool-call repair disabled for security-sensitive tool "${toolCall.toolName}" — failing closed (no argument synthesis).`,
1897
+ );
1898
+ }
1899
+ return null;
1900
+ }
1901
+
1902
+ try {
1903
+ if (!silent) {
1904
+ log.debug(`Repairing tool call: ${toolCall.toolName}`, {
1905
+ error: error.message || String(error),
1906
+ });
1907
+
1908
+ // Log specific details for common enum errors
1909
+ if (
1910
+ error.message &&
1911
+ (error.message.includes("severity") ||
1912
+ error.message.includes("riskLevel"))
1913
+ ) {
1914
+ log.debug(
1915
+ "Enum validation error — tool call repair will normalize the value",
1916
+ );
1917
+ }
1918
+ }
1919
+
1920
+ // Get the actual tool definition which contains the Zod schema
1921
+ const tool = tools[toolCall.toolName];
1922
+ if (!tool?.inputSchema) {
1923
+ if (!silent) {
1924
+ log.warn(
1925
+ `Cannot repair tool call: ${toolCall.toolName} not found or has no schema`,
1926
+ );
1927
+ }
1928
+ return null;
1929
+ }
1930
+
1931
+ const jsonSchema = inputSchema({ toolName: toolCall.toolName });
1932
+
1933
+ // Bound input + schema so the repair call can't itself overflow.
1934
+ const rawInput = toolCall.input;
1935
+ const inputAsText =
1936
+ typeof rawInput === "string" ? rawInput : JSON.stringify(rawInput);
1937
+ const boundedInput = truncateWithMarker(
1938
+ inputAsText,
1939
+ MAX_TOOL_INPUT_CHARS,
1940
+ );
1941
+ const boundedSchema = truncateWithMarker(
1942
+ JSON.stringify(jsonSchema),
1943
+ MAX_SCHEMA_CHARS,
1944
+ "schema",
1945
+ );
1946
+
1947
+ const {
1948
+ output: repairedArgs,
1949
+ usage: repairUsage,
1950
+ providerMetadata: repairProviderMetadata,
1951
+ } = await runWithNativeRolloutOperation(
1952
+ { operationKind: "tool.repair", sessionId },
1953
+ () =>
1954
+ generateText({
1955
+ model: providerModel,
1956
+ providerOptions: {
1957
+ ...openRouterProviderOptions,
1958
+ // Durable runtime: tool-call repair fires only when a
1959
+ // replayed tool call fails validation — nondeterministically
1960
+ // vs the first run — so it must stay off the checkpoint
1961
+ // journal. The agent-runtime middleware reads this namespace
1962
+ // and runs the call without a durable step; the underlying
1963
+ // provider ignores it.
1964
+ pensarRuntime: { ephemeral: true },
1965
+ },
1966
+ output: Output.object({
1967
+ schema: tool.inputSchema, // Use the actual Zod schema from the tool
1968
+ }),
1969
+ prompt: [
1970
+ `The model tried to call the tool "${toolCall.toolName}"` +
1971
+ ` with the following inputs:`,
1972
+ boundedInput,
1973
+ `The tool accepts the following schema:`,
1974
+ boundedSchema,
1975
+ `Error encountered: ${error}`,
1976
+ "Please fix the inputs to match the schema.",
1977
+ "",
1978
+ "IMPORTANT: For enum fields like 'severity' or 'riskLevel', use ONLY the exact values from the enum (e.g., 'HIGH', 'CRITICAL', 'MEDIUM', 'LOW').",
1979
+ "Do not add prefixes, suffixes, or formatting characters like '>', '-', '!', etc.",
1980
+ ].join("\n"),
1981
+ abortSignal,
1982
+ experimental_telemetry: createAiTelemetrySettings({
1983
+ operation: "apex.tool.repair",
1984
+ sessionId,
1985
+ }),
1986
+ }),
1987
+ );
1988
+
1989
+ // Report tool repair token usage if onStepFinish callback is
1990
+ // provided. Awaited: the callback persists messages and records
1991
+ // usage — a detached invocation would leak unhandled rejections
1992
+ // into the tool loop. Provider metadata and cache details flow
1993
+ // through so repair usage stays attributable.
1994
+ if (onStepFinish && repairUsage) {
1995
+ try {
1996
+ await onStepFinish({
1997
+ text: "",
1998
+ reasoning: undefined,
1999
+ reasoningDetails: [],
2000
+ files: [],
2001
+ sources: [],
2002
+ toolCalls: [],
2003
+ toolResults: [],
2004
+ finishReason: "stop",
2005
+ usage: {
2006
+ inputTokens: repairUsage.inputTokens ?? 0,
2007
+ outputTokens: repairUsage.outputTokens ?? 0,
2008
+ totalTokens: repairUsage.totalTokens ?? 0,
2009
+ ...(repairUsage.inputTokenDetails
2010
+ ? { inputTokenDetails: repairUsage.inputTokenDetails }
2011
+ : {}),
2012
+ },
2013
+ warnings: [],
2014
+ request: {},
2015
+ response: {
2016
+ id: "tool-repair",
2017
+ timestamp: new Date(),
2018
+ modelId: "",
2019
+ messages: messagesContainer.current,
2020
+ },
2021
+ providerMetadata: repairProviderMetadata,
2022
+ stepType: "initial",
2023
+ isContinued: false,
2024
+ } as unknown as Parameters<
2025
+ StreamTextOnStepFinishCallback<ToolSet>
2026
+ >[0]);
2027
+ } catch (callbackError) {
2028
+ if (!silent) {
2029
+ log.warn("Error reporting tool repair usage", {
2030
+ error: String(callbackError),
2031
+ });
2032
+ }
2033
+ }
2034
+ }
2035
+
2036
+ if (repairedArgs === undefined || repairedArgs === null) {
2037
+ if (!silent) {
2038
+ log.warn(
2039
+ `Tool call repair for "${toolCall.toolName}" produced no valid output`,
2040
+ );
2041
+ }
2042
+ return null;
2043
+ }
2044
+ return { ...toolCall, input: JSON.stringify(repairedArgs) };
2045
+ } catch (repairError) {
2046
+ if (!silent) {
2047
+ log.warn("Error repairing tool call", {
2048
+ error: String(repairError),
2049
+ });
2050
+ }
2051
+ return null;
2052
+ }
2053
+ },
2054
+ onFinish,
2055
+ };
2056
+ let recovery = nativeRecovery;
2057
+ const response = recovery
2058
+ ? streamText(responseOptions)
2059
+ : runWithNativeRolloutOperation(
2060
+ { operationKind: "agent.stream", sessionId },
2061
+ () => {
2062
+ const operation = new AsyncResource("apex.native-stream-recovery");
2063
+ recovery = {
2064
+ model: providerModel,
2065
+ run: (fn) => operation.runInAsyncScope(fn),
2066
+ };
2067
+ return streamText(responseOptions);
2068
+ },
2069
+ );
2070
+
2071
+ // Wrap the stream to catch async errors during consumption
2072
+ const recoveryOpts: InternalStreamResponseOpts = recovery
2073
+ ? { ...opts, [NATIVE_STREAM_RECOVERY]: recovery }
2074
+ : opts;
2075
+ return wrapStreamWithErrorHandler(
2076
+ response,
2077
+ messagesContainer,
2078
+ recoveryOpts,
2079
+ providerModel,
2080
+ silent,
2081
+ 0,
2082
+ 0,
2083
+ generationSpans,
2084
+ );
2085
+ } catch (error) {
2086
+ // Check if the error is related to context length
2087
+ const isContextLengthError = checkIfContextLengthError(error);
2088
+ const outerErrorMessage =
2089
+ error instanceof Error ? error.message : String(error);
2090
+
2091
+ if (isContextLengthError) {
2092
+ if (!silent) {
2093
+ log.warn(
2094
+ `Context length error, summarizing ${messagesContainer.current.length} messages`,
2095
+ { error: outerErrorMessage },
2096
+ );
2097
+ }
2098
+ // Wrap so a context error inside the summarization stream itself
2099
+ // (or the resumed `streamResponse` it triggers) is caught and routed
2100
+ // through the same recovery cascade as the proactive and reactive
2101
+ // paths — invariant I4: every context-recovery failure must be caught
2102
+ // at the `streamResponse` boundary, never escape raw to the consumer.
2103
+ //
2104
+ // Pass `opts` through unchanged — the slot is consumed by
2105
+ // `summarizeConversation`'s internal `_restartDepth + 1` bump on
2106
+ // the resumed call. See the proactive escalation comment above
2107
+ // for the symmetry rationale.
2108
+ return wrapStreamWithErrorHandler(
2109
+ createSummarizationStream(
2110
+ messagesContainer.current,
2111
+ { ...opts, _compactionTrigger: "context_overflow" },
2112
+ providerModel,
2113
+ ),
2114
+ messagesContainer,
2115
+ opts,
2116
+ providerModel,
2117
+ silent,
2118
+ );
2119
+ }
2120
+ if (!silent) {
2121
+ log.error("Non-context length error, re-throwing", {
2122
+ error: outerErrorMessage,
2123
+ });
2124
+ }
2125
+
2126
+ // Re-throw if it's not a context length error
2127
+ throw error;
2128
+ }
2129
+ }
2130
+
2131
+ export interface GenerateObjectOpts<T extends z.ZodType> {
2132
+ model: AIModel;
2133
+ schema: T;
2134
+ prompt: string;
2135
+ system?: string;
2136
+ maxTokens?: number;
2137
+ temperature?: number;
2138
+ openAIReasoningEffort?: OpenAIReasoningEffort | null;
2139
+ authConfig?: AIAuthConfig;
2140
+ abortSignal?: AbortSignal;
2141
+ onTokenUsage?: (inputTokens: number, outputTokens: number) => void;
2142
+ /** Provider middleware applied only to this call's model. */
2143
+ languageModelMiddleware?: LanguageModelMiddleware | LanguageModelMiddleware[];
2144
+ /** Explicit undefined clears an inherited recorder for an unrecorded child. */
2145
+ inferenceRecorder?: InferenceRecorder;
2146
+ /** Per-run usage recorder; when set it replaces the global usage callback. */
2147
+ usageRecorder?: UsageRecorder;
2148
+ /** Session id (`ses_…`) of the caller — stamped onto AI-span telemetry. */
2149
+ sessionId?: string;
2150
+ /** Stable operation id; defaults to `apex.structured.generate`. */
2151
+ operation?: AiTelemetryOperation;
2152
+ }
2153
+
2154
+ const MAX_OBJECT_RATE_LIMIT_RETRIES = 8;
2155
+
2156
+ export async function generateObjectResponse<T extends z.ZodType>(
2157
+ opts: GenerateObjectOpts<T>,
2158
+ ): Promise<z.infer<T>> {
2159
+ opts = { ...opts, inferenceRecorder: getInferenceRecorder(opts) };
2160
+ return runWithInferenceRecorder(opts.inferenceRecorder, () =>
2161
+ generateObjectResponseWithinRecorder(opts),
2162
+ );
2163
+ }
2164
+
2165
+ async function generateObjectResponseWithinRecorder<T extends z.ZodType>(
2166
+ opts: GenerateObjectOpts<T>,
2167
+ ): Promise<z.infer<T>> {
2168
+ const {
2169
+ model,
2170
+ schema,
2171
+ prompt,
2172
+ system,
2173
+ maxTokens,
2174
+ temperature,
2175
+ openAIReasoningEffort,
2176
+ authConfig,
2177
+ abortSignal,
2178
+ onTokenUsage,
2179
+ languageModelMiddleware,
2180
+ usageRecorder,
2181
+ sessionId,
2182
+ } = opts;
2183
+
2184
+ const baseProviderModel = withNativeRolloutEvidenceModel(
2185
+ withModelCallDiagnostics(getProviderModel(model, authConfig)),
2186
+ {
2187
+ requestedModelId: model,
2188
+ operationKind: nativeRolloutOperation(opts.operation),
2189
+ sessionId,
2190
+ },
2191
+ );
2192
+ const providerModel = languageModelMiddleware
2193
+ ? wrapLanguageModel({
2194
+ model: baseProviderModel,
2195
+ middleware: languageModelMiddleware,
2196
+ })
2197
+ : baseProviderModel;
2198
+ const reasoningProviderOptions = buildReasoningProviderOptions(model, {
2199
+ openAIReasoningEffort,
2200
+ });
2201
+ const openRouterProviderOptions =
2202
+ buildOpenRouterStructuredProviderOptions(model);
2203
+
2204
+ return runWithNativeRolloutOperation(
2205
+ {
2206
+ operationKind: nativeRolloutOperation(opts.operation),
2207
+ sessionId,
2208
+ },
2209
+ async () => {
2210
+ let lastError: unknown;
2211
+
2212
+ for (
2213
+ let attempt = 0;
2214
+ attempt <= MAX_OBJECT_RATE_LIMIT_RETRIES;
2215
+ attempt++
2216
+ ) {
2217
+ try {
2218
+ const { output, usage, providerMetadata } = await generateText({
2219
+ model: providerModel,
2220
+ output: Output.object({
2221
+ schema,
2222
+ }),
2223
+ prompt,
2224
+ system,
2225
+ maxOutputTokens: maxTokens,
2226
+ temperature,
2227
+ providerOptions:
2228
+ reasoningProviderOptions || openRouterProviderOptions
2229
+ ? {
2230
+ ...reasoningProviderOptions,
2231
+ ...(openRouterProviderOptions
2232
+ ? {
2233
+ openrouter: {
2234
+ ...reasoningProviderOptions?.openrouter,
2235
+ ...openRouterProviderOptions.openrouter,
2236
+ },
2237
+ }
2238
+ : {}),
2239
+ }
2240
+ : undefined,
2241
+ maxRetries: 0,
2242
+ abortSignal,
2243
+ experimental_telemetry: createAiTelemetrySettings({
2244
+ operation: opts.operation ?? "apex.structured.generate",
2245
+ sessionId,
2246
+ }),
2247
+ });
2248
+
2249
+ if (onTokenUsage && usage) {
2250
+ onTokenUsage(usage.inputTokens ?? 0, usage.outputTokens ?? 0);
2251
+ }
2252
+
2253
+ if (usage) {
2254
+ await emitUsage(
2255
+ model,
2256
+ normalizeStepUsage({ usage, providerMetadata }),
2257
+ resolveUsageSink(usageRecorder),
2258
+ );
2259
+ }
2260
+
2261
+ // zod v4: the AI SDK's `Output.object` no longer carries the schema's
2262
+ // inferred type through `output` (it widens to `unknown`), so restore it
2263
+ // from the schema generic for callers.
2264
+ return output as z.infer<T>;
2265
+ } catch (error) {
2266
+ // Surface latched persistence/limit failures before any retry
2267
+ // classification — they are terminal, never delayed or retried.
2268
+ await getInferenceRecorder(opts)?.flush();
2269
+ if (
2270
+ error instanceof RunPersistenceError ||
2271
+ error instanceof RunLimitError ||
2272
+ error instanceof RunControlInterruption
2273
+ ) {
2274
+ throw error;
2275
+ }
2276
+ lastError = error;
2277
+
2278
+ if (checkIfContextLengthError(error)) {
2279
+ const msg = error instanceof Error ? error.message : String(error);
2280
+ throw new ContextLengthError(
2281
+ `Prompt exceeds model context window: ${msg}`,
2282
+ );
2283
+ }
2284
+
2285
+ if (
2286
+ checkIfRateLimitError(error) &&
2287
+ attempt < MAX_OBJECT_RATE_LIMIT_RETRIES
2288
+ ) {
2289
+ const delayMs = Math.min(1000 * 2 ** attempt, 60_000);
2290
+ const recorder = getInferenceRecorder(opts);
2291
+ await recorder?.retry({
2292
+ authority: "object-rate-limit",
2293
+ count: attempt + 1,
2294
+ maxRetries: MAX_OBJECT_RATE_LIMIT_RETRIES,
2295
+ delayMs,
2296
+ });
2297
+ if (recorder) {
2298
+ await delay(delayMs, undefined, { signal: abortSignal });
2299
+ } else {
2300
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
2301
+ }
2302
+ continue;
2303
+ }
2304
+
2305
+ throw error;
2306
+ }
2307
+ }
2308
+
2309
+ throw lastError;
2310
+ },
2311
+ );
2312
+ }
2313
+
2314
+ class ContextLengthError extends Error {
2315
+ constructor(message: string) {
2316
+ super(message);
2317
+ this.name = "ContextLengthError";
2318
+ }
2319
+ }
2320
+
2321
+ /**
2322
+ * Terminal: all recovery paths exhausted. The only context-length error
2323
+ * allowed to escape `streamResponse` — others are recoverable by design.
2324
+ */
2325
+ export class ContextLengthExhaustedError extends Error {
2326
+ readonly restartDepth: number;
2327
+ constructor(message: string, restartDepth: number) {
2328
+ super(message);
2329
+ this.name = "ContextLengthExhaustedError";
2330
+ this.restartDepth = restartDepth;
2331
+ }
2332
+ }
2333
+
2334
+ const MAX_RESTART_DEPTH = 3;
2335
+
2336
+ const MAX_TOOL_INPUT_CHARS = 8_000;
2337
+ const MAX_SCHEMA_CHARS = 6_000;
2338
+
2339
+ const MINIMAL_RESTART_PROMPT =
2340
+ "Continue the previous task. Earlier context was discarded due to repeated context-length errors.";
2341
+
2342
+ export {
2343
+ applySequentialToolCallPolicy,
2344
+ createToolExecutionGate,
2345
+ getStreamIdleTimeoutMs,
2346
+ SEQUENTIAL_TOOL_CALL_INSTRUCTION,
2347
+ StreamIdleTimeoutError,
2348
+ withIdleTimeout,
2349
+ };