@pensar/apex 0.0.29-canary.0 → 0.0.30-canary.0

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.
@@ -121560,6 +121560,21 @@ function createSummarizationStream(messages, opts, model) {
121560
121560
  }
121561
121561
  };
121562
121562
  }
121563
+ async function consumeStream2(stream, {
121564
+ onTextDelta,
121565
+ onToolCall,
121566
+ onToolResult
121567
+ }) {
121568
+ for await (const delta of stream.fullStream) {
121569
+ if (delta.type === "text-delta") {
121570
+ onTextDelta?.(delta);
121571
+ } else if (delta.type === "tool-call") {
121572
+ onToolCall?.(delta);
121573
+ } else if (delta.type === "tool-result") {
121574
+ onToolResult?.(delta);
121575
+ }
121576
+ }
121577
+ }
121563
121578
 
121564
121579
  // src/core/ai/ai.ts
121565
121580
  function wrapStreamWithErrorHandler(originalStream, messagesContainer, opts, model, silent) {
@@ -121623,7 +121638,8 @@ function streamResponse(opts) {
121623
121638
  abortSignal,
121624
121639
  activeTools,
121625
121640
  silent,
121626
- authConfig
121641
+ authConfig,
121642
+ onFinish
121627
121643
  } = opts;
121628
121644
  const messagesContainer = { current: messages || [] };
121629
121645
  const providerModel = getProviderModel(model, authConfig);
@@ -121678,7 +121694,8 @@ function streamResponse(opts) {
121678
121694
  }
121679
121695
  throw repairError;
121680
121696
  }
121681
- }
121697
+ },
121698
+ onFinish
121682
121699
  });
121683
121700
  return wrapStreamWithErrorHandler(response, messagesContainer, opts, providerModel, silent);
