@pensar/apex 2.6.1 → 2.7.0-canary.1572d9a4

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 (328) hide show
  1. package/build/{agent-ayreaj6z.js → agent-3g1b578v.js} +6 -5
  2. package/build/{agent-yby11zaq.js → agent-p8cezgbb.js} +7 -6
  3. package/build/{agent-runs-g37vkrjr.js → agent-runs-f86emmgg.js} +23 -20
  4. package/build/agent-vaq31je6.js +14 -0
  5. package/build/agent-vvdqga09.js +14 -0
  6. package/build/{apps-xn6km9yn.js → apps-3stwnmen.js} +16 -13
  7. package/build/{auth-d105wc64.js → auth-7md9kwda.js} +16 -13
  8. package/build/blackboxAgent-ct8bejef.js +14 -0
  9. package/build/{blackboxPentest-ps78v3w7.js → blackboxPentest-w2nr4md3.js} +21 -15
  10. package/build/{cli-c05y640n.js → cli-1j28cbhy.js} +1 -1
  11. package/build/{cli-d37a42dc.js → cli-2jz2jz06.js} +206 -90
  12. package/build/{cli-az3xq70v.js → cli-4a8dsz2k.js} +4 -4
  13. package/build/{cli-qgz1q9g5.js → cli-58781vcf.js} +1192 -1473
  14. package/build/{cli-gx71jcke.js → cli-7067zzeb.js} +1 -1
  15. package/build/{cli-3sp6nd8d.js → cli-81smmd5w.js} +5 -5
  16. package/build/{cli-k2nwxta0.js → cli-8b25dhky.js} +2 -2
  17. package/build/{cli-fy6vh2a7.js → cli-8sw5zpqz.js} +1 -1
  18. package/build/{cli-709rvekb.js → cli-cg3ypx5n.js} +14 -7
  19. package/build/{cli-dpsw2fe6.js → cli-e9v6zg6h.js} +40941 -40172
  20. package/build/cli-fjxmphg1.js +36 -0
  21. package/build/{cli-7eea4e2y.js → cli-gzb6qrzh.js} +31 -60
  22. package/build/{cli-65g6rcat.js → cli-khnf5xrf.js} +2 -1
  23. package/build/{cli-1ve18npr.js → cli-mdzt2e8j.js} +4 -2
  24. package/build/{cli-n2en7j5b.js → cli-n8mmw4c4.js} +1 -1
  25. package/build/cli-pndb7mh9.js +1193 -0
  26. package/build/cli-px6ehzqx.js +54 -0
  27. package/build/{cli-xtc2t6me.js → cli-qs4msn6x.js} +111 -47
  28. package/build/{cli-kb21qhvm.js → cli-rvybdhgn.js} +4 -3
  29. package/build/{cli-ae8jqxqr.js → cli-v739h7hb.js} +2 -2
  30. package/build/{cli-ngq9dr8n.js → cli-wm8ech0x.js} +3 -3
  31. package/build/cli.js +170 -51
  32. package/build/{config-zpqkd5cz.js → config-e5v1bkh1.js} +1 -1
  33. package/build/{fastStrike-mcjdvwez.js → fastStrike-efp0rjs3.js} +74 -17
  34. package/build/{fixes-kytx5dmj.js → fixes-926cw1ej.js} +16 -13
  35. package/build/{index-n65z6v7b.js → index-3t41p258.js} +7 -6
  36. package/build/{index-qv4cc65p.js → index-bv09af6g.js} +19 -15
  37. package/build/{index-je6hcsqr.js → index-bv6dtwse.js} +1 -1
  38. package/build/{index-4vqdgb42.js → index-jt52ffgn.js} +1657 -1400
  39. package/build/{index-ns4m4s01.js → index-np405b9e.js} +11 -7
  40. package/build/{index-r9yjkfrv.js → index-qys178kp.js} +5 -4
  41. package/build/{index-wqetp6gq.js → index-tpyzq2wq.js} +42 -11
  42. package/build/{index-fv64eb32.js → index-vrcdyebh.js} +2 -2
  43. package/build/{index-dr3tg1w3.js → index-z1g8vbtm.js} +1 -1
  44. package/build/{issues-eb3q9d3a.js → issues-sncyqh14.js} +16 -13
  45. package/build/{knowledge-fqsvtx0f.js → knowledge-esgvy5ws.js} +16 -13
  46. package/build/lance-sacfgs1z.js +232 -0
  47. package/build/lib/{chunk-9yksqgzr.js → chunk-4aevegnc.js} +77 -45
  48. package/build/lib/{chunk-9tt2021m.js → chunk-4kf4a15q.js} +13 -13
  49. package/build/lib/{chunk-fy3bbbqy.js → chunk-5avnedwm.js} +7 -1
  50. package/build/lib/{chunk-bb0ekhkw.js → chunk-5nz5tk3p.js} +76 -22
  51. package/build/lib/{chunk-4hwzqthr.js → chunk-7s8e5wrd.js} +3 -2
  52. package/build/lib/{chunk-yrnrbjes.js → chunk-85kpxwzs.js} +4 -2
  53. package/build/lib/{chunk-mg03jdmt.js → chunk-9jkzk9nc.js} +1 -1
  54. package/build/lib/{chunk-r4j8ybn9.js → chunk-9wwts6r6.js} +824 -77
  55. package/build/lib/{chunk-nhfax4gb.js → chunk-bxznzxdy.js} +5 -1
  56. package/build/lib/{chunk-r2dkp4tb.js → chunk-cqxm95md.js} +1 -1
  57. package/build/lib/{chunk-w66ce82a.js → chunk-e3agqspc.js} +12 -4
  58. package/build/lib/{chunk-ba41jh41.js → chunk-eh5yw385.js} +1137 -333
  59. package/build/lib/{chunk-1azdancq.js → chunk-ewc9r84m.js} +5 -1
  60. package/build/lib/{chunk-2njv7wz3.js → chunk-hbyxyxdc.js} +4 -0
  61. package/build/lib/{chunk-e8yy2k73.js → chunk-jhhwts6w.js} +28 -2
  62. package/build/lib/{chunk-1jvwqnem.js → chunk-kbxbd1kn.js} +108 -44
  63. package/build/lib/{chunk-7pwa92rn.js → chunk-mph5fvk7.js} +1 -1
  64. package/build/lib/chunk-psc23epq.js +107 -0
  65. package/build/lib/{chunk-acgbyf5h.js → chunk-qxad7qjd.js} +4 -2
  66. package/build/lib/{chunk-3c00n0cy.js → chunk-r0v3vvgm.js} +54 -33
  67. package/build/lib/{chunk-1yct6cra.js → chunk-rt13120a.js} +1 -1
  68. package/build/lib/{chunk-v3dk9j7k.js → chunk-sgya016v.js} +93 -22
  69. package/build/lib/{chunk-1fy8azee.js → chunk-txef92hq.js} +1 -1
  70. package/build/lib/{chunk-2qsq76xq.js → chunk-vcd90qrn.js} +189 -90
  71. package/build/lib/{chunk-7gjdygcx.js → chunk-vwr9w3ab.js} +2 -0
  72. package/build/lib/{chunk-z137x08b.js → chunk-wf6ak0m3.js} +92 -70
  73. package/build/lib/{chunk-xhdpgpkm.js → chunk-xft0ms9j.js} +2 -2
  74. package/build/lib/core/agents/agentRuntime.d.ts +3 -1
  75. package/build/lib/core/agents/defineAgent.d.ts +3 -2
  76. package/build/lib/core/agents/lance.d.ts +153 -0
  77. package/build/lib/core/agents/lanceJudge.d.ts +3 -0
  78. package/build/lib/core/agents/offSecAgent/index.d.ts +3 -1
  79. package/build/lib/core/agents/offSecAgent/index.js +16 -14
  80. package/build/lib/core/agents/offSecAgent/offensiveSecurityAgent.d.ts +4 -0
  81. package/build/lib/core/agents/offSecAgent/prompt.d.ts +3 -1
  82. package/build/lib/core/agents/offSecAgent/subagentSpawner.d.ts +18 -2
  83. package/build/lib/core/agents/offSecAgent/subagentSpawner.js +10 -8
  84. package/build/lib/core/agents/offSecAgent/toolExecutionContext.d.ts +3 -0
  85. package/build/lib/core/agents/offSecAgent/toolLifecycle.d.ts +1 -0
  86. package/build/lib/core/agents/offSecAgent/tools/index.js +10 -6
  87. package/build/lib/core/agents/offSecAgent/tools/listMemories.d.ts +11 -1
  88. package/build/lib/core/agents/offSecAgent/tools/reportError.d.ts +2 -1
  89. package/build/lib/core/agents/offSecAgent/tools/runPentestWorkflow.d.ts +20 -1
  90. package/build/lib/core/agents/offSecAgent/tools/spawnPentestAgent.d.ts +4 -7
  91. package/build/lib/core/agents/offSecAgent/tools/spawnPentestSwarm.d.ts +7 -1
  92. package/build/lib/core/agents/offSecAgent/tools/types.d.ts +6 -3
  93. package/build/lib/core/agents/offSecAgent/tools/whiteboxCandidates.d.ts +2 -2
  94. package/build/lib/core/agents/offSecAgent/types.d.ts +19 -3
  95. package/build/lib/core/agents/specialized/attackSurface/blackboxAgent.js +13 -13
  96. package/build/lib/core/agents/specialized/attackSurface/schemas.js +12 -12
  97. package/build/lib/core/agents/specialized/authenticationAgent/index.js +14 -14
  98. package/build/lib/core/agents/specialized/codeAgent/agent.js +13 -13
  99. package/build/lib/core/agents/specialized/codeAgent/prompts.d.ts +1 -0
  100. package/build/lib/core/agents/specialized/cvssScorer/index.d.ts +2 -1
  101. package/build/lib/core/agents/specialized/findingJudge/agent.js +11 -11
  102. package/build/lib/core/agents/specialized/findingJudge/index.d.ts +2 -1
  103. package/build/lib/core/agents/specialized/findingJudge/index.js +4 -4
  104. package/build/lib/core/agents/specialized/patching/index.js +14 -14
  105. package/build/lib/core/agents/specialized/pentest/agent.d.ts +18 -4
  106. package/build/lib/core/agents/specialized/pentest/agent.js +15 -13
  107. package/build/lib/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.d.ts +2 -1
  108. package/build/lib/core/agents/specialized/whiteboxAttackSurface/index.js +13 -13
  109. package/build/lib/core/ai/ai.d.ts +29 -70
  110. package/build/lib/core/ai/ai.js +5 -3
  111. package/build/lib/core/ai/index.d.ts +1 -0
  112. package/build/lib/core/ai/index.js +16 -4
  113. package/build/lib/core/ai/models/claude-capabilities.d.ts +3 -2
  114. package/build/lib/core/ai/models/concentrate.d.ts +1 -0
  115. package/build/lib/core/ai/models/index.d.ts +1 -1
  116. package/build/lib/core/ai/providers/concentrate.d.ts +1 -0
  117. package/build/lib/core/ai/reasoning.d.ts +44 -0
  118. package/build/lib/core/ai/utils.d.ts +2 -0
  119. package/build/lib/core/ai/utils.js +5 -3
  120. package/build/lib/core/api/index.d.ts +6 -0
  121. package/build/lib/core/api/index.js +32 -23
  122. package/build/lib/core/api/lance.d.ts +6 -0
  123. package/build/lib/core/api/offesecAgent.d.ts +1 -0
  124. package/build/lib/core/api/reasoning.d.ts +12 -0
  125. package/build/lib/core/api/targetedPentest.d.ts +1 -0
  126. package/build/lib/core/api/targetedPentest.js +14 -14
  127. package/build/lib/core/cli/reasoning.d.ts +4 -0
  128. package/build/lib/core/config/config.d.ts +10 -2
  129. package/build/lib/core/config/customProviders.d.ts +11 -0
  130. package/build/lib/core/config/index.js +1 -1
  131. package/build/lib/core/eventBus.js +1 -1
  132. package/build/lib/core/findings/registry.d.ts +3 -1
  133. package/build/lib/core/findings/registry.js +4 -4
  134. package/build/lib/core/observability/index.js +1 -1
  135. package/build/lib/core/observability/telemetry.d.ts +4 -0
  136. package/build/lib/core/session/index.d.ts +47 -0
  137. package/build/lib/core/session/index.js +6 -4
  138. package/build/lib/core/session/persistence.d.ts +7 -0
  139. package/build/lib/core/session/persistence.js +8 -4
  140. package/build/lib/core/tools/backends/index.js +1 -1
  141. package/build/lib/core/tools/backends/resolve.d.ts +1 -0
  142. package/build/lib/core/workflows/fastStrike.d.ts +3 -1
  143. package/build/lib/core/workflows/pentest.d.ts +12 -2
  144. package/build/lib/core/workflows/pentest.js +19 -19
  145. package/build/lib/core/workflows/seams.js +5 -5
  146. package/build/lib/core/workflows/threatModel.d.ts +1 -0
  147. package/build/lib/core/workflows/whiteboxAttackSurface.d.ts +6 -4
  148. package/build/lib/core/workflows/whiteboxAttackSurface.js +15 -15
  149. package/build/lib/index.js +25 -25
  150. package/build/{logs-x62b7hk1.js → logs-bcbjpjp6.js} +16 -13
  151. package/build/{native-rollout-evidence-c9yhfqcs.js → native-rollout-evidence-rph1774m.js} +5 -5
  152. package/build/offesecAgent-81h1p6ee.js +32 -0
  153. package/build/pentest-2q20q6n1.js +23 -0
  154. package/build/{pentests-e0f32aqx.js → pentests-jgw031mc.js} +16 -13
  155. package/build/recordedRunClient-6axj6fba.js +11 -0
  156. package/build/subagentSpawner-a861gvt0.js +12 -0
  157. package/build/targetedPentest-6yxznt7s.js +91 -0
  158. package/build/{targets-xj9g3q0z.js → targets-bjah19dp.js} +16 -13
  159. package/build/threatModel-739kpexm.js +24 -0
  160. package/build/{uninstall-7s784q4a.js → uninstall-yxrn9edt.js} +1 -1
  161. package/build/{upload-4gvhwmvr.js → upload-34ewrjp5.js} +4 -4
  162. package/build/{utils-cjrz64pc.js → utils-fzm66efw.js} +5 -5
  163. package/package.json +2 -1
  164. package/src/cli/issues.test.ts +17 -1
  165. package/src/cli/lance-verifier.test.ts +57 -0
  166. package/src/cli/lance-verifier.ts +73 -0
  167. package/src/cli/lance.test.ts +71 -0
  168. package/src/cli/lance.ts +48 -0
  169. package/src/cli.ts +109 -19
  170. package/src/core/agents/agentRuntime.test.ts +42 -0
  171. package/src/core/agents/agentRuntime.ts +7 -2
  172. package/src/core/agents/defineAgent.ts +3 -1
  173. package/src/core/agents/lance.test.ts +421 -0
  174. package/src/core/agents/lance.ts +701 -0
  175. package/src/core/agents/lanceJudge.test.ts +166 -0
  176. package/src/core/agents/lanceJudge.ts +115 -0
  177. package/src/core/agents/offSecAgent/index.ts +3 -0
  178. package/src/core/agents/offSecAgent/interruptedStepFinalization.test.ts +51 -0
  179. package/src/core/agents/offSecAgent/lance.test.ts +188 -0
  180. package/src/core/agents/offSecAgent/offensiveSecurityAgent.test.ts +92 -5
  181. package/src/core/agents/offSecAgent/offensiveSecurityAgent.ts +244 -41
  182. package/src/core/agents/offSecAgent/prompt.test.ts +46 -0
  183. package/src/core/agents/offSecAgent/prompt.ts +52 -8
  184. package/src/core/agents/offSecAgent/selectiveConstruction.publicPath.test.ts +38 -0
  185. package/src/core/agents/offSecAgent/selectiveConstruction.test.ts +64 -0
  186. package/src/core/agents/offSecAgent/subagentSpawner.hooks.test.ts +11 -3
  187. package/src/core/agents/offSecAgent/subagentSpawner.reasoning.test.ts +167 -0
  188. package/src/core/agents/offSecAgent/subagentSpawner.ts +82 -28
  189. package/src/core/agents/offSecAgent/toolExecutionContext.test.ts +230 -0
  190. package/src/core/agents/offSecAgent/toolExecutionContext.ts +56 -0
  191. package/src/core/agents/offSecAgent/toolLifecycle.ts +2 -0
  192. package/src/core/agents/offSecAgent/tools/delegateAuth.ts +4 -2
  193. package/src/core/agents/offSecAgent/tools/documentFinding.test.ts +9 -4
  194. package/src/core/agents/offSecAgent/tools/documentFinding.ts +10 -9
  195. package/src/core/agents/offSecAgent/tools/listMemories.test.ts +230 -0
  196. package/src/core/agents/offSecAgent/tools/listMemories.ts +73 -6
  197. package/src/core/agents/offSecAgent/tools/reportError.test.ts +6 -0
  198. package/src/core/agents/offSecAgent/tools/reportError.ts +10 -2
  199. package/src/core/agents/offSecAgent/tools/runAttackSurface.ts +7 -4
  200. package/src/core/agents/offSecAgent/tools/runPentestWorkflow.test.ts +57 -0
  201. package/src/core/agents/offSecAgent/tools/runPentestWorkflow.ts +21 -1
  202. package/src/core/agents/offSecAgent/tools/runWhiteboxScan.ts +5 -2
  203. package/src/core/agents/offSecAgent/tools/spawnCodingAgent.ts +50 -67
  204. package/src/core/agents/offSecAgent/tools/spawnPentestAgent.test.ts +79 -3
  205. package/src/core/agents/offSecAgent/tools/spawnPentestAgent.ts +36 -16
  206. package/src/core/agents/offSecAgent/tools/spawnPentestSwarm.ts +28 -5
  207. package/src/core/agents/offSecAgent/tools/threatModelGenerator.ts +4 -3
  208. package/src/core/agents/offSecAgent/tools/types.ts +12 -2
  209. package/src/core/agents/offSecAgent/tools/updateTask.ts +5 -1
  210. package/src/core/agents/offSecAgent/tools/whiteboxCandidates.ts +11 -4
  211. package/src/core/agents/offSecAgent/types.ts +22 -1
  212. package/src/core/agents/specialized/codeAgent/agent.test.ts +7 -0
  213. package/src/core/agents/specialized/codeAgent/agent.ts +9 -2
  214. package/src/core/agents/specialized/codeAgent/prompts.ts +6 -0
  215. package/src/core/agents/specialized/cvssScorer/index.test.ts +2 -1
  216. package/src/core/agents/specialized/cvssScorer/index.ts +3 -0
  217. package/src/core/agents/specialized/findingJudge/index.ts +6 -0
  218. package/src/core/agents/specialized/pentest/agent.test.ts +155 -0
  219. package/src/core/agents/specialized/pentest/agent.ts +181 -52
  220. package/src/core/agents/specialized/pentest/results.test.ts +59 -4
  221. package/src/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.concurrency.test.ts +59 -2
  222. package/src/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.hooks.test.ts +127 -0
  223. package/src/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.ts +74 -68
  224. package/src/core/ai/ai.durability-hooks.test.ts +25 -7
  225. package/src/core/ai/ai.lance.test.ts +581 -0
  226. package/src/core/ai/ai.operator-context.bench.test.ts +1390 -0
  227. package/src/core/ai/ai.recorded-context.test.ts +89 -8
  228. package/src/core/ai/ai.test.ts +81 -59
  229. package/src/core/ai/ai.ts +453 -327
  230. package/src/core/ai/compactionTelemetry.test.ts +69 -17
  231. package/src/core/ai/index.ts +11 -0
  232. package/src/core/ai/models/anthropic.ts +6 -0
  233. package/src/core/ai/models/bedrock.ts +18 -0
  234. package/src/core/ai/models/claude-capabilities.ts +29 -8
  235. package/src/core/ai/models/concentrate.ts +52 -0
  236. package/src/core/ai/models/index.ts +25 -4
  237. package/src/core/ai/models/models.test.ts +179 -7
  238. package/src/core/ai/models/openrouter-reasoning.json +219 -0
  239. package/src/core/ai/models/openrouter.ts +43 -1
  240. package/src/core/ai/providers/anthropic-models.test.ts +60 -1
  241. package/src/core/ai/providers/bedrock-models.test.ts +81 -0
  242. package/src/core/ai/providers/concentrate.test.ts +31 -0
  243. package/src/core/ai/providers/concentrate.ts +11 -0
  244. package/src/core/ai/providers/custom.test.ts +74 -0
  245. package/src/core/ai/providers/custom.ts +3 -1
  246. package/src/core/ai/providers/gateway-models.test.ts +16 -6
  247. package/src/core/ai/providers/pensarFormatters.ts +8 -1
  248. package/src/core/ai/reasoning.test.ts +313 -0
  249. package/src/core/ai/reasoning.ts +500 -0
  250. package/src/core/ai/streamIdleTimeout.test.ts +21 -0
  251. package/src/core/ai/utils.native-rollout-evidence.test.ts +21 -8
  252. package/src/core/ai/utils.ts +269 -163
  253. package/src/core/api/attackSurface.ts +1 -0
  254. package/src/core/api/blackboxPentest.ts +9 -1
  255. package/src/core/api/index.ts +17 -0
  256. package/src/core/api/lance.ts +23 -0
  257. package/src/core/api/offesecAgent.test.ts +51 -0
  258. package/src/core/api/offesecAgent.ts +15 -1
  259. package/src/core/api/reasoning.test.ts +213 -0
  260. package/src/core/api/reasoning.ts +44 -0
  261. package/src/core/api/recordedRun.loop.test.ts +5 -1
  262. package/src/core/api/targetedPentest.test.ts +14 -2
  263. package/src/core/api/targetedPentest.ts +52 -5
  264. package/src/core/cli/reasoning.test.ts +149 -0
  265. package/src/core/cli/reasoning.ts +95 -0
  266. package/src/core/config/config.test.ts +35 -0
  267. package/src/core/config/config.ts +11 -0
  268. package/src/core/config/customProviders.ts +21 -2
  269. package/src/core/eventBus.ts +1 -0
  270. package/src/core/findings/registry.test.ts +9 -1
  271. package/src/core/findings/registry.ts +6 -0
  272. package/src/core/observability/telemetry.test.ts +131 -79
  273. package/src/core/observability/telemetry.ts +5 -0
  274. package/src/core/runtime/sqliteRunObservation.test.ts +1 -1
  275. package/src/core/session/index.ts +38 -0
  276. package/src/core/session/persistence.test.ts +62 -0
  277. package/src/core/session/persistence.ts +56 -0
  278. package/src/core/tools/backends/resolve.ts +7 -0
  279. package/src/core/tools/backends/whiteboxJobs.test.ts +9 -8
  280. package/src/core/workflows/fastStrike.seams.test.ts +149 -0
  281. package/src/core/workflows/fastStrike.test.ts +18 -1
  282. package/src/core/workflows/fastStrike.ts +106 -11
  283. package/src/core/workflows/pentest.test.ts +104 -0
  284. package/src/core/workflows/pentest.ts +128 -7
  285. package/src/core/workflows/seams.test.ts +13 -0
  286. package/src/core/workflows/seams.ts +5 -1
  287. package/src/core/workflows/threatModel.ts +2 -0
  288. package/src/core/workflows/whiteboxAttackSurface.test.ts +74 -2
  289. package/src/core/workflows/whiteboxAttackSurface.ts +102 -73
  290. package/src/tui/command-registry.test.ts +12 -0
  291. package/src/tui/command-registry.ts +10 -0
  292. package/src/tui/components/chat/config-view.tsx +6 -10
  293. package/src/tui/components/chat/home-view.tsx +2 -2
  294. package/src/tui/components/chat/input-area.tsx +2 -2
  295. package/src/tui/components/chat/loading-indicator.tsx +20 -4
  296. package/src/tui/components/chat/message-list.tsx +1 -0
  297. package/src/tui/components/commands/__tests__/advanced-settings-lifecycle.tsx +164 -0
  298. package/src/tui/components/commands/advanced-settings.test.ts +34 -0
  299. package/src/tui/components/commands/advanced-settings.tsx +220 -31
  300. package/src/tui/components/commands/models-display.tsx +7 -1
  301. package/src/tui/components/model-picker/ModelPicker.tsx +65 -103
  302. package/src/tui/components/model-picker/ModelPickerDialog.tsx +8 -14
  303. package/src/tui/components/model-picker/__tests__/reasoning-control.tsx +162 -0
  304. package/src/tui/components/model-picker/reasoning-control.test.ts +15 -0
  305. package/src/tui/components/operator-dashboard/index.tsx +166 -50
  306. package/src/tui/components/operator-dashboard/logic.test.ts +144 -2
  307. package/src/tui/components/operator-dashboard/logic.ts +54 -3
  308. package/src/tui/components/operator-dashboard/run-events.test.ts +3 -1
  309. package/src/tui/components/shared/__tests__/tool-renderer-lifecycle.tsx +18 -0
  310. package/src/tui/components/shared/action-label.test.ts +9 -0
  311. package/src/tui/components/shared/compacting-icon.tsx +18 -0
  312. package/src/tui/components/shared/index.ts +1 -0
  313. package/src/tui/components/shared/tool-registry.ts +1 -0
  314. package/src/tui/components/shared/tool-renderer.tsx +21 -7
  315. package/src/tui/context/agent.tsx +32 -79
  316. package/src/tui/context/route.tsx +2 -0
  317. package/src/tui/index.tsx +1 -0
  318. package/src/tui/keybindings/registry.ts +2 -0
  319. package/build/agent-6w7egcf1.js +0 -13
  320. package/build/agent-9zx75feh.js +0 -13
  321. package/build/blackboxAgent-s56sgx9b.js +0 -13
  322. package/build/cli-g06s7edq.js +0 -11
  323. package/build/lib/chunk-z96pbjhd.js +0 -56
  324. package/build/offesecAgent-5whnpeta.js +0 -22
  325. package/build/pentest-e61hc38s.js +0 -22
  326. package/build/recordedRunClient-dp032c32.js +0 -11
  327. package/build/targetedPentest-rcbs4nvp.js +0 -57
  328. package/build/threatModel-jkxfa40s.js +0 -21
