@pensar/apex 0.0.29 → 0.0.31-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.
package/build/pentest.js CHANGED
@@ -39879,6 +39879,21 @@ function createSummarizationStream(messages, opts, model) {
39879
39879
  }
39880
39880
  };
39881
39881
  }
39882
+ async function consumeStream2(stream, {
39883
+ onTextDelta,
39884
+ onToolCall,
39885
+ onToolResult
39886
+ }) {
39887
+ for await (const delta of stream.fullStream) {
39888
+ if (delta.type === "text-delta") {
39889
+ onTextDelta?.(delta);
39890
+ } else if (delta.type === "tool-call") {
39891
+ onToolCall?.(delta);
39892
+ } else if (delta.type === "tool-result") {
39893
+ onToolResult?.(delta);
39894
+ }
39895
+ }
39896
+ }
39882
39897
 
39883
39898
  // src/core/ai/ai.ts
39884
39899
  function wrapStreamWithErrorHandler(originalStream, messagesContainer, opts, model, silent) {
@@ -39942,7 +39957,8 @@ function streamResponse(opts) {
39942
39957
  abortSignal,
39943
39958
  activeTools,
39944
39959
  silent,
39945
- authConfig
39960
+ authConfig,
39961
+ onFinish
39946
39962
  } = opts;
39947
39963
  const messagesContainer = { current: messages || [] };
39948
39964
  const providerModel = getProviderModel(model, authConfig);
@@ -39997,7 +40013,8 @@ function streamResponse(opts) {
39997
40013
  }
39998
40014
  throw repairError;
39999
40015
  }
40000
- }
40016
+ },
40017
+ onFinish
40001
40018
  });
40002
40019
  return wrapStreamWithErrorHandler(response, messagesContainer, opts, providerModel, silent);
