@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.
- package/README.md +38 -0
- package/bin/pensar.js +12 -4
- package/build/agent-6mzhkzxj.js +13 -0
- package/build/agent-9ymr36jt.js +13 -0
- package/build/{agent-m30a62kh.js → agent-fb1d2x2a.js} +48 -50
- package/build/agent-h8z7zb26.js +15 -0
- package/build/agent-runs-awgj4sat.js +313 -0
- package/build/{apps-x4ef2gpc.js → apps-d50kkp3g.js} +50 -58
- package/build/{auth-7ay8qgxm.js → auth-396rc66q.js} +61 -68
- package/build/blackboxAgent-j3ncq55f.js +13 -0
- package/build/blackboxPentest-aw69ect4.js +59 -0
- package/build/cli-0ym9qz7r.js +175 -0
- package/build/{cli-zav1yx5k.js → cli-2dqvgkh8.js} +990 -632
- package/build/cli-38j2jc0m.js +62 -0
- package/build/{cli-ee3axgts.js → cli-3gt761d2.js} +7 -1
- package/build/{cli-sx3jkv7p.js → cli-3p4gyc9m.js} +28872 -25951
- package/build/cli-3qznjsnr.js +14 -0
- package/build/cli-5ppxe6qz.js +355 -0
- package/build/cli-691cfgdy.js +186 -0
- package/build/{cli-x92fkt2f.js → cli-6y2mzdz2.js} +55 -97
- package/build/{cli-73k43t1r.js → cli-8s4ew1hv.js} +53 -78
- package/build/{cli-53rm0rrz.js → cli-8w8k4dph.js} +1 -1
- package/build/{cli-68260ckj.js → cli-91gs9whc.js} +1658 -1606
- package/build/{cli-7vg06q5r.js → cli-9s7snz6x.js} +135 -125
- package/build/{cli-bw2ddttk.js → cli-a1m3pmke.js} +4730 -267
- package/build/{cli-knd276ed.js → cli-bb02pjt0.js} +31 -31
- package/build/{cli-p4r7q012.js → cli-c0ha5wh1.js} +16072 -12743
- package/build/{cli-j54qa6tm.js → cli-c2k4xxaw.js} +42 -42
- package/build/{cli-k71t434r.js → cli-ec2hwkv3.js} +34 -76
- package/build/{cli-vkbzcnw1.js → cli-fapvkkbh.js} +43 -40
- package/build/cli-g06s7edq.js +11 -0
- package/build/cli-gsaf4jk3.js +280 -0
- package/build/{cli-bc05qbss.js → cli-h6y3bt60.js} +13 -21
- package/build/cli-jdrx44ge.js +14 -0
- package/build/{cli-z5c0ypg1.js → cli-jp6wytx1.js} +4 -4
- package/build/cli-mz5pk30x.js +5508 -0
- package/build/{cli-kff2bbq7.js → cli-nmg32cfd.js} +43 -43
- package/build/cli-pckpvwbd.js +22 -0
- package/build/cli-pwm29ks7.js +6337 -0
- package/build/cli-retw3rw5.js +12 -0
- package/build/cli-se8ae8z3.js +2250 -0
- package/build/{cli-dm0fc0bm.js → cli-v1sarr4y.js} +5 -9
- package/build/cli-v9rrvh12.js +429 -0
- package/build/{cli-3py0a0wg.js → cli-vfta27tv.js} +206 -136
- package/build/cli-xcy2vxj2.js +1732 -0
- package/build/{cli-y3dpm18e.js → cli-xn12g67s.js} +75 -92
- package/build/cli.js +769 -195
- package/build/{config-4kzh88xz.js → config-hddxxr27.js} +16 -19
- package/build/{doctor-rz7sx6ev.js → doctor-z94afr10.js} +26 -15
- package/build/export-trajectory-rt4tf07k.js +112 -0
- package/build/{fastStrike-a54atjc8.js → fastStrike-mgws2nav.js} +56 -31
- package/build/{fixes-fv66yn1z.js → fixes-9qtsvwxx.js} +22 -30
- package/build/{getMachineId-bsd-xj3bn2fv.js → getMachineId-bsd-zr67nd9p.js} +5 -5
- package/build/{getMachineId-darwin-07jzjcx6.js → getMachineId-darwin-fd1d562d.js} +5 -5
- package/build/{getMachineId-linux-ahngynxd.js → getMachineId-linux-kjmg243j.js} +4 -4
- package/build/{getMachineId-unsupported-vy43b44z.js → getMachineId-unsupported-n4r58vke.js} +4 -4
- package/build/{getMachineId-win-8x66cynz.js → getMachineId-win-yzgpfsrb.js} +5 -5
- package/build/index-0d05xcz4.js +25 -0
- package/build/index-0ef0j7yp.js +12 -0
- package/build/index-557xary4.js +121 -0
- package/build/index-a0bxw5zq.js +17477 -0
- package/build/{index-cbwn03kz.js → index-a2xycbjs.js} +12 -31
- package/build/{index-psqjpw5m.js → index-c1h0g35p.js} +11 -11
- package/build/index-cfbd4zej.js +17 -0
- package/build/index-mqaw1ac6.js +9 -0
- package/build/{index-kyd1jm89.js → index-nfhetcq8.js} +159 -169
- package/build/index-qnyevb6q.js +1563 -0
- package/build/{index-fpwr10qm.js → index-wyn4g2c1.js} +5048 -3786
- package/build/index-zbq3rvwx.js +36 -0
- package/build/index-zhr65sg3.js +102 -0
- package/build/{issues-019678t0.js → issues-9zdszfq8.js} +51 -47
- package/build/knowledge-r6rmer3d.js +139 -0
- package/build/lib/chunk-02awpt3c.js +431 -0
- package/build/lib/chunk-0me4mrrd.js +7150 -0
- package/build/lib/chunk-2j49k090.js +922 -0
- package/build/lib/chunk-2njv7wz3.js +178 -0
- package/build/lib/chunk-2t65f749.js +1412 -0
- package/build/lib/chunk-3502z798.js +9232 -0
- package/build/lib/chunk-3q89v4xv.js +21 -0
- package/build/lib/chunk-3w05jmk6.js +685 -0
- package/build/lib/chunk-48zms2q1.js +572 -0
- package/build/lib/chunk-4ydrmwd9.js +980 -0
- package/build/lib/chunk-517rf135.js +143 -0
- package/build/lib/chunk-5cp1fp0x.js +186 -0
- package/build/lib/chunk-7gjdygcx.js +171 -0
- package/build/lib/chunk-8vhr65w3.js +272 -0
- package/build/lib/chunk-9nsrd4xg.js +12 -0
- package/build/lib/chunk-asbemhm5.js +56 -0
- package/build/lib/chunk-b8eq85d2.js +143 -0
- package/build/lib/chunk-bx94rwt5.js +24 -0
- package/build/lib/chunk-eb4h4k1f.js +213 -0
- package/build/lib/chunk-ebkq3bcq.js +102 -0
- package/build/lib/chunk-esymacwg.js +14 -0
- package/build/lib/chunk-f04pr76h.js +317 -0
- package/build/lib/chunk-fy3bbbqy.js +7896 -0
- package/build/lib/chunk-g8d2x00m.js +2429 -0
- package/build/lib/chunk-ja7j565c.js +743 -0
- package/build/lib/chunk-jah67hkt.js +120 -0
- package/build/lib/chunk-jdjagvgr.js +85 -0
- package/build/lib/chunk-k5m5rasy.js +439 -0
- package/build/lib/chunk-mp1czx2y.js +510 -0
- package/build/lib/chunk-mrjbsaf4.js +31 -0
- package/build/lib/chunk-mv74mq5n.js +59 -0
- package/build/lib/chunk-n0ba7khr.js +64 -0
- package/build/lib/chunk-ngp6p527.js +317 -0
- package/build/lib/chunk-q5e23acz.js +52 -0
- package/build/lib/chunk-sk8xnywf.js +212 -0
- package/build/lib/chunk-t5bt5vn1.js +146 -0
- package/build/lib/chunk-tsnk2k9x.js +345 -0
- package/build/lib/chunk-vt9spgd1.js +62 -0
- package/build/lib/chunk-vx228eeq.js +82 -0
- package/build/lib/chunk-wr6ke041.js +11157 -0
- package/build/lib/chunk-xcdtrzk5.js +27 -0
- package/build/lib/chunk-xpfg2fbk.js +90 -0
- package/build/lib/chunk-zrbqn62x.js +697 -0
- package/build/lib/core/agents/agentRuntime.d.ts +47 -0
- package/build/lib/core/agents/defineAgent.d.ts +82 -0
- package/build/lib/core/agents/offSecAgent/index.d.ts +9 -0
- package/build/lib/core/agents/offSecAgent/index.js +225 -0
- package/build/lib/core/agents/offSecAgent/interruptedStepFinalization.d.ts +23 -0
- package/build/lib/core/agents/offSecAgent/interruptedStepMessages.d.ts +42 -0
- package/build/lib/core/agents/offSecAgent/messagePersistence.d.ts +39 -0
- package/build/lib/core/agents/offSecAgent/offensiveSecurityAgent.d.ts +233 -0
- package/build/lib/core/agents/offSecAgent/prompt.d.ts +35 -0
- package/build/lib/core/agents/offSecAgent/recordedTools.d.ts +11 -0
- package/build/lib/core/agents/offSecAgent/runtimeContext.d.ts +43 -0
- package/build/lib/core/agents/offSecAgent/streamDiagnostics.d.ts +67 -0
- package/build/lib/core/agents/offSecAgent/subagentSpawner.d.ts +223 -0
- package/build/lib/core/agents/offSecAgent/subagentSpawner.js +19 -0
- package/build/lib/core/agents/offSecAgent/toolLifecycle.d.ts +54 -0
- package/build/lib/core/agents/offSecAgent/tools/__tests__/sandboxScript.d.ts +1 -0
- package/build/lib/core/agents/offSecAgent/tools/addMemory.d.ts +16 -0
- package/build/lib/core/agents/offSecAgent/tools/agentScratch.d.ts +17 -0
- package/build/lib/core/agents/offSecAgent/tools/applyPatch.d.ts +8 -0
- package/build/lib/core/agents/offSecAgent/tools/applyPatchImpl.d.ts +24 -0
- package/build/lib/core/agents/offSecAgent/tools/askUserQuestions.d.ts +42 -0
- package/build/lib/core/agents/offSecAgent/tools/browserHeaderRouting.d.ts +9 -0
- package/build/lib/core/agents/offSecAgent/tools/browserToolFactories.d.ts +40 -0
- package/build/lib/core/agents/offSecAgent/tools/browserTools.d.ts +96 -0
- package/build/lib/core/agents/offSecAgent/tools/callbackListener.d.ts +212 -0
- package/build/lib/core/agents/offSecAgent/tools/camoufox.d.ts +106 -0
- package/build/lib/core/agents/offSecAgent/tools/checkpointState.d.ts +17 -0
- package/build/lib/core/agents/offSecAgent/tools/completeAuthentication.d.ts +39 -0
- package/build/lib/core/agents/offSecAgent/tools/crawlAuthenticated.d.ts +36 -0
- package/build/lib/core/agents/offSecAgent/tools/createAttackSurfaceReport.d.ts +31 -0
- package/build/lib/core/agents/offSecAgent/tools/createFile.d.ts +12 -0
- package/build/lib/core/agents/offSecAgent/tools/createTask.d.ts +20 -0
- package/build/lib/core/agents/offSecAgent/tools/delegateAuth.d.ts +72 -0
- package/build/lib/core/agents/offSecAgent/tools/deleteFile.d.ts +10 -0
- package/build/lib/core/agents/offSecAgent/tools/destructiveGuard.d.ts +94 -0
- package/build/lib/core/agents/offSecAgent/tools/detectAuthScheme.d.ts +72 -0
- package/build/lib/core/agents/offSecAgent/tools/documentApp.d.ts +38 -0
- package/build/lib/core/agents/offSecAgent/tools/documentEndpoint.d.ts +111 -0
- package/build/lib/core/agents/offSecAgent/tools/documentFinding.d.ts +285 -0
- package/build/lib/core/agents/offSecAgent/tools/email/adapters.d.ts +45 -0
- package/build/lib/core/agents/offSecAgent/tools/email/adapters.js +8 -0
- package/build/lib/core/agents/offSecAgent/tools/email/getAttachments.d.ts +33 -0
- package/build/lib/core/agents/offSecAgent/tools/email/getMessage.d.ts +20 -0
- package/build/lib/core/agents/offSecAgent/tools/email/index.d.ts +145 -0
- package/build/lib/core/agents/offSecAgent/tools/email/listInboxes.d.ts +23 -0
- package/build/lib/core/agents/offSecAgent/tools/email/listMessages.d.ts +22 -0
- package/build/lib/core/agents/offSecAgent/tools/email/markRead.d.ts +20 -0
- package/build/lib/core/agents/offSecAgent/tools/email/searchMessages.d.ts +24 -0
- package/build/lib/core/agents/offSecAgent/tools/email/sendEmail.d.ts +28 -0
- package/build/lib/core/agents/offSecAgent/tools/email/types.d.ts +40 -0
- package/build/lib/core/agents/offSecAgent/tools/email/types.js +0 -0
- package/build/lib/core/agents/offSecAgent/tools/executeCommand.d.ts +84 -0
- package/build/lib/core/agents/offSecAgent/tools/extractJsEndpoints.d.ts +13 -0
- package/build/lib/core/agents/offSecAgent/tools/fileWorkspace.d.ts +21 -0
- package/build/lib/core/agents/offSecAgent/tools/fileWorkspaceRemote.d.ts +13 -0
- package/build/lib/core/agents/offSecAgent/tools/getMemory.d.ts +12 -0
- package/build/lib/core/agents/offSecAgent/tools/getPage.d.ts +17 -0
- package/build/lib/core/agents/offSecAgent/tools/gitDiff.d.ts +12 -0
- package/build/lib/core/agents/offSecAgent/tools/gitStatus.d.ts +10 -0
- package/build/lib/core/agents/offSecAgent/tools/glob.d.ts +8 -0
- package/build/lib/core/agents/offSecAgent/tools/globImpl.d.ts +13 -0
- package/build/lib/core/agents/offSecAgent/tools/globPattern.d.ts +7 -0
- package/build/lib/core/agents/offSecAgent/tools/grep.d.ts +10 -0
- package/build/lib/core/agents/offSecAgent/tools/grepImpl.d.ts +34 -0
- package/build/lib/core/agents/offSecAgent/tools/httpRequest.d.ts +70 -0
- package/build/lib/core/agents/offSecAgent/tools/index.d.ts +466 -0
- package/build/lib/core/agents/offSecAgent/tools/index.js +262 -0
- package/build/lib/core/agents/offSecAgent/tools/listFiles.d.ts +9 -0
- package/build/lib/core/agents/offSecAgent/tools/listFilesImpl.d.ts +27 -0
- package/build/lib/core/agents/offSecAgent/tools/listMemories.d.ts +13 -0
- package/build/lib/core/agents/offSecAgent/tools/listPromptInjections.d.ts +18 -0
- package/build/lib/core/agents/offSecAgent/tools/listTasks.d.ts +24 -0
- package/build/lib/core/agents/offSecAgent/tools/patchApply.d.ts +24 -0
- package/build/lib/core/agents/offSecAgent/tools/patchParse.d.ts +24 -0
- package/build/lib/core/agents/offSecAgent/tools/perCommandShell.d.ts +82 -0
- package/build/lib/core/agents/offSecAgent/tools/playwrightMcp.d.ts +369 -0
- package/build/lib/core/agents/offSecAgent/tools/probeAuthEndpoints.d.ts +28 -0
- package/build/lib/core/agents/offSecAgent/tools/profileCodebase.d.ts +33 -0
- package/build/lib/core/agents/offSecAgent/tools/provideComparisonResults.d.ts +31 -0
- package/build/lib/core/agents/offSecAgent/tools/queryWhiteboxCatalog.d.ts +17 -0
- package/build/lib/core/agents/offSecAgent/tools/readFile.d.ts +11 -0
- package/build/lib/core/agents/offSecAgent/tools/readFileImpl.d.ts +31 -0
- package/build/lib/core/agents/offSecAgent/tools/readSkill.d.ts +15 -0
- package/build/lib/core/agents/offSecAgent/tools/reportError.d.ts +31 -0
- package/build/lib/core/agents/offSecAgent/tools/response.d.ts +15 -0
- package/build/lib/core/agents/offSecAgent/tools/runAttackSurface.d.ts +81 -0
- package/build/lib/core/agents/offSecAgent/tools/runCodeQuery.d.ts +44 -0
- package/build/lib/core/agents/offSecAgent/tools/runPentestWorkflow.d.ts +32 -0
- package/build/lib/core/agents/offSecAgent/tools/runWhiteboxScan.d.ts +52 -0
- package/build/lib/core/agents/offSecAgent/tools/sandbox.d.ts +30 -0
- package/build/lib/core/agents/offSecAgent/tools/sandboxPlaywright.d.ts +137 -0
- package/build/lib/core/agents/offSecAgent/tools/sandboxScript.d.ts +6 -0
- package/build/lib/core/agents/offSecAgent/tools/scopeGuard.d.ts +91 -0
- package/build/lib/core/agents/offSecAgent/tools/scriptSyntaxCheck.d.ts +45 -0
- package/build/lib/core/agents/offSecAgent/tools/smsInbox.d.ts +67 -0
- package/build/lib/core/agents/offSecAgent/tools/smsInbox.js +6 -0
- package/build/lib/core/agents/offSecAgent/tools/smsListMessages.d.ts +29 -0
- package/build/lib/core/agents/offSecAgent/tools/spawnCodingAgent.d.ts +43 -0
- package/build/lib/core/agents/offSecAgent/tools/spawnPentestAgent.d.ts +51 -0
- package/build/lib/core/agents/offSecAgent/tools/spawnPentestSwarm.d.ts +52 -0
- package/build/lib/core/agents/offSecAgent/tools/submitPlan.d.ts +12 -0
- package/build/lib/core/agents/offSecAgent/tools/testEndpointVariations.d.ts +34 -0
- package/build/lib/core/agents/offSecAgent/tools/threatModelGenerator.d.ts +32 -0
- package/build/lib/core/agents/offSecAgent/tools/toolOutput.d.ts +23 -0
- package/build/lib/core/agents/offSecAgent/tools/types.d.ts +215 -0
- package/build/lib/core/agents/offSecAgent/tools/updateFile.d.ts +14 -0
- package/build/lib/core/agents/offSecAgent/tools/updateTask.d.ts +20 -0
- package/build/lib/core/agents/offSecAgent/tools/validateDiscovery.d.ts +24 -0
- package/build/lib/core/agents/offSecAgent/tools/webSearch.d.ts +16 -0
- package/build/lib/core/agents/offSecAgent/tools/whiteboxCandidates.d.ts +108 -0
- package/build/lib/core/agents/offSecAgent/tools/whiteboxJobs.d.ts +157 -0
- package/build/lib/core/agents/offSecAgent/tools/windowsCurl.d.ts +20 -0
- package/build/lib/core/agents/offSecAgent/tools/workspaceApps.d.ts +120 -0
- package/build/lib/core/agents/offSecAgent/tools/workspaceDomains.d.ts +22 -0
- package/build/lib/core/agents/offSecAgent/tools/workspaceFailure.d.ts +6 -0
- package/build/lib/core/agents/offSecAgent/tools/writePlan.d.ts +13 -0
- package/build/lib/core/agents/offSecAgent/trace.d.ts +268 -0
- package/build/lib/core/agents/offSecAgent/types.d.ts +543 -0
- package/build/lib/core/agents/offSecAgent/types.js +7 -0
- package/build/lib/core/agents/specialized/attackSurface/blackboxAgent.d.ts +66 -0
- package/build/lib/core/agents/specialized/attackSurface/blackboxAgent.js +33 -0
- package/build/lib/core/agents/specialized/attackSurface/blackboxRiskScoring.d.ts +30 -0
- package/build/lib/core/agents/specialized/attackSurface/grpcSchema.d.ts +93 -0
- package/build/lib/core/agents/specialized/attackSurface/jsExtraction.d.ts +42 -0
- package/build/lib/core/agents/specialized/attackSurface/prompts.d.ts +1 -0
- package/build/lib/core/agents/specialized/attackSurface/schemas.d.ts +284 -0
- package/build/lib/core/agents/specialized/attackSurface/schemas.js +144 -0
- package/build/lib/core/agents/specialized/attackSurface/types.d.ts +32 -0
- package/build/lib/core/agents/specialized/authenticationAgent/agent.d.ts +73 -0
- package/build/lib/core/agents/specialized/authenticationAgent/index.d.ts +4 -0
- package/build/lib/core/agents/specialized/authenticationAgent/index.js +71 -0
- package/build/lib/core/agents/specialized/authenticationAgent/prompts.d.ts +10 -0
- package/build/lib/core/agents/specialized/authenticationAgent/types.d.ts +620 -0
- package/build/lib/core/agents/specialized/benchmark/comparisonAgent.d.ts +10 -0
- package/build/lib/core/agents/specialized/benchmark/docker-utils.d.ts +17 -0
- package/build/lib/core/agents/specialized/benchmark/flag-detector.d.ts +60 -0
- package/build/lib/core/agents/specialized/benchmark/index.d.ts +8 -0
- package/build/lib/core/agents/specialized/benchmark/prompts.d.ts +1 -0
- package/build/lib/core/agents/specialized/benchmark/remote/circuit-breaker.d.ts +22 -0
- package/build/lib/core/agents/specialized/benchmark/remote/daytona-wrapper.d.ts +33 -0
- package/build/lib/core/agents/specialized/benchmark/remote/index.d.ts +2 -0
- package/build/lib/core/agents/specialized/benchmark/types.d.ts +92 -0
- package/build/lib/core/agents/specialized/benchmarkComparisonAgent.d.ts +27 -0
- package/build/lib/core/agents/specialized/codeAgent/agent.d.ts +50 -0
- package/build/lib/core/agents/specialized/codeAgent/agent.js +31 -0
- package/build/lib/core/agents/specialized/codeAgent/prompts.d.ts +1 -0
- package/build/lib/core/agents/specialized/codeAgent/schemas.d.ts +11 -0
- package/build/lib/core/agents/specialized/codeAgent/schemas.js +10 -0
- package/build/lib/core/agents/specialized/cvssScorer/index.d.ts +56 -0
- package/build/lib/core/agents/specialized/environment/agent.d.ts +43 -0
- package/build/lib/core/agents/specialized/environment/index.d.ts +4 -0
- package/build/lib/core/agents/specialized/environment/prompts.d.ts +10 -0
- package/build/lib/core/agents/specialized/environment/types.d.ts +37 -0
- package/build/lib/core/agents/specialized/findingJudge/agent.d.ts +22 -0
- package/build/lib/core/agents/specialized/findingJudge/agent.js +224 -0
- package/build/lib/core/agents/specialized/findingJudge/index.d.ts +31 -0
- package/build/lib/core/agents/specialized/findingJudge/index.js +13 -0
- package/build/lib/core/agents/specialized/findingJudge/prompts.d.ts +3 -0
- package/build/lib/core/agents/specialized/findingJudge/types.d.ts +77 -0
- package/build/lib/core/agents/specialized/googleSignInPrompt.d.ts +4 -0
- package/build/lib/core/agents/specialized/mobileOtpPrompt.d.ts +1 -0
- package/build/lib/core/agents/specialized/patching/agent.d.ts +64 -0
- package/build/lib/core/agents/specialized/patching/index.d.ts +4 -0
- package/build/lib/core/agents/specialized/patching/index.js +44 -0
- package/build/lib/core/agents/specialized/patching/prompts.d.ts +17 -0
- package/build/lib/core/agents/specialized/patching/types.d.ts +40 -0
- package/build/lib/core/agents/specialized/pentest/agent.d.ts +172 -0
- package/build/lib/core/agents/specialized/pentest/agent.js +43 -0
- package/build/lib/core/agents/specialized/pentest/helperWorkspace.d.ts +16 -0
- package/build/lib/core/agents/specialized/pentest/planPrompt.d.ts +13 -0
- package/build/lib/core/agents/specialized/utils.d.ts +7 -0
- package/build/lib/core/agents/specialized/vulnerabilityReproduction/agent.d.ts +94 -0
- package/build/lib/core/agents/specialized/whiteboxAttackSurface/agent.d.ts +148 -0
- package/build/lib/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.d.ts +61 -0
- package/build/lib/core/agents/specialized/whiteboxAttackSurface/index.d.ts +5 -0
- package/build/lib/core/agents/specialized/whiteboxAttackSurface/index.js +47 -0
- package/build/lib/core/agents/specialized/whiteboxAttackSurface/prompts.d.ts +34 -0
- package/build/lib/core/agents/specialized/whiteboxAttackSurface/types.d.ts +382 -0
- package/build/lib/core/agents/specialized/whiteboxAttackSurface/types.js +21 -0
- package/build/lib/core/ai/ai.d.ts +332 -0
- package/build/lib/core/ai/ai.js +68 -0
- package/build/lib/core/ai/caching.d.ts +26 -0
- package/build/lib/core/ai/compactionEvidence.d.ts +15 -0
- package/build/lib/core/ai/compactionTelemetry.d.ts +55 -0
- package/build/lib/core/ai/contextManagement.d.ts +85 -0
- package/build/lib/core/ai/index.d.ts +10 -0
- package/build/lib/core/ai/index.js +72 -0
- package/build/lib/core/ai/inference-attempt/adapters.d.ts +15 -0
- package/build/lib/core/ai/inference-attempt/builder.d.ts +31 -0
- package/build/lib/core/ai/inference-attempt/envelope.d.ts +120 -0
- package/build/lib/core/ai/inference-attempt/errors.d.ts +6 -0
- package/build/lib/core/ai/inference-attempt/identity.d.ts +13 -0
- package/build/lib/core/ai/inference-attempt/index.d.ts +36 -0
- package/build/lib/core/ai/inference-attempt/project.d.ts +21 -0
- package/build/lib/core/ai/inference-attempt/recording.d.ts +23 -0
- package/build/lib/core/ai/inference-attempt/tokens.d.ts +13 -0
- package/build/lib/core/ai/inference-attempt/validate.d.ts +2 -0
- package/build/lib/core/ai/mantle.d.ts +28 -0
- package/build/lib/core/ai/model-history.d.ts +4 -0
- package/build/lib/core/ai/models/anthropic.d.ts +2 -0
- package/build/lib/core/ai/models/bedrock.d.ts +2 -0
- package/build/lib/core/ai/models/claude-capabilities.d.ts +6 -0
- package/build/lib/core/ai/models/concentrate.d.ts +2 -0
- package/build/lib/core/ai/models/google.d.ts +2 -0
- package/build/lib/core/ai/models/inception.d.ts +2 -0
- package/build/lib/core/ai/models/index.d.ts +29 -0
- package/build/lib/core/ai/models/mantle.d.ts +2 -0
- package/build/lib/core/ai/models/openai.d.ts +2 -0
- package/build/lib/core/ai/models/openrouter.d.ts +2 -0
- package/build/lib/core/ai/models/pensar.d.ts +2 -0
- package/build/lib/core/ai/native-rollout-evidence/capture.d.ts +31 -0
- package/build/lib/core/ai/native-rollout-evidence/content.d.ts +14 -0
- package/build/lib/core/ai/native-rollout-evidence/index.d.ts +9 -0
- package/build/lib/core/ai/native-rollout-evidence/provider-metadata.d.ts +15 -0
- package/build/lib/core/ai/native-rollout-evidence/schema.d.ts +554 -0
- package/build/lib/core/ai/native-rollout-evidence/validate.d.ts +8 -0
- package/build/lib/core/ai/providers/anthropic.d.ts +2 -0
- package/build/lib/core/ai/providers/concentrate.d.ts +9 -0
- package/build/lib/core/ai/providers/custom.d.ts +3 -0
- package/build/lib/core/ai/providers/hoonify.d.ts +6 -0
- package/build/lib/core/ai/providers/openai-pro-fetch.d.ts +2 -0
- package/build/lib/core/ai/providers/pensar.d.ts +34 -0
- package/build/lib/core/ai/providers/pensarFormatters.d.ts +2 -0
- package/build/lib/core/ai/providers/pensarResponsesStream.d.ts +15 -0
- package/build/lib/core/ai/providers/pensarSSE.d.ts +23 -0
- package/build/lib/core/ai/providers/pensarSigning.d.ts +1 -0
- package/build/lib/core/ai/providers/pensarStreamUsage.d.ts +19 -0
- package/build/lib/core/ai/streamTelemetry.d.ts +22 -0
- package/build/lib/core/ai/utils.d.ts +90 -0
- package/build/lib/core/ai/utils.js +22 -0
- package/build/lib/core/api/apiClient.d.ts +7 -0
- package/build/lib/core/api/apps.d.ts +213 -0
- package/build/lib/core/api/attackSurface.d.ts +14 -0
- package/build/lib/core/api/authentication.d.ts +3 -0
- package/build/lib/core/api/benchmark.d.ts +5 -0
- package/build/lib/core/api/blackboxPentest.d.ts +11 -0
- package/build/lib/core/api/clientIdentity.d.ts +10 -0
- package/build/lib/core/api/constants.d.ts +5 -0
- package/build/lib/core/api/domains.d.ts +19 -0
- package/build/lib/core/api/environment.d.ts +16 -0
- package/build/lib/core/api/index.d.ts +41 -0
- package/build/lib/core/api/index.js +187 -0
- package/build/lib/core/api/issues.d.ts +273 -0
- package/build/lib/core/api/knowledge.d.ts +33 -0
- package/build/lib/core/api/localWorker.d.ts +4 -0
- package/build/lib/core/api/offesecAgent.d.ts +34 -0
- package/build/lib/core/api/patching.d.ts +15 -0
- package/build/lib/core/api/recordedRun.d.ts +36 -0
- package/build/lib/core/api/targetedPentest.d.ts +15 -0
- package/build/lib/core/api/targetedPentest.js +32 -0
- package/build/lib/core/api/threatModel.d.ts +1 -0
- package/build/lib/core/api/trajectoryExport.d.ts +38 -0
- package/build/lib/core/api/vulnerabilityReproduction.d.ts +10 -0
- package/build/lib/core/assets/wordlists.d.ts +31 -0
- package/build/lib/core/atif/convert.d.ts +27 -0
- package/build/lib/core/atif/index.d.ts +7 -0
- package/build/lib/core/atif/schema.d.ts +459 -0
- package/build/lib/core/atif/serialize.d.ts +2 -0
- package/build/lib/core/atif/test-fixtures.d.ts +28 -0
- package/build/lib/core/atif/validate.d.ts +12 -0
- package/build/lib/core/auth/connection.d.ts +12 -0
- package/build/lib/core/auth/device-flow.d.ts +38 -0
- package/build/lib/core/auth/gateway.d.ts +25 -0
- package/build/lib/core/auth/index.d.ts +8 -0
- package/build/lib/core/auth/signing.d.ts +14 -0
- package/build/lib/core/auth/token.d.ts +17 -0
- package/build/lib/core/auth/types.d.ts +85 -0
- package/build/lib/core/auth/workspaces.d.ts +34 -0
- package/build/lib/core/benchmark/index.d.ts +3 -0
- package/build/lib/core/benchmark/report.d.ts +3 -0
- package/build/lib/core/benchmark/runner.d.ts +3 -0
- package/build/lib/core/benchmark/types.d.ts +80 -0
- package/build/lib/core/cli/logLevelArgs.d.ts +18 -0
- package/build/lib/core/cli/model.d.ts +9 -0
- package/build/lib/core/cli/pentestMode.d.ts +5 -0
- package/build/lib/core/cli/tuiArgs.d.ts +5 -0
- package/build/lib/core/config/config.d.ts +86 -0
- package/build/lib/core/config/customProviders.d.ts +62 -0
- package/build/lib/core/config/index.d.ts +6 -0
- package/build/lib/core/config/index.js +6 -0
- package/build/lib/core/credentials/index.d.ts +2 -0
- package/build/lib/core/credentials/manager.d.ts +85 -0
- package/build/lib/core/credentials/types.d.ts +79 -0
- package/build/lib/core/doctor.d.ts +1 -0
- package/build/lib/core/eventBus.d.ts +195 -0
- package/build/lib/core/eventBus.js +6 -0
- package/build/lib/core/findings/attackSurfaceRegistry.d.ts +88 -0
- package/build/lib/core/findings/attackSurfaceRegistry.js +6 -0
- package/build/lib/core/findings/registry.d.ts +177 -0
- package/build/lib/core/findings/registry.js +21 -0
- package/build/lib/core/history.d.ts +23 -0
- package/build/lib/core/hoonify.d.ts +8 -0
- package/build/lib/core/http/parse.d.ts +50 -0
- package/build/lib/core/http/redirects.d.ts +23 -0
- package/build/lib/core/http/targetHeaders.d.ts +30 -0
- package/build/lib/core/http/targetScope.d.ts +12 -0
- package/build/lib/core/http/types.d.ts +11 -0
- package/build/lib/core/id/id.d.ts +60 -0
- package/build/lib/core/id/id.js +28 -0
- package/build/lib/core/installation/index.d.ts +25 -0
- package/build/lib/core/integrations/herdr.d.ts +13 -0
- package/build/lib/core/integrations/surface/index.d.ts +37 -0
- package/build/lib/core/integrations/surface/types.d.ts +22 -0
- package/build/lib/core/integrations/wandb/client.d.ts +23 -0
- package/build/lib/core/integrations/wandb/upload.d.ts +36 -0
- package/build/lib/core/logger/index.d.ts +62 -0
- package/build/lib/core/logger/structured.d.ts +30 -0
- package/build/lib/core/memory/index.d.ts +92 -0
- package/build/lib/core/memory/index.js +21 -0
- package/build/lib/core/messages/types.d.ts +96 -0
- package/build/lib/core/obfuscation/engine.d.ts +51 -0
- package/build/lib/core/obfuscation/index.d.ts +20 -0
- package/build/lib/core/observability/active-root-spans.d.ts +5 -0
- package/build/lib/core/observability/active-spans.d.ts +22 -0
- package/build/lib/core/observability/index.d.ts +36 -0
- package/build/lib/core/observability/index.js +27 -0
- package/build/lib/core/observability/runtime.d.ts +63 -0
- package/build/lib/core/observability/telemetry.d.ts +52 -0
- package/build/lib/core/observability/testkit.d.ts +24 -0
- package/build/lib/core/operator/approvalGate.d.ts +61 -0
- package/build/lib/core/operator/index.d.ts +9 -0
- package/build/lib/core/operator/types.d.ts +167 -0
- package/build/lib/core/plan/index.d.ts +16 -0
- package/build/lib/core/prompt-injections/index.d.ts +111 -0
- package/build/lib/core/prompt-injections/index.js +24 -0
- package/build/lib/core/providers/index.d.ts +5 -0
- package/build/lib/core/providers/types.d.ts +13 -0
- package/build/lib/core/providers/utils.d.ts +15 -0
- package/build/lib/core/providers/verify.d.ts +11 -0
- package/build/lib/core/report/builder.d.ts +9 -0
- package/build/lib/core/report/index.d.ts +7 -0
- package/build/lib/core/report/renderers/json.d.ts +2 -0
- package/build/lib/core/report/renderers/markdown.d.ts +2 -0
- package/build/lib/core/report/schemas.d.ts +115 -0
- package/build/lib/core/runtime/agentExecution.d.ts +15 -0
- package/build/lib/core/runtime/launchLocalWorker.d.ts +33 -0
- package/build/lib/core/runtime/localRunLock.d.ts +9 -0
- package/build/lib/core/runtime/localRunWorker.d.ts +18 -0
- package/build/lib/core/runtime/localWorkerEndpoint.d.ts +14 -0
- package/build/lib/core/runtime/localWorkerProtocol.d.ts +294 -0
- package/build/lib/core/runtime/localWorkerTransport.d.ts +30 -0
- package/build/lib/core/runtime/persistenceError.d.ts +9 -0
- package/build/lib/core/runtime/recordedExecution.d.ts +6 -0
- package/build/lib/core/runtime/recordedRunClient.d.ts +34 -0
- package/build/lib/core/runtime/runCheckpointStore.d.ts +11 -0
- package/build/lib/core/runtime/runContext.d.ts +48 -0
- package/build/lib/core/runtime/runControl.d.ts +44 -0
- package/build/lib/core/runtime/runControlStore.d.ts +83 -0
- package/build/lib/core/runtime/runDeadline.d.ts +4 -0
- package/build/lib/core/runtime/runEvidence.d.ts +37 -0
- package/build/lib/core/runtime/runInference.d.ts +9 -0
- package/build/lib/core/runtime/runModelStore.d.ts +27 -0
- package/build/lib/core/runtime/runObservation.d.ts +19 -0
- package/build/lib/core/runtime/runRecoveryContext.d.ts +20 -0
- package/build/lib/core/runtime/runRecoveryPlan.d.ts +38 -0
- package/build/lib/core/runtime/runRecoveryStore.d.ts +77 -0
- package/build/lib/core/runtime/runStore.d.ts +133 -0
- package/build/lib/core/runtime/runStorePath.d.ts +1 -0
- package/build/lib/core/runtime/runToolStore.d.ts +50 -0
- package/build/lib/core/runtime/runTools.d.ts +16 -0
- package/build/lib/core/runtime/sqliteControlStore.d.ts +41 -0
- package/build/lib/core/runtime/sqliteModelStore.d.ts +20 -0
- package/build/lib/core/runtime/sqliteRecoveryStore.d.ts +35 -0
- package/build/lib/core/runtime/sqliteRunStore.d.ts +8 -0
- package/build/lib/core/runtime/sqliteToolStore.d.ts +30 -0
- package/build/lib/core/runtime/testfixtures/localWorkerChild.d.ts +1 -0
- package/build/lib/core/runtime/testfixtures/localWorkerLauncher.d.ts +1 -0
- package/build/lib/core/runtime/testfixtures/recoveryChild.d.ts +1 -0
- package/build/lib/core/services/rateLimiter/index.d.ts +36 -0
- package/build/lib/core/services/rateLimiter/types.d.ts +10 -0
- package/build/lib/core/session/execution-metrics.d.ts +37 -0
- package/build/lib/core/session/index.d.ts +586 -0
- package/build/lib/core/session/index.js +36 -0
- package/build/lib/core/session/loader.d.ts +30 -0
- package/build/lib/core/session/persistence.d.ts +215 -0
- package/build/lib/core/session/persistence.js +35 -0
- package/build/lib/core/session/types.d.ts +59 -0
- package/build/lib/core/session/usage.d.ts +37 -0
- package/build/lib/core/skills/builtins/index.d.ts +13 -0
- package/build/lib/core/skills/builtins/pentest.d.ts +19 -0
- package/build/lib/core/skills/builtins/promptInjection.d.ts +2 -0
- package/build/lib/core/skills/builtins/threatModel.d.ts +11 -0
- package/build/lib/core/skills/index.d.ts +5 -0
- package/build/lib/core/skills/parser.d.ts +11 -0
- package/build/lib/core/skills/registry.d.ts +30 -0
- package/build/lib/core/skills/scanner.d.ts +12 -0
- package/build/lib/core/skills/types.d.ts +44 -0
- package/build/lib/core/skills/utils.d.ts +6 -0
- package/build/lib/core/storage/index.d.ts +248 -0
- package/build/lib/core/tasks/index.d.ts +78 -0
- package/build/lib/core/tools/backends/capture.d.ts +10 -0
- package/build/lib/core/tools/backends/collectCommand.d.ts +9 -0
- package/build/lib/core/tools/backends/helpers.d.ts +43 -0
- package/build/lib/core/tools/backends/httpTransport.d.ts +18 -0
- package/build/lib/core/tools/backends/index.d.ts +8 -0
- package/build/lib/core/tools/backends/index.js +31 -0
- package/build/lib/core/tools/backends/local.d.ts +11 -0
- package/build/lib/core/tools/backends/policy.d.ts +39 -0
- package/build/lib/core/tools/backends/resolve.d.ts +25 -0
- package/build/lib/core/tools/backends/types.d.ts +240 -0
- package/build/lib/core/tools/backends/whitebox.d.ts +6 -0
- package/build/lib/core/tools/backends/whiteboxJobs.d.ts +18 -0
- package/build/lib/core/tools/backends/windowsProgram.d.ts +4 -0
- package/build/lib/core/tools/daytonaSandbox.d.ts +14 -0
- package/build/lib/core/toolset/index.d.ts +28 -0
- package/build/lib/core/util/lazyLogger.d.ts +16 -0
- package/build/lib/core/utils/concurrency.d.ts +16 -0
- package/build/lib/core/utils/prompt.d.ts +12 -0
- package/build/lib/core/whitebox/adapters.d.ts +29 -0
- package/build/lib/core/whitebox/artifacts.d.ts +32 -0
- package/build/lib/core/whitebox/boundedProcess.d.ts +35 -0
- package/build/lib/core/whitebox/candidates.d.ts +29 -0
- package/build/lib/core/whitebox/catalog.d.ts +10 -0
- package/build/lib/core/whitebox/index.d.ts +9 -0
- package/build/lib/core/whitebox/jobKernel.d.ts +33 -0
- package/build/lib/core/whitebox/jobSupervisor.d.ts +14 -0
- package/build/lib/core/whitebox/jobs.d.ts +17 -0
- package/build/lib/core/whitebox/paths.d.ts +22 -0
- package/build/lib/core/whitebox/profileTransport.d.ts +10 -0
- package/build/lib/core/whitebox/profiles.d.ts +3 -0
- package/build/lib/core/whitebox/repoProfile.d.ts +4 -0
- package/build/lib/core/whitebox/types.d.ts +108 -0
- package/build/lib/core/workflows/fastStrike.d.ts +4 -0
- package/build/lib/core/workflows/pentest.d.ts +167 -0
- package/build/lib/core/workflows/pentest.js +42 -0
- package/build/lib/core/workflows/seams.d.ts +102 -0
- package/build/lib/core/workflows/seams.js +37 -0
- package/build/lib/core/workflows/threatModel.d.ts +26 -0
- package/build/lib/core/workflows/whiteboxAttackSurface.d.ts +142 -0
- package/build/lib/core/workflows/whiteboxAttackSurface.js +36 -0
- package/build/lib/index.d.ts +26 -0
- package/build/lib/index.js +96 -0
- package/build/lib/lib/attack-path/types.d.ts +9 -0
- package/build/lib/lib/cvss/calculator.d.ts +31 -0
- package/build/lib/lib/cvss/index.d.ts +24 -0
- package/build/lib/lib/cvss/index.js +24 -0
- package/build/lib/lib/cvss/macrovector-scores.d.ts +59 -0
- package/build/lib/lib/cvss/types.d.ts +114 -0
- package/build/lib/lib/cvss/types.js +8 -0
- package/build/lib/lib/cwe/cwe-catalog.d.ts +13 -0
- package/build/lib/lib/cwe/types.d.ts +28 -0
- package/build/lib/lib/cwe/validate.d.ts +15 -0
- package/build/lib/lib/evidence/types.d.ts +12 -0
- package/build/lib/util/errors.d.ts +186 -0
- package/build/lib/util/lock.d.ts +2 -0
- package/build/lib/util/name.d.ts +14 -0
- package/build/lib/util/url.d.ts +40 -0
- package/build/{logs-wzr5176k.js → logs-1r7nkzhg.js} +22 -30
- package/build/{multipart-parser-g2xxkezz.js → multipart-parser-vjjdbpd1.js} +10 -10
- package/build/native-rollout-evidence-y0vdtjje.js +135 -0
- package/build/offesecAgent-dfj42jkj.js +22 -0
- package/build/{parse-rtccymzn.js → parse-cqecqrc5.js} +0 -4
- package/build/pentest-n8k0dd5q.js +22 -0
- package/build/pentests-jh9az51h.js +143 -0
- package/build/recordedRunClient-mvendk9n.js +11 -0
- package/build/{targetedPentest-tdwtgmxm.js → targetedPentest-rgffxsgd.js} +22 -22
- package/build/{targets-763n91t7.js → targets-wn0gmdhe.js} +24 -32
- package/build/threatModel-6efzjpbv.js +21 -0
- package/build/{token-3bbp59y6.js → token-mk7t8y0y.js} +2 -2
- package/build/{token-util-6xjme11b.js → token-util-vd776hrv.js} +1 -2
- package/build/{uninstall-d33159cz.js → uninstall-cmv057jn.js} +3 -3
- package/build/{upload-9qj1kpt9.js → upload-vkkj6h54.js} +8 -14
- package/build/{utils-t7gc2903.js → utils-b1kae4f3.js} +29 -29
- package/package.json +230 -5
- package/src/cli/agent-runs.attach.test.ts +359 -0
- package/src/cli/agent-runs.test.ts +1172 -0
- package/src/cli/agent-runs.ts +430 -0
- package/src/cli/apps.test.ts +63 -0
- package/src/cli/apps.ts +526 -0
- package/src/cli/auth.ts +375 -0
- package/src/cli/command-exit.test.ts +15 -0
- package/src/cli/command-exit.ts +3 -0
- package/src/cli/config.ts +210 -0
- package/src/cli/export-trajectory.test.ts +224 -0
- package/src/cli/export-trajectory.ts +119 -0
- package/src/cli/fixes.ts +56 -0
- package/src/cli/issues.test.ts +214 -0
- package/src/cli/issues.ts +242 -0
- package/src/cli/json-output.test.ts +62 -0
- package/src/cli/knowledge.test.ts +140 -0
- package/src/cli/knowledge.ts +146 -0
- package/src/cli/launcher.test.ts +81 -0
- package/src/cli/logs.ts +111 -0
- package/src/cli/native-rollout-evidence.test.ts +322 -0
- package/src/cli/native-rollout-evidence.ts +206 -0
- package/src/cli/pentests.test.ts +194 -0
- package/src/cli/pentests.ts +159 -0
- package/src/cli/resume.test.ts +107 -0
- package/src/cli/targets.ts +125 -0
- package/src/cli/uninstall.ts +302 -0
- package/src/cli.ts +882 -0
- package/src/core/agents/agentRuntime.test.ts +242 -0
- package/src/core/agents/agentRuntime.ts +120 -0
- package/src/core/agents/defineAgent.ts +134 -0
- package/src/core/agents/offSecAgent/index.ts +162 -0
- package/src/core/agents/offSecAgent/interruptedStepFinalization.test.ts +295 -0
- package/src/core/agents/offSecAgent/interruptedStepFinalization.ts +162 -0
- package/src/core/agents/offSecAgent/interruptedStepMessages.test.ts +296 -0
- package/src/core/agents/offSecAgent/interruptedStepMessages.ts +137 -0
- package/src/core/agents/offSecAgent/messagePersistence.test.ts +281 -0
- package/src/core/agents/offSecAgent/messagePersistence.ts +111 -0
- package/src/core/agents/offSecAgent/offensiveSecurityAgent.runtimeContext.test.ts +689 -0
- package/src/core/agents/offSecAgent/offensiveSecurityAgent.test.ts +2899 -0
- package/src/core/agents/offSecAgent/offensiveSecurityAgent.ts +1610 -0
- package/src/core/agents/offSecAgent/prompt.test.ts +72 -0
- package/src/core/agents/offSecAgent/prompt.ts +368 -0
- package/src/core/agents/offSecAgent/recordedTools.test.ts +580 -0
- package/src/core/agents/offSecAgent/recordedTools.ts +162 -0
- package/src/core/agents/offSecAgent/runtimeContext.test.ts +531 -0
- package/src/core/agents/offSecAgent/runtimeContext.ts +387 -0
- package/src/core/agents/offSecAgent/selectiveConstruction.publicPath.test.ts +295 -0
- package/src/core/agents/offSecAgent/selectiveConstruction.test.ts +498 -0
- package/src/core/agents/offSecAgent/streamDiagnostics.test.ts +310 -0
- package/src/core/agents/offSecAgent/streamDiagnostics.ts +237 -0
- package/src/core/agents/offSecAgent/subagentSpawner.hooks.test.ts +102 -0
- package/src/core/agents/offSecAgent/subagentSpawner.test.ts +384 -0
- package/src/core/agents/offSecAgent/subagentSpawner.ts +664 -0
- package/src/core/agents/offSecAgent/toolLifecycle.test.ts +199 -0
- package/src/core/agents/offSecAgent/toolLifecycle.ts +171 -0
- package/src/core/agents/offSecAgent/tools/__tests__/sandboxScript.ts +14 -0
- package/src/core/agents/offSecAgent/tools/addMemory.ts +87 -0
- package/src/core/agents/offSecAgent/tools/agentScratch.test.ts +36 -0
- package/src/core/agents/offSecAgent/tools/agentScratch.ts +23 -0
- package/src/core/agents/offSecAgent/tools/applyPatch.test.ts +546 -0
- package/src/core/agents/offSecAgent/tools/applyPatch.ts +58 -0
- package/src/core/agents/offSecAgent/tools/applyPatchImpl.ts +300 -0
- package/src/core/agents/offSecAgent/tools/askUserQuestions.ts +81 -0
- package/src/core/agents/offSecAgent/tools/authBackendStatus.test.ts +112 -0
- package/src/core/agents/offSecAgent/tools/browserHeaderRouting.test.ts +136 -0
- package/src/core/agents/offSecAgent/tools/browserHeaderRouting.ts +81 -0
- package/src/core/agents/offSecAgent/tools/browserToolFactories.ts +372 -0
- package/src/core/agents/offSecAgent/tools/browserTools.test.ts +243 -0
- package/src/core/agents/offSecAgent/tools/browserTools.ts +285 -0
- package/src/core/agents/offSecAgent/tools/callbackListener.test.ts +1011 -0
- package/src/core/agents/offSecAgent/tools/callbackListener.ts +1038 -0
- package/src/core/agents/offSecAgent/tools/camoufox.test.ts +119 -0
- package/src/core/agents/offSecAgent/tools/camoufox.ts +199 -0
- package/src/core/agents/offSecAgent/tools/checkpointState.ts +79 -0
- package/src/core/agents/offSecAgent/tools/codingTools.windows.test.ts +625 -0
- package/src/core/agents/offSecAgent/tools/completeAuthentication.ts +136 -0
- package/src/core/agents/offSecAgent/tools/crawlAuthenticated.test.ts +267 -0
- package/src/core/agents/offSecAgent/tools/crawlAuthenticated.ts +170 -0
- package/src/core/agents/offSecAgent/tools/createAttackSurfaceReport.ts +75 -0
- package/src/core/agents/offSecAgent/tools/createFile.test.ts +111 -0
- package/src/core/agents/offSecAgent/tools/createFile.ts +44 -0
- package/src/core/agents/offSecAgent/tools/createTask.ts +118 -0
- package/src/core/agents/offSecAgent/tools/delegateAuth.ts +391 -0
- package/src/core/agents/offSecAgent/tools/deleteFile.test.ts +102 -0
- package/src/core/agents/offSecAgent/tools/deleteFile.ts +39 -0
- package/src/core/agents/offSecAgent/tools/destructiveGuard.test.ts +827 -0
- package/src/core/agents/offSecAgent/tools/destructiveGuard.ts +747 -0
- package/src/core/agents/offSecAgent/tools/detectAuthScheme.ts +191 -0
- package/src/core/agents/offSecAgent/tools/documentApp.ts +242 -0
- package/src/core/agents/offSecAgent/tools/documentEndpoint.ts +291 -0
- package/src/core/agents/offSecAgent/tools/documentFinding.test.ts +2091 -0
- package/src/core/agents/offSecAgent/tools/documentFinding.ts +1240 -0
- package/src/core/agents/offSecAgent/tools/email/adapters.test.ts +279 -0
- package/src/core/agents/offSecAgent/tools/email/adapters.ts +1121 -0
- package/src/core/agents/offSecAgent/tools/email/getAttachments.ts +73 -0
- package/src/core/agents/offSecAgent/tools/email/getMessage.ts +56 -0
- package/src/core/agents/offSecAgent/tools/email/inboxBackend.test.ts +137 -0
- package/src/core/agents/offSecAgent/tools/email/index.ts +55 -0
- package/src/core/agents/offSecAgent/tools/email/listInboxes.ts +47 -0
- package/src/core/agents/offSecAgent/tools/email/listMessages.ts +67 -0
- package/src/core/agents/offSecAgent/tools/email/markRead.ts +57 -0
- package/src/core/agents/offSecAgent/tools/email/searchMessages.ts +76 -0
- package/src/core/agents/offSecAgent/tools/email/sendEmail.ts +165 -0
- package/src/core/agents/offSecAgent/tools/email/types.ts +45 -0
- package/src/core/agents/offSecAgent/tools/executeCommand.backends.test.ts +171 -0
- package/src/core/agents/offSecAgent/tools/executeCommand.test.ts +1153 -0
- package/src/core/agents/offSecAgent/tools/executeCommand.ts +604 -0
- package/src/core/agents/offSecAgent/tools/extractJsEndpoints.ts +44 -0
- package/src/core/agents/offSecAgent/tools/fileBackends.test.ts +66 -0
- package/src/core/agents/offSecAgent/tools/fileMutations.test.ts +159 -0
- package/src/core/agents/offSecAgent/tools/fileToolBackendPurity.test.ts +72 -0
- package/src/core/agents/offSecAgent/tools/fileWorkspace.test.ts +357 -0
- package/src/core/agents/offSecAgent/tools/fileWorkspace.ts +434 -0
- package/src/core/agents/offSecAgent/tools/fileWorkspaceRemote.ts +263 -0
- package/src/core/agents/offSecAgent/tools/getMemory.ts +69 -0
- package/src/core/agents/offSecAgent/tools/getPage.test.ts +1127 -0
- package/src/core/agents/offSecAgent/tools/getPage.ts +70 -0
- package/src/core/agents/offSecAgent/tools/gitDiff.ts +67 -0
- package/src/core/agents/offSecAgent/tools/gitStatus.ts +61 -0
- package/src/core/agents/offSecAgent/tools/gitTools.test.ts +237 -0
- package/src/core/agents/offSecAgent/tools/glob.test.ts +695 -0
- package/src/core/agents/offSecAgent/tools/glob.ts +51 -0
- package/src/core/agents/offSecAgent/tools/globImpl.ts +313 -0
- package/src/core/agents/offSecAgent/tools/globPattern.ts +203 -0
- package/src/core/agents/offSecAgent/tools/grep.test.ts +922 -0
- package/src/core/agents/offSecAgent/tools/grep.ts +73 -0
- package/src/core/agents/offSecAgent/tools/grepImpl.ts +718 -0
- package/src/core/agents/offSecAgent/tools/httpBackends.test.ts +534 -0
- package/src/core/agents/offSecAgent/tools/httpRequest.test.ts +2409 -0
- package/src/core/agents/offSecAgent/tools/httpRequest.ts +425 -0
- package/src/core/agents/offSecAgent/tools/index.ts +787 -0
- package/src/core/agents/offSecAgent/tools/listFiles.bounded.test.ts +514 -0
- package/src/core/agents/offSecAgent/tools/listFiles.public-counters.test.ts +163 -0
- package/src/core/agents/offSecAgent/tools/listFiles.test.ts +521 -0
- package/src/core/agents/offSecAgent/tools/listFiles.ts +49 -0
- package/src/core/agents/offSecAgent/tools/listFilesImpl.ts +351 -0
- package/src/core/agents/offSecAgent/tools/listMemories.ts +71 -0
- package/src/core/agents/offSecAgent/tools/listPromptInjections.test.ts +201 -0
- package/src/core/agents/offSecAgent/tools/listPromptInjections.ts +78 -0
- package/src/core/agents/offSecAgent/tools/listTasks.ts +100 -0
- package/src/core/agents/offSecAgent/tools/patchApply.test.ts +573 -0
- package/src/core/agents/offSecAgent/tools/patchApply.ts +430 -0
- package/src/core/agents/offSecAgent/tools/patchParse.test.ts +383 -0
- package/src/core/agents/offSecAgent/tools/patchParse.ts +354 -0
- package/src/core/agents/offSecAgent/tools/perCommandShell.drain.test.ts +109 -0
- package/src/core/agents/offSecAgent/tools/perCommandShell.test.ts +565 -0
- package/src/core/agents/offSecAgent/tools/perCommandShell.ts +516 -0
- package/src/core/agents/offSecAgent/tools/perCommandShell.windows.test.ts +142 -0
- package/src/core/agents/offSecAgent/tools/playwrightMcp.test.ts +778 -0
- package/src/core/agents/offSecAgent/tools/playwrightMcp.ts +1426 -0
- package/src/core/agents/offSecAgent/tools/probeAuthEndpoints.ts +262 -0
- package/src/core/agents/offSecAgent/tools/profileCodebase.ts +110 -0
- package/src/core/agents/offSecAgent/tools/provideComparisonResults.ts +106 -0
- package/src/core/agents/offSecAgent/tools/queryWhiteboxCatalog.coalescing-cost.test.ts +108 -0
- package/src/core/agents/offSecAgent/tools/queryWhiteboxCatalog.test.ts +183 -0
- package/src/core/agents/offSecAgent/tools/queryWhiteboxCatalog.ts +143 -0
- package/src/core/agents/offSecAgent/tools/readFile.test.ts +1242 -0
- package/src/core/agents/offSecAgent/tools/readFile.ts +89 -0
- package/src/core/agents/offSecAgent/tools/readFileImpl.ts +956 -0
- package/src/core/agents/offSecAgent/tools/readSkill.ts +38 -0
- package/src/core/agents/offSecAgent/tools/reportError.test.ts +48 -0
- package/src/core/agents/offSecAgent/tools/reportError.ts +65 -0
- package/src/core/agents/offSecAgent/tools/response.ts +27 -0
- package/src/core/agents/offSecAgent/tools/runAttackSurface.ts +198 -0
- package/src/core/agents/offSecAgent/tools/runCodeQuery.test.ts +82 -0
- package/src/core/agents/offSecAgent/tools/runCodeQuery.ts +237 -0
- package/src/core/agents/offSecAgent/tools/runPentestWorkflow.ts +122 -0
- package/src/core/agents/offSecAgent/tools/runWhiteboxScan.ts +189 -0
- package/src/core/agents/offSecAgent/tools/runtimeBackendConsumers.test.ts +143 -0
- package/src/core/agents/offSecAgent/tools/sandbox.ts +37 -0
- package/src/core/agents/offSecAgent/tools/sandboxPlaywright.test.ts +235 -0
- package/src/core/agents/offSecAgent/tools/sandboxPlaywright.ts +1029 -0
- package/src/core/agents/offSecAgent/tools/sandboxScript.test.ts +31 -0
- package/src/core/agents/offSecAgent/tools/sandboxScript.ts +60 -0
- package/src/core/agents/offSecAgent/tools/scopeGuard.test.ts +574 -0
- package/src/core/agents/offSecAgent/tools/scopeGuard.ts +317 -0
- package/src/core/agents/offSecAgent/tools/scriptSyntaxCheck.test.ts +566 -0
- package/src/core/agents/offSecAgent/tools/scriptSyntaxCheck.ts +240 -0
- package/src/core/agents/offSecAgent/tools/selectiveFactories.test.ts +476 -0
- package/src/core/agents/offSecAgent/tools/smsInbox.ts +130 -0
- package/src/core/agents/offSecAgent/tools/smsListMessages.test.ts +443 -0
- package/src/core/agents/offSecAgent/tools/smsListMessages.ts +123 -0
- package/src/core/agents/offSecAgent/tools/spawnCodingAgent.ts +229 -0
- package/src/core/agents/offSecAgent/tools/spawnPentestAgent.test.ts +413 -0
- package/src/core/agents/offSecAgent/tools/spawnPentestAgent.ts +266 -0
- package/src/core/agents/offSecAgent/tools/spawnPentestSwarm.ts +146 -0
- package/src/core/agents/offSecAgent/tools/submitPlan.ts +51 -0
- package/src/core/agents/offSecAgent/tools/testEndpointVariations.ts +127 -0
- package/src/core/agents/offSecAgent/tools/threatModelGenerator.ts +664 -0
- package/src/core/agents/offSecAgent/tools/toolOutput.test.ts +480 -0
- package/src/core/agents/offSecAgent/tools/toolOutput.ts +160 -0
- package/src/core/agents/offSecAgent/tools/types.ts +267 -0
- package/src/core/agents/offSecAgent/tools/updateFile.ts +121 -0
- package/src/core/agents/offSecAgent/tools/updateTask.ts +107 -0
- package/src/core/agents/offSecAgent/tools/validateDiscovery.ts +123 -0
- package/src/core/agents/offSecAgent/tools/webSearch.ts +265 -0
- package/src/core/agents/offSecAgent/tools/whiteboxCandidates.ts +197 -0
- package/src/core/agents/offSecAgent/tools/whiteboxJobs.ts +312 -0
- package/src/core/agents/offSecAgent/tools/windowsCurl.test.ts +801 -0
- package/src/core/agents/offSecAgent/tools/windowsCurl.ts +202 -0
- package/src/core/agents/offSecAgent/tools/workspaceApps.test.ts +257 -0
- package/src/core/agents/offSecAgent/tools/workspaceApps.ts +334 -0
- package/src/core/agents/offSecAgent/tools/workspaceDomains.test.ts +113 -0
- package/src/core/agents/offSecAgent/tools/workspaceDomains.ts +57 -0
- package/src/core/agents/offSecAgent/tools/workspaceFailure.ts +11 -0
- package/src/core/agents/offSecAgent/tools/writePlan.ts +65 -0
- package/src/core/agents/offSecAgent/trace.test.ts +796 -0
- package/src/core/agents/offSecAgent/trace.ts +633 -0
- package/src/core/agents/offSecAgent/types.test.ts +224 -0
- package/src/core/agents/offSecAgent/types.ts +676 -0
- package/src/core/agents/specialized/attackSurface/blackboxAgent.test.ts +31 -0
- package/src/core/agents/specialized/attackSurface/blackboxAgent.ts +272 -0
- package/src/core/agents/specialized/attackSurface/blackboxRiskScoring.ts +276 -0
- package/src/core/agents/specialized/attackSurface/grpcSchema.ts +142 -0
- package/src/core/agents/specialized/attackSurface/jsExtraction.test.ts +237 -0
- package/src/core/agents/specialized/attackSurface/jsExtraction.ts +174 -0
- package/src/core/agents/specialized/attackSurface/prompts.ts +349 -0
- package/src/core/agents/specialized/attackSurface/schemas.ts +300 -0
- package/src/core/agents/specialized/attackSurface/types.ts +100 -0
- package/src/core/agents/specialized/authenticationAgent/agent.test.ts +111 -0
- package/src/core/agents/specialized/authenticationAgent/agent.ts +300 -0
- package/src/core/agents/specialized/authenticationAgent/index.ts +74 -0
- package/src/core/agents/specialized/authenticationAgent/prompts.test.ts +36 -0
- package/src/core/agents/specialized/authenticationAgent/prompts.ts +645 -0
- package/src/core/agents/specialized/authenticationAgent/types.ts +833 -0
- package/src/core/agents/specialized/benchmark/comparisonAgent.ts +344 -0
- package/src/core/agents/specialized/benchmark/docker-utils.ts +257 -0
- package/src/core/agents/specialized/benchmark/flag-detector.ts +686 -0
- package/src/core/agents/specialized/benchmark/index.ts +28 -0
- package/src/core/agents/specialized/benchmark/prompts.ts +257 -0
- package/src/core/agents/specialized/benchmark/remote/circuit-breaker.ts +108 -0
- package/src/core/agents/specialized/benchmark/remote/daytona-wrapper.ts +1005 -0
- package/src/core/agents/specialized/benchmark/remote/index.ts +2 -0
- package/src/core/agents/specialized/benchmark/types.ts +98 -0
- package/src/core/agents/specialized/benchmarkComparisonAgent.test.ts +111 -0
- package/src/core/agents/specialized/benchmarkComparisonAgent.ts +203 -0
- package/src/core/agents/specialized/codeAgent/agent.test.ts +89 -0
- package/src/core/agents/specialized/codeAgent/agent.ts +134 -0
- package/src/core/agents/specialized/codeAgent/prompts.ts +48 -0
- package/src/core/agents/specialized/codeAgent/schemas.ts +33 -0
- package/src/core/agents/specialized/cvssScorer/index.test.ts +87 -0
- package/src/core/agents/specialized/cvssScorer/index.ts +546 -0
- package/src/core/agents/specialized/environment/agent.ts +75 -0
- package/src/core/agents/specialized/environment/index.ts +16 -0
- package/src/core/agents/specialized/environment/prompts.ts +194 -0
- package/src/core/agents/specialized/environment/types.ts +48 -0
- package/src/core/agents/specialized/findingJudge/agent.test.ts +114 -0
- package/src/core/agents/specialized/findingJudge/agent.ts +59 -0
- package/src/core/agents/specialized/findingJudge/index.test.ts +155 -0
- package/src/core/agents/specialized/findingJudge/index.ts +166 -0
- package/src/core/agents/specialized/findingJudge/prompts.ts +140 -0
- package/src/core/agents/specialized/findingJudge/types.ts +115 -0
- package/src/core/agents/specialized/googleSignInPrompt.test.ts +29 -0
- package/src/core/agents/specialized/googleSignInPrompt.ts +18 -0
- package/src/core/agents/specialized/mobileOtpPrompt.ts +9 -0
- package/src/core/agents/specialized/patching/agent.test.ts +220 -0
- package/src/core/agents/specialized/patching/agent.ts +146 -0
- package/src/core/agents/specialized/patching/index.ts +20 -0
- package/src/core/agents/specialized/patching/prompts.test.ts +172 -0
- package/src/core/agents/specialized/patching/prompts.ts +396 -0
- package/src/core/agents/specialized/patching/types.ts +49 -0
- package/src/core/agents/specialized/pentest/agent.test.ts +1046 -0
- package/src/core/agents/specialized/pentest/agent.ts +1482 -0
- package/src/core/agents/specialized/pentest/helperLifecycle.test.ts +425 -0
- package/src/core/agents/specialized/pentest/helperWorkspace.test.ts +84 -0
- package/src/core/agents/specialized/pentest/helperWorkspace.ts +33 -0
- package/src/core/agents/specialized/pentest/planPrompt.ts +68 -0
- package/src/core/agents/specialized/pentest/results.test.ts +198 -0
- package/src/core/agents/specialized/utils.test.ts +16 -0
- package/src/core/agents/specialized/utils.ts +28 -0
- package/src/core/agents/specialized/vulnerabilityReproduction/agent.test.ts +195 -0
- package/src/core/agents/specialized/vulnerabilityReproduction/agent.ts +159 -0
- package/src/core/agents/specialized/whiteboxAttackSurface/agent.test.ts +39 -0
- package/src/core/agents/specialized/whiteboxAttackSurface/agent.ts +227 -0
- package/src/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.concurrency.test.ts +138 -0
- package/src/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.test.ts +199 -0
- package/src/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.ts +330 -0
- package/src/core/agents/specialized/whiteboxAttackSurface/index.ts +24 -0
- package/src/core/agents/specialized/whiteboxAttackSurface/prompts.ts +345 -0
- package/src/core/agents/specialized/whiteboxAttackSurface/types.test.ts +67 -0
- package/src/core/agents/specialized/whiteboxAttackSurface/types.ts +234 -0
- package/src/core/ai/ai.contract.test.ts +43 -0
- package/src/core/ai/ai.durability-hooks.test.ts +527 -0
- package/src/core/ai/ai.effective-tools.test.ts +739 -0
- package/src/core/ai/ai.native-rollout-evidence.test.ts +373 -0
- package/src/core/ai/ai.outer-catch-recovery.test.ts +82 -0
- package/src/core/ai/ai.proactive-recovery.test.ts +69 -0
- package/src/core/ai/ai.recorded-attempts.test.ts +621 -0
- package/src/core/ai/ai.recorded-context.test.ts +448 -0
- package/src/core/ai/ai.recorded-tools.test.ts +850 -0
- package/src/core/ai/ai.request-retention.test.ts +296 -0
- package/src/core/ai/ai.test.ts +636 -0
- package/src/core/ai/ai.ts +2349 -0
- package/src/core/ai/caching.test.ts +179 -0
- package/src/core/ai/caching.ts +119 -0
- package/src/core/ai/compactionEvidence.test.ts +52 -0
- package/src/core/ai/compactionEvidence.ts +101 -0
- package/src/core/ai/compactionTelemetry.test.ts +621 -0
- package/src/core/ai/compactionTelemetry.ts +287 -0
- package/src/core/ai/concentrate.test.ts +28 -0
- package/src/core/ai/contextManagement.test.ts +350 -0
- package/src/core/ai/contextManagement.ts +594 -0
- package/src/core/ai/index.ts +73 -0
- package/src/core/ai/inference-attempt/adapters.test.ts +84 -0
- package/src/core/ai/inference-attempt/adapters.ts +391 -0
- package/src/core/ai/inference-attempt/attempt.test.ts +198 -0
- package/src/core/ai/inference-attempt/builder.ts +171 -0
- package/src/core/ai/inference-attempt/envelope.ts +120 -0
- package/src/core/ai/inference-attempt/errors.ts +15 -0
- package/src/core/ai/inference-attempt/fixtures/anthropic-messages-cache-create.json +18 -0
- package/src/core/ai/inference-attempt/fixtures/anthropic-messages-cache-read.json +18 -0
- package/src/core/ai/inference-attempt/fixtures/anthropic-messages-incomplete.json +16 -0
- package/src/core/ai/inference-attempt/fixtures/anthropic-messages-mixed.json +22 -0
- package/src/core/ai/inference-attempt/fixtures/anthropic-messages-non-cache.json +26 -0
- package/src/core/ai/inference-attempt/fixtures/bedrock-converse-cache-create.json +18 -0
- package/src/core/ai/inference-attempt/fixtures/bedrock-converse-cache-read.json +26 -0
- package/src/core/ai/inference-attempt/fixtures/bedrock-converse-incomplete.json +19 -0
- package/src/core/ai/inference-attempt/fixtures/bedrock-converse-mixed.json +20 -0
- package/src/core/ai/inference-attempt/fixtures/bedrock-converse-non-cache.json +24 -0
- package/src/core/ai/inference-attempt/fixtures/openai-responses-cache-read.json +17 -0
- package/src/core/ai/inference-attempt/fixtures/openai-responses-incomplete.json +16 -0
- package/src/core/ai/inference-attempt/fixtures/openai-responses-non-cache.json +23 -0
- package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-rest-incomplete.json +21 -0
- package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-rest-native.json +16 -0
- package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-stream-cache-create.json +20 -0
- package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-stream-cache-read.json +20 -0
- package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-stream-incomplete.json +16 -0
- package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-stream-mixed.json +21 -0
- package/src/core/ai/inference-attempt/fixtures/pensar-anthropic-stream-non-cache.json +19 -0
- package/src/core/ai/inference-attempt/fixtures/reject-cache-read-exceeds-inclusive.json +11 -0
- package/src/core/ai/inference-attempt/fixtures/reject-components-exceed-inclusive.json +12 -0
- package/src/core/ai/inference-attempt/fixtures/reject-identity-mismatch.json +13 -0
- package/src/core/ai/inference-attempt/fixtures/reject-negative-token.json +9 -0
- package/src/core/ai/inference-attempt/fixtures/reject-non-integer-token.json +8 -0
- package/src/core/ai/inference-attempt/fixtures/sdk-normalized-cache-read.json +19 -0
- package/src/core/ai/inference-attempt/fixtures/sdk-normalized-incomplete.json +15 -0
- package/src/core/ai/inference-attempt/fixtures/sdk-normalized-mixed.json +20 -0
- package/src/core/ai/inference-attempt/fixtures/sdk-normalized-non-cache.json +16 -0
- package/src/core/ai/inference-attempt/identity.ts +25 -0
- package/src/core/ai/inference-attempt/index.ts +70 -0
- package/src/core/ai/inference-attempt/project.test.ts +118 -0
- package/src/core/ai/inference-attempt/project.ts +60 -0
- package/src/core/ai/inference-attempt/recording.ts +46 -0
- package/src/core/ai/inference-attempt/tokens.ts +165 -0
- package/src/core/ai/inference-attempt/validate.ts +20 -0
- package/src/core/ai/mantle.test.ts +50 -0
- package/src/core/ai/mantle.ts +45 -0
- package/src/core/ai/model-history.test.ts +53 -0
- package/src/core/ai/model-history.ts +38 -0
- package/src/core/ai/models/anthropic.ts +145 -0
- package/src/core/ai/models/bedrock.ts +600 -0
- package/src/core/ai/models/claude-capabilities.ts +22 -0
- package/src/core/ai/models/concentrate.ts +192 -0
- package/src/core/ai/models/google.ts +154 -0
- package/src/core/ai/models/inception.ts +10 -0
- package/src/core/ai/models/index.ts +250 -0
- package/src/core/ai/models/mantle.ts +14 -0
- package/src/core/ai/models/models.test.ts +290 -0
- package/src/core/ai/models/openai.ts +409 -0
- package/src/core/ai/models/openrouter.ts +336 -0
- package/src/core/ai/models/pensar.ts +66 -0
- package/src/core/ai/native-rollout-evidence/capture.test.ts +1836 -0
- package/src/core/ai/native-rollout-evidence/capture.ts +1572 -0
- package/src/core/ai/native-rollout-evidence/content.test.ts +55 -0
- package/src/core/ai/native-rollout-evidence/content.ts +129 -0
- package/src/core/ai/native-rollout-evidence/index.ts +68 -0
- package/src/core/ai/native-rollout-evidence/provider-metadata.test.ts +85 -0
- package/src/core/ai/native-rollout-evidence/provider-metadata.ts +129 -0
- package/src/core/ai/native-rollout-evidence/recording.test.ts +398 -0
- package/src/core/ai/native-rollout-evidence/schema.test.ts +210 -0
- package/src/core/ai/native-rollout-evidence/schema.ts +353 -0
- package/src/core/ai/native-rollout-evidence/validate.ts +141 -0
- package/src/core/ai/providers/anthropic-models.test.ts +289 -0
- package/src/core/ai/providers/anthropic.ts +73 -0
- package/src/core/ai/providers/concentrate.live.test.ts +71 -0
- package/src/core/ai/providers/concentrate.test.ts +160 -0
- package/src/core/ai/providers/concentrate.ts +145 -0
- package/src/core/ai/providers/custom.live.test.ts +42 -0
- package/src/core/ai/providers/custom.test.ts +474 -0
- package/src/core/ai/providers/custom.ts +70 -0
- package/src/core/ai/providers/gateway-models.test.ts +638 -0
- package/src/core/ai/providers/hoonify.live.test.ts +72 -0
- package/src/core/ai/providers/hoonify.test.ts +284 -0
- package/src/core/ai/providers/hoonify.ts +32 -0
- package/src/core/ai/providers/openai-models.test.ts +356 -0
- package/src/core/ai/providers/openai-pro-fetch.test.ts +64 -0
- package/src/core/ai/providers/openai-pro-fetch.ts +32 -0
- package/src/core/ai/providers/pensar.ts +645 -0
- package/src/core/ai/providers/pensarFormatters.test.ts +272 -0
- package/src/core/ai/providers/pensarFormatters.ts +533 -0
- package/src/core/ai/providers/pensarResponsesStream.test.ts +191 -0
- package/src/core/ai/providers/pensarResponsesStream.ts +294 -0
- package/src/core/ai/providers/pensarSSE.test.ts +83 -0
- package/src/core/ai/providers/pensarSSE.ts +128 -0
- package/src/core/ai/providers/pensarSigning.ts +2 -0
- package/src/core/ai/providers/pensarStreamUsage.test.ts +79 -0
- package/src/core/ai/providers/pensarStreamUsage.ts +62 -0
- package/src/core/ai/stepContext.test.ts +61 -0
- package/src/core/ai/streamIdleTimeout.test.ts +390 -0
- package/src/core/ai/streamTelemetry.ts +90 -0
- package/src/core/ai/usage-callback.test.ts +511 -0
- package/src/core/ai/utils.native-rollout-evidence.test.ts +135 -0
- package/src/core/ai/utils.pensar.test.ts +59 -0
- package/src/core/ai/utils.ts +796 -0
- package/src/core/api/apiClient.test.ts +58 -0
- package/src/core/api/apiClient.ts +73 -0
- package/src/core/api/apps.test.ts +78 -0
- package/src/core/api/apps.ts +388 -0
- package/src/core/api/attackSurface.test.ts +24 -0
- package/src/core/api/attackSurface.ts +89 -0
- package/src/core/api/authentication.ts +8 -0
- package/src/core/api/benchmark.ts +35 -0
- package/src/core/api/blackboxPentest.test.ts +89 -0
- package/src/core/api/blackboxPentest.ts +64 -0
- package/src/core/api/clientIdentity.test.ts +61 -0
- package/src/core/api/clientIdentity.ts +57 -0
- package/src/core/api/comments.test.ts +69 -0
- package/src/core/api/constants.ts +15 -0
- package/src/core/api/domains.test.ts +35 -0
- package/src/core/api/domains.ts +32 -0
- package/src/core/api/environment.ts +47 -0
- package/src/core/api/index.ts +219 -0
- package/src/core/api/issues.test.ts +82 -0
- package/src/core/api/issues.ts +439 -0
- package/src/core/api/knowledge.ts +70 -0
- package/src/core/api/localWorker.ts +29 -0
- package/src/core/api/offesecAgent.test.ts +289 -0
- package/src/core/api/offesecAgent.ts +77 -0
- package/src/core/api/patching.ts +44 -0
- package/src/core/api/recordedRun.control.test.ts +830 -0
- package/src/core/api/recordedRun.inference.test.ts +529 -0
- package/src/core/api/recordedRun.loop.test.ts +290 -0
- package/src/core/api/recordedRun.recovery.test.ts +651 -0
- package/src/core/api/recordedRun.test.ts +646 -0
- package/src/core/api/recordedRun.ts +542 -0
- package/src/core/api/targetedPentest.test.ts +177 -0
- package/src/core/api/targetedPentest.ts +83 -0
- package/src/core/api/threatModel.ts +5 -0
- package/src/core/api/trajectoryExport.test.ts +299 -0
- package/src/core/api/trajectoryExport.ts +362 -0
- package/src/core/api/vulnerabilityReproduction.test.ts +56 -0
- package/src/core/api/vulnerabilityReproduction.ts +54 -0
- package/src/core/assets/wordlists.test.ts +85 -0
- package/src/core/assets/wordlists.ts +111 -0
- package/src/core/atif/compatibility.test.ts +107 -0
- package/src/core/atif/convert.test.ts +815 -0
- package/src/core/atif/convert.ts +1658 -0
- package/src/core/atif/fixtures/portable-bundle-v1.json +813 -0
- package/src/core/atif/index.ts +34 -0
- package/src/core/atif/schema.ts +345 -0
- package/src/core/atif/serialize.test.ts +244 -0
- package/src/core/atif/serialize.ts +419 -0
- package/src/core/atif/test-fixtures.ts +184 -0
- package/src/core/atif/validate.test.ts +188 -0
- package/src/core/atif/validate.ts +289 -0
- package/src/core/auth/connection.ts +26 -0
- package/src/core/auth/device-flow.ts +203 -0
- package/src/core/auth/gateway.ts +66 -0
- package/src/core/auth/index.ts +29 -0
- package/src/core/auth/signing.ts +25 -0
- package/src/core/auth/token.ts +140 -0
- package/src/core/auth/types.ts +106 -0
- package/src/core/auth/workspaces.ts +192 -0
- package/src/core/benchmark/index.ts +11 -0
- package/src/core/benchmark/report.ts +257 -0
- package/src/core/benchmark/runner.ts +698 -0
- package/src/core/benchmark/types.ts +80 -0
- package/src/core/cli/logLevelArgs.test.ts +83 -0
- package/src/core/cli/logLevelArgs.ts +62 -0
- package/src/core/cli/model.ts +35 -0
- package/src/core/cli/pentestMode.test.ts +24 -0
- package/src/core/cli/pentestMode.ts +23 -0
- package/src/core/cli/tuiArgs.test.ts +58 -0
- package/src/core/cli/tuiArgs.ts +28 -0
- package/src/core/config/config.test.ts +183 -0
- package/src/core/config/config.ts +201 -0
- package/src/core/config/customProviders.test.ts +183 -0
- package/src/core/config/customProviders.ts +190 -0
- package/src/core/config/index.ts +7 -0
- package/src/core/credentials/index.ts +6 -0
- package/src/core/credentials/manager.ts +313 -0
- package/src/core/credentials/types.ts +112 -0
- package/src/core/doctor.ts +138 -0
- package/src/core/eventBus.test.ts +374 -0
- package/src/core/eventBus.ts +410 -0
- package/src/core/findings/attackSurfaceRegistry.ts +294 -0
- package/src/core/findings/registry.test.ts +1680 -0
- package/src/core/findings/registry.ts +800 -0
- package/src/core/history.ts +82 -0
- package/src/core/hoonify.test.ts +250 -0
- package/src/core/hoonify.ts +163 -0
- package/src/core/http/headers.contract.test.ts +1161 -0
- package/src/core/http/parse.ts +257 -0
- package/src/core/http/redirects.test.ts +207 -0
- package/src/core/http/redirects.ts +145 -0
- package/src/core/http/targetHeaders.ts +604 -0
- package/src/core/http/targetScope.ts +52 -0
- package/src/core/http/types.ts +39 -0
- package/src/core/id/id.test.ts +88 -0
- package/src/core/id/id.ts +138 -0
- package/src/core/installation/index.ts +222 -0
- package/src/core/installation/installation.test.ts +415 -0
- package/src/core/integrations/herdr.test.ts +335 -0
- package/src/core/integrations/herdr.ts +163 -0
- package/src/core/integrations/surface/index.test.ts +534 -0
- package/src/core/integrations/surface/index.ts +224 -0
- package/src/core/integrations/surface/types.ts +29 -0
- package/src/core/integrations/wandb/client.ts +167 -0
- package/src/core/integrations/wandb/upload.test.ts +415 -0
- package/src/core/integrations/wandb/upload.ts +76 -0
- package/src/core/logger/errorLog.test.ts +98 -0
- package/src/core/logger/index.ts +214 -0
- package/src/core/logger/structured.test.ts +212 -0
- package/src/core/logger/structured.ts +207 -0
- package/src/core/memory/backend.test.ts +186 -0
- package/src/core/memory/index.ts +279 -0
- package/src/core/memory/memory.test.ts +362 -0
- package/src/core/messages/types.ts +141 -0
- package/src/core/obfuscation/engine.test.ts +314 -0
- package/src/core/obfuscation/engine.ts +647 -0
- package/src/core/obfuscation/index.ts +27 -0
- package/src/core/observability/active-root-spans.ts +30 -0
- package/src/core/observability/active-spans.ts +80 -0
- package/src/core/observability/index.ts +91 -0
- package/src/core/observability/log-correlation.test.ts +276 -0
- package/src/core/observability/payload-capture.test.ts +59 -0
- package/src/core/observability/runtime.test.ts +743 -0
- package/src/core/observability/runtime.ts +371 -0
- package/src/core/observability/shutdown.test.ts +551 -0
- package/src/core/observability/telemetry.test.ts +895 -0
- package/src/core/observability/telemetry.ts +220 -0
- package/src/core/observability/testkit.test.ts +66 -0
- package/src/core/observability/testkit.ts +97 -0
- package/src/core/observability/trace-contract.test.ts +1031 -0
- package/src/core/observability.test.ts +135 -0
- package/src/core/operator/approvalGate.test.ts +300 -0
- package/src/core/operator/approvalGate.ts +287 -0
- package/src/core/operator/index.ts +30 -0
- package/src/core/operator/types.ts +355 -0
- package/src/core/plan/index.ts +44 -0
- package/src/core/prompt-injections/index.test.ts +248 -0
- package/src/core/prompt-injections/index.ts +350 -0
- package/src/core/providers/index.ts +5 -0
- package/src/core/providers/types.ts +87 -0
- package/src/core/providers/utils.test.ts +189 -0
- package/src/core/providers/utils.ts +183 -0
- package/src/core/providers/verify.test.ts +49 -0
- package/src/core/providers/verify.ts +198 -0
- package/src/core/report/builder.test.ts +229 -0
- package/src/core/report/builder.ts +58 -0
- package/src/core/report/index.ts +13 -0
- package/src/core/report/renderers/json.test.ts +76 -0
- package/src/core/report/renderers/json.ts +5 -0
- package/src/core/report/renderers/markdown.test.ts +366 -0
- package/src/core/report/renderers/markdown.ts +133 -0
- package/src/core/report/schemas.ts +48 -0
- package/src/core/runtime/agentExecution.test.ts +94 -0
- package/src/core/runtime/agentExecution.ts +27 -0
- package/src/core/runtime/launchLocalWorker.test.ts +707 -0
- package/src/core/runtime/launchLocalWorker.ts +273 -0
- package/src/core/runtime/localRunLock.ts +118 -0
- package/src/core/runtime/localRunWorker.test.ts +381 -0
- package/src/core/runtime/localRunWorker.ts +287 -0
- package/src/core/runtime/localWorker.acceptance.test.ts +548 -0
- package/src/core/runtime/localWorkerEndpoint.test.ts +145 -0
- package/src/core/runtime/localWorkerEndpoint.ts +82 -0
- package/src/core/runtime/localWorkerProtocol.ts +176 -0
- package/src/core/runtime/localWorkerTransport.test.ts +841 -0
- package/src/core/runtime/localWorkerTransport.ts +434 -0
- package/src/core/runtime/persistenceError.ts +14 -0
- package/src/core/runtime/recordedExecution.ts +43 -0
- package/src/core/runtime/recordedRunClient.integration.test.ts +106 -0
- package/src/core/runtime/recordedRunClient.test.ts +677 -0
- package/src/core/runtime/recordedRunClient.ts +303 -0
- package/src/core/runtime/runCheckpointStore.ts +23 -0
- package/src/core/runtime/runContext.test.ts +445 -0
- package/src/core/runtime/runContext.ts +184 -0
- package/src/core/runtime/runControl.test.ts +923 -0
- package/src/core/runtime/runControl.ts +419 -0
- package/src/core/runtime/runControlStore.ts +106 -0
- package/src/core/runtime/runDeadline.test.ts +44 -0
- package/src/core/runtime/runDeadline.ts +28 -0
- package/src/core/runtime/runEvidence.test.ts +384 -0
- package/src/core/runtime/runEvidence.ts +267 -0
- package/src/core/runtime/runInference.test.ts +408 -0
- package/src/core/runtime/runInference.ts +125 -0
- package/src/core/runtime/runModelStore.ts +55 -0
- package/src/core/runtime/runObservation.ts +24 -0
- package/src/core/runtime/runRecoveryContext.test.ts +602 -0
- package/src/core/runtime/runRecoveryContext.ts +195 -0
- package/src/core/runtime/runRecoveryPlan.test.ts +851 -0
- package/src/core/runtime/runRecoveryPlan.ts +540 -0
- package/src/core/runtime/runRecoveryStore.ts +78 -0
- package/src/core/runtime/runStore.ts +148 -0
- package/src/core/runtime/runStorePath.ts +13 -0
- package/src/core/runtime/runToolStore.ts +66 -0
- package/src/core/runtime/runTools.crash.test.ts +414 -0
- package/src/core/runtime/runTools.test.ts +689 -0
- package/src/core/runtime/runTools.ts +208 -0
- package/src/core/runtime/sqliteControlStore.test.ts +917 -0
- package/src/core/runtime/sqliteControlStore.ts +555 -0
- package/src/core/runtime/sqliteModelStore.test.ts +619 -0
- package/src/core/runtime/sqliteModelStore.ts +286 -0
- package/src/core/runtime/sqliteRecoveryStore.public.test.ts +374 -0
- package/src/core/runtime/sqliteRecoveryStore.test.ts +836 -0
- package/src/core/runtime/sqliteRecoveryStore.ts +435 -0
- package/src/core/runtime/sqliteRunContext.test.ts +1000 -0
- package/src/core/runtime/sqliteRunObservation.test.ts +432 -0
- package/src/core/runtime/sqliteRunStore.test.ts +698 -0
- package/src/core/runtime/sqliteRunStore.ts +593 -0
- package/src/core/runtime/sqliteToolStore.test.ts +1231 -0
- package/src/core/runtime/sqliteToolStore.ts +419 -0
- package/src/core/runtime/testfixtures/localWorkerChild.ts +254 -0
- package/src/core/runtime/testfixtures/localWorkerLauncher.ts +15 -0
- package/src/core/runtime/testfixtures/recoveryChild.ts +159 -0
- package/src/core/services/rateLimiter/index.test.ts +106 -0
- package/src/core/services/rateLimiter/index.ts +157 -0
- package/src/core/services/rateLimiter/types.ts +10 -0
- package/src/core/session/admitted-config.test.ts +50 -0
- package/src/core/session/deprecated-headers-shim.test.ts +111 -0
- package/src/core/session/execution-metrics.test.ts +297 -0
- package/src/core/session/execution-metrics.ts +176 -0
- package/src/core/session/index.ts +1085 -0
- package/src/core/session/loader.ts +212 -0
- package/src/core/session/persistence.test.ts +1210 -0
- package/src/core/session/persistence.ts +1076 -0
- package/src/core/session/rehydrate.test.ts +393 -0
- package/src/core/session/types.ts +139 -0
- package/src/core/session/usage.test.ts +99 -0
- package/src/core/session/usage.ts +84 -0
- package/src/core/skills/builtins/index.ts +22 -0
- package/src/core/skills/builtins/pentest.ts +135 -0
- package/src/core/skills/builtins/promptInjection.ts +44 -0
- package/src/core/skills/builtins/threatModel.ts +336 -0
- package/src/core/skills/index.ts +15 -0
- package/src/core/skills/parser.test.ts +120 -0
- package/src/core/skills/parser.ts +106 -0
- package/src/core/skills/registry.test.ts +202 -0
- package/src/core/skills/registry.ts +109 -0
- package/src/core/skills/scanner.test.ts +157 -0
- package/src/core/skills/scanner.ts +115 -0
- package/src/core/skills/types.ts +45 -0
- package/src/core/skills/utils.ts +16 -0
- package/src/core/storage/index.ts +150 -0
- package/src/core/tasks/index.ts +242 -0
- package/src/core/tools/backends/capture.ts +38 -0
- package/src/core/tools/backends/collectCommand.test.ts +33 -0
- package/src/core/tools/backends/collectCommand.ts +28 -0
- package/src/core/tools/backends/helpers.ts +140 -0
- package/src/core/tools/backends/httpTransport.ts +534 -0
- package/src/core/tools/backends/index.ts +61 -0
- package/src/core/tools/backends/local.test.ts +307 -0
- package/src/core/tools/backends/local.ts +820 -0
- package/src/core/tools/backends/policy.test.ts +137 -0
- package/src/core/tools/backends/policy.ts +129 -0
- package/src/core/tools/backends/resolve.test.ts +309 -0
- package/src/core/tools/backends/resolve.ts +152 -0
- package/src/core/tools/backends/types.ts +279 -0
- package/src/core/tools/backends/whitebox.test.ts +275 -0
- package/src/core/tools/backends/whitebox.ts +14 -0
- package/src/core/tools/backends/whiteboxJobs.test.ts +375 -0
- package/src/core/tools/backends/whiteboxJobs.ts +157 -0
- package/src/core/tools/backends/windowsProgram.ts +36 -0
- package/src/core/tools/daytonaSandbox.test.ts +491 -0
- package/src/core/tools/daytonaSandbox.ts +232 -0
- package/src/core/toolset/index.ts +583 -0
- package/src/core/util/lazyLogger.ts +32 -0
- package/src/core/utils/concurrency.test.ts +204 -0
- package/src/core/utils/concurrency.ts +75 -0
- package/src/core/utils/prompt.ts +28 -0
- package/src/core/whitebox/adapters.ts +277 -0
- package/src/core/whitebox/artifacts.ts +128 -0
- package/src/core/whitebox/boundedProcess.ts +265 -0
- package/src/core/whitebox/candidates.ts +268 -0
- package/src/core/whitebox/catalog.ts +82 -0
- package/src/core/whitebox/index.ts +53 -0
- package/src/core/whitebox/jobKernel.test.ts +91 -0
- package/src/core/whitebox/jobKernel.ts +347 -0
- package/src/core/whitebox/jobSupervisor.ts +264 -0
- package/src/core/whitebox/jobs.ts +21 -0
- package/src/core/whitebox/paths.ts +94 -0
- package/src/core/whitebox/profileTransport.ts +225 -0
- package/src/core/whitebox/profiles.ts +294 -0
- package/src/core/whitebox/repoProfile.test.ts +217 -0
- package/src/core/whitebox/repoProfile.ts +256 -0
- package/src/core/whitebox/types.ts +189 -0
- package/src/core/whitebox/whitebox.test.ts +789 -0
- package/src/core/workflows/fastStrike.seams.test.ts +217 -0
- package/src/core/workflows/fastStrike.test.ts +29 -0
- package/src/core/workflows/fastStrike.ts +239 -0
- package/src/core/workflows/pentest.test.ts +575 -0
- package/src/core/workflows/pentest.ts +1022 -0
- package/src/core/workflows/seams.test.ts +386 -0
- package/src/core/workflows/seams.ts +276 -0
- package/src/core/workflows/threatModel.ts +108 -0
- package/src/core/workflows/usage-forwarding.test.ts +203 -0
- package/src/core/workflows/whiteboxAttackSurface.test.ts +695 -0
- package/src/core/workflows/whiteboxAttackSurface.ts +1740 -0
- package/src/index.ts +49 -0
- package/src/lib/attack-path/types.ts +13 -0
- package/src/lib/cvss/calculator.test.ts +2090 -0
- package/src/lib/cvss/calculator.ts +643 -0
- package/src/lib/cvss/index.ts +65 -0
- package/src/lib/cvss/macrovector-scores.ts +402 -0
- package/src/lib/cvss/types.ts +241 -0
- package/src/lib/cwe/cwe-catalog.ts +444 -0
- package/src/lib/cwe/types.test.ts +142 -0
- package/src/lib/cwe/types.ts +37 -0
- package/src/lib/cwe/validate.test.ts +110 -0
- package/src/lib/cwe/validate.ts +53 -0
- package/src/lib/evidence/types.ts +9 -0
- package/src/tests/agentWorkingDirectory.test.ts +175 -0
- package/src/tests/attackSurface.test.ts +35 -0
- package/src/tests/auth.test.ts +196 -0
- package/src/tests/authCookieExport.test.ts +143 -0
- package/src/tests/authPentestHandoff.test.ts +231 -0
- package/src/tests/browserCookies.test.ts +128 -0
- package/src/tests/credentialManager.test.ts +657 -0
- package/src/tests/data/console.openapi.json +1037 -0
- package/src/tests/data/console.sitemap.xml +348 -0
- package/src/tests/delegateAuthMerge.test.ts +48 -0
- package/src/tui/auto-copy.ts +36 -0
- package/src/tui/clipboard.ts +65 -0
- package/src/tui/command-registry.test.ts +124 -0
- package/src/tui/command-registry.ts +645 -0
- package/src/tui/command-router.ts +81 -0
- package/src/tui/components/agent-display.tsx +480 -0
- package/src/tui/components/ascii-art.tsx +225 -0
- package/src/tui/components/chat/approval-inline.tsx +51 -0
- package/src/tui/components/chat/config-view.tsx +279 -0
- package/src/tui/components/chat/home-view.tsx +288 -0
- package/src/tui/components/chat/index.tsx +161 -0
- package/src/tui/components/chat/input-area.tsx +529 -0
- package/src/tui/components/chat/lib/play-core/num.ts +102 -0
- package/src/tui/components/chat/lib/wave-simulation.ts +124 -0
- package/src/tui/components/chat/loading-indicator.test.ts +33 -0
- package/src/tui/components/chat/loading-indicator.tsx +115 -0
- package/src/tui/components/chat/message-list.tsx +264 -0
- package/src/tui/components/chat/petri-animation.tsx +175 -0
- package/src/tui/components/chat/plan-review-message.tsx +49 -0
- package/src/tui/components/chat/questions-form.tsx +756 -0
- package/src/tui/components/commands/__tests__/recorded-runs-lifecycle.tsx +907 -0
- package/src/tui/components/commands/advanced-settings.tsx +94 -0
- package/src/tui/components/commands/api-key-input.tsx +122 -0
- package/src/tui/components/commands/auth-flow-logic.test.ts +58 -0
- package/src/tui/components/commands/auth-flow-logic.ts +30 -0
- package/src/tui/components/commands/auth-flow.tsx +702 -0
- package/src/tui/components/commands/credits-flow.tsx +210 -0
- package/src/tui/components/commands/help-dialog.tsx +238 -0
- package/src/tui/components/commands/models-display.tsx +111 -0
- package/src/tui/components/commands/operator-wizard.tsx +328 -0
- package/src/tui/components/commands/provider-manager.tsx +241 -0
- package/src/tui/components/commands/provider-selection.tsx +129 -0
- package/src/tui/components/commands/recorded-runs.test.ts +40 -0
- package/src/tui/components/commands/recorded-runs.tsx +793 -0
- package/src/tui/components/commands/sessions-display.tsx +365 -0
- package/src/tui/components/commands/shortcuts-dialog.tsx +52 -0
- package/src/tui/components/commands/skills-dialog.tsx +308 -0
- package/src/tui/components/commands/theme-picker.tsx +177 -0
- package/src/tui/components/commands/web-wizard.tsx +965 -0
- package/src/tui/components/dialog-layout.tsx +73 -0
- package/src/tui/components/error-boundary.tsx +82 -0
- package/src/tui/components/footer.tsx +101 -0
- package/src/tui/components/input.tsx +43 -0
- package/src/tui/components/loaders.tsx +784 -0
- package/src/tui/components/model-picker/ModelPicker.tsx +907 -0
- package/src/tui/components/model-picker/ModelPickerDialog.tsx +75 -0
- package/src/tui/components/model-picker/index.ts +2 -0
- package/src/tui/components/model-picker/model-navigation.test.ts +102 -0
- package/src/tui/components/model-picker/model-navigation.ts +54 -0
- package/src/tui/components/model-picker/model-search.test.ts +62 -0
- package/src/tui/components/model-picker/model-search.ts +42 -0
- package/src/tui/components/model-picker/model-visibility.test.ts +65 -0
- package/src/tui/components/model-picker/model-visibility.ts +59 -0
- package/src/tui/components/operator-dashboard/conversation.test.ts +431 -0
- package/src/tui/components/operator-dashboard/conversation.ts +179 -0
- package/src/tui/components/operator-dashboard/display-state.test.ts +369 -0
- package/src/tui/components/operator-dashboard/display-state.ts +163 -0
- package/src/tui/components/operator-dashboard/herdr-state.test.ts +162 -0
- package/src/tui/components/operator-dashboard/herdr-state.ts +81 -0
- package/src/tui/components/operator-dashboard/index.tsx +2044 -0
- package/src/tui/components/operator-dashboard/logic.test.ts +753 -0
- package/src/tui/components/operator-dashboard/logic.ts +465 -0
- package/src/tui/components/operator-dashboard/queue.test.ts +147 -0
- package/src/tui/components/operator-dashboard/queue.ts +55 -0
- package/src/tui/components/operator-dashboard/queued-messages.tsx +50 -0
- package/src/tui/components/operator-dashboard/run-events.test.ts +913 -0
- package/src/tui/components/operator-dashboard/run-events.ts +507 -0
- package/src/tui/components/operator-dashboard/run-tracing.test.ts +206 -0
- package/src/tui/components/operator-dashboard/run-tracing.ts +105 -0
- package/src/tui/components/operator-dashboard/subagent-detail-view.tsx +51 -0
- package/src/tui/components/operator-dashboard/subagent-dialog.tsx +142 -0
- package/src/tui/components/operator-dashboard/subagent-hub.test.ts +162 -0
- package/src/tui/components/operator-dashboard/subagent-hub.tsx +266 -0
- package/src/tui/components/operator-dashboard/subagent-state.test.ts +431 -0
- package/src/tui/components/operator-dashboard/subagent-state.ts +404 -0
- package/src/tui/components/operator-dashboard/subagent-status-bar.tsx +80 -0
- package/src/tui/components/operator-dashboard/tool-argument-buffer.test.ts +317 -0
- package/src/tui/components/operator-dashboard/tool-arguments.perf.test.ts +121 -0
- package/src/tui/components/operator-dashboard/welcome-logo.tsx +79 -0
- package/src/tui/components/operator-dashboard/workflow-data.test.ts +291 -0
- package/src/tui/components/operator-dashboard/workflow-data.ts +130 -0
- package/src/tui/components/report-viewer-dialog.tsx +98 -0
- package/src/tui/components/responsible-use-disclosure.tsx +55 -0
- package/src/tui/components/screenshot-modal.tsx +204 -0
- package/src/tui/components/shared/__tests__/prompt-input-lifecycle.tsx +64 -0
- package/src/tui/components/shared/__tests__/tool-renderer-lifecycle.tsx +69 -0
- package/src/tui/components/shared/action-label.test.ts +133 -0
- package/src/tui/components/shared/action-label.ts +18 -0
- package/src/tui/components/shared/ascii-spinner.tsx +40 -0
- package/src/tui/components/shared/dialog-controls.tsx +76 -0
- package/src/tui/components/shared/index.ts +37 -0
- package/src/tui/components/shared/markdown-viewer.tsx +188 -0
- package/src/tui/components/shared/markdown.ts +239 -0
- package/src/tui/components/shared/message-renderer.tsx +178 -0
- package/src/tui/components/shared/message-utils.ts +175 -0
- package/src/tui/components/shared/pentest-workflow-display.tsx +330 -0
- package/src/tui/components/shared/prompt-input-lifecycle.test.ts +22 -0
- package/src/tui/components/shared/prompt-input-logic.test.ts +782 -0
- package/src/tui/components/shared/prompt-input-logic.ts +423 -0
- package/src/tui/components/shared/prompt-input.tsx +782 -0
- package/src/tui/components/shared/result-registry.test.ts +90 -0
- package/src/tui/components/shared/result-registry.ts +900 -0
- package/src/tui/components/shared/syntax-highlight.ts +242 -0
- package/src/tui/components/shared/tool-registry.test.ts +59 -0
- package/src/tui/components/shared/tool-registry.ts +279 -0
- package/src/tui/components/shared/tool-renderer.test.ts +13 -0
- package/src/tui/components/shared/tool-renderer.tsx +223 -0
- package/src/tui/components/shared/type-guards.ts +64 -0
- package/src/tui/components/shared/use-paste-extmarks.ts +109 -0
- package/src/tui/components/switch.tsx +81 -0
- package/src/tui/components/terminal-focus-handler.tsx +34 -0
- package/src/tui/components/toast.tsx +82 -0
- package/src/tui/components/usage-labels.test.ts +191 -0
- package/src/tui/components/usage-labels.ts +78 -0
- package/src/tui/console-theme.ts +59 -0
- package/src/tui/context/agent.tsx +251 -0
- package/src/tui/context/command.tsx +291 -0
- package/src/tui/context/config.tsx +59 -0
- package/src/tui/context/dialog.tsx +206 -0
- package/src/tui/context/dimensions.tsx +31 -0
- package/src/tui/context/focus-ownership.test.ts +26 -0
- package/src/tui/context/focus-ownership.ts +12 -0
- package/src/tui/context/focus.tsx +86 -0
- package/src/tui/context/herdr.tsx +28 -0
- package/src/tui/context/input.tsx +45 -0
- package/src/tui/context/keybinding.tsx +92 -0
- package/src/tui/context/obfuscation.tsx +114 -0
- package/src/tui/context/route.tsx +127 -0
- package/src/tui/context/session-usage.test.ts +295 -0
- package/src/tui/context/session-usage.ts +204 -0
- package/src/tui/context/session.tsx +62 -0
- package/src/tui/context/toast.tsx +66 -0
- package/src/tui/generated-ascii-art.json +1 -0
- package/src/tui/generated-ascii-art.json.d.ts +2 -0
- package/src/tui/herdr-startup.test.ts +157 -0
- package/src/tui/hooks/use-sessions-list.ts +165 -0
- package/src/tui/index.tsx +838 -0
- package/src/tui/keybindings/index.ts +126 -0
- package/src/tui/keybindings/registry.ts +146 -0
- package/src/tui/keybindings-registry.ts +43 -0
- package/src/tui/obfuscation/patch.ts +139 -0
- package/src/tui/terminal-focus.ts +218 -0
- package/src/tui/theme/colors.ts +43 -0
- package/src/tui/theme/context.tsx +137 -0
- package/src/tui/theme/detect-mode.ts +56 -0
- package/src/tui/theme/index.ts +75 -0
- package/src/tui/theme/registry.ts +29 -0
- package/src/tui/theme/themes/apex.ts +190 -0
- package/src/tui/theme/themes/ayu.ts +189 -0
- package/src/tui/theme/themes/catppuccin.ts +189 -0
- package/src/tui/theme/themes/dracula.ts +190 -0
- package/src/tui/theme/themes/everforest.ts +189 -0
- package/src/tui/theme/themes/flexoki.ts +190 -0
- package/src/tui/theme/themes/github.ts +189 -0
- package/src/tui/theme/themes/gruvbox.ts +189 -0
- package/src/tui/theme/themes/index.ts +54 -0
- package/src/tui/theme/themes/kanagawa.ts +189 -0
- package/src/tui/theme/themes/material.ts +190 -0
- package/src/tui/theme/themes/monokai.ts +190 -0
- package/src/tui/theme/themes/nightfox.ts +189 -0
- package/src/tui/theme/themes/nord.ts +190 -0
- package/src/tui/theme/themes/onedark.ts +190 -0
- package/src/tui/theme/themes/rose-pine.ts +189 -0
- package/src/tui/theme/themes/solarized.ts +189 -0
- package/src/tui/theme/themes/tokyonight.ts +189 -0
- package/src/tui/theme/themes/vesper.ts +191 -0
- package/src/tui/theme/types.ts +143 -0
- package/src/tui/utils/command-flags.test.ts +269 -0
- package/src/tui/utils/command-flags.ts +377 -0
- package/src/tui/utils/kitty-graphics.ts +76 -0
- package/src/tui/utils/open-file.ts +37 -0
- package/src/tui/utils/open-report.ts +34 -0
- package/src/tui/utils/open-url.ts +39 -0
- package/src/tui/utils/paste.ts +8 -0
- package/src/tui/utils/scroll.ts +81 -0
- package/src/util/errors.ts +58 -0
- package/src/util/lock.ts +100 -0
- package/src/util/name.ts +148 -0
- package/src/util/url.test.ts +162 -0
- package/src/util/url.ts +107 -0
- package/build/agent-13rrhp8d.js +0 -20
- package/build/agent-zbj2331s.js +0 -30
- package/build/authentication-f4j3w5vs.js +0 -20
- package/build/blackboxAgent-v2vx9ws4.js +0 -20
- package/build/blackboxPentest-w5nwzpvk.js +0 -70
- package/build/cli-5wemv37a.js +0 -194
- package/build/cli-7s062hr6.js +0 -22
- package/build/cli-9qbxkhye.js +0 -55
- package/build/cli-avmhkjtv.js +0 -22961
- package/build/cli-g3czc3jz.js +0 -204
- package/build/cli-ww7hbazg.js +0 -88
- package/build/index-18vyy6mj.js +0 -19
- package/build/index-5wh7gq37.js +0 -12858
- package/build/index-e23zc8g4.js +0 -34
- package/build/index-hnwhswqj.js +0 -213
- package/build/index-wkmnr4nm.js +0 -39
- package/build/index-ywmfnd30.js +0 -12
- package/build/offesecAgent-c97pqzcn.js +0 -27
- package/build/pentest-4p5jt7gj.js +0 -30
- package/build/pentests-v98eg8n3.js +0 -92
- package/build/threatModel-81d4rcbk.js +0 -29
- /package/build/{cli-c8131c4q.js → cli-0wsh8j2t.js} +0 -0
- /package/build/{cli-9pbk8m32.js → cli-ag6jtndp.js} +0 -0
- /package/build/{cli-e08r86zk.js → cli-b3dvxjgk.js} +0 -0
- /package/build/{cli-fw5r7pfj.js → cli-q126f6ef.js} +0 -0
- /package/build/{cli-9fsre5pt.js → cli-qba2x69h.js} +0 -0
- /package/build/{cli-7q3ae3ft.js → cli-z82n3qk1.js} +0 -0
|
@@ -0,0 +1,1038 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { tool } from "ai";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { collectCommand } from "../../../tools/backends/collectCommand";
|
|
5
|
+
import { resolveBackends } from "../../../tools/backends/resolve";
|
|
6
|
+
import { resolveWhiteboxJobs } from "../../../tools/backends/whiteboxJobs";
|
|
7
|
+
import {
|
|
8
|
+
readTextPrefix,
|
|
9
|
+
resolveSessionWhiteboxArtifactPath,
|
|
10
|
+
resolveWhiteboxCodebaseRoot,
|
|
11
|
+
type WhiteboxJobRecord,
|
|
12
|
+
writeWhiteboxArtifact,
|
|
13
|
+
} from "../../../whitebox";
|
|
14
|
+
import { assertCommandInScope, ScopeViolationError } from "./scopeGuard";
|
|
15
|
+
import type { ToolContext } from "./types";
|
|
16
|
+
|
|
17
|
+
const NODE_CHECK_TIMEOUT_SECONDS = 10;
|
|
18
|
+
const READINESS_TIMEOUT_MS = 15_000;
|
|
19
|
+
const READINESS_POLL_MS = 150;
|
|
20
|
+
const PROBE_TIMEOUT_SECONDS = 10;
|
|
21
|
+
const DEFAULT_LISTENER_TIMEOUT_SECONDS = 600;
|
|
22
|
+
const MAX_LISTENER_TIMEOUT_SECONDS = 3_600;
|
|
23
|
+
const INLINE_RECENT_HITS = 25;
|
|
24
|
+
const INLINE_BODY_CHARS = 256;
|
|
25
|
+
|
|
26
|
+
// The executed listener is the generated source embedded as inline base64
|
|
27
|
+
// in a `node -e` bootstrap, mirroring the job-control transport's shell
|
|
28
|
+
// split (POSIX sh needs the space-free payload quoted; cmd.exe verbatim
|
|
29
|
+
// does not). Base64 has no quote/percent characters and the jobs contract
|
|
30
|
+
// carries neither env nor paths, so nothing else needs quoting. The nonce
|
|
31
|
+
// rides inside the payload and therefore inside the job's start identity.
|
|
32
|
+
function bootstrapCommand(source: string, platform: string): string {
|
|
33
|
+
const payload = `eval(Buffer.from('${Buffer.from(source, "utf8").toString("base64")}','base64').toString('utf8'))`;
|
|
34
|
+
return platform === "windows" ? `node -e ${payload}` : `node -e "${payload}"`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Readiness probe: same shell split; the payload rides an env var through
|
|
38
|
+
// the regular command seam (which, unlike the jobs contract, carries env).
|
|
39
|
+
function probeCommand(platform: string): string {
|
|
40
|
+
const payload =
|
|
41
|
+
"eval(Buffer.from(process.env.APEX_CB_PROBE,'base64').toString('utf8'))";
|
|
42
|
+
return platform === "windows" ? `node -e ${payload}` : `node -e "${payload}"`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type CallbackHit = {
|
|
46
|
+
ts: string;
|
|
47
|
+
method: string;
|
|
48
|
+
path: string;
|
|
49
|
+
source: "callback" | "selftest" | "unrelated";
|
|
50
|
+
ip: string;
|
|
51
|
+
body: string;
|
|
52
|
+
bodyCapped?: boolean;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export type CallbackLogEvidence = {
|
|
56
|
+
listening?: { bind: string; port: number; nonce: string };
|
|
57
|
+
bindFailed?: { code: string; detail: string };
|
|
58
|
+
hits: CallbackHit[];
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const HIT_PREFIX = "[apex-callback] hit ";
|
|
62
|
+
const LISTENING_PREFIX = "[apex-callback] listening ";
|
|
63
|
+
const BIND_FAILED_PREFIX = "[apex-callback] bind-failed ";
|
|
64
|
+
|
|
65
|
+
/** Validate and normalize one parsed hit record; undefined for malformed. */
|
|
66
|
+
function asCallbackHit(value: unknown): CallbackHit | undefined {
|
|
67
|
+
if (typeof value !== "object" || value === null) return undefined;
|
|
68
|
+
const rec = value as CallbackHit;
|
|
69
|
+
if (
|
|
70
|
+
typeof rec.ts !== "string" ||
|
|
71
|
+
typeof rec.method !== "string" ||
|
|
72
|
+
typeof rec.path !== "string" ||
|
|
73
|
+
(rec.source !== "callback" &&
|
|
74
|
+
rec.source !== "selftest" &&
|
|
75
|
+
rec.source !== "unrelated") ||
|
|
76
|
+
typeof rec.ip !== "string" ||
|
|
77
|
+
typeof rec.body !== "string"
|
|
78
|
+
) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
ts: rec.ts,
|
|
83
|
+
method: rec.method,
|
|
84
|
+
path: rec.path.slice(0, 512),
|
|
85
|
+
source: rec.source,
|
|
86
|
+
ip: rec.ip,
|
|
87
|
+
body: rec.body,
|
|
88
|
+
...(rec.bodyCapped ? { bodyCapped: true } : {}),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Parse the listener's structured log lines (one JSON hit per line). */
|
|
93
|
+
export function parseCallbackListenerLog(content: string): CallbackLogEvidence {
|
|
94
|
+
const evidence: CallbackLogEvidence = { hits: [] };
|
|
95
|
+
for (const line of content.split("\n")) {
|
|
96
|
+
if (line.startsWith(LISTENING_PREFIX)) {
|
|
97
|
+
const bind = / bind=([^ ]+)/.exec(line)?.[1];
|
|
98
|
+
const port = Number(/ port=(\d+)/.exec(line)?.[1]);
|
|
99
|
+
const nonce = / nonce=([a-f0-9]+)/.exec(line)?.[1];
|
|
100
|
+
if (bind && Number.isInteger(port) && port > 0 && nonce) {
|
|
101
|
+
evidence.listening = { bind, port, nonce };
|
|
102
|
+
}
|
|
103
|
+
} else if (line.startsWith(HIT_PREFIX)) {
|
|
104
|
+
try {
|
|
105
|
+
const hit = asCallbackHit(JSON.parse(line.slice(HIT_PREFIX.length)));
|
|
106
|
+
if (hit) evidence.hits.push(hit);
|
|
107
|
+
} catch {
|
|
108
|
+
// Partial line at the log-tail boundary — skip.
|
|
109
|
+
}
|
|
110
|
+
} else if (line.startsWith(BIND_FAILED_PREFIX)) {
|
|
111
|
+
evidence.bindFailed = {
|
|
112
|
+
code: / code=([^ ]*)/.exec(line)?.[1] ?? "",
|
|
113
|
+
detail: line.slice(BIND_FAILED_PREFIX.length).slice(0, 400),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return evidence;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* The generated listener (Node built-ins only, config embedded). It runs
|
|
122
|
+
* via the embedded bootstrap; the staged `.cjs` copy is the audit artifact
|
|
123
|
+
* (and stays CommonJS even inside a `type: module` workspace). The nonce is
|
|
124
|
+
* the only ownership claim: correlated paths echo it, others get a 404.
|
|
125
|
+
*/
|
|
126
|
+
export function buildCallbackListenerScript(config: {
|
|
127
|
+
port: number;
|
|
128
|
+
bindAddress: string;
|
|
129
|
+
nonce: string;
|
|
130
|
+
}): string {
|
|
131
|
+
return [
|
|
132
|
+
'"use strict";',
|
|
133
|
+
"// Apex callback listener (generated). Config is embedded below.",
|
|
134
|
+
`const port = ${config.port};`,
|
|
135
|
+
`const bind = ${JSON.stringify(config.bindAddress)};`,
|
|
136
|
+
`const nonce = ${JSON.stringify(config.nonce)};`,
|
|
137
|
+
"const http = require('node:http');",
|
|
138
|
+
"const MAX_BODY_BYTES = 2048;",
|
|
139
|
+
"if (!/^[a-f0-9]{16,64}$/.test(nonce) || !Number.isInteger(port) || port < 0 || port > 65535 || !/^[A-Za-z0-9._:-]+$/.test(bind)) {",
|
|
140
|
+
" process.stdout.write('[apex-callback] bind-failed code=BAD_ARGS invalid nonce, port, or bind address\\n');",
|
|
141
|
+
" process.exit(2);",
|
|
142
|
+
"}",
|
|
143
|
+
"const server = http.createServer(function (req, res) {",
|
|
144
|
+
" const chunks = [];",
|
|
145
|
+
" let size = 0;",
|
|
146
|
+
" req.on('data', function (c) { if (size < MAX_BODY_BYTES) chunks.push(c); size += c.length; });",
|
|
147
|
+
" req.on('error', function () {});",
|
|
148
|
+
" req.on('end', function () {",
|
|
149
|
+
" let path = req.url || '/';",
|
|
150
|
+
" if (path.length > 512) path = path.slice(0, 512);",
|
|
151
|
+
" const correlated = path === '/' + nonce || path.slice(0, nonce.length + 2) === '/' + nonce + '/';",
|
|
152
|
+
" const selftest = correlated && path === '/' + nonce + '/__apex_ready__';",
|
|
153
|
+
" process.stdout.write('[apex-callback] hit ' + JSON.stringify({",
|
|
154
|
+
" ts: new Date().toISOString(), method: req.method, path: path,",
|
|
155
|
+
" source: selftest ? 'selftest' : correlated ? 'callback' : 'unrelated',",
|
|
156
|
+
" ip: (req.socket && req.socket.remoteAddress) || '',",
|
|
157
|
+
" body: Buffer.concat(chunks).toString('utf8').slice(0, MAX_BODY_BYTES),",
|
|
158
|
+
" bodyCapped: size > MAX_BODY_BYTES,",
|
|
159
|
+
" }) + '\\n');",
|
|
160
|
+
" res.statusCode = correlated ? 200 : 404;",
|
|
161
|
+
" res.setHeader('content-type', 'text/plain');",
|
|
162
|
+
" res.end(correlated ? 'apex-callback ' + nonce : 'not found');",
|
|
163
|
+
" });",
|
|
164
|
+
"});",
|
|
165
|
+
"server.on('error', function (e) {",
|
|
166
|
+
" process.stdout.write('[apex-callback] bind-failed code=' + ((e && e.code) || '') + ' ' + String((e && e.message) || '').slice(0, 200) + '\\n');",
|
|
167
|
+
" process.exit(1);",
|
|
168
|
+
"});",
|
|
169
|
+
"server.listen(port, bind, function () {",
|
|
170
|
+
" const a = server.address();",
|
|
171
|
+
" process.stdout.write('[apex-callback] listening bind=' + bind + ' port=' + ((a && a.port) || 0) + ' nonce=' + nonce + '\\n');",
|
|
172
|
+
"});",
|
|
173
|
+
"",
|
|
174
|
+
].join("\n");
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** Loopback probe URL for the listener's own bind address (IPv6 bracketed). */
|
|
178
|
+
export function probeUrlFor(bindAddress: string, port: number, nonce: string) {
|
|
179
|
+
const host =
|
|
180
|
+
bindAddress === "0.0.0.0"
|
|
181
|
+
? "127.0.0.1"
|
|
182
|
+
: bindAddress === "::"
|
|
183
|
+
? "[::1]"
|
|
184
|
+
: bindAddress.includes(":")
|
|
185
|
+
? `[${bindAddress}]`
|
|
186
|
+
: bindAddress;
|
|
187
|
+
return `http://${host}:${port}/${nonce}/__apex_ready__`;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export type CallbackListenerHandle = {
|
|
191
|
+
jobId: string;
|
|
192
|
+
nonce: string;
|
|
193
|
+
scriptPath: string;
|
|
194
|
+
bindAddress: string;
|
|
195
|
+
port: number;
|
|
196
|
+
advertisedBaseUrl?: string;
|
|
197
|
+
/** Set once a nonce self-test confirmed through the command seam. */
|
|
198
|
+
selfTestConfirmed: boolean;
|
|
199
|
+
artifactPath?: string;
|
|
200
|
+
/** Identity of the last persisted snapshot; content-based, not hit-count. */
|
|
201
|
+
lastPersistedSnapshot?: string;
|
|
202
|
+
/** Stops exactly this listener; abort signal cleared for post-abort cleanup. */
|
|
203
|
+
stop: () => Promise<WhiteboxJobRecord | undefined>;
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Per-agent listener registry. Tools require a handle from it — a job id
|
|
208
|
+
* alone never authorizes poll/stop — and the agent's finalization drains
|
|
209
|
+
* it so cleanup survives an abort.
|
|
210
|
+
*/
|
|
211
|
+
export class CallbackListenerRegistry {
|
|
212
|
+
private readonly handles = new Map<string, CallbackListenerHandle>();
|
|
213
|
+
|
|
214
|
+
register(handle: CallbackListenerHandle): void {
|
|
215
|
+
this.handles.set(handle.jobId, handle);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
get(jobId: string): CallbackListenerHandle | undefined {
|
|
219
|
+
return this.handles.get(jobId);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
remove(jobId: string): void {
|
|
223
|
+
this.handles.delete(jobId);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Best-effort stop of every listener; each outcome independent. Only
|
|
228
|
+
* successfully cleaned handles are removed — a failed stop stays
|
|
229
|
+
* registered so the next cleanup path (finalizeRun after abortAndDrain)
|
|
230
|
+
* can retry that owner.
|
|
231
|
+
*/
|
|
232
|
+
async stopAll(): Promise<Array<{ jobId: string; error?: string }>> {
|
|
233
|
+
const outcomes: Array<{ jobId: string; error?: string }> = [];
|
|
234
|
+
for (const handle of [...this.handles.values()]) {
|
|
235
|
+
try {
|
|
236
|
+
await handle.stop();
|
|
237
|
+
this.handles.delete(handle.jobId);
|
|
238
|
+
outcomes.push({ jobId: handle.jobId });
|
|
239
|
+
} catch (error: unknown) {
|
|
240
|
+
outcomes.push({
|
|
241
|
+
jobId: handle.jobId,
|
|
242
|
+
error: error instanceof Error ? error.message : String(error),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return outcomes;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Compose the nonce callback URL from an advertised base, path-aware: the
|
|
252
|
+
* base's route prefix is kept, its query (tokenized routes) stays after the
|
|
253
|
+
* path, and fragments are stripped — HTTP clients never send them.
|
|
254
|
+
*/
|
|
255
|
+
export function composeCallbackUrl(
|
|
256
|
+
advertisedBaseUrl: string,
|
|
257
|
+
nonce: string,
|
|
258
|
+
): string | undefined {
|
|
259
|
+
try {
|
|
260
|
+
const url = new URL(advertisedBaseUrl);
|
|
261
|
+
const route = url.pathname.replace(/\/+$/, "");
|
|
262
|
+
url.pathname = `${route}/${nonce}/cb`;
|
|
263
|
+
url.hash = "";
|
|
264
|
+
return url.toString();
|
|
265
|
+
} catch {
|
|
266
|
+
return undefined;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function callbackUrlFor(handle: {
|
|
271
|
+
nonce: string;
|
|
272
|
+
advertisedBaseUrl?: string;
|
|
273
|
+
}): string | undefined {
|
|
274
|
+
return handle.advertisedBaseUrl
|
|
275
|
+
? composeCallbackUrl(handle.advertisedBaseUrl, handle.nonce)
|
|
276
|
+
: undefined;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function summarizeEvidence(evidence: CallbackLogEvidence) {
|
|
280
|
+
const callbacks = evidence.hits.filter((h) => h.source === "callback");
|
|
281
|
+
return {
|
|
282
|
+
callbackHits: callbacks.length,
|
|
283
|
+
selfTestHits: evidence.hits.filter((h) => h.source === "selftest").length,
|
|
284
|
+
unrelatedHits: evidence.hits.filter((h) => h.source === "unrelated").length,
|
|
285
|
+
recentHits: callbacks.slice(-INLINE_RECENT_HITS).map((h) => ({
|
|
286
|
+
ts: h.ts,
|
|
287
|
+
method: h.method,
|
|
288
|
+
path: h.path,
|
|
289
|
+
ip: h.ip,
|
|
290
|
+
body: h.body.slice(0, INLINE_BODY_CHARS),
|
|
291
|
+
...(h.body.length > INLINE_BODY_CHARS || h.bodyCapped
|
|
292
|
+
? { bodyTruncated: true }
|
|
293
|
+
: {}),
|
|
294
|
+
})),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/** Cleanup seam: abort cleared so an already-aborted run can still stop. */
|
|
299
|
+
function jobsSeamForCleanup(ctx: ToolContext) {
|
|
300
|
+
return resolveWhiteboxJobs({ ...ctx, abortSignal: undefined });
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const PROBE_SOURCE = Buffer.from(
|
|
304
|
+
[
|
|
305
|
+
'"use strict";',
|
|
306
|
+
"const http = require('node:http');",
|
|
307
|
+
"const req = http.get(process.env.APEX_CB_PROBE_URL || '', function (res) {",
|
|
308
|
+
" let body = '';",
|
|
309
|
+
" res.setEncoding('utf8');",
|
|
310
|
+
" res.on('data', function (c) { body += c; });",
|
|
311
|
+
" res.on('end', function () { process.stdout.write(body); process.exit(0); });",
|
|
312
|
+
"});",
|
|
313
|
+
"req.on('error', function (e) { process.stderr.write(String((e && e.message) || e)); process.exit(1); });",
|
|
314
|
+
"setTimeout(function () { process.stderr.write('probe timeout'); process.exit(1); }, 8000).unref();",
|
|
315
|
+
"",
|
|
316
|
+
].join("\n"),
|
|
317
|
+
"utf8",
|
|
318
|
+
).toString("base64");
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Nonce readiness probe through the command seam — the same environment
|
|
322
|
+
* the listener runs in. Readiness is established only by a response that
|
|
323
|
+
* echoes the nonce; a log line or an open port never confirms it.
|
|
324
|
+
*/
|
|
325
|
+
async function runNonceProbe(
|
|
326
|
+
ctx: ToolContext,
|
|
327
|
+
handle: CallbackListenerHandle,
|
|
328
|
+
): Promise<boolean> {
|
|
329
|
+
try {
|
|
330
|
+
const command = resolveBackends(ctx).command;
|
|
331
|
+
const probe = await collectCommand(
|
|
332
|
+
command.run(probeCommand(command.platform ?? "posix"), {
|
|
333
|
+
timeoutSeconds: PROBE_TIMEOUT_SECONDS,
|
|
334
|
+
envVars: {
|
|
335
|
+
...ctx.environmentVariables,
|
|
336
|
+
APEX_CB_PROBE: PROBE_SOURCE,
|
|
337
|
+
APEX_CB_PROBE_URL: probeUrlFor(
|
|
338
|
+
handle.bindAddress,
|
|
339
|
+
handle.port,
|
|
340
|
+
handle.nonce,
|
|
341
|
+
),
|
|
342
|
+
},
|
|
343
|
+
abortSignal: ctx.abortSignal,
|
|
344
|
+
}),
|
|
345
|
+
);
|
|
346
|
+
return probe.exitCode === 0 && probe.stdout.includes(handle.nonce);
|
|
347
|
+
} catch {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Stop one owned listener and report the real outcome — never a silent
|
|
354
|
+
* "stopped" after a caught error. Handles stay registered after success
|
|
355
|
+
* (evidence remains pollable); a failed stop keeps them for finalization.
|
|
356
|
+
*/
|
|
357
|
+
async function stopListenerReporting(
|
|
358
|
+
handle: CallbackListenerHandle,
|
|
359
|
+
): Promise<string> {
|
|
360
|
+
try {
|
|
361
|
+
const record = await handle.stop();
|
|
362
|
+
return record
|
|
363
|
+
? `listener stopped (status ${record.status})`
|
|
364
|
+
: "stop returned no record (job already gone)";
|
|
365
|
+
} catch (error: unknown) {
|
|
366
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
367
|
+
return `stop failed: ${msg} — handle kept for finalization cleanup`;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
async function persistEvidenceSnapshot(input: {
|
|
372
|
+
ctx: ToolContext;
|
|
373
|
+
handle: CallbackListenerHandle;
|
|
374
|
+
status: string;
|
|
375
|
+
evidence: CallbackLogEvidence;
|
|
376
|
+
logTruncated: boolean;
|
|
377
|
+
}): Promise<string | undefined> {
|
|
378
|
+
const content = JSON.stringify(
|
|
379
|
+
{
|
|
380
|
+
jobId: input.handle.jobId,
|
|
381
|
+
nonce: input.handle.nonce,
|
|
382
|
+
bindAddress: input.handle.bindAddress,
|
|
383
|
+
port: input.handle.port,
|
|
384
|
+
status: input.status,
|
|
385
|
+
logTruncated: input.logTruncated,
|
|
386
|
+
listening: input.evidence.listening,
|
|
387
|
+
bindFailed: input.evidence.bindFailed,
|
|
388
|
+
hits: input.evidence.hits,
|
|
389
|
+
},
|
|
390
|
+
null,
|
|
391
|
+
2,
|
|
392
|
+
);
|
|
393
|
+
// Content identity, not hit count: a rotated log tail can swap old hits
|
|
394
|
+
// for new ones without changing the count.
|
|
395
|
+
if (input.handle.lastPersistedSnapshot === content) {
|
|
396
|
+
return input.handle.artifactPath;
|
|
397
|
+
}
|
|
398
|
+
try {
|
|
399
|
+
const ref = await writeWhiteboxArtifact({
|
|
400
|
+
session: input.ctx.session,
|
|
401
|
+
area: "scratchpad",
|
|
402
|
+
type: "raw-output",
|
|
403
|
+
name: `callback-evidence-${input.handle.jobId}`,
|
|
404
|
+
description: "Callback listener evidence snapshot (bounded)",
|
|
405
|
+
content,
|
|
406
|
+
});
|
|
407
|
+
input.handle.artifactPath = ref.path;
|
|
408
|
+
input.handle.lastPersistedSnapshot = content;
|
|
409
|
+
return ref.path;
|
|
410
|
+
} catch {
|
|
411
|
+
return undefined;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Retained snapshots are read through the bounded session-artifact prefix
|
|
416
|
+
// seam, capped at one million UTF-16 code units (readTextPrefix counts
|
|
417
|
+
// chars, not bytes); truncation is detected before parsing.
|
|
418
|
+
const MAX_SNAPSHOT_READ_CHARS = 1_000_000;
|
|
419
|
+
|
|
420
|
+
type SnapshotRead =
|
|
421
|
+
| { kind: "ok"; evidence: CallbackLogEvidence; logTruncated: boolean }
|
|
422
|
+
| { kind: "absent" }
|
|
423
|
+
| { kind: "unreadable"; reason: string };
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Read a retained evidence snapshot through the session-artifact seam —
|
|
427
|
+
* the same owner/path resolver and bounded prefix IO that wrote it. A
|
|
428
|
+
* missing file is absent; anything else that defeats the read is reported
|
|
429
|
+
* as unreadable with its reason, never as absence.
|
|
430
|
+
*/
|
|
431
|
+
async function readSnapshotEvidence(
|
|
432
|
+
session: { rootPath: string },
|
|
433
|
+
artifactPath: string,
|
|
434
|
+
): Promise<SnapshotRead> {
|
|
435
|
+
let absolute: string;
|
|
436
|
+
try {
|
|
437
|
+
absolute = resolveSessionWhiteboxArtifactPath({
|
|
438
|
+
sessionRootPath: session.rootPath,
|
|
439
|
+
artifactRelativePath: artifactPath,
|
|
440
|
+
});
|
|
441
|
+
} catch (error: unknown) {
|
|
442
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
443
|
+
return { kind: "unreadable", reason: `path rejected: ${msg}` };
|
|
444
|
+
}
|
|
445
|
+
let read: { content: string; truncated: boolean };
|
|
446
|
+
try {
|
|
447
|
+
read = await readTextPrefix(absolute, MAX_SNAPSHOT_READ_CHARS);
|
|
448
|
+
} catch (error: unknown) {
|
|
449
|
+
if ((error as NodeJS.ErrnoException)?.code === "ENOENT") {
|
|
450
|
+
return { kind: "absent" };
|
|
451
|
+
}
|
|
452
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
453
|
+
return { kind: "unreadable", reason: `read failed: ${msg}` };
|
|
454
|
+
}
|
|
455
|
+
// Truncation is checked before parsing: a cut JSON body cannot parse and
|
|
456
|
+
// must be reported as capped, not as corrupt or absent.
|
|
457
|
+
if (read.truncated) {
|
|
458
|
+
return {
|
|
459
|
+
kind: "unreadable",
|
|
460
|
+
reason: `exceeds the bounded read cap of ${MAX_SNAPSHOT_READ_CHARS} chars`,
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
try {
|
|
464
|
+
const parsed = JSON.parse(read.content) as {
|
|
465
|
+
hits?: unknown;
|
|
466
|
+
listening?: CallbackLogEvidence["listening"];
|
|
467
|
+
bindFailed?: CallbackLogEvidence["bindFailed"];
|
|
468
|
+
logTruncated?: boolean;
|
|
469
|
+
};
|
|
470
|
+
// A snapshot this helper wrote always carries an array of valid hit
|
|
471
|
+
// entries; anything else is corruption, never a zero/partial success.
|
|
472
|
+
if (!Array.isArray(parsed.hits)) {
|
|
473
|
+
return { kind: "unreadable", reason: "corrupt (hits is not an array)" };
|
|
474
|
+
}
|
|
475
|
+
const hits: CallbackHit[] = [];
|
|
476
|
+
for (const entry of parsed.hits) {
|
|
477
|
+
const hit = asCallbackHit(entry);
|
|
478
|
+
if (!hit) {
|
|
479
|
+
return {
|
|
480
|
+
kind: "unreadable",
|
|
481
|
+
reason: "corrupt (malformed hit entry)",
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
hits.push(hit);
|
|
485
|
+
}
|
|
486
|
+
return {
|
|
487
|
+
kind: "ok",
|
|
488
|
+
evidence: {
|
|
489
|
+
listening: parsed.listening,
|
|
490
|
+
bindFailed: parsed.bindFailed,
|
|
491
|
+
hits,
|
|
492
|
+
},
|
|
493
|
+
logTruncated: parsed.logTruncated === true,
|
|
494
|
+
};
|
|
495
|
+
} catch {
|
|
496
|
+
return { kind: "unreadable", reason: "corrupt (not valid JSON)" };
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/** Read the live job log for an owned handle; `gone` = no live record. */
|
|
501
|
+
async function readListenerLog(
|
|
502
|
+
ctx: ToolContext,
|
|
503
|
+
handle: CallbackListenerHandle,
|
|
504
|
+
): Promise<
|
|
505
|
+
| {
|
|
506
|
+
ok: true;
|
|
507
|
+
record?: WhiteboxJobRecord;
|
|
508
|
+
evidence: CallbackLogEvidence;
|
|
509
|
+
logTruncated: boolean;
|
|
510
|
+
gone: boolean;
|
|
511
|
+
}
|
|
512
|
+
| { ok: false; summary: string; artifactPath?: string }
|
|
513
|
+
> {
|
|
514
|
+
const jobs = resolveWhiteboxJobs(ctx);
|
|
515
|
+
try {
|
|
516
|
+
// Use the read's record: a separate poll can race job pruning.
|
|
517
|
+
const log = await jobs.read(handle.jobId);
|
|
518
|
+
if (log.record) {
|
|
519
|
+
return {
|
|
520
|
+
ok: true,
|
|
521
|
+
record: log.record,
|
|
522
|
+
evidence: parseCallbackListenerLog(log.content),
|
|
523
|
+
logTruncated: log.truncated,
|
|
524
|
+
gone: false,
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
} catch (error: unknown) {
|
|
528
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
529
|
+
return { ok: false, summary: `Listener log read failed: ${msg}` };
|
|
530
|
+
}
|
|
531
|
+
// Record gone (pruned/expired): the persisted snapshot is retrieval-only.
|
|
532
|
+
if (handle.artifactPath) {
|
|
533
|
+
const snapshot = await readSnapshotEvidence(
|
|
534
|
+
ctx.session,
|
|
535
|
+
handle.artifactPath,
|
|
536
|
+
);
|
|
537
|
+
if (snapshot.kind === "ok") {
|
|
538
|
+
return {
|
|
539
|
+
ok: true,
|
|
540
|
+
evidence: snapshot.evidence,
|
|
541
|
+
logTruncated: snapshot.logTruncated,
|
|
542
|
+
gone: true,
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
if (snapshot.kind === "unreadable") {
|
|
546
|
+
return {
|
|
547
|
+
ok: false,
|
|
548
|
+
summary: `Listener ${handle.jobId}'s retained evidence snapshot could not be read (${snapshot.reason}); the snapshot is preserved for direct inspection.`,
|
|
549
|
+
artifactPath: handle.artifactPath,
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
return {
|
|
554
|
+
ok: false,
|
|
555
|
+
summary: `Listener ${handle.jobId} has no live job record and no persisted evidence snapshot.`,
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
// Remote supervisor ids are wjob_<64 hex>; the in-process kernel also mints
|
|
560
|
+
// wjob_<epoch>_<hex> ids. Both spellings name a listener this agent started.
|
|
561
|
+
const callbackListenerJobIdSchema = z
|
|
562
|
+
.string()
|
|
563
|
+
.regex(
|
|
564
|
+
/^wjob_(?:[a-f0-9]{64}|\d+_[a-f0-9]{1,16})$/,
|
|
565
|
+
"Job id must come from start_callback_listener",
|
|
566
|
+
);
|
|
567
|
+
|
|
568
|
+
const bindAddressSchema = z
|
|
569
|
+
.string()
|
|
570
|
+
.regex(
|
|
571
|
+
/^[A-Za-z0-9._:-]+$/,
|
|
572
|
+
"Bind address must be an IP address or hostname (no shell metacharacters)",
|
|
573
|
+
);
|
|
574
|
+
|
|
575
|
+
function failureResult(
|
|
576
|
+
summary: string,
|
|
577
|
+
nextActions?: string[],
|
|
578
|
+
data?: { jobId: string; artifactPath?: string },
|
|
579
|
+
) {
|
|
580
|
+
return {
|
|
581
|
+
success: false as const,
|
|
582
|
+
summary,
|
|
583
|
+
artifactPaths: data?.artifactPath ? [data.artifactPath] : [],
|
|
584
|
+
nextActions: nextActions ?? ["Inspect the error, adjust, and retry."],
|
|
585
|
+
...(data ? { data } : {}),
|
|
586
|
+
};
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
function unknownListenerResult(jobId: string) {
|
|
590
|
+
return failureResult(
|
|
591
|
+
`Listener ${jobId} is not owned by this agent. Only listeners started by this agent's start_callback_listener can be polled or stopped.`,
|
|
592
|
+
["Use start_callback_listener to start one, or check the job id."],
|
|
593
|
+
);
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
export function startCallbackListener(ctx: ToolContext) {
|
|
597
|
+
return tool({
|
|
598
|
+
description: `Start a nonce-correlated HTTP callback listener for blind/out-of-band testing (SSRF, blind RCE, XSS callbacks).
|
|
599
|
+
|
|
600
|
+
The listener runs as a bounded whitebox job in the selected execution environment (sandbox/remote/local — never a host fallback) and survives intervening tool calls. Its port answers ONLY paths under its secret nonce; unrelated requests get a 404 and are counted separately, so an open port that belongs to someone else can never masquerade as your listener. Readiness is confirmed by a nonce self-test executed in the same environment — self-test hits are never target evidence.
|
|
601
|
+
|
|
602
|
+
Bind address and advertised URL are distinct: the listener binds where it runs (default 0.0.0.0, ephemeral port); the URL you embed in payloads must be an address the TARGET can reach. Supply advertisedBaseUrl only when you know one (an operator-provided route or a reachable host) — it is never guessed for you. Poll evidence with poll_callback_listener; stop with stop_callback_listener. The listener dies at its timeoutSeconds deadline at the latest.`,
|
|
603
|
+
inputSchema: z.object({
|
|
604
|
+
port: z
|
|
605
|
+
.number()
|
|
606
|
+
.int()
|
|
607
|
+
.min(0)
|
|
608
|
+
.max(65535)
|
|
609
|
+
.optional()
|
|
610
|
+
.describe(
|
|
611
|
+
"Port to bind (0 = ephemeral, default). Fixed ports risk conflicts.",
|
|
612
|
+
),
|
|
613
|
+
bindAddress: bindAddressSchema
|
|
614
|
+
.optional()
|
|
615
|
+
.describe("Bind address for the listener (default 0.0.0.0)."),
|
|
616
|
+
advertisedBaseUrl: z
|
|
617
|
+
.string()
|
|
618
|
+
.url()
|
|
619
|
+
.refine((v) => /^https?:\/\//.test(v), {
|
|
620
|
+
message: "advertisedBaseUrl must be an http(s) URL",
|
|
621
|
+
})
|
|
622
|
+
.optional()
|
|
623
|
+
.describe(
|
|
624
|
+
"Base URL the TARGET can reach (e.g. an operator-provided callback route), used only to compose the callback URL returned to you. Never guessed. Route prefix and query parameters are preserved; fragments are stripped (HTTP clients never send them).",
|
|
625
|
+
),
|
|
626
|
+
timeoutSeconds: z
|
|
627
|
+
.number()
|
|
628
|
+
.int()
|
|
629
|
+
.min(10)
|
|
630
|
+
.max(MAX_LISTENER_TIMEOUT_SECONDS)
|
|
631
|
+
.optional()
|
|
632
|
+
.describe(
|
|
633
|
+
`Listener lifetime bound in seconds (default ${DEFAULT_LISTENER_TIMEOUT_SECONDS}, max ${MAX_LISTENER_TIMEOUT_SECONDS}).`,
|
|
634
|
+
),
|
|
635
|
+
toolCallDescription: z
|
|
636
|
+
.string()
|
|
637
|
+
.describe("A concise description of what this listener is for"),
|
|
638
|
+
}),
|
|
639
|
+
execute: async (
|
|
640
|
+
{
|
|
641
|
+
port = 0,
|
|
642
|
+
bindAddress = "0.0.0.0",
|
|
643
|
+
advertisedBaseUrl,
|
|
644
|
+
timeoutSeconds = DEFAULT_LISTENER_TIMEOUT_SECONDS,
|
|
645
|
+
},
|
|
646
|
+
options,
|
|
647
|
+
) => {
|
|
648
|
+
if (!ctx.callbackListeners) {
|
|
649
|
+
return failureResult(
|
|
650
|
+
"Callback listeners require the agent's listener registry (owner-tracked cleanup); this tool context has none.",
|
|
651
|
+
);
|
|
652
|
+
}
|
|
653
|
+
if (ctx.abortSignal?.aborted) {
|
|
654
|
+
return failureResult("Listener start aborted by user before dispatch.");
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
const command = resolveBackends(ctx).command;
|
|
658
|
+
|
|
659
|
+
// Preflight: the listener is a Node script; Node must exist in the
|
|
660
|
+
// selected execution environment. Unsupported is reported, never
|
|
661
|
+
// turned into false readiness.
|
|
662
|
+
let nodeVersion: string | undefined;
|
|
663
|
+
try {
|
|
664
|
+
const checked = await collectCommand(
|
|
665
|
+
command.run("node --version", {
|
|
666
|
+
timeoutSeconds: NODE_CHECK_TIMEOUT_SECONDS,
|
|
667
|
+
envVars: ctx.environmentVariables,
|
|
668
|
+
abortSignal: ctx.abortSignal,
|
|
669
|
+
}),
|
|
670
|
+
);
|
|
671
|
+
if (checked.exitCode !== 0 || checked.timedOut) {
|
|
672
|
+
return failureResult(
|
|
673
|
+
`Callback listeners are unavailable: Node.js is not available in the selected execution environment (node --version exit ${checked.exitCode}${checked.timedOut ? ", timed out" : ""}: ${checked.stderr.trim().slice(0, 200) || "no stderr"}).`,
|
|
674
|
+
["Use a probe technique that does not need a local listener."],
|
|
675
|
+
);
|
|
676
|
+
}
|
|
677
|
+
nodeVersion = checked.stdout.trim().split("\n").pop()?.trim();
|
|
678
|
+
} catch (error: unknown) {
|
|
679
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
680
|
+
return failureResult(
|
|
681
|
+
`Callback listeners are unavailable: Node.js check failed: ${msg}`,
|
|
682
|
+
);
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
const nonce = randomBytes(16).toString("hex");
|
|
686
|
+
// One generated source, staged for audit AND embedded in the job
|
|
687
|
+
// command — the jobs contract carries neither env vars nor paths.
|
|
688
|
+
const listenerSource = buildCallbackListenerScript({
|
|
689
|
+
port,
|
|
690
|
+
bindAddress,
|
|
691
|
+
nonce,
|
|
692
|
+
});
|
|
693
|
+
const write = await resolveBackends(ctx).fs.write(
|
|
694
|
+
`callback-listeners/listener-${nonce}.cjs`,
|
|
695
|
+
listenerSource,
|
|
696
|
+
{ mode: "overwrite" },
|
|
697
|
+
);
|
|
698
|
+
if (!write.success) {
|
|
699
|
+
return failureResult(
|
|
700
|
+
`Failed to stage the listener script in the helper workspace: ${write.error}`,
|
|
701
|
+
);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
let cwd: string;
|
|
705
|
+
try {
|
|
706
|
+
// Same cwd contract as start_whitebox_job: jobs run inside the
|
|
707
|
+
// configured codebase root; the staged script is the audit copy.
|
|
708
|
+
cwd = resolveWhiteboxCodebaseRoot({
|
|
709
|
+
agentCwd: ctx.agentCwd,
|
|
710
|
+
codebasePath: ctx.session.config?.codebasePath,
|
|
711
|
+
});
|
|
712
|
+
} catch (error: unknown) {
|
|
713
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
714
|
+
return failureResult(msg);
|
|
715
|
+
}
|
|
716
|
+
const listenerCommand = bootstrapCommand(
|
|
717
|
+
listenerSource,
|
|
718
|
+
command.platform ?? "posix",
|
|
719
|
+
);
|
|
720
|
+
try {
|
|
721
|
+
assertCommandInScope(listenerCommand, ctx);
|
|
722
|
+
} catch (error: unknown) {
|
|
723
|
+
if (error instanceof ScopeViolationError) {
|
|
724
|
+
return failureResult(error.message);
|
|
725
|
+
}
|
|
726
|
+
throw error;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
const jobs = resolveWhiteboxJobs(ctx);
|
|
730
|
+
let record: WhiteboxJobRecord;
|
|
731
|
+
try {
|
|
732
|
+
record = await jobs.start(
|
|
733
|
+
{
|
|
734
|
+
command: listenerCommand,
|
|
735
|
+
cwd,
|
|
736
|
+
timeoutSeconds,
|
|
737
|
+
name: "callback-listener",
|
|
738
|
+
},
|
|
739
|
+
options.toolCallId,
|
|
740
|
+
);
|
|
741
|
+
} catch (error: unknown) {
|
|
742
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
743
|
+
return failureResult(`Listener job failed to start: ${msg}`, [
|
|
744
|
+
"The job supervisor reports backend and path-policy failures verbatim.",
|
|
745
|
+
]);
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
// Ownership registers immediately after start — before readiness —
|
|
749
|
+
// so an abort during startup still leaves a cleanable handle.
|
|
750
|
+
const handle: CallbackListenerHandle = {
|
|
751
|
+
jobId: record.id,
|
|
752
|
+
nonce,
|
|
753
|
+
scriptPath: write.path,
|
|
754
|
+
bindAddress,
|
|
755
|
+
port,
|
|
756
|
+
...(advertisedBaseUrl ? { advertisedBaseUrl } : {}),
|
|
757
|
+
selfTestConfirmed: false,
|
|
758
|
+
stop: () => jobsSeamForCleanup(ctx).stop(record.id),
|
|
759
|
+
};
|
|
760
|
+
ctx.callbackListeners.register(handle);
|
|
761
|
+
|
|
762
|
+
// Readiness is distinct from "spawned": the listener's own listening
|
|
763
|
+
// line, then a nonce probe through the same command environment.
|
|
764
|
+
const deadline = Date.now() + READINESS_TIMEOUT_MS;
|
|
765
|
+
let evidence: CallbackLogEvidence = { hits: [] };
|
|
766
|
+
let status = record.status;
|
|
767
|
+
while (Date.now() < deadline) {
|
|
768
|
+
if (ctx.abortSignal?.aborted) {
|
|
769
|
+
const stopReport = await stopListenerReporting(handle);
|
|
770
|
+
return failureResult(
|
|
771
|
+
`Listener start aborted by user during startup; ${stopReport}.`,
|
|
772
|
+
undefined,
|
|
773
|
+
{ jobId: handle.jobId },
|
|
774
|
+
);
|
|
775
|
+
}
|
|
776
|
+
try {
|
|
777
|
+
const polled = await jobs.poll(handle.jobId);
|
|
778
|
+
status = polled?.status ?? status;
|
|
779
|
+
const log = await jobs.read(handle.jobId);
|
|
780
|
+
evidence = parseCallbackListenerLog(log.content);
|
|
781
|
+
if (evidence.listening) break;
|
|
782
|
+
if (!polled || polled.status !== "running") break;
|
|
783
|
+
} catch (error: unknown) {
|
|
784
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
785
|
+
const stopReport = await stopListenerReporting(handle);
|
|
786
|
+
return failureResult(
|
|
787
|
+
`Listener startup could not be confirmed: ${msg}; ${stopReport}.`,
|
|
788
|
+
undefined,
|
|
789
|
+
{ jobId: handle.jobId },
|
|
790
|
+
);
|
|
791
|
+
}
|
|
792
|
+
await new Promise((r) => setTimeout(r, READINESS_POLL_MS));
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
if (
|
|
796
|
+
evidence.bindFailed ||
|
|
797
|
+
(!evidence.listening && status !== "running")
|
|
798
|
+
) {
|
|
799
|
+
// The job is dead (bind conflict or startup error) — nothing to stop.
|
|
800
|
+
ctx.callbackListeners.remove(handle.jobId);
|
|
801
|
+
const code = evidence.bindFailed?.code ?? "";
|
|
802
|
+
const detail =
|
|
803
|
+
evidence.bindFailed?.detail ?? `listener exited (${status})`;
|
|
804
|
+
return failureResult(
|
|
805
|
+
code === "EADDRINUSE"
|
|
806
|
+
? `Port conflict: the listener could not bind ${bindAddress}:${port} (EADDRINUSE).`
|
|
807
|
+
: `Listener startup failed: ${detail}`,
|
|
808
|
+
code === "EADDRINUSE"
|
|
809
|
+
? ["Retry with port 0 (ephemeral) or another free port."]
|
|
810
|
+
: ["Inspect the failure detail and retry."],
|
|
811
|
+
{ jobId: handle.jobId },
|
|
812
|
+
);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
if (evidence.listening) {
|
|
816
|
+
// The running listener's own log line is authoritative for the
|
|
817
|
+
// effective port and nonce (idempotent restarts of the same request).
|
|
818
|
+
handle.port = evidence.listening.port;
|
|
819
|
+
handle.nonce = evidence.listening.nonce;
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
let selfTest: "confirmed" | "unconfirmed" | "not-listening" =
|
|
823
|
+
"not-listening";
|
|
824
|
+
if (evidence.listening) {
|
|
825
|
+
if (await runNonceProbe(ctx, handle)) {
|
|
826
|
+
selfTest = "confirmed";
|
|
827
|
+
handle.selfTestConfirmed = true;
|
|
828
|
+
} else {
|
|
829
|
+
selfTest = "unconfirmed";
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
// Readiness requires the nonce response AND a process that is still
|
|
834
|
+
// running — a listener that died between probe and return is not ready.
|
|
835
|
+
const finalStatus = (await jobs.poll(handle.jobId))?.status;
|
|
836
|
+
const listenerReady =
|
|
837
|
+
handle.selfTestConfirmed && finalStatus === "running";
|
|
838
|
+
const callbackUrl = callbackUrlFor(handle);
|
|
839
|
+
return {
|
|
840
|
+
success: true,
|
|
841
|
+
summary: listenerReady
|
|
842
|
+
? `Callback listener ready on ${handle.bindAddress}:${handle.port} (job ${handle.jobId}, nonce ${handle.nonce}).${callbackUrl ? ` Callback URL: ${callbackUrl}` : " No advertised URL supplied — use one only when you know an address the target can reach."}`
|
|
843
|
+
: `Listener job ${handle.jobId} is ${finalStatus ?? "no longer reporting"} but readiness is ${selfTest === "not-listening" ? "not confirmed (no listening line yet)" : "unconfirmed (nonce self-test did not succeed)"}. It stays registered for cleanup; poll again or stop it.`,
|
|
844
|
+
data: {
|
|
845
|
+
listener: {
|
|
846
|
+
jobId: handle.jobId,
|
|
847
|
+
nonce: handle.nonce,
|
|
848
|
+
spawned: true,
|
|
849
|
+
bindAddress: handle.bindAddress,
|
|
850
|
+
port: handle.port,
|
|
851
|
+
requestedPort: port,
|
|
852
|
+
timeoutSeconds,
|
|
853
|
+
nodeVersion,
|
|
854
|
+
},
|
|
855
|
+
listenerReady,
|
|
856
|
+
selfTest,
|
|
857
|
+
listening: evidence.listening ?? null,
|
|
858
|
+
callbackUrl: callbackUrl ?? null,
|
|
859
|
+
},
|
|
860
|
+
artifactPaths: record.logPath ? [record.logPath] : [],
|
|
861
|
+
nextActions: listenerReady
|
|
862
|
+
? [
|
|
863
|
+
callbackUrl
|
|
864
|
+
? `Embed ${callbackUrl} in payloads, then poll ${handle.jobId} with poll_callback_listener.`
|
|
865
|
+
: `Poll ${handle.jobId} with poll_callback_listener once you have embedded a reachable URL under path /${handle.nonce}/.`,
|
|
866
|
+
"Stop the listener with stop_callback_listener when done.",
|
|
867
|
+
]
|
|
868
|
+
: [
|
|
869
|
+
`Poll ${handle.jobId} with poll_callback_listener to check readiness later, or stop it.`,
|
|
870
|
+
],
|
|
871
|
+
truncated: false,
|
|
872
|
+
};
|
|
873
|
+
},
|
|
874
|
+
});
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
export function pollCallbackListener(ctx: ToolContext) {
|
|
878
|
+
return tool({
|
|
879
|
+
description: `Poll an owned callback listener and read its evidence.
|
|
880
|
+
|
|
881
|
+
Returns job status, listener readiness (only true while the process is running AND the nonce self-test succeeded), and nonce-correlated callback hits (method, path, source IP, bounded body preview). The tool's own self-test and traffic that misses the nonce path are reported separately and never counted as target callbacks. When the job record has expired, the last persisted evidence snapshot is shown instead. Output is bounded; the full window is persisted under scratchpad/whitebox.`,
|
|
882
|
+
inputSchema: z.object({
|
|
883
|
+
jobId: callbackListenerJobIdSchema,
|
|
884
|
+
toolCallDescription: z
|
|
885
|
+
.string()
|
|
886
|
+
.describe("A concise description of this poll"),
|
|
887
|
+
}),
|
|
888
|
+
execute: async ({ jobId }) => {
|
|
889
|
+
const handle = ctx.callbackListeners?.get(jobId);
|
|
890
|
+
if (!handle) return unknownListenerResult(jobId);
|
|
891
|
+
|
|
892
|
+
const read = await readListenerLog(ctx, handle);
|
|
893
|
+
if (!read.ok) {
|
|
894
|
+
return failureResult(read.summary, undefined, {
|
|
895
|
+
jobId,
|
|
896
|
+
...(read.artifactPath ? { artifactPath: read.artifactPath } : {}),
|
|
897
|
+
});
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
// A late listening line carries the effective (possibly ephemeral)
|
|
901
|
+
// port — adopt it before probing so the probe targets the listener.
|
|
902
|
+
if (read.evidence.listening) {
|
|
903
|
+
handle.port = read.evidence.listening.port;
|
|
904
|
+
handle.nonce = read.evidence.listening.nonce;
|
|
905
|
+
}
|
|
906
|
+
// Readiness holds only while the process runs and a nonce RESPONSE
|
|
907
|
+
// confirmed it. A previously unconfirmed listener gets one bounded
|
|
908
|
+
// probe here; a selftest log line alone never promotes readiness.
|
|
909
|
+
const running = !read.gone && read.record?.status === "running";
|
|
910
|
+
if (running && !handle.selfTestConfirmed) {
|
|
911
|
+
handle.selfTestConfirmed = await runNonceProbe(ctx, handle);
|
|
912
|
+
}
|
|
913
|
+
const listenerReady = running && handle.selfTestConfirmed;
|
|
914
|
+
|
|
915
|
+
const artifactPath = read.gone
|
|
916
|
+
? handle.artifactPath
|
|
917
|
+
: ((await persistEvidenceSnapshot({
|
|
918
|
+
ctx,
|
|
919
|
+
handle,
|
|
920
|
+
status: read.record?.status ?? "unknown",
|
|
921
|
+
evidence: read.evidence,
|
|
922
|
+
logTruncated: read.logTruncated,
|
|
923
|
+
})) ?? handle.artifactPath);
|
|
924
|
+
|
|
925
|
+
const summary = summarizeEvidence(read.evidence);
|
|
926
|
+
const callbackUrl = callbackUrlFor(handle);
|
|
927
|
+
return {
|
|
928
|
+
success: true,
|
|
929
|
+
summary: read.gone
|
|
930
|
+
? `Listener ${jobId} is no longer live; showing the persisted evidence snapshot (${summary.callbackHits} nonce-correlated callback${summary.callbackHits === 1 ? "" : "s"} observed).`
|
|
931
|
+
: `Listener ${jobId} is ${read.record?.status ?? "unknown"}${listenerReady ? ", listener-ready" : ""}: ${summary.callbackHits} nonce-correlated callback${summary.callbackHits === 1 ? "" : "s"}, ${summary.unrelatedHits} unrelated request${summary.unrelatedHits === 1 ? "" : "s"}. Readiness and the tool's own self-test are never counted as target callbacks.`,
|
|
932
|
+
data: {
|
|
933
|
+
jobId,
|
|
934
|
+
status: read.gone ? "record-gone" : read.record?.status,
|
|
935
|
+
listenerReady,
|
|
936
|
+
nonce: handle.nonce,
|
|
937
|
+
bindAddress: handle.bindAddress,
|
|
938
|
+
port: handle.port,
|
|
939
|
+
callbackUrl: callbackUrl ?? null,
|
|
940
|
+
...summary,
|
|
941
|
+
...(read.logTruncated
|
|
942
|
+
? {
|
|
943
|
+
logWindowTruncated: true,
|
|
944
|
+
note: "Counts cover the visible tail of the bounded job log (lower bounds).",
|
|
945
|
+
}
|
|
946
|
+
: {}),
|
|
947
|
+
},
|
|
948
|
+
artifactPaths: artifactPath ? [artifactPath] : [],
|
|
949
|
+
nextActions: [
|
|
950
|
+
"Keep polling while the callback URL is embedded in live payloads.",
|
|
951
|
+
"Stop the listener with stop_callback_listener when done.",
|
|
952
|
+
],
|
|
953
|
+
truncated: false,
|
|
954
|
+
};
|
|
955
|
+
},
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
export function stopCallbackListener(ctx: ToolContext) {
|
|
960
|
+
return tool({
|
|
961
|
+
description: `Stop an owned callback listener and return its final evidence.
|
|
962
|
+
|
|
963
|
+
Stopping touches only this listener's own job and works even after the run abort signal has fired (owned-resource cleanup). When the job record is already gone, the persisted evidence snapshot is returned instead — nothing is restarted.`,
|
|
964
|
+
inputSchema: z.object({
|
|
965
|
+
jobId: callbackListenerJobIdSchema,
|
|
966
|
+
toolCallDescription: z
|
|
967
|
+
.string()
|
|
968
|
+
.describe("A concise description of this stop"),
|
|
969
|
+
}),
|
|
970
|
+
execute: async ({ jobId }) => {
|
|
971
|
+
const handle = ctx.callbackListeners?.get(jobId);
|
|
972
|
+
if (!handle) return unknownListenerResult(jobId);
|
|
973
|
+
|
|
974
|
+
const stopReport = await stopListenerReporting(handle);
|
|
975
|
+
if (stopReport.startsWith("stop failed")) {
|
|
976
|
+
return failureResult(
|
|
977
|
+
`Listener ${jobId} stop failed: ${stopReport.slice("stop failed: ".length)}`,
|
|
978
|
+
);
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
// One final read after the stop settles, for hits that raced the kill.
|
|
982
|
+
// A failed read never fabricates empty evidence: surface it and keep
|
|
983
|
+
// the prior snapshot untouched.
|
|
984
|
+
const after = await readListenerLog(
|
|
985
|
+
{ ...ctx, abortSignal: undefined },
|
|
986
|
+
handle,
|
|
987
|
+
);
|
|
988
|
+
if (!after.ok) {
|
|
989
|
+
return {
|
|
990
|
+
success: true,
|
|
991
|
+
summary: `Listener ${jobId} ${stopReport}. Final evidence could not be re-read: ${after.summary} Prior snapshot, if any, is preserved.`,
|
|
992
|
+
data: {
|
|
993
|
+
jobId,
|
|
994
|
+
nonce: handle.nonce,
|
|
995
|
+
callbackUrl: callbackUrlFor(handle) ?? null,
|
|
996
|
+
},
|
|
997
|
+
artifactPaths: handle.artifactPath ? [handle.artifactPath] : [],
|
|
998
|
+
nextActions: [
|
|
999
|
+
"Read the job log artifact directly if evidence is needed.",
|
|
1000
|
+
],
|
|
1001
|
+
truncated: false,
|
|
1002
|
+
};
|
|
1003
|
+
}
|
|
1004
|
+
const status =
|
|
1005
|
+
after.record?.status ?? (after.gone ? "record-gone" : "stopped");
|
|
1006
|
+
const artifactPath = await persistEvidenceSnapshot({
|
|
1007
|
+
ctx,
|
|
1008
|
+
handle,
|
|
1009
|
+
status,
|
|
1010
|
+
evidence: after.evidence,
|
|
1011
|
+
logTruncated: after.logTruncated,
|
|
1012
|
+
});
|
|
1013
|
+
const summary = summarizeEvidence(after.evidence);
|
|
1014
|
+
return {
|
|
1015
|
+
success: true,
|
|
1016
|
+
summary: `Listener ${jobId} ${stopReport}: ${summary.callbackHits} nonce-correlated callback${summary.callbackHits === 1 ? "" : "s"}, ${summary.unrelatedHits} unrelated request${summary.unrelatedHits === 1 ? "" : "s"}.${artifactPath ? " Final evidence persisted." : " Evidence snapshot could not be persisted (inline summary only)."}`,
|
|
1017
|
+
data: {
|
|
1018
|
+
jobId,
|
|
1019
|
+
status,
|
|
1020
|
+
nonce: handle.nonce,
|
|
1021
|
+
callbackUrl: callbackUrlFor(handle) ?? null,
|
|
1022
|
+
...summary,
|
|
1023
|
+
...(after.logTruncated
|
|
1024
|
+
? {
|
|
1025
|
+
logWindowTruncated: true,
|
|
1026
|
+
note: "Counts cover the visible tail of the bounded job log (lower bounds).",
|
|
1027
|
+
}
|
|
1028
|
+
: {}),
|
|
1029
|
+
},
|
|
1030
|
+
artifactPaths: artifactPath ? [artifactPath] : [],
|
|
1031
|
+
nextActions: [
|
|
1032
|
+
"Start a fresh listener if more callback evidence is needed.",
|
|
1033
|
+
],
|
|
1034
|
+
truncated: false,
|
|
1035
|
+
};
|
|
1036
|
+
},
|
|
1037
|
+
});
|
|
1038
|
+
}
|