121684
121701
  } catch (error46) {
@@ -122657,7 +122674,14 @@ Remember: You are the orchestrator, not a testing agent. Your value is in strate
122657
122674
 
122658
122675
  // src/core/agent/thoroughPentestAgent/agent.ts
122659
122676
  import { join as join6 } from "path";
122660
- import { readFileSync as readFileSync5, existsSync as existsSync8, writeFileSync as writeFileSync6, copyFileSync, readdirSync as readdirSync4, mkdirSync as mkdirSync6 } from "fs";
122677
+ import {
122678
+ readFileSync as readFileSync5,
122679
+ existsSync as existsSync8,
122680
+ writeFileSync as writeFileSync6,
122681
+ copyFileSync,
122682
+ readdirSync as readdirSync4,
122683
+ mkdirSync as mkdirSync6
122684
+ } from "fs";
122661
122685
 
122662
122686
  // src/core/agent/attackSurfaceAgent/prompts.ts
122663
122687
  var SYSTEM3 = `You are an expert attack surface analysis agent specializing in comprehensive reconnaissance and asset discovery. Your role is to AUTONOMOUSLY map the entire attack surface of a target and identify specific targets for deeper penetration testing.
@@ -126271,6 +126295,239 @@ Begin your analysis now.
126271
126295
  };
126272
126296
  }
126273
126297
 
126298
+ // src/core/messages/index.ts
126299
+ import fs from "fs";
126300
+
126301
+ // src/core/messages/types.ts
126302
+ var ToolMessageObject = exports_external.object({
126303
+ role: exports_external.literal("tool"),
126304
+ status: exports_external.enum(["pending", "completed"]),
126305
+ toolCallId: exports_external.string(),
126306
+ content: exports_external.string(),
126307
+ args: exports_external.record(exports_external.string(), exports_external.any()),
126308
+ toolName: exports_external.string(),
126309
+ createdAt: exports_external.coerce.date()
126310
+ });
126311
+ var SystemModelMessageObject = exports_external.object({
126312
+ role: exports_external.literal("system"),
126313
+ content: exports_external.string(),
126314
+ createdAt: exports_external.coerce.date(),
126315
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
126316
+ });
126317
+ var TextPartObject = exports_external.object({
126318
+ type: exports_external.literal("text"),
126319
+ text: exports_external.string(),
126320
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
126321
+ });
126322
+ var FilePartObject = exports_external.object({
126323
+ type: exports_external.literal("file"),
126324
+ data: exports_external.union([
126325
+ exports_external.string(),
126326
+ exports_external.instanceof(Uint8Array),
126327
+ exports_external.instanceof(ArrayBuffer),
126328
+ exports_external.instanceof(Buffer),
126329
+ exports_external.url()
126330
+ ]),
126331
+ filename: exports_external.string().optional(),
126332
+ mediaType: exports_external.string(),
126333
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
126334
+ });
126335
+ var ReasoningPartObject = exports_external.object({
126336
+ type: exports_external.literal("reasoning"),
126337
+ text: exports_external.string(),
126338
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
126339
+ });
126340
+ var ToolCallPartObject = exports_external.object({
126341
+ type: exports_external.literal("tool-call"),
126342
+ toolCallId: exports_external.string(),
126343
+ toolName: exports_external.string(),
126344
+ input: exports_external.unknown(),
126345
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional(),
126346
+ providerExecuted: exports_external.boolean().optional()
126347
+ });
126348
+ var ToolResultOutputObject = exports_external.discriminatedUnion("type", [
126349
+ exports_external.object({
126350
+ type: exports_external.literal("text"),
126351
+ value: exports_external.string()
126352
+ }),
126353
+ exports_external.object({
126354
+ type: exports_external.literal("json"),
126355
+ value: exports_external.any()
126356
+ }),
126357
+ exports_external.object({
126358
+ type: exports_external.literal("error-text"),
126359
+ value: exports_external.string()
126360
+ }),
126361
+ exports_external.object({
126362
+ type: exports_external.literal("error-json"),
126363
+ value: exports_external.any()
126364
+ }),
126365
+ exports_external.object({
126366
+ type: exports_external.literal("content"),
126367
+ value: exports_external.array(exports_external.discriminatedUnion("type", [
126368
+ exports_external.object({
126369
+ type: exports_external.literal("text"),
126370
+ text: exports_external.string()
126371
+ }),
126372
+ exports_external.object({
126373
+ type: exports_external.literal("media"),
126374
+ data: exports_external.string(),
126375
+ mediaType: exports_external.string()
126376
+ })
126377
+ ]))
126378
+ })
126379
+ ]);
126380
+ var ToolResultPartObject = exports_external.object({
126381
+ type: exports_external.literal("tool-result"),
126382
+ toolCallId: exports_external.string(),
126383
+ toolName: exports_external.string(),
126384
+ output: ToolResultOutputObject,
126385
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
126386
+ });
126387
+ var AssistantModelMessageObject = exports_external.object({
126388
+ role: exports_external.literal("assistant"),
126389
+ content: exports_external.union([
126390
+ exports_external.string(),
126391
+ exports_external.array(exports_external.discriminatedUnion("type", [
126392
+ TextPartObject,
126393
+ FilePartObject,
126394
+ ReasoningPartObject,
126395
+ ToolCallPartObject,
126396
+ ToolResultPartObject
126397
+ ]))
126398
+ ]),
126399
+ createdAt: exports_external.coerce.date(),
126400
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
126401
+ });
126402
+ var UserModelMessageObject = exports_external.object({
126403
+ role: exports_external.literal("user"),
126404
+ content: exports_external.union([
126405
+ exports_external.string(),
126406
+ exports_external.array(exports_external.discriminatedUnion("type", [TextPartObject, FilePartObject]))
126407
+ ]),
126408
+ createdAt: exports_external.coerce.date(),
126409
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
126410
+ });
126411
+ var ModelMessageObject = exports_external.discriminatedUnion("role", [
126412
+ SystemModelMessageObject,
126413
+ UserModelMessageObject,
126414
+ AssistantModelMessageObject,
126415
+ ToolMessageObject
126416
+ ]);
126417
+
126418
+ // src/core/messages/index.ts
126419
+ function saveMessages(session, messages) {
126420
+ fs.writeFileSync(session.rootPath + "/messages.json", JSON.stringify(messages, null, 2));
126421
+ }
126422
+ function saveSubagentMessages(orchestratorSession, subagentId, messages) {
126423
+ const subagentDir = `${orchestratorSession.rootPath}/subagents/${subagentId}`;
126424
+ if (!fs.existsSync(`${orchestratorSession.rootPath}/subagents`)) {
126425
+ fs.mkdirSync(`${orchestratorSession.rootPath}/subagents`, {
126426
+ recursive: true
126427
+ });
126428
+ }
126429
+ if (!fs.existsSync(subagentDir)) {
126430
+ fs.mkdirSync(subagentDir, { recursive: true });
126431
+ }
126432
+ fs.writeFileSync(`${subagentDir}/messages.json`, JSON.stringify(messages, null, 2));
126433
+ }
126434
+ function mapMessages(messages) {
126435
+ const result = [];
126436
+ const toolResults = new Map;
126437
+ for (const message of messages) {
126438
+ if (message.role === "tool") {
126439
+ const content = message.content;
126440
+ if (Array.isArray(content)) {
126441
+ for (const part of content) {
126442
+ if (part.type === "tool-result") {
126443
+ toolResults.set(part.toolCallId, part.output);
126444
+ }
126445
+ }
126446
+ }
126447
+ }
126448
+ }
126449
+ for (const message of messages) {
126450
+ if (message.role === "system") {
126451
+ result.push({
126452
+ role: "system",
126453
+ content: message.content,
126454
+ createdAt: new Date,
126455
+ ...message.providerOptions && {
126456
+ providerOptions: message.providerOptions
126457
+ }
126458
+ });
126459
+ continue;
126460
+ }
126461
+ if (message.role === "user") {
126462
+ const content = typeof message.content === "string" ? message.content : message.content.map((part) => part.type === "text" ? part.text : "").join("");
126463
+ result.push({
126464
+ role: "user",
126465
+ content,
126466
+ createdAt: new Date,
126467
+ ...message.providerOptions && {
126468
+ providerOptions: message.providerOptions
126469
+ }
126470
+ });
126471
+ continue;
126472
+ }
126473
+ if (message.role === "tool") {
126474
+ continue;
126475
+ }
126476
+ if (message.role === "assistant") {
126477
+ const content = message.content;
126478
+ if (typeof content === "string") {
126479
+ result.push({
126480
+ role: "assistant",
126481
+ content,
126482
+ createdAt: new Date,
126483
+ ...message.providerOptions && {
126484
+ providerOptions: message.providerOptions
126485
+ }
126486
+ });
126487
+ continue;
126488
+ }
126489
+ const textParts = [];
126490
+ const toolCalls = [];
126491
+ for (const part of content) {
126492
+ if (part.type === "text") {
126493
+ textParts.push(part.text);
126494
+ } else if (part.type === "tool-call") {
126495
+ toolCalls.push({
126496
+ toolCallId: part.toolCallId,
126497
+ toolName: part.toolName,
126498
+ input: part.input
126499
+ });
126500
+ }
126501
+ }
126502
+ if (textParts.length > 0) {
126503
+ result.push({
126504
+ role: "assistant",
126505
+ content: textParts.join(""),
126506
+ createdAt: new Date,
126507
+ ...message.providerOptions && {
126508
+ providerOptions: message.providerOptions
126509
+ }
126510
+ });
126511
+ }
126512
+ for (const toolCall of toolCalls) {
126513
+ const input = toolCall.input;
126514
+ const toolCallDescription = input?.toolCallDescription || `Executing ${toolCall.toolName}`;
126515
+ const hasResult = toolResults.has(toolCall.toolCallId);
126516
+ result.push({
126517
+ role: "tool",
126518
+ status: hasResult ? "completed" : "pending",
126519
+ toolCallId: toolCall.toolCallId,
126520
+ content: hasResult ? `✓ ${toolCallDescription}` : toolCallDescription,
126521
+ args: input || {},
126522
+ toolName: toolCall.toolName,
126523
+ createdAt: new Date
126524
+ });
126525
+ }
126526
+ }
126527
+ }
126528
+ return result;
126529
+ }
126530
+
126274
126531
  // src/core/agent/pentestAgent/agent.ts
126275
126532
  var execAsync2 = promisify2(exec2);
126276
126533
  function runAgent(opts) {
@@ -126287,6 +126544,7 @@ function runAgent(opts) {
126287
126544
  sessionConfig
126288
126545
  } = opts;
126289
126546
  const session = opts.session || createSession(target, objective, undefined, sessionConfig);
126547
+ const subagentId = `pentest-${nanoid3(6)}`;
126290
126548
  const pocsPath = join3(session.rootPath, "pocs");
126291
126549
  if (!existsSync5(pocsPath)) {
126292
126550
  mkdirSync4(pocsPath, { recursive: true });
@@ -126442,10 +126700,13 @@ You are only authorized to perform testing against the specific target endpoint
126442
126700
  onStepFinish,
126443
126701
  abortSignal,
126444
126702
  silent,
126445
- authConfig
126703
+ authConfig,
126704
+ onFinish: ({ response }) => {
126705
+ saveSubagentMessages(session, subagentId, mapMessages(response.messages));
126706
+ }
126446
126707
  });
126447
126708
  streamResult.session = session;
126448
- return { streamResult, session };
126709
+ return { streamResult, session, subagentId };
126449
126710
  }
126450
126711
  // src/core/agent/tools.ts
126451
126712
  var execAsync3 = promisify3(exec3);
@@ -128994,6 +129255,7 @@ import { writeFileSync as writeFileSync5, mkdirSync as mkdirSync5, existsSync as
128994
129255
  function runAgent2(opts) {
128995
129256
  const { target, model, onStepFinish, abortSignal } = opts;
128996
129257
  const session = opts.session || createSession(target);
129258
+ const subagentId = `attack-surface-${nanoid3(6)}`;
128997
129259
  console.log(`Created attack surface session: ${session.id}`);
128998
129260
  console.log(`Session path: ${session.rootPath}`);
128999
129261
  const assetsPath = join5(session.rootPath, "assets");
@@ -129140,144 +129402,13 @@ You MUST provide the details final report using create_attack_surface_report too
129140
129402
  stopWhen: stepCountIs(1e4),
129141
129403
  toolChoice: "auto",
129142
129404
  onStepFinish,
129143
- abortSignal
129405
+ abortSignal,
129406
+ onFinish: ({ response }) => {
129407
+ saveSubagentMessages(session, subagentId, mapMessages(response.messages));
129408
+ }
129144
129409
  });
129145
129410
  streamResult.session = session;
129146
- return { streamResult, session };
129147
- }
129148
-
129149
- // src/core/messages/index.ts
129150
- import fs from "fs";
129151
-
129152
- // src/core/messages/types.ts
129153
- var ToolMessageObject = exports_external.object({
129154
- role: exports_external.literal("tool"),
129155
- status: exports_external.enum(["pending", "completed"]),
129156
- toolCallId: exports_external.string(),
129157
- content: exports_external.string(),
129158
- args: exports_external.record(exports_external.string(), exports_external.any()),
129159
- toolName: exports_external.string(),
129160
- createdAt: exports_external.coerce.date()
129161
- });
129162
- var SystemModelMessageObject = exports_external.object({
129163
- role: exports_external.literal("system"),
129164
- content: exports_external.string(),
129165
- createdAt: exports_external.coerce.date(),
129166
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
129167
- });
129168
- var TextPartObject = exports_external.object({
129169
- type: exports_external.literal("text"),
129170
- text: exports_external.string(),
129171
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
129172
- });
129173
- var FilePartObject = exports_external.object({
129174
- type: exports_external.literal("file"),
129175
- data: exports_external.union([
129176
- exports_external.string(),
129177
- exports_external.instanceof(Uint8Array),
129178
- exports_external.instanceof(ArrayBuffer),
129179
- exports_external.instanceof(Buffer),
129180
- exports_external.url()
129181
- ]),
129182
- filename: exports_external.string().optional(),
129183
- mediaType: exports_external.string(),
129184
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
129185
- });
129186
- var ReasoningPartObject = exports_external.object({
129187
- type: exports_external.literal("reasoning"),
129188
- text: exports_external.string(),
129189
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
129190
- });
129191
- var ToolCallPartObject = exports_external.object({
129192
- type: exports_external.literal("tool-call"),
129193
- toolCallId: exports_external.string(),
129194
- toolName: exports_external.string(),
129195
- input: exports_external.unknown(),
129196
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional(),
129197
- providerExecuted: exports_external.boolean().optional()
129198
- });
129199
- var ToolResultOutputObject = exports_external.discriminatedUnion("type", [
129200
- exports_external.object({
129201
- type: exports_external.literal("text"),
129202
- value: exports_external.string()
129203
- }),
129204
- exports_external.object({
129205
- type: exports_external.literal("json"),
129206
- value: exports_external.any()
129207
- }),
129208
- exports_external.object({
129209
- type: exports_external.literal("error-text"),
129210
- value: exports_external.string()
129211
- }),
129212
- exports_external.object({
129213
- type: exports_external.literal("error-json"),
129214
- value: exports_external.any()
129215
- }),
129216
- exports_external.object({
129217
- type: exports_external.literal("content"),
129218
- value: exports_external.array(exports_external.discriminatedUnion("type", [
129219
- exports_external.object({
129220
- type: exports_external.literal("text"),
129221
- text: exports_external.string()
129222
- }),
129223
- exports_external.object({
129224
- type: exports_external.literal("media"),
129225
- data: exports_external.string(),
129226
- mediaType: exports_external.string()
129227
- })
129228
- ]))
129229
- })
129230
- ]);
129231
- var ToolResultPartObject = exports_external.object({
129232
- type: exports_external.literal("tool-result"),
129233
- toolCallId: exports_external.string(),
129234
- toolName: exports_external.string(),
129235
- output: ToolResultOutputObject,
129236
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
129237
- });
129238
- var AssistantModelMessageObject = exports_external.object({
129239
- role: exports_external.literal("assistant"),
129240
- content: exports_external.union([
129241
- exports_external.string(),
129242
- exports_external.array(exports_external.discriminatedUnion("type", [
129243
- TextPartObject,
129244
- FilePartObject,
129245
- ReasoningPartObject,
129246
- ToolCallPartObject,
129247
- ToolResultPartObject
129248
- ]))
129249
- ]),
129250
- createdAt: exports_external.coerce.date(),
129251
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
129252
- });
129253
- var UserModelMessageObject = exports_external.object({
129254
- role: exports_external.literal("user"),
129255
- content: exports_external.union([
129256
- exports_external.string(),
129257
- exports_external.array(exports_external.discriminatedUnion("type", [TextPartObject, FilePartObject]))
129258
- ]),
129259
- createdAt: exports_external.coerce.date(),
129260
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
129261
- });
129262
- var ModelMessageObject = exports_external.discriminatedUnion("role", [
129263
- SystemModelMessageObject,
129264
- UserModelMessageObject,
129265
- AssistantModelMessageObject,
129266
- ToolMessageObject
129267
- ]);
129268
-
129269
- // src/core/messages/index.ts
129270
- function saveSubagentMessages(orchestratorSession, subagentId, messages) {
129271
- const subagentDir = `${orchestratorSession.rootPath}/subagents/${subagentId}`;
129272
- if (!fs.existsSync(`${orchestratorSession.rootPath}/subagents`)) {
129273
- fs.mkdirSync(`${orchestratorSession.rootPath}/subagents`, {
129274
- recursive: true
129275
- });
129276
- }
129277
- if (!fs.existsSync(subagentDir)) {
129278
- fs.mkdirSync(subagentDir, { recursive: true });
129279
- }
129280
- fs.writeFileSync(`${subagentDir}/messages.json`, JSON.stringify(messages, null, 2));
129411
+ return { streamResult, session, subagentId };
129281
129412
  }
129282
129413
 
129283
129414
  // src/core/agent/thoroughPentestAgent/agent.ts
@@ -129326,7 +129457,10 @@ Begin by using the get_attack_surface tool to map the complete attack surface of
129326
129457
  stopWhen: stepCountIs(1e4),
129327
129458
  toolChoice: "auto",
129328
129459
  onStepFinish,
129329
- abortSignal
129460
+ abortSignal,
129461
+ onFinish: ({ response }) => {
129462
+ saveMessages(session, mapMessages(response.messages));
129463
+ }
129330
129464
  });
129331
129465
  streamResult.session = session;
129332
129466
  return { streamResult, session };
@@ -129358,14 +129492,13 @@ Use this as the FIRST step in your thorough penetration test.`,
129358
129492
  execute: async ({ target, objective }) => {
129359
129493
  try {
129360
129494
  logger?.log(`[Orchestrator] Spawning attack surface agent for: ${target}`);
129361
- const { streamResult: result } = runAgent2({
129495
+ const { streamResult: result, subagentId } = runAgent2({
129362
129496
  session,
129363
129497
  target,
129364
129498
  objective,
129365
129499
  model,
129366
129500
  abortSignal
129367
129501
  });
129368
- const subagentId = `attack-surface-${result.session.id}`;
129369
129502
  const allMessages = [];
129370
129503
  let currentAssistantText = "";
129371
129504
  if (onSubagentSpawn) {
@@ -129390,8 +129523,8 @@ Objective: ${objective}`,
129390
129523
  if (onSubagentMessage) {
129391
129524
  onSubagentMessage(subagentId, initialMessage);
129392
129525
  }
129393
- for await (const delta of result.fullStream) {
129394
- if (delta.type === "text-delta") {
129526
+ await consumeStream2(result, {
129527
+ onTextDelta: (delta) => {
129395
129528
  currentAssistantText += delta.text;
129396
129529
  const lastMessage = allMessages[allMessages.length - 1];
129397
129530
  if (lastMessage && lastMessage.role === "assistant") {
@@ -129414,7 +129547,8 @@ Objective: ${objective}`,
129414
129547
  onSubagentMessage(subagentId, newMessage);
129415
129548
  }
129416
129549
  }
129417
- } else if (delta.type === "tool-call") {
129550
+ },
129551
+ onToolCall: (delta) => {
129418
129552
  if (currentAssistantText) {
129419
129553
  currentAssistantText = "";
129420
129554
  }
@@ -129431,7 +129565,8 @@ Objective: ${objective}`,
129431
129565
  if (onSubagentMessage) {
129432
129566
  onSubagentMessage(subagentId, toolMessage);
129433
129567
  }
129434
- } else if (delta.type === "tool-result") {
129568
+ },
129569
+ onToolResult: (delta) => {
129435
129570
  const existingToolMessageIndex = allMessages.findIndex((msg) => msg.role === "tool" && msg.toolCallId === delta.toolCallId);
129436
129571
  if (existingToolMessageIndex !== -1) {
129437
129572
  const existingMessage = allMessages[existingToolMessageIndex];
@@ -129446,11 +129581,10 @@ Objective: ${objective}`,
129446
129581
  }
129447
129582
  }
129448
129583
  }
129449
- }
129584
+ });
129450
129585
  if (onSubagentComplete) {
129451
129586
  onSubagentComplete(subagentId, true);
129452
129587
  }
