@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
|
@@ -1,114 +1,70 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
collectCommand,
|
|
3
|
+
FindingsRegistry,
|
|
4
|
+
inMemoryRegistryProvider,
|
|
5
|
+
withFindingPersistedHook,
|
|
6
|
+
assertDepth,
|
|
7
|
+
inProcessSeams,
|
|
8
|
+
resolveItemHooks,
|
|
9
|
+
toGrpcPentestContext,
|
|
10
|
+
grpcAuthorityTarget,
|
|
11
|
+
inProcessSubagentSpawner,
|
|
12
|
+
pLimit,
|
|
13
|
+
PLAN_MODE_TOOL_NAMES,
|
|
14
|
+
OffensiveSecurityAgent
|
|
15
|
+
} from "./cli-3p4gyc9m.js";
|
|
9
16
|
import {
|
|
10
|
-
|
|
11
|
-
} from "./cli-
|
|
17
|
+
BlackboxAttackSurfaceAgent2
|
|
18
|
+
} from "./cli-xn12g67s.js";
|
|
12
19
|
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
} from "./cli-
|
|
20
|
+
TargetedPentestAgent2,
|
|
21
|
+
buildPentestSystemPrompt2
|
|
22
|
+
} from "./cli-vfta27tv.js";
|
|
16
23
|
import {
|
|
17
|
-
REPORT_FILENAME_JSON,
|
|
18
|
-
REPORT_FILENAME_MD,
|
|
19
24
|
buildPentestReport,
|
|
20
25
|
renderJson,
|
|
21
|
-
renderMarkdown
|
|
22
|
-
|
|
26
|
+
renderMarkdown,
|
|
27
|
+
REPORT_FILENAME_MD,
|
|
28
|
+
REPORT_FILENAME_JSON
|
|
29
|
+
} from "./cli-fapvkkbh.js";
|
|
23
30
|
import {
|
|
24
|
-
|
|
25
|
-
} from "./cli-
|
|
31
|
+
CodeAgent2
|
|
32
|
+
} from "./cli-8s4ew1hv.js";
|
|
26
33
|
import {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
} from "./cli-
|
|
34
|
+
WHITEBOX_APPS_DISCOVERY_SYSTEM_PROMPT2,
|
|
35
|
+
WHITEBOX_ENDPOINT_DOCUMENTATION_SYSTEM_PROMPT,
|
|
36
|
+
WHITEBOX_DISCOVERY_SYSTEM_PROMPT2,
|
|
37
|
+
EndpointSchema2,
|
|
38
|
+
AppInfoSchema2,
|
|
39
|
+
AppsDiscoveryResultSchema2,
|
|
40
|
+
DiscoverySummarySchema2
|
|
41
|
+
} from "./cli-9s7snz6x.js";
|
|
35
42
|
import {
|
|
36
43
|
createThreatModelPrompt
|
|
37
|
-
} from "./cli-
|
|
44
|
+
} from "./cli-q126f6ef.js";
|
|
38
45
|
import {
|
|
39
|
-
createLogger,
|
|
40
46
|
hasToolCall,
|
|
41
47
|
init_dist,
|
|
42
|
-
|
|
48
|
+
scopedLogger,
|
|
43
49
|
init_lazyLogger,
|
|
44
50
|
init_session,
|
|
45
|
-
|
|
51
|
+
createLogger,
|
|
52
|
+
init_structured
|
|
53
|
+
} from "./cli-c0ha5wh1.js";
|
|
54
|
+
import {
|
|
46
55
|
newSessionId,
|
|
47
|
-
|
|
48
|
-
} from "./cli-
|
|
56
|
+
init_id
|
|
57
|
+
} from "./cli-se8ae8z3.js";
|
|
49
58
|
import {
|
|
50
|
-
|
|
51
|
-
} from "./cli-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
var PLAN_PHASE_SYSTEM_PROMPT = `You are an expert penetration tester performing reconnaissance and planning.
|
|
60
|
-
|
|
61
|
-
Your job is to analyze the target, understand its attack surface, and create a comprehensive testing plan. You have READ-ONLY tools available — you can probe the target but NOT exploit it.
|
|
62
|
-
|
|
63
|
-
Methodology:
|
|
64
|
-
1. RECALL — Call list_memories to check for relevant knowledge from previous engagements.
|
|
65
|
-
2. PROBE — Use http_request and browser tools to understand the target's behavior, technology stack, and input vectors.
|
|
66
|
-
3. ANALYZE — Identify technologies, endpoints, authentication mechanisms, input parameters, and potential vulnerability classes.
|
|
67
|
-
4. PLAN — Write a structured pentest plan via write_plan with the following sections:
|
|
68
|
-
- **Objective** — engagement goals
|
|
69
|
-
- **Scope** — in-scope targets, exclusions
|
|
70
|
-
- **Reconnaissance Findings** — technology stack, endpoints, authentication mechanisms discovered
|
|
71
|
-
- **Attack Surface Map** — entry points ranked by exposure
|
|
72
|
-
- **Prioritized Attack Vectors** — ordered by impact, with endpoint, vulnerability class, rationale, and test approach per vector
|
|
73
|
-
- **Testing Methodology** — concrete techniques and payloads per vector (OWASP categories)
|
|
74
|
-
- **Estimated Action Tiers** — anticipated T1–T5 action counts for operator awareness
|
|
75
|
-
5. DECOMPOSE — Call create_task for each attack vector in the plan. One task per technique × endpoint combination.
|
|
76
|
-
6. SUBMIT — Call submit_plan when the plan is complete and all tasks are created.
|
|
77
|
-
|
|
78
|
-
Guidelines:
|
|
79
|
-
- Be thorough in reconnaissance — probe different endpoints, check response headers, test authentication flows
|
|
80
|
-
- Rank attack vectors by likelihood of success and potential impact
|
|
81
|
-
- Each task should be atomic and testable independently
|
|
82
|
-
- Include authentication bypass, injection, access control, and business logic testing as appropriate`;
|
|
83
|
-
function buildPlanPrompt(target, objectives, grpc) {
|
|
84
|
-
const objectiveList = objectives.map((o, i) => `${i + 1}. ${o}`).join(`
|
|
85
|
-
`);
|
|
86
|
-
const grpcSection = grpc ? `
|
|
87
|
-
## gRPC Target
|
|
88
|
-
This target is a **gRPC method**, not a plain HTTP endpoint — plan gRPC-specific attack vectors (reflection/schema recovery, per-method missing-auth, BOLA on request-message IDs, metadata trust, \`:path\` authz bypass, protobuf fuzzing, streaming abuse) rather than HTTP-centric ones.
|
|
89
|
-
- **Transport:** ${grpc.transport}
|
|
90
|
-
- **Service:** ${grpc.serviceFqn}
|
|
91
|
-
- **Method:** ${grpc.method}${grpc.streamingType ? `
|
|
92
|
-
- **Streaming:** ${grpc.streamingType}` : ""}${grpc.host ? `
|
|
93
|
-
- **Authority (host):** ${grpc.host}` : ""}
|
|
94
|
-
` : "";
|
|
95
|
-
return `# Planning Assignment
|
|
96
|
-
|
|
97
|
-
## Target
|
|
98
|
-
- **URL:** ${target}
|
|
99
|
-
${grpcSection}
|
|
100
|
-
## Objectives
|
|
101
|
-
${objectiveList}
|
|
102
|
-
|
|
103
|
-
## Instructions
|
|
104
|
-
1. Probe the target to understand its behavior and attack surface
|
|
105
|
-
2. Write a comprehensive pentest plan via write_plan
|
|
106
|
-
3. Create tasks for each attack vector via create_task
|
|
107
|
-
4. Submit the plan via submit_plan when complete`;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// src/core/workflows/pentest.ts
|
|
111
|
-
init_structured();
|
|
59
|
+
init_zod
|
|
60
|
+
} from "./cli-3qznjsnr.js";
|
|
61
|
+
import {
|
|
62
|
+
string,
|
|
63
|
+
number,
|
|
64
|
+
array,
|
|
65
|
+
object,
|
|
66
|
+
union
|
|
67
|
+
} from "./cli-mz5pk30x.js";
|
|
112
68
|
|
|
113
69
|
// src/core/session/execution-metrics.ts
|
|
114
70
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
@@ -205,6 +161,66 @@ function formatDurationHmsFromMs(durationMs) {
|
|
|
205
161
|
return `${hours}h${minutes}m${seconds}s`;
|
|
206
162
|
}
|
|
207
163
|
|
|
164
|
+
// src/core/workflows/pentest.ts
|
|
165
|
+
init_dist();
|
|
166
|
+
import { existsSync as existsSync12, readdirSync as readdirSync11, readFileSync as readFileSync10, writeFileSync as writeFileSync4 } from "node:fs";
|
|
167
|
+
import { join as join17 } from "node:path";
|
|
168
|
+
|
|
169
|
+
// src/core/agents/specialized/pentest/planPrompt.ts
|
|
170
|
+
var PLAN_PHASE_SYSTEM_PROMPT = `You are an expert penetration tester performing reconnaissance and planning.
|
|
171
|
+
|
|
172
|
+
Your job is to analyze the target, understand its attack surface, and create a comprehensive testing plan. You have READ-ONLY tools available — you can probe the target but NOT exploit it.
|
|
173
|
+
|
|
174
|
+
Methodology:
|
|
175
|
+
1. RECALL — Call list_memories to check for relevant knowledge from previous engagements.
|
|
176
|
+
2. PROBE — Use http_request and browser tools to understand the target's behavior, technology stack, and input vectors.
|
|
177
|
+
3. ANALYZE — Identify technologies, endpoints, authentication mechanisms, input parameters, and potential vulnerability classes.
|
|
178
|
+
4. PLAN — Write a structured pentest plan via write_plan with the following sections:
|
|
179
|
+
- **Objective** — engagement goals
|
|
180
|
+
- **Scope** — in-scope targets, exclusions
|
|
181
|
+
- **Reconnaissance Findings** — technology stack, endpoints, authentication mechanisms discovered
|
|
182
|
+
- **Attack Surface Map** — entry points ranked by exposure
|
|
183
|
+
- **Prioritized Attack Vectors** — ordered by impact, with endpoint, vulnerability class, rationale, and test approach per vector
|
|
184
|
+
- **Testing Methodology** — concrete techniques and payloads per vector (OWASP categories)
|
|
185
|
+
- **Estimated Action Tiers** — anticipated T1–T5 action counts for operator awareness
|
|
186
|
+
5. DECOMPOSE — Call create_task for each attack vector in the plan. One task per technique × endpoint combination.
|
|
187
|
+
6. SUBMIT — Call submit_plan when the plan is complete and all tasks are created.
|
|
188
|
+
|
|
189
|
+
Guidelines:
|
|
190
|
+
- Be thorough in reconnaissance — probe different endpoints, check response headers, test authentication flows
|
|
191
|
+
- Rank attack vectors by likelihood of success and potential impact
|
|
192
|
+
- Each task should be atomic and testable independently
|
|
193
|
+
- Include authentication bypass, injection, access control, and business logic testing as appropriate`;
|
|
194
|
+
function buildPlanPrompt(target, objectives, grpc) {
|
|
195
|
+
const objectiveList = objectives.map((o, i) => `${i + 1}. ${o}`).join(`
|
|
196
|
+
`);
|
|
197
|
+
const grpcSection = grpc ? `
|
|
198
|
+
## gRPC Target
|
|
199
|
+
This target is a **gRPC method**, not a plain HTTP endpoint — plan gRPC-specific attack vectors (reflection/schema recovery, per-method missing-auth, BOLA on request-message IDs, metadata trust, \`:path\` authz bypass, protobuf fuzzing, streaming abuse) rather than HTTP-centric ones.
|
|
200
|
+
- **Transport:** ${grpc.transport}
|
|
201
|
+
- **Service:** ${grpc.serviceFqn}
|
|
202
|
+
- **Method:** ${grpc.method}${grpc.streamingType ? `
|
|
203
|
+
- **Streaming:** ${grpc.streamingType}` : ""}${grpc.host ? `
|
|
204
|
+
- **Authority (host):** ${grpc.host}` : ""}
|
|
205
|
+
` : "";
|
|
206
|
+
return `# Planning Assignment
|
|
207
|
+
|
|
208
|
+
## Target
|
|
209
|
+
- **URL:** ${target}
|
|
210
|
+
${grpcSection}
|
|
211
|
+
## Objectives
|
|
212
|
+
${objectiveList}
|
|
213
|
+
|
|
214
|
+
## Instructions
|
|
215
|
+
1. Probe the target to understand its behavior and attack surface
|
|
216
|
+
2. Write a comprehensive pentest plan via write_plan
|
|
217
|
+
3. Create tasks for each attack vector via create_task
|
|
218
|
+
4. Submit the plan via submit_plan when complete`;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// src/core/workflows/pentest.ts
|
|
222
|
+
init_structured();
|
|
223
|
+
|
|
208
224
|
// src/core/session/loader.ts
|
|
209
225
|
init_structured();
|
|
210
226
|
import { existsSync as existsSync3, readFileSync as readFileSync3 } from "node:fs";
|
|
@@ -293,9 +309,9 @@ function readAgentManifest(session) {
|
|
|
293
309
|
return [];
|
|
294
310
|
}
|
|
295
311
|
}
|
|
296
|
-
function buildManifestEntries(targets) {
|
|
312
|
+
function buildManifestEntries(targets, mintId = () => newSessionId()) {
|
|
297
313
|
return targets.map((t, i) => {
|
|
298
|
-
const sessionId =
|
|
314
|
+
const sessionId = mintId(t.name ?? "pentest-worker", i);
|
|
299
315
|
return {
|
|
300
316
|
id: sessionId,
|
|
301
317
|
sessionId,
|
|
@@ -485,10 +501,10 @@ function loadSubagents(rootPath) {
|
|
|
485
501
|
const subagentsPath = join2(rootPath, SUBAGENTS_DIR);
|
|
486
502
|
const manifestNameById = new Map;
|
|
487
503
|
{
|
|
488
|
-
const
|
|
489
|
-
if (existsSync2(
|
|
504
|
+
const manifestPath = join2(rootPath, MANIFEST_FILE);
|
|
505
|
+
if (existsSync2(manifestPath)) {
|
|
490
506
|
try {
|
|
491
|
-
const manifest = JSON.parse(readFileSync2(
|
|
507
|
+
const manifest = JSON.parse(readFileSync2(manifestPath, "utf-8"));
|
|
492
508
|
for (const entry of manifest)
|
|
493
509
|
manifestNameById.set(entry.id, entry.name);
|
|
494
510
|
} catch {}
|
|
@@ -638,7 +654,7 @@ init_lazyLogger();
|
|
|
638
654
|
|
|
639
655
|
// src/core/workflows/whiteboxAttackSurface.ts
|
|
640
656
|
import {
|
|
641
|
-
existsSync as
|
|
657
|
+
existsSync as existsSync11,
|
|
642
658
|
mkdirSync as mkdirSync2,
|
|
643
659
|
readdirSync as readdirSync10,
|
|
644
660
|
readFileSync as readFileSync9,
|
|
@@ -646,6 +662,7 @@ import {
|
|
|
646
662
|
writeFileSync as writeFileSync3
|
|
647
663
|
} from "node:fs";
|
|
648
664
|
import { join as join16 } from "node:path";
|
|
665
|
+
init_zod();
|
|
649
666
|
|
|
650
667
|
// src/core/agents/specialized/whiteboxAttackSurface/endpointDocumentationAgent.ts
|
|
651
668
|
init_id();
|
|
@@ -736,64 +753,64 @@ async function runEndpointDocumentationAgent(opts) {
|
|
|
736
753
|
thinkingEffort,
|
|
737
754
|
projectThreatModel,
|
|
738
755
|
parentSubagentId,
|
|
739
|
-
agentLimiter
|
|
756
|
+
agentLimiter,
|
|
757
|
+
subagentSpawner,
|
|
758
|
+
hooks,
|
|
759
|
+
mintChildId
|
|
740
760
|
} = opts;
|
|
741
|
-
const subagentId = newSessionId();
|
|
742
761
|
const displayMethod = getDocumentMethod(endpoint);
|
|
743
762
|
const displayName = `${app.name}: ${displayMethod.join(",")} ${endpoint.path}`;
|
|
744
|
-
|
|
745
|
-
subagentId,
|
|
746
|
-
name: displayName,
|
|
747
|
-
input: {
|
|
748
|
-
app: app.name,
|
|
749
|
-
type: "endpointDocumentation",
|
|
750
|
-
method: displayMethod,
|
|
751
|
-
path: endpoint.path
|
|
752
|
-
},
|
|
753
|
-
parentSubagentId
|
|
754
|
-
});
|
|
763
|
+
const subagentId = mintChildId ? mintChildId(displayName) : newSessionId();
|
|
755
764
|
const objective = buildEndpointDocumentationObjective({
|
|
756
765
|
app,
|
|
757
766
|
codebasePath,
|
|
758
767
|
endpoint,
|
|
759
768
|
frameworks
|
|
760
769
|
});
|
|
761
|
-
const
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
770
|
+
const spawner = subagentSpawner ?? inProcessSubagentSpawner;
|
|
771
|
+
const spawnChild = () => spawner.spawn({
|
|
772
|
+
spec: {
|
|
773
|
+
type: "code",
|
|
774
|
+
codebasePath,
|
|
775
|
+
objective,
|
|
776
|
+
system: WHITEBOX_ENDPOINT_DOCUMENTATION_SYSTEM_PROMPT,
|
|
777
|
+
excludeTools: ["document_app", "list_files", "grep"],
|
|
778
|
+
responseSchema: DiscoverySummarySchema2,
|
|
779
|
+
projectThreatModel,
|
|
780
|
+
attackSurfaceRegistry
|
|
781
|
+
},
|
|
782
|
+
runtime: {
|
|
783
|
+
model,
|
|
784
|
+
session,
|
|
785
|
+
authConfig,
|
|
786
|
+
abortSignal,
|
|
787
|
+
enableThinking,
|
|
788
|
+
thinkingEffort,
|
|
789
|
+
openAIReasoningEffort,
|
|
790
|
+
onStepFinish,
|
|
791
|
+
onCacheMetrics,
|
|
792
|
+
backends: hooks?.backends,
|
|
793
|
+
sandbox: hooks?.sandbox,
|
|
794
|
+
languageModelMiddleware: hooks?.languageModelMiddleware,
|
|
795
|
+
usageRecorder: hooks?.usageRecorder,
|
|
796
|
+
streamIdFactory: hooks?.streamIdFactory
|
|
797
|
+
},
|
|
771
798
|
subagentId,
|
|
772
799
|
subagentName: displayName,
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
800
|
+
parentBus: eventBus,
|
|
801
|
+
parentSubagentId,
|
|
802
|
+
lifecycleInput: {
|
|
803
|
+
app: app.name,
|
|
804
|
+
type: "endpointDocumentation",
|
|
805
|
+
method: displayMethod,
|
|
806
|
+
path: endpoint.path
|
|
807
|
+
}
|
|
781
808
|
});
|
|
782
809
|
try {
|
|
783
|
-
await (agentLimiter ? agentLimiter(
|
|
784
|
-
eventBus?.emit("subagent-complete", {
|
|
785
|
-
subagentId,
|
|
786
|
-
status: "completed",
|
|
787
|
-
parentSubagentId
|
|
788
|
-
});
|
|
810
|
+
await (agentLimiter ? agentLimiter(spawnChild) : spawnChild());
|
|
789
811
|
return true;
|
|
790
812
|
} catch (error) {
|
|
791
813
|
log3.error(`"${subagentId}" FAILED`, error instanceof Error ? error : undefined, { error: String(error) });
|
|
792
|
-
eventBus?.emit("subagent-complete", {
|
|
793
|
-
subagentId,
|
|
794
|
-
status: "failed",
|
|
795
|
-
parentSubagentId
|
|
796
|
-
});
|
|
797
814
|
return false;
|
|
798
815
|
}
|
|
799
816
|
}
|
|
@@ -801,20 +818,18 @@ async function runAppEndpointDocumentation(opts) {
|
|
|
801
818
|
const { endpoints, ...shared } = opts;
|
|
802
819
|
if (endpoints.length === 0)
|
|
803
820
|
return;
|
|
821
|
+
const spawner = opts.subagentSpawner ?? inProcessSubagentSpawner;
|
|
804
822
|
let anyFailed = false;
|
|
805
|
-
await
|
|
823
|
+
await spawner.spawnMany(endpoints, async (endpoint) => {
|
|
806
824
|
const ok = await runEndpointDocumentationAgent({ ...shared, endpoint });
|
|
807
825
|
if (!ok)
|
|
808
826
|
anyFailed = true;
|
|
809
|
-
});
|
|
827
|
+
}, { concurrency: ENDPOINT_DOCUMENTATION_CONCURRENCY });
|
|
810
828
|
if (anyFailed) {
|
|
811
829
|
throw new Error(`One or more endpoint documentation agents failed for app ${opts.app.name}`);
|
|
812
830
|
}
|
|
813
831
|
}
|
|
814
832
|
|
|
815
|
-
// src/core/workflows/whiteboxAttackSurface.ts
|
|
816
|
-
init_id();
|
|
817
|
-
|
|
818
833
|
// src/core/integrations/surface/index.ts
|
|
819
834
|
import { existsSync as existsSync10 } from "node:fs";
|
|
820
835
|
import { dirname as dirname3, relative as relative3, resolve as resolve2, sep } from "node:path";
|
|
@@ -1073,12 +1088,12 @@ function compileMap() {
|
|
|
1073
1088
|
fallback: []
|
|
1074
1089
|
}
|
|
1075
1090
|
}, index, length;
|
|
1076
|
-
function collectType(
|
|
1077
|
-
if (
|
|
1078
|
-
result.multi[
|
|
1079
|
-
result.multi["fallback"].push(
|
|
1091
|
+
function collectType(type) {
|
|
1092
|
+
if (type.multi) {
|
|
1093
|
+
result.multi[type.kind].push(type);
|
|
1094
|
+
result.multi["fallback"].push(type);
|
|
1080
1095
|
} else {
|
|
1081
|
-
result[
|
|
1096
|
+
result[type.kind][type.tag] = result["fallback"][type.tag] = type;
|
|
1082
1097
|
}
|
|
1083
1098
|
}
|
|
1084
1099
|
for (index = 0, length = arguments.length;index < length; index += 1) {
|
|
@@ -1089,7 +1104,7 @@ function compileMap() {
|
|
|
1089
1104
|
function Schema$1(definition) {
|
|
1090
1105
|
return this.extend(definition);
|
|
1091
1106
|
}
|
|
1092
|
-
Schema$1.prototype.extend = function
|
|
1107
|
+
Schema$1.prototype.extend = function extend(definition) {
|
|
1093
1108
|
var implicit = [];
|
|
1094
1109
|
var explicit = [];
|
|
1095
1110
|
if (definition instanceof type) {
|
|
@@ -1496,9 +1511,9 @@ var BASE64_MAP = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
|
|
|
1496
1511
|
function resolveYamlBinary(data) {
|
|
1497
1512
|
if (data === null)
|
|
1498
1513
|
return false;
|
|
1499
|
-
var code, idx, bitlen = 0, max = data.length,
|
|
1514
|
+
var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;
|
|
1500
1515
|
for (idx = 0;idx < max; idx++) {
|
|
1501
|
-
code =
|
|
1516
|
+
code = map.indexOf(data.charAt(idx));
|
|
1502
1517
|
if (code > 64)
|
|
1503
1518
|
continue;
|
|
1504
1519
|
if (code < 0)
|
|
@@ -1508,14 +1523,14 @@ function resolveYamlBinary(data) {
|
|
|
1508
1523
|
return bitlen % 8 === 0;
|
|
1509
1524
|
}
|
|
1510
1525
|
function constructYamlBinary(data) {
|
|
1511
|
-
var idx, tailbits, input = data.replace(/[\r\n=]/g, ""), max = input.length,
|
|
1526
|
+
var idx, tailbits, input = data.replace(/[\r\n=]/g, ""), max = input.length, map = BASE64_MAP, bits = 0, result = [];
|
|
1512
1527
|
for (idx = 0;idx < max; idx++) {
|
|
1513
1528
|
if (idx % 4 === 0 && idx) {
|
|
1514
1529
|
result.push(bits >> 16 & 255);
|
|
1515
1530
|
result.push(bits >> 8 & 255);
|
|
1516
1531
|
result.push(bits & 255);
|
|
1517
1532
|
}
|
|
1518
|
-
bits = bits << 6 |
|
|
1533
|
+
bits = bits << 6 | map.indexOf(input.charAt(idx));
|
|
1519
1534
|
}
|
|
1520
1535
|
tailbits = max % 4 * 6;
|
|
1521
1536
|
if (tailbits === 0) {
|
|
@@ -1531,32 +1546,32 @@ function constructYamlBinary(data) {
|
|
|
1531
1546
|
return new Uint8Array(result);
|
|
1532
1547
|
}
|
|
1533
1548
|
function representYamlBinary(object) {
|
|
1534
|
-
var result = "", bits = 0, idx, tail, max = object.length,
|
|
1549
|
+
var result = "", bits = 0, idx, tail, max = object.length, map = BASE64_MAP;
|
|
1535
1550
|
for (idx = 0;idx < max; idx++) {
|
|
1536
1551
|
if (idx % 3 === 0 && idx) {
|
|
1537
|
-
result +=
|
|
1538
|
-
result +=
|
|
1539
|
-
result +=
|
|
1540
|
-
result +=
|
|
1552
|
+
result += map[bits >> 18 & 63];
|
|
1553
|
+
result += map[bits >> 12 & 63];
|
|
1554
|
+
result += map[bits >> 6 & 63];
|
|
1555
|
+
result += map[bits & 63];
|
|
1541
1556
|
}
|
|
1542
1557
|
bits = (bits << 8) + object[idx];
|
|
1543
1558
|
}
|
|
1544
1559
|
tail = max % 3;
|
|
1545
1560
|
if (tail === 0) {
|
|
1546
|
-
result +=
|
|
1547
|
-
result +=
|
|
1548
|
-
result +=
|
|
1549
|
-
result +=
|
|
1561
|
+
result += map[bits >> 18 & 63];
|
|
1562
|
+
result += map[bits >> 12 & 63];
|
|
1563
|
+
result += map[bits >> 6 & 63];
|
|
1564
|
+
result += map[bits & 63];
|
|
1550
1565
|
} else if (tail === 2) {
|
|
1551
|
-
result +=
|
|
1552
|
-
result +=
|
|
1553
|
-
result +=
|
|
1554
|
-
result +=
|
|
1566
|
+
result += map[bits >> 10 & 63];
|
|
1567
|
+
result += map[bits >> 4 & 63];
|
|
1568
|
+
result += map[bits << 2 & 63];
|
|
1569
|
+
result += map[64];
|
|
1555
1570
|
} else if (tail === 1) {
|
|
1556
|
-
result +=
|
|
1557
|
-
result +=
|
|
1558
|
-
result +=
|
|
1559
|
-
result +=
|
|
1571
|
+
result += map[bits >> 2 & 63];
|
|
1572
|
+
result += map[bits << 4 & 63];
|
|
1573
|
+
result += map[64];
|
|
1574
|
+
result += map[64];
|
|
1560
1575
|
}
|
|
1561
1576
|
return result;
|
|
1562
1577
|
}
|
|
@@ -1985,7 +2000,7 @@ function writeFoldedLines(state, count) {
|
|
|
1985
2000
|
}
|
|
1986
2001
|
}
|
|
1987
2002
|
function readPlainScalar(state, nodeIndent, withinFlowCollection) {
|
|
1988
|
-
var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent,
|
|
2003
|
+
var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, { kind: _kind, result: _result } = state, ch;
|
|
1989
2004
|
ch = state.input.charCodeAt(state.position);
|
|
1990
2005
|
if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 35 || ch === 38 || ch === 42 || ch === 33 || ch === 124 || ch === 62 || ch === 39 || ch === 34 || ch === 37 || ch === 64 || ch === 96) {
|
|
1991
2006
|
return false;
|
|
@@ -2315,7 +2330,7 @@ function readBlockScalar(state, nodeIndent) {
|
|
|
2315
2330
|
return true;
|
|
2316
2331
|
}
|
|
2317
2332
|
function readBlockSequence(state, nodeIndent) {
|
|
2318
|
-
var _line,
|
|
2333
|
+
var _line, { tag: _tag, anchor: _anchor } = state, _result = [], following, detected = false, ch;
|
|
2319
2334
|
if (state.firstTabInLine !== -1)
|
|
2320
2335
|
return false;
|
|
2321
2336
|
if (state.anchor !== null) {
|
|
@@ -2364,7 +2379,7 @@ function readBlockSequence(state, nodeIndent) {
|
|
|
2364
2379
|
return false;
|
|
2365
2380
|
}
|
|
2366
2381
|
function readBlockMapping(state, nodeIndent, flowIndent) {
|
|
2367
|
-
var following, allowCompact, _line, _keyLine, _keyLineStart, _keyPos,
|
|
2382
|
+
var following, allowCompact, _line, _keyLine, _keyLineStart, _keyPos, { tag: _tag, anchor: _anchor } = state, _result = {}, overridableKeys = Object.create(null), keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch;
|
|
2368
2383
|
if (state.firstTabInLine !== -1)
|
|
2369
2384
|
return false;
|
|
2370
2385
|
if (state.anchor !== null) {
|
|
@@ -2586,7 +2601,7 @@ function readAlias(state) {
|
|
|
2586
2601
|
return true;
|
|
2587
2602
|
}
|
|
2588
2603
|
function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
|
|
2589
|
-
var allowBlockStyles, allowBlockScalars, allowBlockCollections, indentStatus = 1, atNewLine = false, hasContent = false, typeIndex, typeQuantity, typeList,
|
|
2604
|
+
var allowBlockStyles, allowBlockScalars, allowBlockCollections, indentStatus = 1, atNewLine = false, hasContent = false, typeIndex, typeQuantity, typeList, type, flowIndent, blockIndent;
|
|
2590
2605
|
if (state.listener !== null) {
|
|
2591
2606
|
state.listener("open", state);
|
|
2592
2607
|
}
|
|
@@ -2668,10 +2683,10 @@ function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact
|
|
|
2668
2683
|
throwError(state, 'unacceptable node kind for !<?> tag; it should be "scalar", not "' + state.kind + '"');
|
|
2669
2684
|
}
|
|
2670
2685
|
for (typeIndex = 0, typeQuantity = state.implicitTypes.length;typeIndex < typeQuantity; typeIndex += 1) {
|
|
2671
|
-
|
|
2672
|
-
if (
|
|
2673
|
-
state.result =
|
|
2674
|
-
state.tag =
|
|
2686
|
+
type = state.implicitTypes[typeIndex];
|
|
2687
|
+
if (type.resolve(state.result)) {
|
|
2688
|
+
state.result = type.construct(state.result);
|
|
2689
|
+
state.tag = type.tag;
|
|
2675
2690
|
if (state.anchor !== null) {
|
|
2676
2691
|
state.anchorMap[state.anchor] = state.result;
|
|
2677
2692
|
}
|
|
@@ -2680,27 +2695,27 @@ function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact
|
|
|
2680
2695
|
}
|
|
2681
2696
|
} else if (state.tag !== "!") {
|
|
2682
2697
|
if (_hasOwnProperty$1.call(state.typeMap[state.kind || "fallback"], state.tag)) {
|
|
2683
|
-
|
|
2698
|
+
type = state.typeMap[state.kind || "fallback"][state.tag];
|
|
2684
2699
|
} else {
|
|
2685
|
-
|
|
2700
|
+
type = null;
|
|
2686
2701
|
typeList = state.typeMap.multi[state.kind || "fallback"];
|
|
2687
2702
|
for (typeIndex = 0, typeQuantity = typeList.length;typeIndex < typeQuantity; typeIndex += 1) {
|
|
2688
2703
|
if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {
|
|
2689
|
-
|
|
2704
|
+
type = typeList[typeIndex];
|
|
2690
2705
|
break;
|
|
2691
2706
|
}
|
|
2692
2707
|
}
|
|
2693
2708
|
}
|
|
2694
|
-
if (!
|
|
2709
|
+
if (!type) {
|
|
2695
2710
|
throwError(state, "unknown tag !<" + state.tag + ">");
|
|
2696
2711
|
}
|
|
2697
|
-
if (state.result !== null &&
|
|
2698
|
-
throwError(state, "unacceptable node kind for !<" + state.tag + '> tag; it should be "' +
|
|
2712
|
+
if (state.result !== null && type.kind !== state.kind) {
|
|
2713
|
+
throwError(state, "unacceptable node kind for !<" + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
|
|
2699
2714
|
}
|
|
2700
|
-
if (!
|
|
2715
|
+
if (!type.resolve(state.result, state.tag)) {
|
|
2701
2716
|
throwError(state, "cannot resolve a node with !<" + state.tag + "> explicit tag");
|
|
2702
2717
|
} else {
|
|
2703
|
-
state.result =
|
|
2718
|
+
state.result = type.construct(state.result, state.tag);
|
|
2704
2719
|
if (state.anchor !== null) {
|
|
2705
2720
|
state.anchorMap[state.anchor] = state.result;
|
|
2706
2721
|
}
|
|
@@ -2904,21 +2919,21 @@ var DEPRECATED_BOOLEANS_SYNTAX = [
|
|
|
2904
2919
|
"OFF"
|
|
2905
2920
|
];
|
|
2906
2921
|
var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;
|
|
2907
|
-
function compileStyleMap(
|
|
2908
|
-
var result, keys, index, length, tag, style,
|
|
2909
|
-
if (
|
|
2922
|
+
function compileStyleMap(schema, map) {
|
|
2923
|
+
var result, keys, index, length, tag, style, type;
|
|
2924
|
+
if (map === null)
|
|
2910
2925
|
return {};
|
|
2911
2926
|
result = {};
|
|
2912
|
-
keys = Object.keys(
|
|
2927
|
+
keys = Object.keys(map);
|
|
2913
2928
|
for (index = 0, length = keys.length;index < length; index += 1) {
|
|
2914
2929
|
tag = keys[index];
|
|
2915
|
-
style = String(
|
|
2930
|
+
style = String(map[tag]);
|
|
2916
2931
|
if (tag.slice(0, 2) === "!!") {
|
|
2917
2932
|
tag = "tag:yaml.org,2002:" + tag.slice(2);
|
|
2918
2933
|
}
|
|
2919
|
-
|
|
2920
|
-
if (
|
|
2921
|
-
style =
|
|
2934
|
+
type = schema.compiledTypeMap["fallback"][tag];
|
|
2935
|
+
if (type && _hasOwnProperty.call(type.styleAliases, style)) {
|
|
2936
|
+
style = type.styleAliases[style];
|
|
2922
2937
|
}
|
|
2923
2938
|
result[tag] = style;
|
|
2924
2939
|
}
|
|
@@ -2988,11 +3003,11 @@ function generateNextLine(state, level) {
|
|
|
2988
3003
|
return `
|
|
2989
3004
|
` + common.repeat(" ", state.indent * level);
|
|
2990
3005
|
}
|
|
2991
|
-
function testImplicitResolving(state,
|
|
2992
|
-
var index, length,
|
|
3006
|
+
function testImplicitResolving(state, str) {
|
|
3007
|
+
var index, length, type;
|
|
2993
3008
|
for (index = 0, length = state.implicitTypes.length;index < length; index += 1) {
|
|
2994
|
-
|
|
2995
|
-
if (
|
|
3009
|
+
type = state.implicitTypes[index];
|
|
3010
|
+
if (type.resolve(str)) {
|
|
2996
3011
|
return true;
|
|
2997
3012
|
}
|
|
2998
3013
|
}
|
|
@@ -3038,7 +3053,7 @@ var STYLE_LITERAL = 3;
|
|
|
3038
3053
|
var STYLE_FOLDED = 4;
|
|
3039
3054
|
var STYLE_DOUBLE = 5;
|
|
3040
3055
|
function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType, quotingType, forceQuotes, inblock) {
|
|
3041
|
-
var
|
|
3056
|
+
var i;
|
|
3042
3057
|
var char = 0;
|
|
3043
3058
|
var prevChar = null;
|
|
3044
3059
|
var hasLineBreak = false;
|
|
@@ -3047,8 +3062,8 @@ function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, te
|
|
|
3047
3062
|
var previousLineBreak = -1;
|
|
3048
3063
|
var plain = isPlainSafeFirst(codePointAt(string, 0)) && isPlainSafeLast(codePointAt(string, string.length - 1));
|
|
3049
3064
|
if (singleLineOnly || forceQuotes) {
|
|
3050
|
-
for (
|
|
3051
|
-
char = codePointAt(string,
|
|
3065
|
+
for (i = 0;i < string.length; char >= 65536 ? i += 2 : i++) {
|
|
3066
|
+
char = codePointAt(string, i);
|
|
3052
3067
|
if (!isPrintable(char)) {
|
|
3053
3068
|
return STYLE_DOUBLE;
|
|
3054
3069
|
}
|
|
@@ -3056,13 +3071,13 @@ function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, te
|
|
|
3056
3071
|
prevChar = char;
|
|
3057
3072
|
}
|
|
3058
3073
|
} else {
|
|
3059
|
-
for (
|
|
3060
|
-
char = codePointAt(string,
|
|
3074
|
+
for (i = 0;i < string.length; char >= 65536 ? i += 2 : i++) {
|
|
3075
|
+
char = codePointAt(string, i);
|
|
3061
3076
|
if (char === CHAR_LINE_FEED) {
|
|
3062
3077
|
hasLineBreak = true;
|
|
3063
3078
|
if (shouldTrackWidth) {
|
|
3064
|
-
hasFoldableLine = hasFoldableLine ||
|
|
3065
|
-
previousLineBreak =
|
|
3079
|
+
hasFoldableLine = hasFoldableLine || i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== " ";
|
|
3080
|
+
previousLineBreak = i;
|
|
3066
3081
|
}
|
|
3067
3082
|
} else if (!isPrintable(char)) {
|
|
3068
3083
|
return STYLE_DOUBLE;
|
|
@@ -3070,7 +3085,7 @@ function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, te
|
|
|
3070
3085
|
plain = plain && isPlainSafe(char, prevChar, inblock);
|
|
3071
3086
|
prevChar = char;
|
|
3072
3087
|
}
|
|
3073
|
-
hasFoldableLine = hasFoldableLine || shouldTrackWidth && (
|
|
3088
|
+
hasFoldableLine = hasFoldableLine || shouldTrackWidth && (i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== " ");
|
|
3074
3089
|
}
|
|
3075
3090
|
if (!hasLineBreak && !hasFoldableLine) {
|
|
3076
3091
|
if (plain && !forceQuotes && !testAmbiguousType(string)) {
|
|
@@ -3099,8 +3114,8 @@ function writeScalar(state, string, level, iskey, inblock) {
|
|
|
3099
3114
|
var indent = state.indent * Math.max(1, level);
|
|
3100
3115
|
var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);
|
|
3101
3116
|
var singleLineOnly = iskey || state.flowLevel > -1 && level >= state.flowLevel;
|
|
3102
|
-
function testAmbiguity(
|
|
3103
|
-
return testImplicitResolving(state,
|
|
3117
|
+
function testAmbiguity(string) {
|
|
3118
|
+
return testImplicitResolving(state, string);
|
|
3104
3119
|
}
|
|
3105
3120
|
switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {
|
|
3106
3121
|
case STYLE_PLAIN:
|
|
@@ -3186,13 +3201,13 @@ function escapeString(string) {
|
|
|
3186
3201
|
var result = "";
|
|
3187
3202
|
var char = 0;
|
|
3188
3203
|
var escapeSeq;
|
|
3189
|
-
for (var
|
|
3190
|
-
char = codePointAt(string,
|
|
3204
|
+
for (var i = 0;i < string.length; char >= 65536 ? i += 2 : i++) {
|
|
3205
|
+
char = codePointAt(string, i);
|
|
3191
3206
|
escapeSeq = ESCAPE_SEQUENCES[char];
|
|
3192
3207
|
if (!escapeSeq && isPrintable(char)) {
|
|
3193
|
-
result += string[
|
|
3208
|
+
result += string[i];
|
|
3194
3209
|
if (char >= 65536)
|
|
3195
|
-
result += string[
|
|
3210
|
+
result += string[i + 1];
|
|
3196
3211
|
} else {
|
|
3197
3212
|
result += escapeSeq || encodeHex(char);
|
|
3198
3213
|
}
|
|
@@ -3314,28 +3329,28 @@ function writeBlockMapping(state, level, object, compact) {
|
|
|
3314
3329
|
state.dump = _result || "{}";
|
|
3315
3330
|
}
|
|
3316
3331
|
function detectType(state, object, explicit) {
|
|
3317
|
-
var _result, typeList, index, length,
|
|
3332
|
+
var _result, typeList, index, length, type, style;
|
|
3318
3333
|
typeList = explicit ? state.explicitTypes : state.implicitTypes;
|
|
3319
3334
|
for (index = 0, length = typeList.length;index < length; index += 1) {
|
|
3320
|
-
|
|
3321
|
-
if ((
|
|
3335
|
+
type = typeList[index];
|
|
3336
|
+
if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === "object" && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) {
|
|
3322
3337
|
if (explicit) {
|
|
3323
|
-
if (
|
|
3324
|
-
state.tag =
|
|
3338
|
+
if (type.multi && type.representName) {
|
|
3339
|
+
state.tag = type.representName(object);
|
|
3325
3340
|
} else {
|
|
3326
|
-
state.tag =
|
|
3341
|
+
state.tag = type.tag;
|
|
3327
3342
|
}
|
|
3328
3343
|
} else {
|
|
3329
3344
|
state.tag = "?";
|
|
3330
3345
|
}
|
|
3331
|
-
if (
|
|
3332
|
-
style = state.styleMap[
|
|
3333
|
-
if (_toString.call(
|
|
3334
|
-
_result =
|
|
3335
|
-
} else if (_hasOwnProperty.call(
|
|
3336
|
-
_result =
|
|
3346
|
+
if (type.represent) {
|
|
3347
|
+
style = state.styleMap[type.tag] || type.defaultStyle;
|
|
3348
|
+
if (_toString.call(type.represent) === "[object Function]") {
|
|
3349
|
+
_result = type.represent(object, style);
|
|
3350
|
+
} else if (_hasOwnProperty.call(type.represent, style)) {
|
|
3351
|
+
_result = type.represent[style](object, style);
|
|
3337
3352
|
} else {
|
|
3338
|
-
throw new exception("!<" +
|
|
3353
|
+
throw new exception("!<" + type.tag + '> tag resolver accepts not "' + style + '" style');
|
|
3339
3354
|
}
|
|
3340
3355
|
state.dump = _result;
|
|
3341
3356
|
}
|
|
@@ -3350,13 +3365,13 @@ function writeNode(state, level, object, block, compact, iskey, isblockseq) {
|
|
|
3350
3365
|
if (!detectType(state, object, false)) {
|
|
3351
3366
|
detectType(state, object, true);
|
|
3352
3367
|
}
|
|
3353
|
-
var
|
|
3368
|
+
var type = _toString.call(state.dump);
|
|
3354
3369
|
var inblock = block;
|
|
3355
3370
|
var tagStr;
|
|
3356
3371
|
if (block) {
|
|
3357
3372
|
block = state.flowLevel < 0 || state.flowLevel > level;
|
|
3358
3373
|
}
|
|
3359
|
-
var objectOrArray =
|
|
3374
|
+
var objectOrArray = type === "[object Object]" || type === "[object Array]", duplicateIndex, duplicate;
|
|
3360
3375
|
if (objectOrArray) {
|
|
3361
3376
|
duplicateIndex = state.duplicates.indexOf(object);
|
|
3362
3377
|
duplicate = duplicateIndex !== -1;
|
|
@@ -3370,7 +3385,7 @@ function writeNode(state, level, object, block, compact, iskey, isblockseq) {
|
|
|
3370
3385
|
if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
|
|
3371
3386
|
state.usedDuplicates[duplicateIndex] = true;
|
|
3372
3387
|
}
|
|
3373
|
-
if (
|
|
3388
|
+
if (type === "[object Object]") {
|
|
3374
3389
|
if (block && Object.keys(state.dump).length !== 0) {
|
|
3375
3390
|
writeBlockMapping(state, level, state.dump, compact);
|
|
3376
3391
|
if (duplicate) {
|
|
@@ -3382,7 +3397,7 @@ function writeNode(state, level, object, block, compact, iskey, isblockseq) {
|
|
|
3382
3397
|
state.dump = "&ref_" + duplicateIndex + " " + state.dump;
|
|
3383
3398
|
}
|
|
3384
3399
|
}
|
|
3385
|
-
} else if (
|
|
3400
|
+
} else if (type === "[object Array]") {
|
|
3386
3401
|
if (block && state.dump.length !== 0) {
|
|
3387
3402
|
if (state.noArrayIndent && !isblockseq && level > 0) {
|
|
3388
3403
|
writeBlockSequence(state, level - 1, state.dump, compact);
|
|
@@ -3398,16 +3413,16 @@ function writeNode(state, level, object, block, compact, iskey, isblockseq) {
|
|
|
3398
3413
|
state.dump = "&ref_" + duplicateIndex + " " + state.dump;
|
|
3399
3414
|
}
|
|
3400
3415
|
}
|
|
3401
|
-
} else if (
|
|
3416
|
+
} else if (type === "[object String]") {
|
|
3402
3417
|
if (state.tag !== "?") {
|
|
3403
3418
|
writeScalar(state, state.dump, level, iskey, inblock);
|
|
3404
3419
|
}
|
|
3405
|
-
} else if (
|
|
3420
|
+
} else if (type === "[object Undefined]") {
|
|
3406
3421
|
return false;
|
|
3407
3422
|
} else {
|
|
3408
3423
|
if (state.skipInvalid)
|
|
3409
3424
|
return false;
|
|
3410
|
-
throw new exception("unacceptable kind of an object to dump " +
|
|
3425
|
+
throw new exception("unacceptable kind of an object to dump " + type);
|
|
3411
3426
|
}
|
|
3412
3427
|
if (state.tag !== null && state.tag !== "?") {
|
|
3413
3428
|
tagStr = encodeURI(state.tag[0] === "!" ? state.tag.slice(1) : state.tag).replace(/!/g, "%21");
|
|
@@ -3838,8 +3853,8 @@ function normalizePath(path) {
|
|
|
3838
3853
|
}
|
|
3839
3854
|
function lineNumber(content, offset) {
|
|
3840
3855
|
let count = 1;
|
|
3841
|
-
for (let
|
|
3842
|
-
if (content[
|
|
3856
|
+
for (let i = 0;i < offset && i < content.length; i++) {
|
|
3857
|
+
if (content[i] === `
|
|
3843
3858
|
`)
|
|
3844
3859
|
count++;
|
|
3845
3860
|
}
|
|
@@ -3847,10 +3862,10 @@ function lineNumber(content, offset) {
|
|
|
3847
3862
|
}
|
|
3848
3863
|
function buildLineIndex(content) {
|
|
3849
3864
|
const offsets = [0];
|
|
3850
|
-
for (let
|
|
3851
|
-
if (content[
|
|
3865
|
+
for (let i = 0;i < content.length; i++) {
|
|
3866
|
+
if (content[i] === `
|
|
3852
3867
|
`)
|
|
3853
|
-
offsets.push(
|
|
3868
|
+
offsets.push(i + 1);
|
|
3854
3869
|
}
|
|
3855
3870
|
return {
|
|
3856
3871
|
lineAt(offset) {
|
|
@@ -4065,8 +4080,8 @@ var django = {
|
|
|
4065
4080
|
const pyFiles = ctx.iterFiles(PY_EXTS3);
|
|
4066
4081
|
const dirOf2 = (f) => {
|
|
4067
4082
|
const norm = f.replace(/\\/g, "/");
|
|
4068
|
-
const
|
|
4069
|
-
return
|
|
4083
|
+
const i = norm.lastIndexOf("/");
|
|
4084
|
+
return i < 0 ? "" : norm.slice(0, i);
|
|
4070
4085
|
};
|
|
4071
4086
|
const classesByDir = /* @__PURE__ */ new Map;
|
|
4072
4087
|
const funcsByDir = /* @__PURE__ */ new Map;
|
|
@@ -4260,67 +4275,67 @@ var PAGE_RENDER_RE = /\bres\s*\.\s*render\s*\(/;
|
|
|
4260
4275
|
var PAGE_SENDFILE_RE = /\bres\s*\.\s*sendFile\s*\(/;
|
|
4261
4276
|
function findMatchingParen(content, start) {
|
|
4262
4277
|
let depth = 0;
|
|
4263
|
-
let
|
|
4278
|
+
let i = start;
|
|
4264
4279
|
const len = content.length;
|
|
4265
|
-
while (
|
|
4266
|
-
const ch = content[
|
|
4267
|
-
if (ch === "/" && content[
|
|
4280
|
+
while (i < len) {
|
|
4281
|
+
const ch = content[i];
|
|
4282
|
+
if (ch === "/" && content[i + 1] === "/") {
|
|
4268
4283
|
const nl = content.indexOf(`
|
|
4269
|
-
`,
|
|
4284
|
+
`, i);
|
|
4270
4285
|
if (nl === -1)
|
|
4271
4286
|
return -1;
|
|
4272
|
-
|
|
4287
|
+
i = nl + 1;
|
|
4273
4288
|
continue;
|
|
4274
4289
|
}
|
|
4275
|
-
if (ch === "/" && content[
|
|
4276
|
-
const end = content.indexOf("*/",
|
|
4290
|
+
if (ch === "/" && content[i + 1] === "*") {
|
|
4291
|
+
const end = content.indexOf("*/", i + 2);
|
|
4277
4292
|
if (end === -1)
|
|
4278
4293
|
return -1;
|
|
4279
|
-
|
|
4294
|
+
i = end + 2;
|
|
4280
4295
|
continue;
|
|
4281
4296
|
}
|
|
4282
4297
|
if (ch === "'" || ch === '"') {
|
|
4283
|
-
|
|
4284
|
-
while (
|
|
4285
|
-
const c = content[
|
|
4298
|
+
i++;
|
|
4299
|
+
while (i < len) {
|
|
4300
|
+
const c = content[i];
|
|
4286
4301
|
if (c === "\\") {
|
|
4287
|
-
|
|
4302
|
+
i += 2;
|
|
4288
4303
|
continue;
|
|
4289
4304
|
}
|
|
4290
4305
|
if (c === ch) {
|
|
4291
|
-
|
|
4306
|
+
i++;
|
|
4292
4307
|
break;
|
|
4293
4308
|
}
|
|
4294
|
-
|
|
4309
|
+
i++;
|
|
4295
4310
|
}
|
|
4296
4311
|
continue;
|
|
4297
4312
|
}
|
|
4298
4313
|
if (ch === "`") {
|
|
4299
|
-
|
|
4300
|
-
while (
|
|
4301
|
-
const c = content[
|
|
4314
|
+
i++;
|
|
4315
|
+
while (i < len) {
|
|
4316
|
+
const c = content[i];
|
|
4302
4317
|
if (c === "\\") {
|
|
4303
|
-
|
|
4318
|
+
i += 2;
|
|
4304
4319
|
continue;
|
|
4305
4320
|
}
|
|
4306
4321
|
if (c === "`") {
|
|
4307
|
-
|
|
4322
|
+
i++;
|
|
4308
4323
|
break;
|
|
4309
4324
|
}
|
|
4310
|
-
if (c === "$" && content[
|
|
4311
|
-
|
|
4325
|
+
if (c === "$" && content[i + 1] === "{") {
|
|
4326
|
+
i += 2;
|
|
4312
4327
|
let d = 1;
|
|
4313
|
-
while (
|
|
4314
|
-
const cc = content[
|
|
4328
|
+
while (i < len && d > 0) {
|
|
4329
|
+
const cc = content[i];
|
|
4315
4330
|
if (cc === "{")
|
|
4316
4331
|
d++;
|
|
4317
4332
|
else if (cc === "}")
|
|
4318
4333
|
d--;
|
|
4319
|
-
|
|
4334
|
+
i++;
|
|
4320
4335
|
}
|
|
4321
4336
|
continue;
|
|
4322
4337
|
}
|
|
4323
|
-
|
|
4338
|
+
i++;
|
|
4324
4339
|
}
|
|
4325
4340
|
continue;
|
|
4326
4341
|
}
|
|
@@ -4329,9 +4344,9 @@ function findMatchingParen(content, start) {
|
|
|
4329
4344
|
else if (ch === ")" || ch === "]" || ch === "}") {
|
|
4330
4345
|
depth--;
|
|
4331
4346
|
if (depth === 0 && ch === ")")
|
|
4332
|
-
return
|
|
4347
|
+
return i;
|
|
4333
4348
|
}
|
|
4334
|
-
|
|
4349
|
+
i++;
|
|
4335
4350
|
}
|
|
4336
4351
|
return -1;
|
|
4337
4352
|
}
|
|
@@ -4492,47 +4507,47 @@ var express = {
|
|
|
4492
4507
|
};
|
|
4493
4508
|
function maskComments(src) {
|
|
4494
4509
|
let out = "";
|
|
4495
|
-
let
|
|
4510
|
+
let i = 0;
|
|
4496
4511
|
const n = src.length;
|
|
4497
|
-
while (
|
|
4498
|
-
const c = src[
|
|
4512
|
+
while (i < n) {
|
|
4513
|
+
const c = src[i];
|
|
4499
4514
|
if (c === '"' || c === "'" || c === "`") {
|
|
4500
4515
|
out += c;
|
|
4501
|
-
|
|
4502
|
-
while (
|
|
4503
|
-
if (src[
|
|
4504
|
-
out += src[
|
|
4505
|
-
|
|
4516
|
+
i++;
|
|
4517
|
+
while (i < n) {
|
|
4518
|
+
if (src[i] === "\\" && i + 1 < n) {
|
|
4519
|
+
out += src[i] + src[i + 1];
|
|
4520
|
+
i += 2;
|
|
4506
4521
|
continue;
|
|
4507
4522
|
}
|
|
4508
|
-
out += src[
|
|
4509
|
-
const done = src[
|
|
4510
|
-
|
|
4523
|
+
out += src[i];
|
|
4524
|
+
const done = src[i] === c;
|
|
4525
|
+
i++;
|
|
4511
4526
|
if (done)
|
|
4512
4527
|
break;
|
|
4513
4528
|
}
|
|
4514
|
-
} else if (c === "/" && src[
|
|
4515
|
-
while (
|
|
4529
|
+
} else if (c === "/" && src[i + 1] === "/") {
|
|
4530
|
+
while (i < n && src[i] !== `
|
|
4516
4531
|
`) {
|
|
4517
4532
|
out += " ";
|
|
4518
|
-
|
|
4533
|
+
i++;
|
|
4519
4534
|
}
|
|
4520
|
-
} else if (c === "/" && src[
|
|
4535
|
+
} else if (c === "/" && src[i + 1] === "*") {
|
|
4521
4536
|
out += " ";
|
|
4522
|
-
|
|
4523
|
-
while (
|
|
4524
|
-
out += src[
|
|
4537
|
+
i += 2;
|
|
4538
|
+
while (i < n && !(src[i] === "*" && src[i + 1] === "/")) {
|
|
4539
|
+
out += src[i] === `
|
|
4525
4540
|
` ? `
|
|
4526
4541
|
` : " ";
|
|
4527
|
-
|
|
4542
|
+
i++;
|
|
4528
4543
|
}
|
|
4529
|
-
if (
|
|
4544
|
+
if (i < n) {
|
|
4530
4545
|
out += " ";
|
|
4531
|
-
|
|
4546
|
+
i += 2;
|
|
4532
4547
|
}
|
|
4533
4548
|
} else {
|
|
4534
4549
|
out += c;
|
|
4535
|
-
|
|
4550
|
+
i++;
|
|
4536
4551
|
}
|
|
4537
4552
|
}
|
|
4538
4553
|
return out;
|
|
@@ -4995,8 +5010,8 @@ var GO_EXTS = [".go"];
|
|
|
4995
5010
|
var GO_GROUP_RE = /(\w+)\s*[:=]+\s*(\w+)\.Group\s*\(\s*['"]([^'"]+)['"]/g;
|
|
4996
5011
|
var dirOf = (f) => {
|
|
4997
5012
|
const norm = f.replace(/\\/g, "/");
|
|
4998
|
-
const
|
|
4999
|
-
return
|
|
5013
|
+
const i = norm.lastIndexOf("/");
|
|
5014
|
+
return i < 0 ? "" : norm.slice(0, i);
|
|
5000
5015
|
};
|
|
5001
5016
|
var GORILLA_WS_IMPORT_RE = /["']github\.com\/gorilla\/websocket["']/;
|
|
5002
5017
|
var UPGRADE_CALL_RE = /\.\s*Upgrade\s*\(/;
|
|
@@ -5010,26 +5025,26 @@ function findWebsocketHandlers(ctx, goFiles) {
|
|
|
5010
5025
|
if (!GORILLA_WS_IMPORT_RE.test(content))
|
|
5011
5026
|
continue;
|
|
5012
5027
|
const dir = dirOf(f);
|
|
5013
|
-
const
|
|
5028
|
+
const set = byDir.get(dir) ?? /* @__PURE__ */ new Set;
|
|
5014
5029
|
for (const m of content.matchAll(funcRe)) {
|
|
5015
5030
|
const name = m[1];
|
|
5016
5031
|
const bodyStart = m.index + m[0].length;
|
|
5017
5032
|
let depth = 1;
|
|
5018
|
-
let
|
|
5033
|
+
let i = bodyStart;
|
|
5019
5034
|
const len = content.length;
|
|
5020
|
-
while (
|
|
5021
|
-
const ch = content[
|
|
5035
|
+
while (i < len && depth > 0) {
|
|
5036
|
+
const ch = content[i];
|
|
5022
5037
|
if (ch === "{")
|
|
5023
5038
|
depth++;
|
|
5024
5039
|
else if (ch === "}")
|
|
5025
5040
|
depth--;
|
|
5026
|
-
|
|
5041
|
+
i++;
|
|
5027
5042
|
}
|
|
5028
|
-
const body = content.slice(bodyStart,
|
|
5043
|
+
const body = content.slice(bodyStart, i - 1);
|
|
5029
5044
|
if (UPGRADE_CALL_RE.test(body))
|
|
5030
|
-
|
|
5045
|
+
set.add(name);
|
|
5031
5046
|
}
|
|
5032
|
-
byDir.set(dir,
|
|
5047
|
+
byDir.set(dir, set);
|
|
5033
5048
|
}
|
|
5034
5049
|
return byDir;
|
|
5035
5050
|
}
|
|
@@ -5410,8 +5425,8 @@ var rails = {
|
|
|
5410
5425
|
const nsStack = [];
|
|
5411
5426
|
let depth = 0;
|
|
5412
5427
|
const prefixAtLine = new Array(sourceLines.length + 1).fill("");
|
|
5413
|
-
for (let
|
|
5414
|
-
const line = sourceLines[
|
|
5428
|
+
for (let i = 0;i < sourceLines.length; i++) {
|
|
5429
|
+
const line = sourceLines[i];
|
|
5415
5430
|
const code = line.replace(/#.*$/, "");
|
|
5416
5431
|
const nsM = namespaceLineRe.exec(code);
|
|
5417
5432
|
if (nsM) {
|
|
@@ -5428,7 +5443,7 @@ var rails = {
|
|
|
5428
5443
|
if (doMatches)
|
|
5429
5444
|
depth++;
|
|
5430
5445
|
const prefix = nsStack.length ? "/" + nsStack.map((n) => n.name).join("/") : "";
|
|
5431
|
-
prefixAtLine[
|
|
5446
|
+
prefixAtLine[i + 1] = prefix;
|
|
5432
5447
|
}
|
|
5433
5448
|
const prefixAt = (offset) => {
|
|
5434
5449
|
const ln = lines.lineAt(offset);
|
|
@@ -5696,15 +5711,15 @@ function splitTopLevel(s) {
|
|
|
5696
5711
|
const parts = [];
|
|
5697
5712
|
let depth = 0;
|
|
5698
5713
|
let start = 0;
|
|
5699
|
-
for (let
|
|
5700
|
-
const c = s[
|
|
5714
|
+
for (let i = 0;i < s.length; i++) {
|
|
5715
|
+
const c = s[i];
|
|
5701
5716
|
if (c === "<" || c === "{" || c === "[" || c === "(")
|
|
5702
5717
|
depth++;
|
|
5703
5718
|
else if (c === ">" || c === "}" || c === "]" || c === ")")
|
|
5704
5719
|
depth--;
|
|
5705
5720
|
else if (c === "," && depth === 0) {
|
|
5706
|
-
parts.push(s.slice(start,
|
|
5707
|
-
start =
|
|
5721
|
+
parts.push(s.slice(start, i));
|
|
5722
|
+
start = i + 1;
|
|
5708
5723
|
}
|
|
5709
5724
|
}
|
|
5710
5725
|
parts.push(s.slice(start));
|
|
@@ -5712,14 +5727,14 @@ function splitTopLevel(s) {
|
|
|
5712
5727
|
}
|
|
5713
5728
|
function findTopLevelChar(s, targets) {
|
|
5714
5729
|
let depth = 0;
|
|
5715
|
-
for (let
|
|
5716
|
-
const c = s[
|
|
5730
|
+
for (let i = 0;i < s.length; i++) {
|
|
5731
|
+
const c = s[i];
|
|
5717
5732
|
if (c === "<" || c === "{" || c === "[" || c === "(")
|
|
5718
5733
|
depth++;
|
|
5719
5734
|
else if (c === ">" || c === "}" || c === "]" || c === ")")
|
|
5720
5735
|
depth--;
|
|
5721
5736
|
else if (depth === 0 && targets.includes(c))
|
|
5722
|
-
return
|
|
5737
|
+
return i;
|
|
5723
5738
|
}
|
|
5724
5739
|
return -1;
|
|
5725
5740
|
}
|
|
@@ -5743,14 +5758,14 @@ function parseParams(funcParams) {
|
|
|
5743
5758
|
if (trimmed.startsWith("{")) {
|
|
5744
5759
|
let depth = 0;
|
|
5745
5760
|
let close = -1;
|
|
5746
|
-
for (let
|
|
5747
|
-
const c = trimmed[
|
|
5761
|
+
for (let i = 0;i < trimmed.length; i++) {
|
|
5762
|
+
const c = trimmed[i];
|
|
5748
5763
|
if (c === "{")
|
|
5749
5764
|
depth++;
|
|
5750
5765
|
else if (c === "}") {
|
|
5751
5766
|
depth--;
|
|
5752
5767
|
if (depth === 0) {
|
|
5753
|
-
close =
|
|
5768
|
+
close = i;
|
|
5754
5769
|
break;
|
|
5755
5770
|
}
|
|
5756
5771
|
}
|
|
@@ -5882,11 +5897,11 @@ var openapi = {
|
|
|
5882
5897
|
for (const p of allParams) {
|
|
5883
5898
|
if (!p || typeof p !== "object")
|
|
5884
5899
|
continue;
|
|
5885
|
-
const
|
|
5900
|
+
const schema = p.schema;
|
|
5886
5901
|
params.push({
|
|
5887
5902
|
name: p.name ?? "?",
|
|
5888
5903
|
location: p.in ?? "query",
|
|
5889
|
-
type:
|
|
5904
|
+
type: schema?.type,
|
|
5890
5905
|
required: p.required ?? false
|
|
5891
5906
|
});
|
|
5892
5907
|
}
|
|
@@ -5955,46 +5970,46 @@ function makeConnectResolver(ctx) {
|
|
|
5955
5970
|
}
|
|
5956
5971
|
function stripComments(src) {
|
|
5957
5972
|
let out = "";
|
|
5958
|
-
for (let
|
|
5959
|
-
const c = src[
|
|
5973
|
+
for (let i = 0;i < src.length; ) {
|
|
5974
|
+
const c = src[i];
|
|
5960
5975
|
if (c === '"' || c === "'") {
|
|
5961
5976
|
out += c;
|
|
5962
|
-
|
|
5963
|
-
while (
|
|
5964
|
-
if (src[
|
|
5965
|
-
out += src[
|
|
5966
|
-
|
|
5977
|
+
i++;
|
|
5978
|
+
while (i < src.length && src[i] !== c) {
|
|
5979
|
+
if (src[i] === "\\" && i + 1 < src.length) {
|
|
5980
|
+
out += src[i] + src[i + 1];
|
|
5981
|
+
i += 2;
|
|
5967
5982
|
} else {
|
|
5968
|
-
out += src[
|
|
5969
|
-
|
|
5983
|
+
out += src[i];
|
|
5984
|
+
i++;
|
|
5970
5985
|
}
|
|
5971
5986
|
}
|
|
5972
|
-
if (
|
|
5973
|
-
out += src[
|
|
5974
|
-
|
|
5987
|
+
if (i < src.length) {
|
|
5988
|
+
out += src[i];
|
|
5989
|
+
i++;
|
|
5975
5990
|
}
|
|
5976
|
-
} else if (c === "/" && src[
|
|
5977
|
-
while (
|
|
5991
|
+
} else if (c === "/" && src[i + 1] === "/") {
|
|
5992
|
+
while (i < src.length && src[i] !== `
|
|
5978
5993
|
`) {
|
|
5979
5994
|
out += " ";
|
|
5980
|
-
|
|
5995
|
+
i++;
|
|
5981
5996
|
}
|
|
5982
|
-
} else if (c === "/" && src[
|
|
5997
|
+
} else if (c === "/" && src[i + 1] === "*") {
|
|
5983
5998
|
out += " ";
|
|
5984
|
-
|
|
5985
|
-
while (
|
|
5986
|
-
out += src[
|
|
5999
|
+
i += 2;
|
|
6000
|
+
while (i < src.length && !(src[i] === "*" && src[i + 1] === "/")) {
|
|
6001
|
+
out += src[i] === `
|
|
5987
6002
|
` ? `
|
|
5988
6003
|
` : " ";
|
|
5989
|
-
|
|
6004
|
+
i++;
|
|
5990
6005
|
}
|
|
5991
|
-
if (
|
|
6006
|
+
if (i < src.length) {
|
|
5992
6007
|
out += " ";
|
|
5993
|
-
|
|
6008
|
+
i += 2;
|
|
5994
6009
|
}
|
|
5995
6010
|
} else {
|
|
5996
6011
|
out += c;
|
|
5997
|
-
|
|
6012
|
+
i++;
|
|
5998
6013
|
}
|
|
5999
6014
|
}
|
|
6000
6015
|
return out;
|
|
@@ -6123,33 +6138,33 @@ function inferServiceType(absDir) {
|
|
|
6123
6138
|
try {
|
|
6124
6139
|
const content = readFileSync42(join10(absDir, "package.json"), "utf-8");
|
|
6125
6140
|
const lower = content.toLowerCase();
|
|
6126
|
-
for (const [dep,
|
|
6141
|
+
for (const [dep, type] of PKG_DEP_TO_TYPE) {
|
|
6127
6142
|
if (lower.includes(`"${dep}"`))
|
|
6128
|
-
return
|
|
6143
|
+
return type;
|
|
6129
6144
|
}
|
|
6130
6145
|
return "generic";
|
|
6131
6146
|
} catch {}
|
|
6132
6147
|
try {
|
|
6133
6148
|
const content = readFileSync42(join10(absDir, "go.mod"), "utf-8");
|
|
6134
|
-
for (const [dep,
|
|
6149
|
+
for (const [dep, type] of GO_DEP_TO_TYPE) {
|
|
6135
6150
|
if (content.includes(dep))
|
|
6136
|
-
return
|
|
6151
|
+
return type;
|
|
6137
6152
|
}
|
|
6138
6153
|
return "generic";
|
|
6139
6154
|
} catch {}
|
|
6140
6155
|
try {
|
|
6141
6156
|
const content = readFileSync42(join10(absDir, "Cargo.toml"), "utf-8");
|
|
6142
|
-
for (const [dep,
|
|
6157
|
+
for (const [dep, type] of CARGO_DEP_TO_TYPE) {
|
|
6143
6158
|
if (content.includes(dep))
|
|
6144
|
-
return
|
|
6159
|
+
return type;
|
|
6145
6160
|
}
|
|
6146
6161
|
return "generic";
|
|
6147
6162
|
} catch {}
|
|
6148
6163
|
try {
|
|
6149
6164
|
const content = readFileSync42(join10(absDir, "requirements.txt"), "utf-8");
|
|
6150
|
-
for (const [dep,
|
|
6165
|
+
for (const [dep, type] of PY_DEP_TO_TYPE) {
|
|
6151
6166
|
if (content.includes(dep))
|
|
6152
|
-
return
|
|
6167
|
+
return type;
|
|
6153
6168
|
}
|
|
6154
6169
|
return "generic";
|
|
6155
6170
|
} catch {}
|
|
@@ -6965,10 +6980,10 @@ function mapAppWithSurface(appPath, repoRoot, options) {
|
|
|
6965
6980
|
}
|
|
6966
6981
|
const narrow = map2(absApp, { includeInternal: false });
|
|
6967
6982
|
if (narrow.frameworks.length > 0 && narrow.endpoints.all.length > 0) {
|
|
6968
|
-
const
|
|
6983
|
+
const rebased = rebaseFileToRepoRoot(narrow.endpoints.all, absApp, absRoot);
|
|
6969
6984
|
return {
|
|
6970
6985
|
mode: "surface",
|
|
6971
|
-
endpoints: consolidateBySameRoute(
|
|
6986
|
+
endpoints: consolidateBySameRoute(rebased),
|
|
6972
6987
|
frameworks: narrow.frameworks
|
|
6973
6988
|
};
|
|
6974
6989
|
}
|
|
@@ -7006,6 +7021,7 @@ var TASK_TYPE_LABELS = {
|
|
|
7006
7021
|
apiEndpoints: "API Endpoints",
|
|
7007
7022
|
cloudResourceEndpoints: "Cloud Resources"
|
|
7008
7023
|
};
|
|
7024
|
+
var NON_SERVICE_TYPES = ["cloud_resource", "storage", "database"];
|
|
7009
7025
|
function sanitizeName(name) {
|
|
7010
7026
|
return name.toLowerCase().replace(/[^a-z0-9-_.]/g, "_");
|
|
7011
7027
|
}
|
|
@@ -7018,6 +7034,129 @@ function toAppMetadata(app) {
|
|
|
7018
7034
|
location: app.location
|
|
7019
7035
|
};
|
|
7020
7036
|
}
|
|
7037
|
+
async function runWhiteboxAttackSurfaceApp(app, appIndex, input) {
|
|
7038
|
+
const {
|
|
7039
|
+
codebasePath,
|
|
7040
|
+
model,
|
|
7041
|
+
session,
|
|
7042
|
+
authConfig,
|
|
7043
|
+
abortSignal,
|
|
7044
|
+
eventBus,
|
|
7045
|
+
attackSurfaceRegistry,
|
|
7046
|
+
onStepFinish,
|
|
7047
|
+
onCacheMetrics,
|
|
7048
|
+
openAIReasoningEffort,
|
|
7049
|
+
enableThinking,
|
|
7050
|
+
thinkingEffort,
|
|
7051
|
+
projectThreatModel,
|
|
7052
|
+
environments,
|
|
7053
|
+
surfaceIntegrationEnabled,
|
|
7054
|
+
isSingleAppRepo,
|
|
7055
|
+
umbrellaId,
|
|
7056
|
+
mintChildId,
|
|
7057
|
+
agentLimiter,
|
|
7058
|
+
subagentSpawner,
|
|
7059
|
+
hooks: sharedHooks,
|
|
7060
|
+
seams
|
|
7061
|
+
} = input;
|
|
7062
|
+
const appNodeId = `app:${sanitizeName(app.name)}`;
|
|
7063
|
+
const hooksForApp = resolveItemHooks(sharedHooks, seams, app, appIndex);
|
|
7064
|
+
let failed = false;
|
|
7065
|
+
const spawnDiscoveryAgent = async (type, objective) => {
|
|
7066
|
+
const subagentId = mintChildId(TASK_TYPE_LABELS[type]);
|
|
7067
|
+
log4.debug(`Phase 2: spawning agent id="${subagentId}" parent="${appNodeId}" (app="${app.name}", type=${type}, appType=${app.type})`);
|
|
7068
|
+
const spawner = subagentSpawner ?? inProcessSubagentSpawner;
|
|
7069
|
+
try {
|
|
7070
|
+
await agentLimiter(() => spawner.spawn({
|
|
7071
|
+
spec: {
|
|
7072
|
+
type: "code",
|
|
7073
|
+
codebasePath,
|
|
7074
|
+
objective,
|
|
7075
|
+
system: WHITEBOX_DISCOVERY_SYSTEM_PROMPT2,
|
|
7076
|
+
excludeTools: ["document_app"],
|
|
7077
|
+
responseSchema: DiscoverySummarySchema2,
|
|
7078
|
+
projectThreatModel,
|
|
7079
|
+
attackSurfaceRegistry
|
|
7080
|
+
},
|
|
7081
|
+
runtime: {
|
|
7082
|
+
model,
|
|
7083
|
+
session,
|
|
7084
|
+
authConfig,
|
|
7085
|
+
abortSignal,
|
|
7086
|
+
enableThinking,
|
|
7087
|
+
thinkingEffort,
|
|
7088
|
+
openAIReasoningEffort,
|
|
7089
|
+
onStepFinish,
|
|
7090
|
+
onCacheMetrics,
|
|
7091
|
+
backends: hooksForApp.backends,
|
|
7092
|
+
sandbox: hooksForApp.sandbox,
|
|
7093
|
+
languageModelMiddleware: hooksForApp.languageModelMiddleware,
|
|
7094
|
+
usageRecorder: hooksForApp.usageRecorder,
|
|
7095
|
+
streamIdFactory: hooksForApp.streamIdFactory
|
|
7096
|
+
},
|
|
7097
|
+
subagentId,
|
|
7098
|
+
subagentName: TASK_TYPE_LABELS[type],
|
|
7099
|
+
parentBus: eventBus,
|
|
7100
|
+
parentSubagentId: appNodeId,
|
|
7101
|
+
lifecycleInput: { app: app.name, type }
|
|
7102
|
+
}));
|
|
7103
|
+
log4.debug(`Phase 2: agent "${subagentId}" completed`);
|
|
7104
|
+
} catch (error) {
|
|
7105
|
+
log4.error(`Phase 2: agent "${subagentId}" FAILED`, error instanceof Error ? error : undefined, { error: String(error) });
|
|
7106
|
+
failed = true;
|
|
7107
|
+
}
|
|
7108
|
+
};
|
|
7109
|
+
const spawnPagesAgent = () => spawnDiscoveryAgent("pages", buildPagesDiscoveryObjective(codebasePath, app));
|
|
7110
|
+
const spawnApiEndpointsAgent = () => spawnDiscoveryAgent("apiEndpoints", buildApiEndpointsDiscoveryObjective(codebasePath, app));
|
|
7111
|
+
const spawnCloudResourceAgent = () => spawnDiscoveryAgent("cloudResourceEndpoints", buildCloudResourceEndpointsObjective(codebasePath, app, environments));
|
|
7112
|
+
try {
|
|
7113
|
+
if (NON_SERVICE_TYPES.includes(app.type)) {
|
|
7114
|
+
await spawnCloudResourceAgent();
|
|
7115
|
+
} else if (!surfaceIntegrationEnabled) {
|
|
7116
|
+
log4.debug(`${app.name}: legacy (surfaceIntegrationEnabled=false)`);
|
|
7117
|
+
await Promise.all([spawnPagesAgent(), spawnApiEndpointsAgent()]);
|
|
7118
|
+
} else {
|
|
7119
|
+
const surfaceResult = mapAppWithSurface(join16(codebasePath, app.location), codebasePath, { isSingleAppRepo });
|
|
7120
|
+
if (surfaceResult.mode === "surface") {
|
|
7121
|
+
log4.debug(`${app.name}: surface-driven (${surfaceResult.endpoints.length} endpoints, frameworks=${surfaceResult.frameworks.join(",")})`);
|
|
7122
|
+
await runAppEndpointDocumentation({
|
|
7123
|
+
codebasePath,
|
|
7124
|
+
app,
|
|
7125
|
+
endpoints: surfaceResult.endpoints,
|
|
7126
|
+
frameworks: surfaceResult.frameworks,
|
|
7127
|
+
model,
|
|
7128
|
+
session,
|
|
7129
|
+
authConfig,
|
|
7130
|
+
abortSignal,
|
|
7131
|
+
eventBus,
|
|
7132
|
+
attackSurfaceRegistry,
|
|
7133
|
+
onStepFinish,
|
|
7134
|
+
onCacheMetrics,
|
|
7135
|
+
openAIReasoningEffort,
|
|
7136
|
+
enableThinking,
|
|
7137
|
+
thinkingEffort,
|
|
7138
|
+
projectThreatModel,
|
|
7139
|
+
parentSubagentId: appNodeId,
|
|
7140
|
+
agentLimiter,
|
|
7141
|
+
subagentSpawner,
|
|
7142
|
+
hooks: hooksForApp,
|
|
7143
|
+
mintChildId
|
|
7144
|
+
});
|
|
7145
|
+
} else {
|
|
7146
|
+
log4.debug(`${app.name}: fallback (${surfaceResult.reason})`);
|
|
7147
|
+
await Promise.all([spawnPagesAgent(), spawnApiEndpointsAgent()]);
|
|
7148
|
+
}
|
|
7149
|
+
}
|
|
7150
|
+
} catch {
|
|
7151
|
+
failed = true;
|
|
7152
|
+
}
|
|
7153
|
+
eventBus?.emit("subagent-complete", {
|
|
7154
|
+
subagentId: appNodeId,
|
|
7155
|
+
status: failed ? "failed" : "completed",
|
|
7156
|
+
parentSubagentId: umbrellaId
|
|
7157
|
+
});
|
|
7158
|
+
return failed;
|
|
7159
|
+
}
|
|
7021
7160
|
async function runWhiteboxAttackSurfaceWorkflow(input) {
|
|
7022
7161
|
const {
|
|
7023
7162
|
codebasePath,
|
|
@@ -7036,19 +7175,28 @@ async function runWhiteboxAttackSurfaceWorkflow(input) {
|
|
|
7036
7175
|
projectThreatModel,
|
|
7037
7176
|
environments,
|
|
7038
7177
|
surfaceIntegrationEnabled = true,
|
|
7039
|
-
maxConcurrentAgents = MAX_CONCURRENT_AGENTS
|
|
7178
|
+
maxConcurrentAgents = MAX_CONCURRENT_AGENTS,
|
|
7179
|
+
subagentSpawner,
|
|
7180
|
+
hooks,
|
|
7181
|
+
seams: inputSeams
|
|
7040
7182
|
} = input;
|
|
7183
|
+
const seams = inputSeams ?? inProcessSeams();
|
|
7184
|
+
const sharedHooks = { subagentSpawner, ...hooks };
|
|
7185
|
+
let nextChildOrdinal = 0;
|
|
7186
|
+
const mintChildId = (name) => seams.ids.newSessionId(name, nextChildOrdinal++);
|
|
7041
7187
|
const agentSlots = pLimit(Math.max(1, maxConcurrentAgents));
|
|
7042
7188
|
const agentLimiter = (fn) => agentSlots(fn);
|
|
7043
|
-
const WORKFLOW_UMBRELLA_ID =
|
|
7044
|
-
|
|
7189
|
+
const WORKFLOW_UMBRELLA_ID = mintChildId("whitebox-apps-discovery");
|
|
7190
|
+
if (input.incremental && !hooks?.backends)
|
|
7191
|
+
throw new Error("Incremental recon requires owned artifact backends");
|
|
7192
|
+
const appsAgent = new CodeAgent2({
|
|
7045
7193
|
codebasePath,
|
|
7046
|
-
objective:
|
|
7047
|
-
|
|
7194
|
+
objective: input.incremental ? buildIncrementalObjective(codebasePath, input.incremental.diffPath, input.incremental.assetsPath, input.incremental.existingResult, domains, environments).replace("- **Non-route changes** (e.g. utility functions, configs, tests) → skip", "- **Shared-library/configuration changes** → trace affected consumers and update only impacted endpoint assets; skip unrelated changes") + `
|
|
7195
|
+
Trace changed shared libraries, deleted files, and root/build/deployment configuration to the applications that consume them. A path outside an application directory does not prove that application is unaffected. Leave unrelated endpoint artifacts unchanged.` : buildAppsDiscoveryObjective(codebasePath, domains, environments),
|
|
7196
|
+
system: input.incremental ? WHITEBOX_DISCOVERY_SYSTEM_PROMPT2 : WHITEBOX_APPS_DISCOVERY_SYSTEM_PROMPT2,
|
|
7048
7197
|
model,
|
|
7049
7198
|
session,
|
|
7050
7199
|
authConfig,
|
|
7051
|
-
abortSignal,
|
|
7052
7200
|
attackSurfaceRegistry,
|
|
7053
7201
|
eventBus,
|
|
7054
7202
|
subagentId: WORKFLOW_UMBRELLA_ID,
|
|
@@ -7058,9 +7206,12 @@ async function runWhiteboxAttackSurfaceWorkflow(input) {
|
|
|
7058
7206
|
openAIReasoningEffort,
|
|
7059
7207
|
enableThinking,
|
|
7060
7208
|
thinkingEffort,
|
|
7061
|
-
responseSchema:
|
|
7209
|
+
responseSchema: input.incremental ? IncrementalReconResultSchema : AppsDiscoveryResultSchema2,
|
|
7062
7210
|
projectThreatModel,
|
|
7063
|
-
excludeTools: ["document_endpoint"]
|
|
7211
|
+
excludeTools: input.incremental ? [] : ["document_endpoint"],
|
|
7212
|
+
...sharedHooks,
|
|
7213
|
+
...input.incremental ? { attackSurfaceArtifactsPath: input.incremental.assetsPath } : {},
|
|
7214
|
+
abortSignal
|
|
7064
7215
|
});
|
|
7065
7216
|
log4.info(`Phase 1: discovering apps in ${codebasePath}${domains?.length ? ` (${domains.length} known domains)` : ""}`);
|
|
7066
7217
|
eventBus?.emit("subagent-spawn", {
|
|
@@ -7069,6 +7220,16 @@ async function runWhiteboxAttackSurfaceWorkflow(input) {
|
|
|
7069
7220
|
input: { codebasePath }
|
|
7070
7221
|
});
|
|
7071
7222
|
const appsResult = await agentLimiter(() => appsAgent.consume());
|
|
7223
|
+
if (input.incremental) {
|
|
7224
|
+
if (!hooks?.backends)
|
|
7225
|
+
throw new Error("Incremental recon requires owned artifact backends");
|
|
7226
|
+
const result = await readIncrementalReconAssets(hooks.backends, input.incremental.assetsPath, input.incremental.existingResult, abortSignal);
|
|
7227
|
+
eventBus?.emit("subagent-complete", {
|
|
7228
|
+
subagentId: WORKFLOW_UMBRELLA_ID,
|
|
7229
|
+
status: "completed"
|
|
7230
|
+
});
|
|
7231
|
+
return result;
|
|
7232
|
+
}
|
|
7072
7233
|
log4.info(`Phase 1 complete: ${appsResult?.apps.length ?? 0} apps discovered` + (appsResult ? ` (repoType=${appsResult.repoType}, packageManager=${appsResult.packageManager})` : " (no result returned)"));
|
|
7073
7234
|
if (appsResult?.apps.length) {
|
|
7074
7235
|
for (const app of appsResult.apps) {
|
|
@@ -7100,7 +7261,6 @@ async function runWhiteboxAttackSurfaceWorkflow(input) {
|
|
|
7100
7261
|
writeFileSync3(join16(appDir, "app.json"), JSON.stringify(toAppMetadata(app), null, 2), "utf-8");
|
|
7101
7262
|
}
|
|
7102
7263
|
log4.info(`Phase 2: surfaceIntegrationEnabled=${surfaceIntegrationEnabled}`);
|
|
7103
|
-
const NON_SERVICE_TYPES = ["cloud_resource", "storage", "database"];
|
|
7104
7264
|
const serviceApps = appsResult.apps.filter((app) => !NON_SERVICE_TYPES.includes(app.type));
|
|
7105
7265
|
const cloudApps = appsResult.apps.filter((app) => NON_SERVICE_TYPES.includes(app.type));
|
|
7106
7266
|
log4.info(`Phase 2: ${serviceApps.length} service apps (surface or fallback per app), ${cloudApps.length} cloud resources → ${appsResult.apps.length} total apps`);
|
|
@@ -7110,130 +7270,48 @@ async function runWhiteboxAttackSurfaceWorkflow(input) {
|
|
|
7110
7270
|
totalApps,
|
|
7111
7271
|
completedApps: 0
|
|
7112
7272
|
});
|
|
7113
|
-
const appNodeIdFor = (appName) => `app:${sanitizeName(appName)}`;
|
|
7114
|
-
const appAnyTaskFailed = new Map;
|
|
7115
7273
|
for (const app of appsResult.apps) {
|
|
7116
|
-
const appNodeId = appNodeIdFor(app.name);
|
|
7117
|
-
appAnyTaskFailed.set(app.name, false);
|
|
7118
7274
|
eventBus?.emit("subagent-spawn", {
|
|
7119
|
-
subagentId:
|
|
7275
|
+
subagentId: `app:${sanitizeName(app.name)}`,
|
|
7120
7276
|
name: app.name,
|
|
7121
7277
|
input: { app: app.name, type: app.type, framework: app.framework },
|
|
7122
7278
|
parentSubagentId: WORKFLOW_UMBRELLA_ID
|
|
7123
7279
|
});
|
|
7124
7280
|
}
|
|
7125
|
-
const
|
|
7126
|
-
|
|
7127
|
-
|
|
7128
|
-
|
|
7129
|
-
|
|
7130
|
-
|
|
7131
|
-
|
|
7132
|
-
|
|
7133
|
-
|
|
7134
|
-
|
|
7135
|
-
|
|
7136
|
-
|
|
7137
|
-
|
|
7138
|
-
|
|
7139
|
-
|
|
7140
|
-
|
|
7141
|
-
|
|
7142
|
-
|
|
7143
|
-
|
|
7144
|
-
|
|
7145
|
-
|
|
7146
|
-
|
|
7147
|
-
|
|
7148
|
-
onCacheMetrics,
|
|
7149
|
-
openAIReasoningEffort,
|
|
7150
|
-
enableThinking,
|
|
7151
|
-
thinkingEffort,
|
|
7152
|
-
responseSchema: DiscoverySummarySchema,
|
|
7153
|
-
excludeTools: ["document_app"],
|
|
7154
|
-
projectThreatModel
|
|
7155
|
-
});
|
|
7156
|
-
try {
|
|
7157
|
-
await agentLimiter(() => agent.consume());
|
|
7158
|
-
log4.debug(`Phase 2: agent "${subagentId}" completed`);
|
|
7159
|
-
eventBus?.emit("subagent-complete", {
|
|
7160
|
-
subagentId,
|
|
7161
|
-
status: "completed",
|
|
7162
|
-
parentSubagentId: appNodeId
|
|
7163
|
-
});
|
|
7164
|
-
} catch (error) {
|
|
7165
|
-
log4.error(`Phase 2: agent "${subagentId}" FAILED`, error instanceof Error ? error : undefined, { error: String(error) });
|
|
7166
|
-
appAnyTaskFailed.set(app.name, true);
|
|
7167
|
-
eventBus?.emit("subagent-complete", {
|
|
7168
|
-
subagentId,
|
|
7169
|
-
status: "failed",
|
|
7170
|
-
parentSubagentId: appNodeId
|
|
7171
|
-
});
|
|
7172
|
-
}
|
|
7281
|
+
const appWorkerInput = {
|
|
7282
|
+
codebasePath,
|
|
7283
|
+
model,
|
|
7284
|
+
session,
|
|
7285
|
+
authConfig,
|
|
7286
|
+
abortSignal,
|
|
7287
|
+
eventBus,
|
|
7288
|
+
attackSurfaceRegistry,
|
|
7289
|
+
onStepFinish,
|
|
7290
|
+
onCacheMetrics,
|
|
7291
|
+
openAIReasoningEffort,
|
|
7292
|
+
enableThinking,
|
|
7293
|
+
thinkingEffort,
|
|
7294
|
+
projectThreatModel,
|
|
7295
|
+
environments,
|
|
7296
|
+
surfaceIntegrationEnabled,
|
|
7297
|
+
isSingleAppRepo: serviceApps.length === 1,
|
|
7298
|
+
umbrellaId: WORKFLOW_UMBRELLA_ID,
|
|
7299
|
+
mintChildId,
|
|
7300
|
+
agentLimiter,
|
|
7301
|
+
subagentSpawner,
|
|
7302
|
+
hooks: sharedHooks,
|
|
7303
|
+
seams
|
|
7173
7304
|
};
|
|
7174
|
-
|
|
7175
|
-
|
|
7176
|
-
|
|
7177
|
-
|
|
7178
|
-
|
|
7179
|
-
|
|
7180
|
-
|
|
7181
|
-
|
|
7182
|
-
|
|
7183
|
-
|
|
7184
|
-
await Promise.all([
|
|
7185
|
-
spawnPagesAgent(app),
|
|
7186
|
-
spawnApiEndpointsAgent(app)
|
|
7187
|
-
]);
|
|
7188
|
-
} else {
|
|
7189
|
-
const surfaceResult = mapAppWithSurface(join16(codebasePath, app.location), codebasePath, { isSingleAppRepo: serviceApps.length === 1 });
|
|
7190
|
-
if (surfaceResult.mode === "surface") {
|
|
7191
|
-
log4.debug(`${app.name}: surface-driven (${surfaceResult.endpoints.length} endpoints, frameworks=${surfaceResult.frameworks.join(",")})`);
|
|
7192
|
-
await runAppEndpointDocumentation({
|
|
7193
|
-
codebasePath,
|
|
7194
|
-
app,
|
|
7195
|
-
endpoints: surfaceResult.endpoints,
|
|
7196
|
-
frameworks: surfaceResult.frameworks,
|
|
7197
|
-
model,
|
|
7198
|
-
session,
|
|
7199
|
-
authConfig,
|
|
7200
|
-
abortSignal,
|
|
7201
|
-
eventBus,
|
|
7202
|
-
attackSurfaceRegistry,
|
|
7203
|
-
onStepFinish,
|
|
7204
|
-
onCacheMetrics,
|
|
7205
|
-
openAIReasoningEffort,
|
|
7206
|
-
enableThinking,
|
|
7207
|
-
thinkingEffort,
|
|
7208
|
-
projectThreatModel,
|
|
7209
|
-
parentSubagentId: appNodeId,
|
|
7210
|
-
agentLimiter
|
|
7211
|
-
});
|
|
7212
|
-
} else {
|
|
7213
|
-
log4.debug(`${app.name}: fallback (${surfaceResult.reason})`);
|
|
7214
|
-
await Promise.all([
|
|
7215
|
-
spawnPagesAgent(app),
|
|
7216
|
-
spawnApiEndpointsAgent(app)
|
|
7217
|
-
]);
|
|
7218
|
-
}
|
|
7219
|
-
}
|
|
7220
|
-
} catch {
|
|
7221
|
-
appAnyTaskFailed.set(app.name, true);
|
|
7222
|
-
} finally {
|
|
7223
|
-
completedAppCount++;
|
|
7224
|
-
const appStatus = appAnyTaskFailed.get(app.name) ? "failed" : "completed";
|
|
7225
|
-
eventBus?.emit("subagent-complete", {
|
|
7226
|
-
subagentId: appNodeId,
|
|
7227
|
-
status: appStatus,
|
|
7228
|
-
parentSubagentId: WORKFLOW_UMBRELLA_ID
|
|
7229
|
-
});
|
|
7230
|
-
eventBus?.emit("app-analysis-progress", {
|
|
7231
|
-
totalApps,
|
|
7232
|
-
completedApps: completedAppCount,
|
|
7233
|
-
appName: app.name
|
|
7234
|
-
});
|
|
7235
|
-
}
|
|
7236
|
-
});
|
|
7305
|
+
assertDepth(1, seams.limits);
|
|
7306
|
+
await seams.fanOut.spawnMany(appsResult.apps, async (app, appIndex) => {
|
|
7307
|
+
await runWhiteboxAttackSurfaceApp(app, appIndex, appWorkerInput);
|
|
7308
|
+
completedAppCount++;
|
|
7309
|
+
eventBus?.emit("app-analysis-progress", {
|
|
7310
|
+
totalApps,
|
|
7311
|
+
completedApps: completedAppCount,
|
|
7312
|
+
appName: app.name
|
|
7313
|
+
});
|
|
7314
|
+
}, { concurrency: DEFAULT_CONCURRENCY });
|
|
7237
7315
|
eventBus?.emit("subagent-complete", {
|
|
7238
7316
|
subagentId: WORKFLOW_UMBRELLA_ID,
|
|
7239
7317
|
status: "completed"
|
|
@@ -7266,7 +7344,7 @@ async function runWhiteboxAttackSurfaceWorkflow(input) {
|
|
|
7266
7344
|
function readAppsFromAssetsDirectory(assetsPath, appsDiscovery) {
|
|
7267
7345
|
const repoType = appsDiscovery?.repoType ?? "unknown";
|
|
7268
7346
|
const packageManager = appsDiscovery?.packageManager ?? "unknown";
|
|
7269
|
-
if (!
|
|
7347
|
+
if (!existsSync11(assetsPath)) {
|
|
7270
7348
|
log4.debug(`readAssets: assets directory does not exist: ${assetsPath}`);
|
|
7271
7349
|
return { apps: [], repoType, packageManager };
|
|
7272
7350
|
}
|
|
@@ -7281,7 +7359,7 @@ function readAppsFromAssetsDirectory(assetsPath, appsDiscovery) {
|
|
|
7281
7359
|
}
|
|
7282
7360
|
const appJsonPath = join16(entryPath, "app.json");
|
|
7283
7361
|
let metadata;
|
|
7284
|
-
if (
|
|
7362
|
+
if (existsSync11(appJsonPath)) {
|
|
7285
7363
|
try {
|
|
7286
7364
|
metadata = JSON.parse(readFileSync9(appJsonPath, "utf-8"));
|
|
7287
7365
|
} catch {
|
|
@@ -7301,16 +7379,16 @@ function readAppsFromAssetsDirectory(assetsPath, appsDiscovery) {
|
|
|
7301
7379
|
try {
|
|
7302
7380
|
const raw = readFileSync9(join16(entryPath, file), "utf-8");
|
|
7303
7381
|
const data = JSON.parse(raw);
|
|
7304
|
-
const
|
|
7305
|
-
if (!
|
|
7382
|
+
const endpoint = assetRecordToEndpoint(data);
|
|
7383
|
+
if (!endpoint) {
|
|
7306
7384
|
log4.debug(`readAssets: ${file}: failed schema validation (assetRecordToEndpoint returned null)`);
|
|
7307
7385
|
parseFailed++;
|
|
7308
7386
|
continue;
|
|
7309
7387
|
}
|
|
7310
7388
|
if (isPageEndpoint(data)) {
|
|
7311
|
-
pages.push(
|
|
7389
|
+
pages.push(endpoint);
|
|
7312
7390
|
} else {
|
|
7313
|
-
apiEndpoints.push(
|
|
7391
|
+
apiEndpoints.push(endpoint);
|
|
7314
7392
|
}
|
|
7315
7393
|
} catch {
|
|
7316
7394
|
log4.warn(`readAssets: skipping unreadable asset file: ${entry}/${file}`);
|
|
@@ -7335,7 +7413,7 @@ function assetRecordToEndpoint(record) {
|
|
|
7335
7413
|
const method = Array.isArray(rawMethod) ? rawMethod.join(", ") : rawMethod ?? "UNKNOWN";
|
|
7336
7414
|
const path = record.routePath;
|
|
7337
7415
|
const file = record.file ?? "";
|
|
7338
|
-
const parsed =
|
|
7416
|
+
const parsed = EndpointSchema2.safeParse({
|
|
7339
7417
|
method,
|
|
7340
7418
|
path,
|
|
7341
7419
|
handler: record.handler,
|
|
@@ -7653,169 +7731,415 @@ For each entry point, call \`document_endpoint\` with:
|
|
|
7653
7731
|
|
|
7654
7732
|
When finished, call \`response\` with a summary of how many entry points you documented. The reported count must equal the number of successful \`document_endpoint\` calls you made.`;
|
|
7655
7733
|
}
|
|
7734
|
+
function buildIncrementalObjective(codebasePath, diffPath, assetsPath, existingResult, domains, environments) {
|
|
7735
|
+
const appsSummary = existingResult.apps.map((app) => {
|
|
7736
|
+
const epCount = app.pages.length + app.apiEndpoints.length;
|
|
7737
|
+
return ` - **${app.name}** (${app.framework}) at \`${app.location}\` — ${epCount} endpoints`;
|
|
7738
|
+
}).join(`
|
|
7739
|
+
`);
|
|
7740
|
+
const domainSection = domains?.length ? `
|
|
7741
|
+
## Known Domains
|
|
7742
|
+
The following domains are associated with this project. When documenting new apps, set the \`domain\` field on \`document_app\` if you can determine which domain serves the app:
|
|
7743
|
+
${domains.map((d) => `- ${d}`).join(`
|
|
7744
|
+
`)}
|
|
7745
|
+
` : "";
|
|
7746
|
+
const environmentsSection = environments?.length ? `
|
|
7747
|
+
## Target Environments
|
|
7748
|
+
This project is deployed to: ${environments.join(", ")}. When the diff introduces new dynamically-named resources (e.g. environment-prefixed S3 buckets, stage-scoped databases), create a **separate app entry per environment** using the environment name as a prefix (e.g. \`${environments[0]}-<resource>\`). Use environment-specific identifiers in domains and endpoints.
|
|
7749
|
+
` : "";
|
|
7750
|
+
return `# Incremental Attack Surface Update
|
|
7751
|
+
|
|
7752
|
+
## Context
|
|
7753
|
+
You are updating the attack surface map for a repository after a new commit. Rather than analyzing the entire codebase, you will analyze only the **changed files** and update the existing endpoint assets accordingly. Also check for any new cloud resources (S3 buckets, storage, CDN origins, etc.) introduced in the diff.
|
|
7754
|
+
|
|
7755
|
+
## Codebase
|
|
7756
|
+
- **Path:** ${codebasePath}
|
|
7757
|
+
- **Diff file:** ${diffPath} (contains \`git diff\` output between the previous and current commit)
|
|
7758
|
+
- **Existing assets directory:** ${assetsPath}
|
|
7759
|
+
${domainSection}${environmentsSection}
|
|
7760
|
+
## Directory Structure
|
|
7761
|
+
The assets directory uses app-scoped folders:
|
|
7762
|
+
\`\`\`
|
|
7763
|
+
assets/
|
|
7764
|
+
<app-name>/
|
|
7765
|
+
app.json — app metadata (name, framework, description, location)
|
|
7766
|
+
asset_*.json — one file per endpoint (written by document_endpoint)
|
|
7767
|
+
\`\`\`
|
|
7768
|
+
|
|
7769
|
+
## Existing Applications
|
|
7770
|
+
${appsSummary}
|
|
7771
|
+
|
|
7772
|
+
## Task
|
|
7773
|
+
|
|
7774
|
+
### Step 1: Read and understand the diff
|
|
7775
|
+
Read the diff file at \`${diffPath}\`. If it's very large, read it in chunks. Identify which files were added, modified, or deleted.
|
|
7776
|
+
|
|
7777
|
+
### Step 2: Determine impact on the attack surface
|
|
7778
|
+
For each changed file, determine if it affects any endpoints:
|
|
7779
|
+
- **New route/endpoint definitions** → use \`document_endpoint\` with the appropriate \`appName\`
|
|
7780
|
+
- **Modified route handlers** → read the existing asset file, then use \`execute_command\` to update it
|
|
7781
|
+
- **Deleted route files or endpoint definitions** → delete the corresponding asset file
|
|
7782
|
+
- **Non-route changes** (e.g. utility functions, configs, tests) → skip
|
|
7783
|
+
|
|
7784
|
+
### Step 3: Update assets
|
|
7785
|
+
For new endpoints, use \`document_endpoint\` with:
|
|
7786
|
+
- \`appName\` set to the correct application name
|
|
7787
|
+
- \`routePath\` set to the HTTP route (e.g., \`/api/users\`) — this is NOT a file path
|
|
7788
|
+
- \`method\` as an array of ALL HTTP methods the path supports
|
|
7789
|
+
- \`file\` set to the source-code file (e.g., \`src/routes/users.ts\`) — this is NOT the route
|
|
7790
|
+
- \`line\`, \`handler\`, \`authRequired\` filled in
|
|
7791
|
+
|
|
7792
|
+
For modified endpoints, update the existing JSON file via \`execute_command\`.
|
|
7793
|
+
For removed endpoints, delete the file via \`execute_command\`.
|
|
7794
|
+
|
|
7795
|
+
**IMPORTANT: ONE entry per route path.** Do NOT create separate entries for different HTTP methods on the same path.
|
|
7796
|
+
|
|
7797
|
+
**IMPORTANT: NO MANIFESTS, NO BATCHING.** Call \`document_endpoint\` directly, one new endpoint at a time, the moment you identify it. Do not build a JSON file or list of endpoints-to-document and process it later, and do not write a script that emits \`document_endpoint\` calls — that pattern hits output-token limits and silently drops endpoints.
|
|
7798
|
+
|
|
7799
|
+
### Step 4: Report
|
|
7800
|
+
When finished, call the \`response\` tool with a summary of your changes.
|
|
7801
|
+
|
|
7802
|
+
**IMPORTANT:** Be conservative. Only add/modify/remove endpoints that are clearly affected by the diff. Do not re-analyze the entire codebase.`;
|
|
7803
|
+
}
|
|
7804
|
+
var IncrementalReconResultSchema = object({
|
|
7805
|
+
repoType: string(),
|
|
7806
|
+
packageManager: string(),
|
|
7807
|
+
changedApps: array(string()).describe("Names of applications that were affected by the diff"),
|
|
7808
|
+
addedEndpoints: number().describe("Count of new endpoints added"),
|
|
7809
|
+
modifiedEndpoints: number().describe("Count of existing endpoints modified"),
|
|
7810
|
+
removedEndpoints: number().describe("Count of endpoints removed"),
|
|
7811
|
+
summary: string().describe("Brief summary of what changed")
|
|
7812
|
+
});
|
|
7813
|
+
async function readIncrementalReconAssets(backends, assetsPath, existing, abortSignal) {
|
|
7814
|
+
const fs = backends.fs;
|
|
7815
|
+
const list = async (path) => {
|
|
7816
|
+
abortSignal?.throwIfAborted();
|
|
7817
|
+
const result = await fs.list(path);
|
|
7818
|
+
if (!result.success)
|
|
7819
|
+
throw new Error(`Incomplete recon asset listing: ${path}`);
|
|
7820
|
+
if (!result.truncated)
|
|
7821
|
+
return result.files;
|
|
7822
|
+
const files = [];
|
|
7823
|
+
let total;
|
|
7824
|
+
for (let offset = 0;; ) {
|
|
7825
|
+
abortSignal?.throwIfAborted();
|
|
7826
|
+
const quote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
|
|
7827
|
+
const output = await collectCommand(backends.command.run(`python3 -c ${quote(RECON_ARTIFACT_PAGE_SCRIPT)} ${quote(assetsPath)} ${quote(path)} ${offset}`, { timeoutSeconds: 30, abortSignal }));
|
|
7828
|
+
if (output.exitCode !== 0 || output.timedOut || output.stdoutTruncated)
|
|
7829
|
+
throw new Error(`Recon artifact enumeration failed: ${path}`);
|
|
7830
|
+
const page = object({
|
|
7831
|
+
files: array(string()).max(64),
|
|
7832
|
+
total: number().int().min(0).max(1e5),
|
|
7833
|
+
next: number().int().min(1).nullable()
|
|
7834
|
+
}).parse(JSON.parse(output.stdout));
|
|
7835
|
+
total ??= page.total;
|
|
7836
|
+
if (page.total !== total || page.next !== null && page.next !== offset + page.files.length || page.next !== null && (page.files.length === 0 || page.next >= total))
|
|
7837
|
+
throw new Error("Recon artifact enumeration did not advance consistently");
|
|
7838
|
+
files.push(...page.files);
|
|
7839
|
+
if (page.next === null) {
|
|
7840
|
+
if (files.length !== total || new Set(files).size !== total)
|
|
7841
|
+
throw new Error("Incomplete recon artifact pagination");
|
|
7842
|
+
return files;
|
|
7843
|
+
}
|
|
7844
|
+
offset = page.next;
|
|
7845
|
+
}
|
|
7846
|
+
};
|
|
7847
|
+
const read = async (path) => {
|
|
7848
|
+
abortSignal?.throwIfAborted();
|
|
7849
|
+
const result = await fs.readRaw(path);
|
|
7850
|
+
if (!result.success)
|
|
7851
|
+
throw new Error(`Recon artifact read failed: ${path}`);
|
|
7852
|
+
return JSON.parse(result.content);
|
|
7853
|
+
};
|
|
7854
|
+
const apps = [];
|
|
7855
|
+
for (const directory of await list(assetsPath)) {
|
|
7856
|
+
if (!directory.endsWith("/"))
|
|
7857
|
+
continue;
|
|
7858
|
+
if (directory === "../" || directory === "./" || directory.slice(0, -1).includes("/"))
|
|
7859
|
+
throw new Error("Invalid recon artifact directory");
|
|
7860
|
+
const appPath = join16(assetsPath, directory);
|
|
7861
|
+
const metadata = AppInfoSchema2.parse(await read(join16(appPath, "app.json")));
|
|
7862
|
+
const previousApp = existing.apps.find((app) => app.name === metadata.name);
|
|
7863
|
+
const app = {
|
|
7864
|
+
...previousApp,
|
|
7865
|
+
...metadata,
|
|
7866
|
+
pages: [],
|
|
7867
|
+
apiEndpoints: []
|
|
7868
|
+
};
|
|
7869
|
+
for (const file of await list(appPath)) {
|
|
7870
|
+
if (file === "app.json" || !file.endsWith(".json"))
|
|
7871
|
+
continue;
|
|
7872
|
+
if (file.includes("/") || file === "..")
|
|
7873
|
+
throw new Error("Invalid recon artifact filename");
|
|
7874
|
+
const raw = await read(join16(appPath, file));
|
|
7875
|
+
const record = object({
|
|
7876
|
+
method: union([string(), array(string())]),
|
|
7877
|
+
routePath: string()
|
|
7878
|
+
}).passthrough().parse(raw);
|
|
7879
|
+
const endpoint = assetRecordToEndpoint(record);
|
|
7880
|
+
if (!endpoint)
|
|
7881
|
+
throw new Error(`Invalid recon endpoint artifact: ${file}`);
|
|
7882
|
+
const previous = previousApp && [...previousApp.pages, ...previousApp.apiEndpoints].find((ep) => ep.method === endpoint.method && ep.file === endpoint.file && ep.path === endpoint.path);
|
|
7883
|
+
const restored = {
|
|
7884
|
+
...previous,
|
|
7885
|
+
...endpoint,
|
|
7886
|
+
...endpoint.riskScore ? {} : previous?.riskScore ? { riskScore: previous.riskScore } : {}
|
|
7887
|
+
};
|
|
7888
|
+
(isPageEndpoint(record) ? app.pages : app.apiEndpoints).push(restored);
|
|
7889
|
+
}
|
|
7890
|
+
apps.push(app);
|
|
7891
|
+
}
|
|
7892
|
+
return {
|
|
7893
|
+
...existing,
|
|
7894
|
+
apps,
|
|
7895
|
+
summary: {
|
|
7896
|
+
totalApps: apps.length,
|
|
7897
|
+
totalPages: apps.reduce((sum, app) => sum + app.pages.length, 0),
|
|
7898
|
+
totalApiEndpoints: apps.reduce((sum, app) => sum + app.apiEndpoints.length, 0),
|
|
7899
|
+
totalPentestObjectives: apps.reduce((sum, app) => sum + [...app.pages, ...app.apiEndpoints].reduce((count, ep) => count + ep.pentestObjectives.length, 0), 0)
|
|
7900
|
+
}
|
|
7901
|
+
};
|
|
7902
|
+
}
|
|
7903
|
+
var RECON_ARTIFACT_PAGE_SCRIPT = `import os,sys,json,itertools
|
|
7904
|
+
base=os.path.realpath(sys.argv[1]); directory=os.path.realpath(sys.argv[2]); offset=int(sys.argv[3])
|
|
7905
|
+
if os.path.commonpath([base,directory]) != base: raise ValueError("Artifact directory escaped root")
|
|
7906
|
+
with os.scandir(directory) as scan:
|
|
7907
|
+
entries=list(itertools.islice(scan,100001))
|
|
7908
|
+
if len(entries)>100000: raise ValueError("Artifact inventory exceeds limit")
|
|
7909
|
+
if any(entry.is_symlink() for entry in entries): raise ValueError("Artifact links are not supported")
|
|
7910
|
+
files=sorted(entry.name+("/" if entry.is_dir() else "") for entry in entries)
|
|
7911
|
+
end=min(len(files),offset+64)
|
|
7912
|
+
print(json.dumps({"files":files[offset:end],"total":len(files),"next":end if end<len(files) else None}))`;
|
|
7656
7913
|
|
|
7657
7914
|
// src/core/workflows/pentest.ts
|
|
7658
7915
|
var log5 = scopedLogger(() => createLogger("pentest-swarm"));
|
|
7659
7916
|
var DEFAULT_CONCURRENCY2 = 10;
|
|
7660
|
-
async function
|
|
7917
|
+
async function runPentestSwarmTarget(target, index, input) {
|
|
7661
7918
|
const {
|
|
7662
|
-
targets,
|
|
7663
7919
|
model,
|
|
7664
7920
|
session,
|
|
7665
7921
|
authConfig,
|
|
7666
7922
|
abortSignal,
|
|
7667
7923
|
findingsRegistry,
|
|
7668
7924
|
eventBus,
|
|
7669
|
-
onError,
|
|
7670
|
-
concurrency = DEFAULT_CONCURRENCY2,
|
|
7671
7925
|
onStepFinish,
|
|
7672
7926
|
onCacheMetrics,
|
|
7673
7927
|
enableThinking,
|
|
7674
7928
|
thinkingEffort,
|
|
7675
7929
|
openAIReasoningEffort,
|
|
7676
|
-
display
|
|
7930
|
+
display,
|
|
7931
|
+
onError,
|
|
7932
|
+
hooks: sharedHooks,
|
|
7933
|
+
seams,
|
|
7934
|
+
manifestEntries,
|
|
7935
|
+
completedIds
|
|
7677
7936
|
} = input;
|
|
7678
|
-
const
|
|
7679
|
-
const
|
|
7680
|
-
const
|
|
7681
|
-
|
|
7682
|
-
|
|
7683
|
-
const
|
|
7684
|
-
|
|
7685
|
-
|
|
7686
|
-
|
|
7687
|
-
|
|
7688
|
-
|
|
7689
|
-
|
|
7690
|
-
let lastMessages = [];
|
|
7691
|
-
const handleStepFinish = (e) => {
|
|
7692
|
-
if (e.response.messages) {
|
|
7693
|
-
lastMessages = e.response.messages;
|
|
7694
|
-
}
|
|
7695
|
-
onStepFinish?.(e);
|
|
7696
|
-
};
|
|
7697
|
-
eventBus?.emit("subagent-spawn", {
|
|
7698
|
-
subagentId,
|
|
7699
|
-
name: subagentName,
|
|
7700
|
-
input: { target: target.target, objectives: target.objectives }
|
|
7701
|
-
});
|
|
7702
|
-
if (session.config?.requirePlan && session.config?.taskDriven && previousMessages.length === 0) {
|
|
7703
|
-
try {
|
|
7704
|
-
eventBus?.emit("subagent-spawn", {
|
|
7705
|
-
subagentId: `${subagentId}-plan`,
|
|
7706
|
-
name: `${subagentName} (plan)`,
|
|
7707
|
-
input: { target: target.target, objectives: target.objectives },
|
|
7708
|
-
parentSubagentId: subagentId
|
|
7709
|
-
});
|
|
7710
|
-
const executionTasksDir = join18(session.rootPath, "subagents", `${subagentId}-tasks`);
|
|
7711
|
-
const planAgent = new OffensiveSecurityAgent({
|
|
7712
|
-
system: PLAN_PHASE_SYSTEM_PROMPT,
|
|
7713
|
-
prompt: buildPlanPrompt(target.target, target.objectives, target.grpc),
|
|
7714
|
-
model,
|
|
7715
|
-
session,
|
|
7716
|
-
target: target.target,
|
|
7717
|
-
grpc: target.grpc,
|
|
7718
|
-
mode: "plan",
|
|
7719
|
-
activeTools: [...PLAN_MODE_TOOL_NAMES],
|
|
7720
|
-
stopWhen: hasToolCall("submit_plan"),
|
|
7721
|
-
authConfig,
|
|
7722
|
-
abortSignal,
|
|
7723
|
-
findingsRegistry,
|
|
7724
|
-
subagentId: `${subagentId}-plan`,
|
|
7725
|
-
subagentName: `${subagentName} (plan)`,
|
|
7726
|
-
tasksDir: executionTasksDir,
|
|
7727
|
-
planSubagentId: subagentId,
|
|
7728
|
-
eventBus,
|
|
7729
|
-
onStepFinish,
|
|
7730
|
-
onCacheMetrics,
|
|
7731
|
-
enableThinking,
|
|
7732
|
-
thinkingEffort,
|
|
7733
|
-
openAIReasoningEffort,
|
|
7734
|
-
display
|
|
7735
|
-
});
|
|
7736
|
-
await planAgent.consume();
|
|
7737
|
-
eventBus?.emit("subagent-complete", {
|
|
7738
|
-
subagentId: `${subagentId}-plan`,
|
|
7739
|
-
status: "completed",
|
|
7740
|
-
parentSubagentId: subagentId
|
|
7741
|
-
});
|
|
7742
|
-
} catch (planErr) {
|
|
7743
|
-
eventBus?.emit("subagent-complete", {
|
|
7744
|
-
subagentId: `${subagentId}-plan`,
|
|
7745
|
-
status: "failed",
|
|
7746
|
-
parentSubagentId: subagentId
|
|
7747
|
-
});
|
|
7748
|
-
log5.warn(`Plan phase failed for ${subagentId}: ${planErr}`);
|
|
7749
|
-
}
|
|
7937
|
+
const entry = manifestEntries[index];
|
|
7938
|
+
const subagentId = entry.id;
|
|
7939
|
+
const subagentName = target.name ?? entry.name;
|
|
7940
|
+
if (completedIds.has(subagentId))
|
|
7941
|
+
return null;
|
|
7942
|
+
const itemHooks = resolveItemHooks(sharedHooks, seams, target, index);
|
|
7943
|
+
const childSignal = abortSignal && itemHooks.abortSignal ? AbortSignal.any([abortSignal, itemHooks.abortSignal]) : abortSignal ?? itemHooks.abortSignal;
|
|
7944
|
+
const previousMessages = loadSubagentMessages(session, subagentId);
|
|
7945
|
+
let lastMessages = [];
|
|
7946
|
+
const handleStepFinish = (e) => {
|
|
7947
|
+
if (e.response.messages) {
|
|
7948
|
+
lastMessages = e.response.messages;
|
|
7750
7949
|
}
|
|
7751
|
-
|
|
7752
|
-
|
|
7950
|
+
onStepFinish?.(e);
|
|
7951
|
+
};
|
|
7952
|
+
await seams.hooks.onEndpointStart?.({
|
|
7953
|
+
subagentId,
|
|
7954
|
+
subagentName,
|
|
7955
|
+
target: target.target
|
|
7956
|
+
});
|
|
7957
|
+
eventBus?.emit("subagent-spawn", {
|
|
7958
|
+
subagentId,
|
|
7959
|
+
name: subagentName,
|
|
7960
|
+
input: { target: target.target, objectives: target.objectives }
|
|
7961
|
+
});
|
|
7962
|
+
if (session.config?.requirePlan && session.config?.taskDriven && previousMessages.length === 0) {
|
|
7753
7963
|
try {
|
|
7754
|
-
|
|
7755
|
-
|
|
7756
|
-
|
|
7757
|
-
objectives: target.objectives,
|
|
7964
|
+
eventBus?.emit("subagent-spawn", {
|
|
7965
|
+
subagentId: `${subagentId}-plan`,
|
|
7966
|
+
name: `${subagentName} (plan)`,
|
|
7967
|
+
input: { target: target.target, objectives: target.objectives },
|
|
7968
|
+
parentSubagentId: subagentId
|
|
7969
|
+
});
|
|
7970
|
+
const executionTasksDir = join17(session.rootPath, "subagents", `${subagentId}-tasks`);
|
|
7971
|
+
const planAgent = new OffensiveSecurityAgent({
|
|
7972
|
+
system: PLAN_PHASE_SYSTEM_PROMPT,
|
|
7973
|
+
prompt: buildPlanPrompt(target.target, target.objectives, target.grpc),
|
|
7758
7974
|
model,
|
|
7759
7975
|
session,
|
|
7976
|
+
target: target.target,
|
|
7977
|
+
grpc: target.grpc,
|
|
7978
|
+
mode: "plan",
|
|
7979
|
+
activeTools: [...PLAN_MODE_TOOL_NAMES],
|
|
7980
|
+
stopWhen: hasToolCall("submit_plan"),
|
|
7760
7981
|
authConfig,
|
|
7761
|
-
abortSignal,
|
|
7762
7982
|
findingsRegistry,
|
|
7763
|
-
|
|
7764
|
-
|
|
7765
|
-
|
|
7766
|
-
|
|
7983
|
+
subagentId: `${subagentId}-plan`,
|
|
7984
|
+
subagentName: `${subagentName} (plan)`,
|
|
7985
|
+
tasksDir: executionTasksDir,
|
|
7986
|
+
planSubagentId: subagentId,
|
|
7767
7987
|
eventBus,
|
|
7768
|
-
|
|
7769
|
-
|
|
7988
|
+
onStepFinish,
|
|
7989
|
+
onCacheMetrics,
|
|
7770
7990
|
enableThinking,
|
|
7771
7991
|
thinkingEffort,
|
|
7772
7992
|
openAIReasoningEffort,
|
|
7773
|
-
display
|
|
7993
|
+
display,
|
|
7994
|
+
...itemHooks,
|
|
7995
|
+
abortSignal: childSignal
|
|
7774
7996
|
});
|
|
7775
|
-
|
|
7776
|
-
|
|
7777
|
-
|
|
7778
|
-
target: target.target,
|
|
7779
|
-
objective: objectiveStr,
|
|
7997
|
+
await planAgent.consume();
|
|
7998
|
+
eventBus?.emit("subagent-complete", {
|
|
7999
|
+
subagentId: `${subagentId}-plan`,
|
|
7780
8000
|
status: "completed",
|
|
7781
|
-
|
|
7782
|
-
messages: [...previousMessages, ...lastMessages],
|
|
7783
|
-
systemPrompt: buildPentestSystemPrompt(session),
|
|
7784
|
-
userPrompt: agent.userPrompt
|
|
8001
|
+
parentSubagentId: subagentId
|
|
7785
8002
|
});
|
|
7786
|
-
|
|
8003
|
+
} catch (planErr) {
|
|
7787
8004
|
eventBus?.emit("subagent-complete", {
|
|
7788
|
-
subagentId
|
|
7789
|
-
status: "completed"
|
|
7790
|
-
});
|
|
7791
|
-
return result;
|
|
7792
|
-
} catch (error) {
|
|
7793
|
-
saveSubagentData(session, {
|
|
7794
|
-
agentName: subagentId,
|
|
7795
|
-
target: target.target,
|
|
7796
|
-
objective: objectiveStr,
|
|
8005
|
+
subagentId: `${subagentId}-plan`,
|
|
7797
8006
|
status: "failed",
|
|
7798
|
-
|
|
7799
|
-
messages: [...previousMessages, ...lastMessages],
|
|
7800
|
-
systemPrompt: buildPentestSystemPrompt(session),
|
|
7801
|
-
userPrompt: agent?.userPrompt ?? ""
|
|
8007
|
+
parentSubagentId: subagentId
|
|
7802
8008
|
});
|
|
7803
|
-
|
|
7804
|
-
eventBus?.emit("subagent-complete", {
|
|
7805
|
-
subagentId,
|
|
7806
|
-
status: "failed"
|
|
7807
|
-
});
|
|
7808
|
-
eventBus?.emit("error", { error, subagentId });
|
|
7809
|
-
onError?.(error);
|
|
7810
|
-
throw error;
|
|
8009
|
+
log5.warn(`Plan phase failed for ${subagentId}: ${planErr}`);
|
|
7811
8010
|
}
|
|
7812
|
-
}
|
|
8011
|
+
}
|
|
8012
|
+
const objectiveStr = target.objectives.join("; ");
|
|
8013
|
+
let agent;
|
|
8014
|
+
try {
|
|
8015
|
+
agent = new TargetedPentestAgent2({
|
|
8016
|
+
target: target.target,
|
|
8017
|
+
grpc: target.grpc,
|
|
8018
|
+
objectives: target.objectives,
|
|
8019
|
+
model,
|
|
8020
|
+
session,
|
|
8021
|
+
authConfig,
|
|
8022
|
+
findingsRegistry,
|
|
8023
|
+
onStepFinish: handleStepFinish,
|
|
8024
|
+
onCacheMetrics,
|
|
8025
|
+
forwardUsageCallbacksToSpawnedAgents: true,
|
|
8026
|
+
messages: previousMessages.length > 0 ? previousMessages : undefined,
|
|
8027
|
+
eventBus,
|
|
8028
|
+
subagentId,
|
|
8029
|
+
subagentName,
|
|
8030
|
+
enableThinking,
|
|
8031
|
+
thinkingEffort,
|
|
8032
|
+
openAIReasoningEffort,
|
|
8033
|
+
display,
|
|
8034
|
+
...itemHooks,
|
|
8035
|
+
abortSignal: childSignal
|
|
8036
|
+
});
|
|
8037
|
+
const result = await agent.consume();
|
|
8038
|
+
saveSubagentData(session, {
|
|
8039
|
+
agentName: subagentId,
|
|
8040
|
+
target: target.target,
|
|
8041
|
+
objective: objectiveStr,
|
|
8042
|
+
status: "completed",
|
|
8043
|
+
findingsCount: result.findings.length,
|
|
8044
|
+
messages: [...previousMessages, ...lastMessages],
|
|
8045
|
+
systemPrompt: buildPentestSystemPrompt2(session),
|
|
8046
|
+
userPrompt: agent.userPrompt
|
|
8047
|
+
});
|
|
8048
|
+
updateManifestEntryStatus(session, subagentId, "completed");
|
|
8049
|
+
eventBus?.emit("subagent-complete", {
|
|
8050
|
+
subagentId,
|
|
8051
|
+
status: "completed"
|
|
8052
|
+
});
|
|
8053
|
+
await seams.hooks.onEndpointDone?.({ subagentId, subagentName, target: target.target }, result);
|
|
8054
|
+
return result;
|
|
8055
|
+
} catch (error) {
|
|
8056
|
+
saveSubagentData(session, {
|
|
8057
|
+
agentName: subagentId,
|
|
8058
|
+
target: target.target,
|
|
8059
|
+
objective: objectiveStr,
|
|
8060
|
+
status: "failed",
|
|
8061
|
+
error: error instanceof Error ? error.message : String(error),
|
|
8062
|
+
messages: [...previousMessages, ...lastMessages],
|
|
8063
|
+
systemPrompt: buildPentestSystemPrompt2(session),
|
|
8064
|
+
userPrompt: agent?.userPrompt ?? ""
|
|
8065
|
+
});
|
|
8066
|
+
updateManifestEntryStatus(session, subagentId, "failed");
|
|
8067
|
+
eventBus?.emit("subagent-complete", {
|
|
8068
|
+
subagentId,
|
|
8069
|
+
status: "failed"
|
|
8070
|
+
});
|
|
8071
|
+
eventBus?.emit("error", { error, subagentId });
|
|
8072
|
+
await seams.hooks.onEndpointFailed?.({ subagentId, subagentName, target: target.target }, error);
|
|
8073
|
+
onError?.(error);
|
|
8074
|
+
throw error;
|
|
8075
|
+
}
|
|
8076
|
+
}
|
|
8077
|
+
async function runPentestSwarm2(input) {
|
|
8078
|
+
const {
|
|
8079
|
+
targets,
|
|
8080
|
+
model,
|
|
8081
|
+
session,
|
|
8082
|
+
authConfig,
|
|
8083
|
+
abortSignal,
|
|
8084
|
+
findingsRegistry: rawFindingsRegistry,
|
|
8085
|
+
eventBus,
|
|
8086
|
+
onError,
|
|
8087
|
+
concurrency = DEFAULT_CONCURRENCY2,
|
|
8088
|
+
onStepFinish,
|
|
8089
|
+
onCacheMetrics,
|
|
8090
|
+
enableThinking,
|
|
8091
|
+
thinkingEffort,
|
|
8092
|
+
openAIReasoningEffort,
|
|
8093
|
+
display,
|
|
8094
|
+
subagentSpawner,
|
|
8095
|
+
languageModelMiddleware,
|
|
8096
|
+
usageRecorder,
|
|
8097
|
+
streamIdFactory,
|
|
8098
|
+
hooks,
|
|
8099
|
+
seams: inputSeams
|
|
8100
|
+
} = input;
|
|
8101
|
+
const seams = inputSeams ?? inProcessSeams({ fanOut: hooks?.subagentSpawner ?? subagentSpawner });
|
|
8102
|
+
assertDepth(1, seams.limits);
|
|
8103
|
+
const spawner = subagentSpawner ?? inProcessSubagentSpawner;
|
|
8104
|
+
const sharedHooks = {
|
|
8105
|
+
subagentSpawner: spawner,
|
|
8106
|
+
languageModelMiddleware,
|
|
8107
|
+
usageRecorder,
|
|
8108
|
+
streamIdFactory,
|
|
8109
|
+
...hooks
|
|
8110
|
+
};
|
|
8111
|
+
const findingsRegistry = withFindingPersistedHook(rawFindingsRegistry, seams.hooks.onFindingPersisted);
|
|
8112
|
+
const completedIds = getCompletedAgentIds(session);
|
|
8113
|
+
const existingManifest = readAgentManifest(session);
|
|
8114
|
+
const freshEntries = buildManifestEntries(targets, (name, ordinal) => seams.ids.newSessionId(name, ordinal));
|
|
8115
|
+
const manifestEntries = reconcileManifestOnResume(existingManifest, freshEntries);
|
|
8116
|
+
writeAgentManifest(session, manifestEntries);
|
|
8117
|
+
const targetInput = {
|
|
8118
|
+
model,
|
|
8119
|
+
session,
|
|
8120
|
+
authConfig,
|
|
8121
|
+
abortSignal,
|
|
8122
|
+
findingsRegistry,
|
|
8123
|
+
eventBus,
|
|
8124
|
+
onStepFinish,
|
|
8125
|
+
onCacheMetrics,
|
|
8126
|
+
enableThinking,
|
|
8127
|
+
thinkingEffort,
|
|
8128
|
+
openAIReasoningEffort,
|
|
8129
|
+
display,
|
|
8130
|
+
onError,
|
|
8131
|
+
hooks: sharedHooks,
|
|
8132
|
+
seams,
|
|
8133
|
+
manifestEntries,
|
|
8134
|
+
completedIds
|
|
8135
|
+
};
|
|
8136
|
+
const results = await seams.fanOut.spawnMany(targets, (target, index) => runPentestSwarmTarget(target, index, targetInput), { concurrency, abortSignal });
|
|
7813
8137
|
finalizeManifest(session, manifestEntries, results);
|
|
7814
8138
|
return results;
|
|
7815
8139
|
}
|
|
7816
|
-
async function
|
|
8140
|
+
async function runPentestWorkflow2(input) {
|
|
7817
8141
|
if (input.fastStrike) {
|
|
7818
|
-
const { runFastStrike } = await import("./fastStrike-
|
|
8142
|
+
const { runFastStrike } = await import("./fastStrike-mgws2nav.js");
|
|
7819
8143
|
return runFastStrike(input);
|
|
7820
8144
|
}
|
|
7821
8145
|
const {
|
|
@@ -7835,6 +8159,18 @@ async function runPentestWorkflow(input) {
|
|
|
7835
8159
|
threatModel,
|
|
7836
8160
|
surfaceIntegrationEnabled
|
|
7837
8161
|
} = input;
|
|
8162
|
+
const seams = input.seams ?? inProcessSeams({
|
|
8163
|
+
fanOut: input.hooks?.subagentSpawner ?? input.subagentSpawner,
|
|
8164
|
+
registries: {
|
|
8165
|
+
findings: () => FindingsRegistry.fromDirectory(session.findingsPath, {
|
|
8166
|
+
model,
|
|
8167
|
+
authConfig,
|
|
8168
|
+
abortSignal,
|
|
8169
|
+
sessionId: session.id
|
|
8170
|
+
}),
|
|
8171
|
+
attackSurface: inMemoryRegistryProvider.attackSurface
|
|
8172
|
+
}
|
|
8173
|
+
});
|
|
7838
8174
|
if (prompt || threatModel) {
|
|
7839
8175
|
const parts = [];
|
|
7840
8176
|
if (threatModel)
|
|
@@ -7891,7 +8227,16 @@ ${combined}` : combined;
|
|
|
7891
8227
|
onStepFinish,
|
|
7892
8228
|
onCacheMetrics,
|
|
7893
8229
|
openAIReasoningEffort,
|
|
7894
|
-
surfaceIntegrationEnabled
|
|
8230
|
+
surfaceIntegrationEnabled,
|
|
8231
|
+
subagentSpawner: input.subagentSpawner,
|
|
8232
|
+
hooks: {
|
|
8233
|
+
subagentSpawner: input.subagentSpawner,
|
|
8234
|
+
languageModelMiddleware: input.languageModelMiddleware,
|
|
8235
|
+
usageRecorder: input.usageRecorder,
|
|
8236
|
+
streamIdFactory: input.streamIdFactory,
|
|
8237
|
+
...input.hooks
|
|
8238
|
+
},
|
|
8239
|
+
seams
|
|
7895
8240
|
});
|
|
7896
8241
|
} else {
|
|
7897
8242
|
swarmTargets = await runBlackboxPhase({
|
|
@@ -7903,7 +8248,14 @@ ${combined}` : combined;
|
|
|
7903
8248
|
eventBus,
|
|
7904
8249
|
onStepFinish,
|
|
7905
8250
|
onCacheMetrics,
|
|
7906
|
-
openAIReasoningEffort
|
|
8251
|
+
openAIReasoningEffort,
|
|
8252
|
+
hooks: {
|
|
8253
|
+
subagentSpawner: input.subagentSpawner,
|
|
8254
|
+
languageModelMiddleware: input.languageModelMiddleware,
|
|
8255
|
+
usageRecorder: input.usageRecorder,
|
|
8256
|
+
streamIdFactory: input.streamIdFactory,
|
|
8257
|
+
...input.hooks
|
|
8258
|
+
}
|
|
7907
8259
|
});
|
|
7908
8260
|
}
|
|
7909
8261
|
eventBus?.emit("workflow-phase-complete", {
|
|
@@ -7918,35 +8270,31 @@ ${combined}` : combined;
|
|
|
7918
8270
|
throw new DOMException("Pentest aborted by user", "AbortError");
|
|
7919
8271
|
}
|
|
7920
8272
|
if (swarmTargets.length === 0) {
|
|
7921
|
-
const
|
|
8273
|
+
const report = buildPentestReport([], {
|
|
7922
8274
|
target,
|
|
7923
8275
|
model,
|
|
7924
8276
|
sessionId: session.id,
|
|
7925
8277
|
mode
|
|
7926
8278
|
});
|
|
7927
|
-
const
|
|
7928
|
-
const
|
|
7929
|
-
writeFileSync4(
|
|
7930
|
-
writeFileSync4(
|
|
8279
|
+
const mdPath = join17(session.rootPath, REPORT_FILENAME_MD);
|
|
8280
|
+
const jsonPath = join17(session.rootPath, REPORT_FILENAME_JSON);
|
|
8281
|
+
writeFileSync4(mdPath, renderMarkdown(report));
|
|
8282
|
+
writeFileSync4(jsonPath, renderJson(report));
|
|
7931
8283
|
return {
|
|
7932
8284
|
findings: [],
|
|
7933
8285
|
findingsPath: session.findingsPath,
|
|
7934
8286
|
pocsPath: session.pocsPath,
|
|
7935
|
-
reportPath:
|
|
8287
|
+
reportPath: mdPath
|
|
7936
8288
|
};
|
|
7937
8289
|
}
|
|
7938
8290
|
eventBus?.emit("workflow-phase-start", {
|
|
7939
8291
|
phase: "pentesting",
|
|
7940
8292
|
label: `Pentest Swarm (${swarmTargets.length} targets)`
|
|
7941
8293
|
});
|
|
7942
|
-
const findingsRegistry =
|
|
7943
|
-
model,
|
|
7944
|
-
authConfig,
|
|
7945
|
-
abortSignal
|
|
7946
|
-
});
|
|
8294
|
+
const findingsRegistry = seams.registries.findings();
|
|
7947
8295
|
const completedCount = getCompletedAgentIds(session).size;
|
|
7948
8296
|
if (completedCount < swarmTargets.length) {
|
|
7949
|
-
await
|
|
8297
|
+
await runPentestSwarm2({
|
|
7950
8298
|
targets: swarmTargets,
|
|
7951
8299
|
model,
|
|
7952
8300
|
session,
|
|
@@ -7958,7 +8306,13 @@ ${combined}` : combined;
|
|
|
7958
8306
|
onCacheMetrics,
|
|
7959
8307
|
enableThinking,
|
|
7960
8308
|
thinkingEffort,
|
|
7961
|
-
openAIReasoningEffort
|
|
8309
|
+
openAIReasoningEffort,
|
|
8310
|
+
subagentSpawner: input.subagentSpawner,
|
|
8311
|
+
languageModelMiddleware: input.languageModelMiddleware,
|
|
8312
|
+
usageRecorder: input.usageRecorder,
|
|
8313
|
+
streamIdFactory: input.streamIdFactory,
|
|
8314
|
+
hooks: input.hooks,
|
|
8315
|
+
seams
|
|
7962
8316
|
});
|
|
7963
8317
|
}
|
|
7964
8318
|
if (abortSignal?.aborted) {
|
|
@@ -7976,8 +8330,8 @@ ${combined}` : combined;
|
|
|
7976
8330
|
sessionId: session.id,
|
|
7977
8331
|
mode
|
|
7978
8332
|
});
|
|
7979
|
-
const mdPath =
|
|
7980
|
-
const jsonPath =
|
|
8333
|
+
const mdPath = join17(session.rootPath, REPORT_FILENAME_MD);
|
|
8334
|
+
const jsonPath = join17(session.rootPath, REPORT_FILENAME_JSON);
|
|
7981
8335
|
writeFileSync4(mdPath, renderMarkdown(report));
|
|
7982
8336
|
writeFileSync4(jsonPath, renderJson(report));
|
|
7983
8337
|
const severityCounts = {};
|
|
@@ -8018,26 +8372,30 @@ async function runWhiteboxPhase(opts) {
|
|
|
8018
8372
|
onStepFinish: opts.onStepFinish,
|
|
8019
8373
|
onCacheMetrics: opts.onCacheMetrics,
|
|
8020
8374
|
openAIReasoningEffort: opts.openAIReasoningEffort,
|
|
8021
|
-
surfaceIntegrationEnabled: opts.surfaceIntegrationEnabled
|
|
8375
|
+
surfaceIntegrationEnabled: opts.surfaceIntegrationEnabled,
|
|
8376
|
+
subagentSpawner: opts.subagentSpawner,
|
|
8377
|
+
hooks: opts.hooks,
|
|
8378
|
+
seams: opts.seams
|
|
8022
8379
|
};
|
|
8023
8380
|
const result = await runWhiteboxAttackSurfaceWorkflow(workflowInput);
|
|
8024
8381
|
return result.apps.flatMap((app) => [...app.pages, ...app.apiEndpoints].map((ep) => {
|
|
8025
|
-
const
|
|
8382
|
+
const grpc = toGrpcPentestContext(ep.transport, ep.grpc, ep.path);
|
|
8026
8383
|
return {
|
|
8027
|
-
target: grpcAuthorityTarget(
|
|
8384
|
+
target: grpcAuthorityTarget(grpc, ep.path) ?? (ep.path.startsWith("http") ? ep.path : `${opts.baseTarget}${ep.path}`),
|
|
8028
8385
|
objectives: ep.pentestObjectives,
|
|
8029
|
-
grpc
|
|
8386
|
+
grpc
|
|
8030
8387
|
};
|
|
8031
8388
|
}));
|
|
8032
8389
|
}
|
|
8033
8390
|
async function runBlackboxPhase(opts) {
|
|
8034
8391
|
let lastMessages = [];
|
|
8035
8392
|
const agentInput = {
|
|
8393
|
+
...opts.hooks,
|
|
8036
8394
|
target: opts.target,
|
|
8037
8395
|
model: opts.model,
|
|
8038
8396
|
session: opts.session,
|
|
8039
8397
|
authConfig: opts.authConfig,
|
|
8040
|
-
abortSignal: opts.abortSignal,
|
|
8398
|
+
abortSignal: opts.abortSignal && opts.hooks?.abortSignal ? AbortSignal.any([opts.abortSignal, opts.hooks.abortSignal]) : opts.abortSignal ?? opts.hooks?.abortSignal,
|
|
8041
8399
|
eventBus: opts.eventBus,
|
|
8042
8400
|
subagentId: "attack-surface-agent",
|
|
8043
8401
|
onStepFinish: (e) => {
|
|
@@ -8049,7 +8407,7 @@ async function runBlackboxPhase(opts) {
|
|
|
8049
8407
|
onCacheMetrics: opts.onCacheMetrics,
|
|
8050
8408
|
openAIReasoningEffort: opts.openAIReasoningEffort
|
|
8051
8409
|
};
|
|
8052
|
-
const agent = new
|
|
8410
|
+
const agent = new BlackboxAttackSurfaceAgent2(agentInput);
|
|
8053
8411
|
opts.eventBus?.emit("subagent-spawn", {
|
|
8054
8412
|
subagentId: "attack-surface-agent",
|
|
8055
8413
|
name: "Attack Surface Discovery",
|
|
@@ -8086,4 +8444,4 @@ async function runBlackboxPhase(opts) {
|
|
|
8086
8444
|
throw e;
|
|
8087
8445
|
}
|
|
8088
8446
|
}
|
|
8089
|
-
export { readExecutionMetrics, writeExecutionMetrics, convertModelMessagesToUI, loadSubagents, DEFAULT_CONCURRENCY2
|
|
8447
|
+
export { readExecutionMetrics, writeExecutionMetrics, convertModelMessagesToUI, loadSubagents, DEFAULT_CONCURRENCY2, runPentestSwarm2, runPentestWorkflow2 };
|