40003
40020
  } catch (error46) {
@@ -40713,7 +40730,14 @@ function getOffensiveHeaders(session) {
40713
40730
 
40714
40731
  // src/core/agent/thoroughPentestAgent/agent.ts
40715
40732
  import { join as join6 } from "path";
40716
- import { readFileSync as readFileSync5, existsSync as existsSync8, writeFileSync as writeFileSync6, copyFileSync, readdirSync as readdirSync4, mkdirSync as mkdirSync6 } from "fs";
40733
+ import {
40734
+ readFileSync as readFileSync5,
40735
+ existsSync as existsSync8,
40736
+ writeFileSync as writeFileSync6,
40737
+ copyFileSync,
40738
+ readdirSync as readdirSync4,
40739
+ mkdirSync as mkdirSync6
40740
+ } from "fs";
40717
40741
 
40718
40742
  // src/core/agent/attackSurfaceAgent/prompts.ts
40719
40743
  var SYSTEM2 = `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.
@@ -44327,6 +44351,239 @@ Begin your analysis now.
44327
44351
  };
44328
44352
  }
44329
44353
 
44354
+ // src/core/messages/index.ts
44355
+ import fs from "fs";
44356
+
44357
+ // src/core/messages/types.ts
44358
+ var ToolMessageObject = exports_external.object({
44359
+ role: exports_external.literal("tool"),
44360
+ status: exports_external.enum(["pending", "completed"]),
44361
+ toolCallId: exports_external.string(),
44362
+ content: exports_external.string(),
44363
+ args: exports_external.record(exports_external.string(), exports_external.any()),
44364
+ toolName: exports_external.string(),
44365
+ createdAt: exports_external.coerce.date()
44366
+ });
44367
+ var SystemModelMessageObject = exports_external.object({
44368
+ role: exports_external.literal("system"),
44369
+ content: exports_external.string(),
44370
+ createdAt: exports_external.coerce.date(),
44371
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
44372
+ });
44373
+ var TextPartObject = exports_external.object({
44374
+ type: exports_external.literal("text"),
44375
+ text: exports_external.string(),
44376
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
44377
+ });
44378
+ var FilePartObject = exports_external.object({
44379
+ type: exports_external.literal("file"),
44380
+ data: exports_external.union([
44381
+ exports_external.string(),
44382
+ exports_external.instanceof(Uint8Array),
44383
+ exports_external.instanceof(ArrayBuffer),
44384
+ exports_external.instanceof(Buffer),
44385
+ exports_external.url()
44386
+ ]),
44387
+ filename: exports_external.string().optional(),
44388
+ mediaType: exports_external.string(),
44389
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
44390
+ });
44391
+ var ReasoningPartObject = exports_external.object({
44392
+ type: exports_external.literal("reasoning"),
44393
+ text: exports_external.string(),
44394
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
44395
+ });
44396
+ var ToolCallPartObject = exports_external.object({
44397
+ type: exports_external.literal("tool-call"),
44398
+ toolCallId: exports_external.string(),
44399
+ toolName: exports_external.string(),
44400
+ input: exports_external.unknown(),
44401
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional(),
44402
+ providerExecuted: exports_external.boolean().optional()
44403
+ });
44404
+ var ToolResultOutputObject = exports_external.discriminatedUnion("type", [
44405
+ exports_external.object({
44406
+ type: exports_external.literal("text"),
44407
+ value: exports_external.string()
44408
+ }),
44409
+ exports_external.object({
44410
+ type: exports_external.literal("json"),
44411
+ value: exports_external.any()
44412
+ }),
44413
+ exports_external.object({
44414
+ type: exports_external.literal("error-text"),
44415
+ value: exports_external.string()
44416
+ }),
44417
+ exports_external.object({
44418
+ type: exports_external.literal("error-json"),
44419
+ value: exports_external.any()
44420
+ }),
44421
+ exports_external.object({
44422
+ type: exports_external.literal("content"),
44423
+ value: exports_external.array(exports_external.discriminatedUnion("type", [
44424
+ exports_external.object({
44425
+ type: exports_external.literal("text"),
44426
+ text: exports_external.string()
44427
+ }),
44428
+ exports_external.object({
44429
+ type: exports_external.literal("media"),
44430
+ data: exports_external.string(),
44431
+ mediaType: exports_external.string()
44432
+ })
44433
+ ]))
44434
+ })
44435
+ ]);
44436
+ var ToolResultPartObject = exports_external.object({
44437
+ type: exports_external.literal("tool-result"),
44438
+ toolCallId: exports_external.string(),
44439
+ toolName: exports_external.string(),
44440
+ output: ToolResultOutputObject,
44441
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
44442
+ });
44443
+ var AssistantModelMessageObject = exports_external.object({
44444
+ role: exports_external.literal("assistant"),
44445
+ content: exports_external.union([
44446
+ exports_external.string(),
44447
+ exports_external.array(exports_external.discriminatedUnion("type", [
44448
+ TextPartObject,
44449
+ FilePartObject,
44450
+ ReasoningPartObject,
44451
+ ToolCallPartObject,
44452
+ ToolResultPartObject
44453
+ ]))
44454
+ ]),
44455
+ createdAt: exports_external.coerce.date(),
44456
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
44457
+ });
44458
+ var UserModelMessageObject = exports_external.object({
44459
+ role: exports_external.literal("user"),
44460
+ content: exports_external.union([
44461
+ exports_external.string(),
44462
+ exports_external.array(exports_external.discriminatedUnion("type", [TextPartObject, FilePartObject]))
44463
+ ]),
44464
+ createdAt: exports_external.coerce.date(),
44465
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
44466
+ });
44467
+ var ModelMessageObject = exports_external.discriminatedUnion("role", [
44468
+ SystemModelMessageObject,
44469
+ UserModelMessageObject,
44470
+ AssistantModelMessageObject,
44471
+ ToolMessageObject
44472
+ ]);
44473
+
44474
+ // src/core/messages/index.ts
44475
+ function saveMessages(session, messages) {
44476
+ fs.writeFileSync(session.rootPath + "/messages.json", JSON.stringify(messages, null, 2));
44477
+ }
44478
+ function saveSubagentMessages(orchestratorSession, subagentId, messages) {
44479
+ const subagentDir = `${orchestratorSession.rootPath}/subagents/${subagentId}`;
44480
+ if (!fs.existsSync(`${orchestratorSession.rootPath}/subagents`)) {
44481
+ fs.mkdirSync(`${orchestratorSession.rootPath}/subagents`, {
44482
+ recursive: true
44483
+ });
44484
+ }
44485
+ if (!fs.existsSync(subagentDir)) {
44486
+ fs.mkdirSync(subagentDir, { recursive: true });
44487
+ }
44488
+ fs.writeFileSync(`${subagentDir}/messages.json`, JSON.stringify(messages, null, 2));
44489
+ }
44490
+ function mapMessages(messages) {
44491
+ const result = [];
44492
+ const toolResults = new Map;
44493
+ for (const message of messages) {
44494
+ if (message.role === "tool") {
44495
+ const content = message.content;
44496
+ if (Array.isArray(content)) {
44497
+ for (const part of content) {
44498
+ if (part.type === "tool-result") {
44499
+ toolResults.set(part.toolCallId, part.output);
44500
+ }
44501
+ }
44502
+ }
44503
+ }
44504
+ }
44505
+ for (const message of messages) {
44506
+ if (message.role === "system") {
44507
+ result.push({
44508
+ role: "system",
44509
+ content: message.content,
44510
+ createdAt: new Date,
44511
+ ...message.providerOptions && {
44512
+ providerOptions: message.providerOptions
44513
+ }
44514
+ });
44515
+ continue;
44516
+ }
44517
+ if (message.role === "user") {
44518
+ const content = typeof message.content === "string" ? message.content : message.content.map((part) => part.type === "text" ? part.text : "").join("");
44519
+ result.push({
44520
+ role: "user",
44521
+ content,
44522
+ createdAt: new Date,
44523
+ ...message.providerOptions && {
44524
+ providerOptions: message.providerOptions
44525
+ }
44526
+ });
44527
+ continue;
44528
+ }
44529
+ if (message.role === "tool") {
44530
+ continue;
44531
+ }
44532
+ if (message.role === "assistant") {
44533
+ const content = message.content;
44534
+ if (typeof content === "string") {
44535
+ result.push({
44536
+ role: "assistant",
44537
+ content,
44538
+ createdAt: new Date,
44539
+ ...message.providerOptions && {
44540
+ providerOptions: message.providerOptions
44541
+ }
44542
+ });
44543
+ continue;
44544
+ }
44545
+ const textParts = [];
44546
+ const toolCalls = [];
44547
+ for (const part of content) {
44548
+ if (part.type === "text") {
44549
+ textParts.push(part.text);
44550
+ } else if (part.type === "tool-call") {
44551
+ toolCalls.push({
44552
+ toolCallId: part.toolCallId,
44553
+ toolName: part.toolName,
44554
+ input: part.input
44555
+ });
44556
+ }
44557
+ }
44558
+ if (textParts.length > 0) {
44559
+ result.push({
44560
+ role: "assistant",
44561
+ content: textParts.join(""),
44562
+ createdAt: new Date,
44563
+ ...message.providerOptions && {
44564
+ providerOptions: message.providerOptions
44565
+ }
44566
+ });
44567
+ }
44568
+ for (const toolCall of toolCalls) {
44569
+ const input = toolCall.input;
44570
+ const toolCallDescription = input?.toolCallDescription || `Executing ${toolCall.toolName}`;
44571
+ const hasResult = toolResults.has(toolCall.toolCallId);
44572
+ result.push({
44573
+ role: "tool",
44574
+ status: hasResult ? "completed" : "pending",
44575
+ toolCallId: toolCall.toolCallId,
44576
+ content: hasResult ? `✓ ${toolCallDescription}` : toolCallDescription,
44577
+ args: input || {},
44578
+ toolName: toolCall.toolName,
44579
+ createdAt: new Date
44580
+ });
44581
+ }
44582
+ }
44583
+ }
44584
+ return result;
44585
+ }
44586
+
44330
44587
  // src/core/agent/pentestAgent/agent.ts
44331
44588
  var execAsync2 = promisify2(exec2);
44332
44589
  function runAgent(opts) {
@@ -44343,6 +44600,7 @@ function runAgent(opts) {
44343
44600
  sessionConfig
44344
44601
  } = opts;
44345
44602
  const session = opts.session || createSession(target, objective, undefined, sessionConfig);
44603
+ const subagentId = `pentest-${nanoid3(6)}`;
44346
44604
  const pocsPath = join3(session.rootPath, "pocs");
44347
44605
  if (!existsSync5(pocsPath)) {
44348
44606
  mkdirSync4(pocsPath, { recursive: true });
@@ -44498,10 +44756,13 @@ You are only authorized to perform testing against the specific target endpoint
44498
44756
  onStepFinish,
44499
44757
  abortSignal,
44500
44758
  silent,
44501
- authConfig
44759
+ authConfig,
44760
+ onFinish: ({ response }) => {
44761
+ saveSubagentMessages(session, subagentId, mapMessages(response.messages));
44762
+ }
44502
44763
  });
44503
44764
  streamResult.session = session;
44504
- return { streamResult, session };
44765
+ return { streamResult, session, subagentId };
44505
44766
  }
44506
44767
  // src/core/agent/tools.ts
44507
44768
  var execAsync3 = promisify3(exec3);
@@ -47050,6 +47311,7 @@ import { writeFileSync as writeFileSync5, mkdirSync as mkdirSync5, existsSync as
47050
47311
  function runAgent2(opts) {
47051
47312
  const { target, model, onStepFinish, abortSignal } = opts;
47052
47313
  const session = opts.session || createSession(target);
47314
+ const subagentId = `attack-surface-${nanoid3(6)}`;
47053
47315
  console.log(`Created attack surface session: ${session.id}`);
47054
47316
  console.log(`Session path: ${session.rootPath}`);
47055
47317
  const assetsPath = join5(session.rootPath, "assets");
@@ -47196,144 +47458,13 @@ You MUST provide the details final report using create_attack_surface_report too
47196
47458
  stopWhen: stepCountIs(1e4),
47197
47459
  toolChoice: "auto",
47198
47460
  onStepFinish,
47199
- abortSignal
47461
+ abortSignal,
47462
+ onFinish: ({ response }) => {
47463
+ saveSubagentMessages(session, subagentId, mapMessages(response.messages));
47464
+ }
47200
47465
  });
47201
47466
  streamResult.session = session;
47202
- return { streamResult, session };
47203
- }
47204
-
47205
- // src/core/messages/index.ts
47206
- import fs from "fs";
47207
-
47208
- // src/core/messages/types.ts
47209
- var ToolMessageObject = exports_external.object({
47210
- role: exports_external.literal("tool"),
47211
- status: exports_external.enum(["pending", "completed"]),
47212
- toolCallId: exports_external.string(),
47213
- content: exports_external.string(),
47214
- args: exports_external.record(exports_external.string(), exports_external.any()),
47215
- toolName: exports_external.string(),
47216
- createdAt: exports_external.coerce.date()
47217
- });
47218
- var SystemModelMessageObject = exports_external.object({
47219
- role: exports_external.literal("system"),
47220
- content: exports_external.string(),
47221
- createdAt: exports_external.coerce.date(),
47222
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
47223
- });
47224
- var TextPartObject = exports_external.object({
47225
- type: exports_external.literal("text"),
47226
- text: exports_external.string(),
47227
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
47228
- });
47229
- var FilePartObject = exports_external.object({
47230
- type: exports_external.literal("file"),
47231
- data: exports_external.union([
47232
- exports_external.string(),
47233
- exports_external.instanceof(Uint8Array),
47234
- exports_external.instanceof(ArrayBuffer),
47235
- exports_external.instanceof(Buffer),
47236
- exports_external.url()
47237
- ]),
47238
- filename: exports_external.string().optional(),
47239
- mediaType: exports_external.string(),
47240
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
47241
- });
47242
- var ReasoningPartObject = exports_external.object({
47243
- type: exports_external.literal("reasoning"),
47244
- text: exports_external.string(),
47245
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
47246
- });
47247
- var ToolCallPartObject = exports_external.object({
47248
- type: exports_external.literal("tool-call"),
47249
- toolCallId: exports_external.string(),
47250
- toolName: exports_external.string(),
47251
- input: exports_external.unknown(),
47252
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional(),
47253
- providerExecuted: exports_external.boolean().optional()
47254
- });
47255
- var ToolResultOutputObject = exports_external.discriminatedUnion("type", [
47256
- exports_external.object({
47257
- type: exports_external.literal("text"),
47258
- value: exports_external.string()
47259
- }),
47260
- exports_external.object({
47261
- type: exports_external.literal("json"),
47262
- value: exports_external.any()
47263
- }),
47264
- exports_external.object({
47265
- type: exports_external.literal("error-text"),
47266
- value: exports_external.string()
47267
- }),
47268
- exports_external.object({
47269
- type: exports_external.literal("error-json"),
47270
- value: exports_external.any()
47271
- }),
47272
- exports_external.object({
47273
- type: exports_external.literal("content"),
47274
- value: exports_external.array(exports_external.discriminatedUnion("type", [
47275
- exports_external.object({
47276
- type: exports_external.literal("text"),
47277
- text: exports_external.string()
47278
- }),
47279
- exports_external.object({
47280
- type: exports_external.literal("media"),
47281
- data: exports_external.string(),
47282
- mediaType: exports_external.string()
47283
- })
47284
- ]))
47285
- })
47286
- ]);
47287
- var ToolResultPartObject = exports_external.object({
47288
- type: exports_external.literal("tool-result"),
47289
- toolCallId: exports_external.string(),
47290
- toolName: exports_external.string(),
47291
- output: ToolResultOutputObject,
47292
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
47293
- });
47294
- var AssistantModelMessageObject = exports_external.object({
47295
- role: exports_external.literal("assistant"),
47296
- content: exports_external.union([
47297
- exports_external.string(),
47298
- exports_external.array(exports_external.discriminatedUnion("type", [
47299
- TextPartObject,
47300
- FilePartObject,
47301
- ReasoningPartObject,
47302
- ToolCallPartObject,
47303
- ToolResultPartObject
47304
- ]))
47305
- ]),
47306
- createdAt: exports_external.coerce.date(),
47307
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
47308
- });
47309
- var UserModelMessageObject = exports_external.object({
47310
- role: exports_external.literal("user"),
47311
- content: exports_external.union([
47312
- exports_external.string(),
47313
- exports_external.array(exports_external.discriminatedUnion("type", [TextPartObject, FilePartObject]))
47314
- ]),
47315
- createdAt: exports_external.coerce.date(),
47316
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
47317
- });
47318
- var ModelMessageObject = exports_external.discriminatedUnion("role", [
47319
- SystemModelMessageObject,
47320
- UserModelMessageObject,
47321
- AssistantModelMessageObject,
47322
- ToolMessageObject
47323
- ]);
47324
-
47325
- // src/core/messages/index.ts
47326
- function saveSubagentMessages(orchestratorSession, subagentId, messages) {
47327
- const subagentDir = `${orchestratorSession.rootPath}/subagents/${subagentId}`;
47328
- if (!fs.existsSync(`${orchestratorSession.rootPath}/subagents`)) {
47329
- fs.mkdirSync(`${orchestratorSession.rootPath}/subagents`, {
47330
- recursive: true
47331
- });
47332
- }
47333
- if (!fs.existsSync(subagentDir)) {
47334
- fs.mkdirSync(subagentDir, { recursive: true });
47335
- }
47336
- fs.writeFileSync(`${subagentDir}/messages.json`, JSON.stringify(messages, null, 2));
47467
+ return { streamResult, session, subagentId };
47337
47468
  }
47338
47469
 
47339
47470
  // node_modules/yocto-queue/index.js
@@ -47518,7 +47649,10 @@ Begin by using the get_attack_surface tool to map the complete attack surface of
47518
47649
  stopWhen: stepCountIs(1e4),
47519
47650
  toolChoice: "auto",
47520
47651
  onStepFinish,
47521
- abortSignal
47652
+ abortSignal,
47653
+ onFinish: ({ response }) => {
47654
+ saveMessages(session, mapMessages(response.messages));
47655
+ }
47522
47656
  });
47523
47657
  streamResult.session = session;
47524
47658
  return { streamResult, session };
@@ -47550,14 +47684,13 @@ Use this as the FIRST step in your thorough penetration test.`,
47550
47684
  execute: async ({ target, objective }) => {
47551
47685
  try {
47552
47686
  logger?.log(`[Orchestrator] Spawning attack surface agent for: ${target}`);
47553
- const { streamResult: result } = runAgent2({
47687
+ const { streamResult: result, subagentId } = runAgent2({
47554
47688
  session,
47555
47689
  target,
47556
47690
  objective,
47557
47691
  model,
47558
47692
  abortSignal
47559
47693
  });
47560
- const subagentId = `attack-surface-${result.session.id}`;
47561
47694
  const allMessages = [];
47562
47695
  let currentAssistantText = "";
47563
47696
  if (onSubagentSpawn) {
@@ -47582,8 +47715,8 @@ Objective: ${objective}`,
47582
47715
  if (onSubagentMessage) {
47583
47716
  onSubagentMessage(subagentId, initialMessage);
47584
47717
  }
47585
- for await (const delta of result.fullStream) {
47586
- if (delta.type === "text-delta") {
47718
+ await consumeStream2(result, {
47719
+ onTextDelta: (delta) => {
47587
47720
  currentAssistantText += delta.text;
47588
47721
  const lastMessage = allMessages[allMessages.length - 1];
47589
47722
  if (lastMessage && lastMessage.role === "assistant") {
@@ -47606,7 +47739,8 @@ Objective: ${objective}`,
47606
47739
  onSubagentMessage(subagentId, newMessage);
47607
47740
  }
47608
47741
  }
47609
- } else if (delta.type === "tool-call") {
47742
+ },
47743
+ onToolCall: (delta) => {
47610
47744
  if (currentAssistantText) {
47611
47745
  currentAssistantText = "";
47612
47746
  }
@@ -47623,7 +47757,8 @@ Objective: ${objective}`,
47623
47757
  if (onSubagentMessage) {
47624
47758
  onSubagentMessage(subagentId, toolMessage);
47625
47759
  }
47626
- } else if (delta.type === "tool-result") {
47760
+ },
47761
+ onToolResult: (delta) => {
47627
47762
  const existingToolMessageIndex = allMessages.findIndex((msg) => msg.role === "tool" && msg.toolCallId === delta.toolCallId);
47628
47763
  if (existingToolMessageIndex !== -1) {
47629
47764
  const existingMessage = allMessages[existingToolMessageIndex];
@@ -47638,11 +47773,10 @@ Objective: ${objective}`,
47638
47773
  }
47639
47774
  }
47640
47775
  }
47641
- }
47776
+ });
47642
47777
  if (onSubagentComplete) {
47643
47778
  onSubagentComplete(subagentId, true);
47644
47779
  }