129453
- saveSubagentMessages(session, subagentId, allMessages);
129454
129588
  const subagentMetadata = {
129455
129589
  type: "attack-surface",
129456
129590
  subagentId,
@@ -129533,14 +129667,13 @@ You can spawn multiple agents in parallel - they will run concurrently.`,
129533
129667
  const limit = pLimit(5);
129534
129668
  const promises = targets.map((targetInfo, index) => limit(async () => {
129535
129669
  try {
129536
- const { streamResult: result } = runAgent({
129670
+ const { streamResult: result, subagentId } = runAgent({
129537
129671
  session,
129538
129672
  target: targetInfo.target,
129539
129673
  objective: targetInfo.objective,
129540
129674
  model,
129541
129675
  abortSignal
129542
129676
  });
129543
- const subagentId = `pentest-${index + 1}-${result.session.id}`;
129544
129677
  const allMessages = [];
129545
129678
  let currentAssistantText = "";
129546
129679
  const startTime = new Date().toISOString();
@@ -129566,8 +129699,8 @@ Objective: ${targetInfo.objective}`,
129566
129699
  if (onSubagentMessage) {
129567
129700
  onSubagentMessage(subagentId, initialMessage);
129568
129701
  }
129569
- for await (const delta of result.fullStream) {
129570
- if (delta.type === "text-delta") {
129702
+ await consumeStream2(result, {
129703
+ onTextDelta: (delta) => {
129571
129704
  currentAssistantText += delta.text;
129572
129705
  const lastMessage = allMessages[allMessages.length - 1];
129573
129706
  if (lastMessage && lastMessage.role === "assistant") {
@@ -129590,7 +129723,8 @@ Objective: ${targetInfo.objective}`,
129590
129723
  onSubagentMessage(subagentId, newMessage);
129591
129724
  }
129592
129725
  }
129593
- } else if (delta.type === "tool-call") {
129726
+ },
129727
+ onToolCall: (delta) => {
129594
129728
  if (currentAssistantText) {
129595
129729
  currentAssistantText = "";
129596
129730
  }
@@ -129607,7 +129741,8 @@ Objective: ${targetInfo.objective}`,
129607
129741
  if (onSubagentMessage) {
129608
129742
  onSubagentMessage(subagentId, toolMessage);
129609
129743
  }
129610
- } else if (delta.type === "tool-result") {
129744
+ },
129745
+ onToolResult: (delta) => {
129611
129746
  const existingToolMessageIndex = allMessages.findIndex((msg) => msg.role === "tool" && msg.toolCallId === delta.toolCallId);
129612
129747
  if (existingToolMessageIndex !== -1) {
129613
129748
  const existingMessage = allMessages[existingToolMessageIndex];
@@ -129622,12 +129757,11 @@ Objective: ${targetInfo.objective}`,
129622
129757
  }
129623
129758
  }
129624
129759
  }
129625
- }
129626
- const endTime = new Date().toISOString();
129760
+ });
129627
129761
  if (onSubagentComplete) {
129628
129762
  onSubagentComplete(subagentId, true);
129629
129763
  }
129630
- saveSubagentMessages(session, subagentId, allMessages);
129764
+ const endTime = new Date().toISOString();
129631
129765
  const subagentMetadata = {
129632
129766
  type: "pentest",
129633
129767
  subagentId,