@@ -7,6 +7,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
7
7
  import { z } from "zod";
8
8
  import { RunPersistenceError } from "../runtime/persistenceError";
9
9
  import type { RunContextRecorder } from "../runtime/runContext";
10
+ import { estimateMessageTokens } from "./contextManagement";
10
11
 
11
12
  const state: { model?: MockLanguageModelV3 } = {};
12
13
  vi.mock("./utils", async () => ({
@@ -94,6 +95,12 @@ function streamOf(chunks: unknown[]): LanguageModelV3StreamResult {
94
95
  } as LanguageModelV3StreamResult;
95
96
  }
96
97
 
98
+ // Compaction streams now, so the summarizer answers on doStream alongside the
99
+ // resumed agent turn; its request carries the compaction instruction.
100
+ function isSummaryCall(options: { prompt: unknown }): boolean {
101
+ return JSON.stringify(options.prompt).includes("Compact this conversation");
102
+ }
103
+
97
104
  async function drain(stream: { fullStream: AsyncIterable<unknown> }) {
98
105
  for await (const _part of stream.fullStream) {
99
106
  /* consume the SDK lifecycle */
@@ -178,6 +185,76 @@ describe("pre-dispatch gate (real SDK)", () => {
178
185
  });
179
186
 
180
187
  describe("step commits (real SDK)", () => {
188
+ it("commits fitted in-stream context before dispatch without restoring old tool results", async () => {
189
+ const output = "e".repeat(8_000);
190
+ const seenAtDispatch: number[] = [];
191
+ const preparedOffsets: number[] = [];
192
+ const { recorder } = fakeRecorder();
193
+ let calls = 0;
194
+ state.model = new MockLanguageModelV3({
195
+ modelId: "small",
196
+ doStream: async () => {
197
+ const latest = recorder.latest();
198
+ if (latest) seenAtDispatch.push(estimateMessageTokens(latest));
199
+ const call = calls++;
200
+ return call < 8
201
+ ? streamOf([
202
+ {
203
+ type: "tool-call",
204
+ toolCallId: `c${call}`,
205
+ toolName: "probe",
206
+ input: '{"q":"x"}',
207
+ },
208
+ finishChunk(),
209
+ ])
210
+ : streamOf([...textStepChunks("done", "done"), finishChunk()]);
211
+ },
212
+ });
213
+
214
+ await drain(
215
+ streamResponse({
216
+ model: "custom:fixture:small",
217
+ prompt: "run probes",
218
+ silent: true,
219
+ tools: {
220
+ probe: {
221
+ description: "probe",
222
+ inputSchema: z.object({ q: z.string() }),
223
+ execute: async () => output,
224
+ },
225
+ },
226
+ stopWhen: stepCountIs(20),
227
+ contextRecorder: recorder,
228
+ onContextPrepared: ({ responseMessageOffset }) => {
229
+ preparedOffsets.push(responseMessageOffset);
230
+ },
231
+ authConfig: {
232
+ customProviders: {
233
+ fixture: {
234
+ baseUrl: "https://example.invalid/v1",
235
+ models: [
236
+ { id: "small", contextLength: 20_000, maxOutputTokens: 2_000 },
237
+ ],
238
+ },
239
+ },
240
+ },
241
+ }),
242
+ );
243
+
244
+ expect(calls).toBe(9);
245
+ expect(seenAtDispatch).toHaveLength(9);
246
+ expect(preparedOffsets).toEqual([0, 2, 4, 6, 8, 10, 12, 14, 16]);
247
+ expect(Math.max(...seenAtDispatch)).toBeLessThan(7_000);
248
+ const final = recorder.latest();
249
+ expect(final).toHaveLength(18);
250
+ const toolOutputLengths = final
251
+ ?.filter((message) => message.role === "tool")
252
+ .map((message) => JSON.stringify(message).length);
253
+ expect(
254
+ toolOutputLengths?.filter((length) => length < 1_000).length,
255
+ ).toBeGreaterThanOrEqual(4);
256
+ });
257
+
181
258
  it("commits base + cumulative response.messages per step, preserving accepted outputs in later turns", async () => {
182
259
  let call = 0;
183
260
  state.model = new MockLanguageModelV3({
@@ -353,14 +430,15 @@ describe("critical failure modes (real SDK)", () => {
353
430
  const { recorder, checkpoints } = fakeRecorder();
354
431
  state.model = new MockLanguageModelV3({
355
432
  modelId: MODEL,
356
- // summarizeConversation runs generateText (doGenerate) for the summary.
357
- doGenerate: async () => ({
358
- content: [{ type: "text", text: "A compact summary" }],
359
- finishReason: { unified: "stop", raw: "stop" },
360
- usage,
361
- warnings: [],
362
- }),
363
- doStream: async () => {
433
+ doStream: async (options) => {
434
+ if (isSummaryCall(options)) {
435
+ return streamOf([
436
+ { type: "text-start", id: "s" },
437
+ { type: "text-delta", id: "s", delta: "A compact summary" },
438
+ { type: "text-end", id: "s" },
439
+ finishChunk(),
440
+ ]);
441
+ }
364
442
  call++;
365
443
  if (call === 1) {
366
444
  const err = new Error(
@@ -440,6 +518,9 @@ describe("critical failure modes (real SDK)", () => {
440
518
  // Every commit is the base optionally extended, never base + base.
441
519
  const base = checkpoints[0]?.messages ?? [];
442
520
  expect(base.length).toBeGreaterThan(0);
521
+ expect(checkpoints.at(-1)?.messages.map((message) => message.role)).toEqual(
522
+ ["user", "assistant", "tool"],
523
+ );
443
524
  for (const c of checkpoints) {
444
525
  expect(c.messages.slice(0, base.length)).toEqual(base);
445
526
  expect(c.messages.slice(base.length, base.length * 2)).not.toEqual(base);
@@ -155,58 +155,92 @@ describe("isRepairFailClosedTool", () => {
155
155
  });
156
156
 
157
157
  describe("buildReasoningProviderOptions", () => {
158
- it("sets the bedrock reasoningConfig (and anthropic.thinking) for a Bedrock Claude model when thinking is enabled", () => {
159
- // Console sandbox agents run on Bedrock; this is the path the bug starved.
160
- const result = buildReasoningProviderOptions(
161
- "global.anthropic.claude-opus-4-6-v1",
162
- { enableThinking: true },
163
- );
164
- expect(result).toEqual({
165
- anthropic: { thinking: { type: "adaptive" } },
158
+ it("sends Claude Haiku 5.5 max effort through Bedrock", () => {
159
+ expect(
160
+ buildReasoningProviderOptions("global.anthropic.claude-haiku-5-5", {
161
+ enableThinking: true,
162
+ thinkingEffort: "max",
163
+ }),
164
+ ).toEqual({
165
+ anthropic: {
166
+ thinking: { type: "adaptive", display: "summarized" },
167
+ effort: "max",
168
+ },
166
169
  bedrock: {
167
- reasoningConfig: { type: "adaptive", display: "summarized" },
170
+ reasoningConfig: {
171
+ type: "adaptive",
172
+ display: "summarized",
173
+ maxReasoningEffort: "max",
174
+ },
168
175
  },
169
176
  });
170
177
  });
171
178
 
172
- it("requests no thinking for the Bedrock recon model (Haiku 4.5), which rejects adaptive", () => {
173
- // Regression: Haiku 4.5 supports extended thinking but not the adaptive
174
- // type; requesting it failed recon. Non-4.6 models get no thinking.
179
+ it("uses Claude Haiku 5.5 medium effort by default and can disable thinking", () => {
175
180
  expect(
176
- buildReasoningProviderOptions(
177
- "global.anthropic.claude-haiku-4-5-20251001-v1:0",
178
- { enableThinking: true },
179
- ),
180
- ).toBeUndefined();
181
- });
182
-
183
- it("requests no thinking for pre-4.6 thinking models (Sonnet 4.5)", () => {
184
- expect(
185
- buildReasoningProviderOptions("claude-sonnet-4-5", {
181
+ buildReasoningProviderOptions("global.anthropic.claude-haiku-5-5", {
186
182
  enableThinking: true,
187
183
  }),
188
- ).toBeUndefined();
184
+ ).toEqual({
185
+ anthropic: {
186
+ thinking: { type: "adaptive", display: "summarized" },
187
+ effort: "medium",
188
+ },
189
+ bedrock: {
190
+ reasoningConfig: {
191
+ type: "adaptive",
192
+ display: "summarized",
193
+ maxReasoningEffort: "medium",
194
+ },
195
+ },
196
+ });
197
+ expect(
198
+ buildReasoningProviderOptions("global.anthropic.claude-haiku-5-5", {
199
+ enableThinking: false,
200
+ }),
201
+ ).toEqual({
202
+ anthropic: { thinking: { type: "disabled" } },
203
+ bedrock: {
204
+ reasoningConfig: { type: "disabled" },
205
+ additionalModelRequestFields: {
206
+ thinking: { type: "disabled" },
207
+ },
208
+ },
209
+ });
189
210
  });
190
211
 
191
- it("requests no thinking for pre-4.6 Opus models (Opus 4.0, 4.1, 4.5)", () => {
212
+ it("uses the documented budget mode for legacy Claude thinking", () => {
192
213
  for (const id of [
193
- "claude-opus-4-0",
214
+ "claude-sonnet-4-5",
194
215
  "claude-opus-4-20250514",
195
216
  "claude-opus-4-1-20250805",
196
217
  "claude-opus-4-5",
197
- "global.anthropic.claude-opus-4-5-20251101-v1:0",
218
+ "global.anthropic.claude-haiku-4-5-20251001-v1:0",
198
219
  ]) {
199
220
  expect(
200
221
  buildReasoningProviderOptions(id, { enableThinking: true }),
201
- ).toBeUndefined();
222
+ ).toMatchObject({
223
+ anthropic: { thinking: { type: "enabled", budgetTokens: 10000 } },
224
+ });
202
225
  }
203
226
  });
204
227
 
205
- it("returns undefined when thinking is disabled and no OpenAI effort applies", () => {
228
+ it("sends disabled thinking without an effort when the legacy toggle is off", () => {
206
229
  expect(
207
230
  buildReasoningProviderOptions("global.anthropic.claude-opus-4-6-v1", {
208
231
  enableThinking: false,
232
+ thinkingEffort: "high",
209
233
  }),
234
+ ).toMatchObject({
235
+ anthropic: { thinking: { type: "disabled" } },
236
+ bedrock: {
237
+ additionalModelRequestFields: { thinking: { type: "disabled" } },
238
+ },
239
+ });
240
+ expect(
241
+ buildReasoningProviderOptions("global.anthropic.claude-opus-4-6-v1", {
242
+ enableThinking: false,
243
+ })?.anthropic?.effort,
210
244
  ).toBeUndefined();
211
245
  });
212
246
 
@@ -252,13 +286,13 @@ describe("buildReasoningProviderOptions", () => {
252
286
  ).toEqual({ openai: { reasoningEffort: "high" } });
253
287
  });
254
288
 
255
- it("carries the adaptive-thinking effort hint on both anthropic and bedrock for a 4.6 model", () => {
289
+ it("carries adaptive effort through the native and Bedrock namespaces", () => {
256
290
  const result = buildReasoningProviderOptions(
257
291
  "global.anthropic.claude-opus-4-6-v1",
258
292
  { enableThinking: true, thinkingEffort: "low" },
259
293
  );
260
294
  expect(result?.anthropic).toEqual({
261
- thinking: { type: "adaptive" },
295
+ thinking: { type: "adaptive", display: "summarized" },
262
296
  effort: "low",
263
297
  });
264
298
  expect(result?.bedrock).toEqual({
@@ -270,39 +304,27 @@ describe("buildReasoningProviderOptions", () => {
270
304
  });
271
305
  });
272
306
 
273
- it("omits the effort hint when none is provided (model default)", () => {
274
- const result = buildReasoningProviderOptions(
275
- "global.anthropic.claude-opus-4-6-v1",
276
- { enableThinking: true },
277
- );
278
- expect(result?.anthropic).toEqual({ thinking: { type: "adaptive" } });
307
+ it("selects the documented default when legacy thinking is enabled without effort", () => {
279
308
  expect(
280
- (result?.anthropic as { effort?: string } | undefined)?.effort,
281
- ).toBeUndefined();
282
- expect(result?.bedrock?.reasoningConfig).toEqual({
283
- type: "adaptive",
284
- display: "summarized",
309
+ buildReasoningProviderOptions("global.anthropic.claude-opus-4-6-v1", {
310
+ enableThinking: true,
311
+ }),
312
+ ).toMatchObject({
313
+ anthropic: { effort: "high" },
314
+ bedrock: { reasoningConfig: { maxReasoningEffort: "high" } },
285
315
  });
286
316
  });
287
317
 
288
- it("drops the effort hint when thinking is not actually used (non-adaptive model)", () => {
289
- // Haiku 4.5 supports thinking but not adaptive; the effort hint must not
290
- // ride along on a request that requests no thinking at all.
291
- expect(
292
- buildReasoningProviderOptions(
293
- "global.anthropic.claude-haiku-4-5-20251001-v1:0",
294
- { enableThinking: true, thinkingEffort: "high" },
295
- ),
296
- ).toBeUndefined();
297
- });
298
-
299
- it("ignores the effort hint when thinking is disabled", () => {
300
- expect(
301
- buildReasoningProviderOptions("global.anthropic.claude-opus-4-6-v1", {
302
- enableThinking: false,
303
- thinkingEffort: "high",
304
- }),
305
- ).toBeUndefined();
318
+ it("does not send an effort hint on a toggle-only model", () => {
319
+ const result = buildReasoningProviderOptions(
320
+ "global.anthropic.claude-haiku-4-5-20251001-v1:0",
321
+ { enableThinking: true, thinkingEffort: "high" },
322
+ );
323
+ expect(result?.anthropic?.thinking).toEqual({
324
+ type: "enabled",
325
+ budgetTokens: 10000,
326
+ });
327
+ expect(result?.anthropic?.effort).toBeUndefined();
306
328
  });
307
329
  });
308
330