47645
- saveSubagentMessages(session, subagentId, allMessages);
47646
47780
  const subagentMetadata = {
47647
47781
  type: "attack-surface",
47648
47782
  subagentId,
@@ -47725,14 +47859,13 @@ You can spawn multiple agents in parallel - they will run concurrently.`,
47725
47859
  const limit = pLimit(5);
47726
47860
  const promises = targets.map((targetInfo, index) => limit(async () => {
47727
47861
  try {
47728
- const { streamResult: result } = runAgent({
47862
+ const { streamResult: result, subagentId } = runAgent({
47729
47863
  session,
47730
47864
  target: targetInfo.target,
47731
47865
  objective: targetInfo.objective,
47732
47866
  model,
47733
47867
  abortSignal
47734
47868
  });
47735
- const subagentId = `pentest-${index + 1}-${result.session.id}`;
47736
47869
  const allMessages = [];
47737
47870
  let currentAssistantText = "";
47738
47871
  const startTime = new Date().toISOString();
@@ -47758,8 +47891,8 @@ Objective: ${targetInfo.objective}`,
47758
47891
  if (onSubagentMessage) {
47759
47892
  onSubagentMessage(subagentId, initialMessage);
47760
47893
  }
47761
- for await (const delta of result.fullStream) {
47762
- if (delta.type === "text-delta") {
47894
+ await consumeStream2(result, {
47895
+ onTextDelta: (delta) => {
47763
47896
  currentAssistantText += delta.text;
47764
47897
  const lastMessage = allMessages[allMessages.length - 1];
47765
47898
  if (lastMessage && lastMessage.role === "assistant") {
@@ -47782,7 +47915,8 @@ Objective: ${targetInfo.objective}`,
47782
47915
  onSubagentMessage(subagentId, newMessage);
47783
47916
  }
47784
47917
  }
47785
- } else if (delta.type === "tool-call") {
47918
+ },
47919
+ onToolCall: (delta) => {
47786
47920
  if (currentAssistantText) {
47787
47921
  currentAssistantText = "";
47788
47922
  }
@@ -47799,7 +47933,8 @@ Objective: ${targetInfo.objective}`,
47799
47933
  if (onSubagentMessage) {
47800
47934
  onSubagentMessage(subagentId, toolMessage);
47801
47935
  }
47802
- } else if (delta.type === "tool-result") {
47936
+ },
47937
+ onToolResult: (delta) => {
47803
47938
  const existingToolMessageIndex = allMessages.findIndex((msg) => msg.role === "tool" && msg.toolCallId === delta.toolCallId);
47804
47939
  if (existingToolMessageIndex !== -1) {
47805
47940
  const existingMessage = allMessages[existingToolMessageIndex];
@@ -47814,12 +47949,11 @@ Objective: ${targetInfo.objective}`,
47814
47949
  }
47815
47950
  }
47816
47951
  }
47817
- }
47818
- const endTime = new Date().toISOString();
47952
+ });
47819
47953
  if (onSubagentComplete) {
47820
47954
  onSubagentComplete(subagentId, true);
47821
47955
  }
47822
- saveSubagentMessages(session, subagentId, allMessages);
47956
+ const endTime = new Date().toISOString();
47823
47957
  const subagentMetadata = {
47824
47958
  type: "pentest",
47825
47959
  subagentId,