@pensar/apex 0.0.29 → 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.
package/build/index.js CHANGED
@@ -64848,6 +64848,21 @@ function createSummarizationStream(messages, opts, model) {
64848
64848
  }
64849
64849
  };
64850
64850
  }
64851
+ async function consumeStream2(stream, {
64852
+ onTextDelta,
64853
+ onToolCall,
64854
+ onToolResult
64855
+ }) {
64856
+ for await (const delta of stream.fullStream) {
64857
+ if (delta.type === "text-delta") {
64858
+ onTextDelta?.(delta);
64859
+ } else if (delta.type === "tool-call") {
64860
+ onToolCall?.(delta);
64861
+ } else if (delta.type === "tool-result") {
64862
+ onToolResult?.(delta);
64863
+ }
64864
+ }
64865
+ }
64851
64866
 
64852
64867
  // src/core/ai/ai.ts
64853
64868
  function wrapStreamWithErrorHandler(originalStream, messagesContainer, opts, model, silent) {
@@ -64911,7 +64926,8 @@ function streamResponse(opts) {
64911
64926
  abortSignal,
64912
64927
  activeTools,
64913
64928
  silent,
64914
- authConfig
64929
+ authConfig,
64930
+ onFinish
64915
64931
  } = opts;
64916
64932
  const messagesContainer = { current: messages || [] };
64917
64933
  const providerModel = getProviderModel(model, authConfig);
@@ -64966,7 +64982,8 @@ function streamResponse(opts) {
64966
64982
  }
64967
64983
  throw repairError;
64968
64984
  }
64969
- }
64985
+ },
64986
+ onFinish
64970
64987
  });
64971
64988
  return wrapStreamWithErrorHandler(response, messagesContainer, opts, providerModel, silent);
64972
64989
  } catch (error46) {
@@ -70040,6 +70057,243 @@ Begin your analysis now.
70040
70057
  };
70041
70058
  }
70042
70059
 
70060
+ // src/core/messages/index.ts
70061
+ import fs3 from "fs";
70062
+
70063
+ // src/core/messages/types.ts
70064
+ var ToolMessageObject = exports_external.object({
70065
+ role: exports_external.literal("tool"),
70066
+ status: exports_external.enum(["pending", "completed"]),
70067
+ toolCallId: exports_external.string(),
70068
+ content: exports_external.string(),
70069
+ args: exports_external.record(exports_external.string(), exports_external.any()),
70070
+ toolName: exports_external.string(),
70071
+ createdAt: exports_external.coerce.date()
70072
+ });
70073
+ var SystemModelMessageObject = exports_external.object({
70074
+ role: exports_external.literal("system"),
70075
+ content: exports_external.string(),
70076
+ createdAt: exports_external.coerce.date(),
70077
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
70078
+ });
70079
+ var TextPartObject = exports_external.object({
70080
+ type: exports_external.literal("text"),
70081
+ text: exports_external.string(),
70082
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
70083
+ });
70084
+ var FilePartObject = exports_external.object({
70085
+ type: exports_external.literal("file"),
70086
+ data: exports_external.union([
70087
+ exports_external.string(),
70088
+ exports_external.instanceof(Uint8Array),
70089
+ exports_external.instanceof(ArrayBuffer),
70090
+ exports_external.instanceof(Buffer),
70091
+ exports_external.url()
70092
+ ]),
70093
+ filename: exports_external.string().optional(),
70094
+ mediaType: exports_external.string(),
70095
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
70096
+ });
70097
+ var ReasoningPartObject = exports_external.object({
70098
+ type: exports_external.literal("reasoning"),
70099
+ text: exports_external.string(),
70100
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
70101
+ });
70102
+ var ToolCallPartObject = exports_external.object({
70103
+ type: exports_external.literal("tool-call"),
70104
+ toolCallId: exports_external.string(),
70105
+ toolName: exports_external.string(),
70106
+ input: exports_external.unknown(),
70107
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional(),
70108
+ providerExecuted: exports_external.boolean().optional()
70109
+ });
70110
+ var ToolResultOutputObject = exports_external.discriminatedUnion("type", [
70111
+ exports_external.object({
70112
+ type: exports_external.literal("text"),
70113
+ value: exports_external.string()
70114
+ }),
70115
+ exports_external.object({
70116
+ type: exports_external.literal("json"),
70117
+ value: exports_external.any()
70118
+ }),
70119
+ exports_external.object({
70120
+ type: exports_external.literal("error-text"),
70121
+ value: exports_external.string()
70122
+ }),
70123
+ exports_external.object({
70124
+ type: exports_external.literal("error-json"),
70125
+ value: exports_external.any()
70126
+ }),
70127
+ exports_external.object({
70128
+ type: exports_external.literal("content"),
70129
+ value: exports_external.array(exports_external.discriminatedUnion("type", [
70130
+ exports_external.object({
70131
+ type: exports_external.literal("text"),
70132
+ text: exports_external.string()
70133
+ }),
70134
+ exports_external.object({
70135
+ type: exports_external.literal("media"),
70136
+ data: exports_external.string(),
70137
+ mediaType: exports_external.string()
70138
+ })
70139
+ ]))
70140
+ })
70141
+ ]);
70142
+ var ToolResultPartObject = exports_external.object({
70143
+ type: exports_external.literal("tool-result"),
70144
+ toolCallId: exports_external.string(),
70145
+ toolName: exports_external.string(),
70146
+ output: ToolResultOutputObject,
70147
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
70148
+ });
70149
+ var AssistantModelMessageObject = exports_external.object({
70150
+ role: exports_external.literal("assistant"),
70151
+ content: exports_external.union([
70152
+ exports_external.string(),
70153
+ exports_external.array(exports_external.discriminatedUnion("type", [
70154
+ TextPartObject,
70155
+ FilePartObject,
70156
+ ReasoningPartObject,
70157
+ ToolCallPartObject,
70158
+ ToolResultPartObject
70159
+ ]))
70160
+ ]),
70161
+ createdAt: exports_external.coerce.date(),
70162
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
70163
+ });
70164
+ var UserModelMessageObject = exports_external.object({
70165
+ role: exports_external.literal("user"),
70166
+ content: exports_external.union([
70167
+ exports_external.string(),
70168
+ exports_external.array(exports_external.discriminatedUnion("type", [TextPartObject, FilePartObject]))
70169
+ ]),
70170
+ createdAt: exports_external.coerce.date(),
70171
+ providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
70172
+ });
70173
+ var ModelMessageObject = exports_external.discriminatedUnion("role", [
70174
+ SystemModelMessageObject,
70175
+ UserModelMessageObject,
70176
+ AssistantModelMessageObject,
70177
+ ToolMessageObject
70178
+ ]);
70179
+
70180
+ // src/core/messages/index.ts
70181
+ function getMessages(session) {
70182
+ const messages = fs3.readFileSync(session.rootPath + "/messages.json", "utf8");
70183
+ return ModelMessageObject.array().parse(JSON.parse(messages));
70184
+ }
70185
+ function saveMessages(session, messages) {
70186
+ fs3.writeFileSync(session.rootPath + "/messages.json", JSON.stringify(messages, null, 2));
70187
+ }
70188
+ function saveSubagentMessages(orchestratorSession, subagentId, messages) {
70189
+ const subagentDir = `${orchestratorSession.rootPath}/subagents/${subagentId}`;
70190
+ if (!fs3.existsSync(`${orchestratorSession.rootPath}/subagents`)) {
70191
+ fs3.mkdirSync(`${orchestratorSession.rootPath}/subagents`, {
70192
+ recursive: true
70193
+ });
70194
+ }
70195
+ if (!fs3.existsSync(subagentDir)) {
70196
+ fs3.mkdirSync(subagentDir, { recursive: true });
70197
+ }
70198
+ fs3.writeFileSync(`${subagentDir}/messages.json`, JSON.stringify(messages, null, 2));
70199
+ }
70200
+ function mapMessages(messages) {
70201
+ const result = [];
70202
+ const toolResults = new Map;
70203
+ for (const message of messages) {
70204
+ if (message.role === "tool") {
70205
+ const content = message.content;
70206
+ if (Array.isArray(content)) {
70207
+ for (const part of content) {
70208
+ if (part.type === "tool-result") {
70209
+ toolResults.set(part.toolCallId, part.output);
70210
+ }
70211
+ }
70212
+ }
70213
+ }
70214
+ }
70215
+ for (const message of messages) {
70216
+ if (message.role === "system") {
70217
+ result.push({
70218
+ role: "system",
70219
+ content: message.content,
70220
+ createdAt: new Date,
70221
+ ...message.providerOptions && {
70222
+ providerOptions: message.providerOptions
70223
+ }
70224
+ });
70225
+ continue;
70226
+ }
70227
+ if (message.role === "user") {
70228
+ const content = typeof message.content === "string" ? message.content : message.content.map((part) => part.type === "text" ? part.text : "").join("");
70229
+ result.push({
70230
+ role: "user",
70231
+ content,
70232
+ createdAt: new Date,
70233
+ ...message.providerOptions && {
70234
+ providerOptions: message.providerOptions
70235
+ }
70236
+ });
70237
+ continue;
70238
+ }
70239
+ if (message.role === "tool") {
70240
+ continue;
70241
+ }
70242
+ if (message.role === "assistant") {
70243
+ const content = message.content;
70244
+ if (typeof content === "string") {
70245
+ result.push({
70246
+ role: "assistant",
70247
+ content,
70248
+ createdAt: new Date,
70249
+ ...message.providerOptions && {
70250
+ providerOptions: message.providerOptions
70251
+ }
70252
+ });
70253
+ continue;
70254
+ }
70255
+ const textParts = [];
70256
+ const toolCalls = [];
70257
+ for (const part of content) {
70258
+ if (part.type === "text") {
70259
+ textParts.push(part.text);
70260
+ } else if (part.type === "tool-call") {
70261
+ toolCalls.push({
70262
+ toolCallId: part.toolCallId,
70263
+ toolName: part.toolName,
70264
+ input: part.input
70265
+ });
70266
+ }
70267
+ }
70268
+ if (textParts.length > 0) {
70269
+ result.push({
70270
+ role: "assistant",
70271
+ content: textParts.join(""),
70272
+ createdAt: new Date,
70273
+ ...message.providerOptions && {
70274
+ providerOptions: message.providerOptions
70275
+ }
70276
+ });
70277
+ }
70278
+ for (const toolCall of toolCalls) {
70279
+ const input = toolCall.input;
70280
+ const toolCallDescription = input?.toolCallDescription || `Executing ${toolCall.toolName}`;
70281
+ const hasResult = toolResults.has(toolCall.toolCallId);
70282
+ result.push({
70283
+ role: "tool",
70284
+ status: hasResult ? "completed" : "pending",
70285
+ toolCallId: toolCall.toolCallId,
70286
+ content: hasResult ? `✓ ${toolCallDescription}` : toolCallDescription,
70287
+ args: input || {},
70288
+ toolName: toolCall.toolName,
70289
+ createdAt: new Date
70290
+ });
70291
+ }
70292
+ }
70293
+ }
70294
+ return result;
70295
+ }
70296
+
70043
70297
  // src/core/agent/pentestAgent/agent.ts
70044
70298
  var execAsync3 = promisify3(exec3);
70045
70299
  function runAgent(opts) {
@@ -70056,6 +70310,7 @@ function runAgent(opts) {
70056
70310
  sessionConfig
70057
70311
  } = opts;
70058
70312
  const session = opts.session || createSession(target, objective, undefined, sessionConfig);
70313
+ const subagentId = `pentest-${nanoid3(6)}`;
70059
70314
  const pocsPath = join4(session.rootPath, "pocs");
70060
70315
  if (!existsSync9(pocsPath)) {
70061
70316
  mkdirSync4(pocsPath, { recursive: true });
@@ -70211,10 +70466,13 @@ You are only authorized to perform testing against the specific target endpoint
70211
70466
  onStepFinish,
70212
70467
  abortSignal,
70213
70468
  silent,
70214
- authConfig
70469
+ authConfig,
70470
+ onFinish: ({ response }) => {
70471
+ saveSubagentMessages(session, subagentId, mapMessages(response.messages));
70472
+ }
70215
70473
  });
70216
70474
  streamResult.session = session;
70217
- return { streamResult, session };
70475
+ return { streamResult, session, subagentId };
70218
70476
  }
70219
70477
 
70220
70478
  // src/tui/components/agent-display.tsx
@@ -71459,13 +71717,13 @@ var Qt = b.parse;
71459
71717
  var Ut = x.lex;
71460
71718
 
71461
71719
  // src/tui/components/agent-display.tsx
71462
- import fs3 from "fs";
71720
+ import fs4 from "fs";
71463
71721
  var LOG_FILE = "/tmp/apex-debug.log";
71464
71722
  function logToFile(message, data) {
71465
71723
  const timestamp = new Date().toISOString();
71466
71724
  const logLine = `[${timestamp}] ${message} ${data ? JSON.stringify(data, null, 2) : ""}
71467
71725
  `;
71468
- fs3.appendFileSync(LOG_FILE, logLine);
71726
+ fs4.appendFileSync(LOG_FILE, logLine);
71469
71727
  }
71470
71728
  function getStableKey(item, contextId = "root") {
71471
71729
  if ("messages" in item) {
@@ -71808,149 +72066,6 @@ function ToolArgs({ message }) {
71808
72066
 
71809
72067
  // src/tui/components/commands/pentest-agent-display.tsx
71810
72068
  import fs5 from "fs";
71811
-
71812
- // src/core/messages/index.ts
71813
- import fs4 from "fs";
71814
-
71815
- // src/core/messages/types.ts
71816
- var ToolMessageObject = exports_external.object({
71817
- role: exports_external.literal("tool"),
71818
- status: exports_external.enum(["pending", "completed"]),
71819
- toolCallId: exports_external.string(),
71820
- content: exports_external.string(),
71821
- args: exports_external.record(exports_external.string(), exports_external.any()),
71822
- toolName: exports_external.string(),
71823
- createdAt: exports_external.coerce.date()
71824
- });
71825
- var SystemModelMessageObject = exports_external.object({
71826
- role: exports_external.literal("system"),
71827
- content: exports_external.string(),
71828
- createdAt: exports_external.coerce.date(),
71829
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
71830
- });
71831
- var TextPartObject = exports_external.object({
71832
- type: exports_external.literal("text"),
71833
- text: exports_external.string(),
71834
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
71835
- });
71836
- var FilePartObject = exports_external.object({
71837
- type: exports_external.literal("file"),
71838
- data: exports_external.union([
71839
- exports_external.string(),
71840
- exports_external.instanceof(Uint8Array),
71841
- exports_external.instanceof(ArrayBuffer),
71842
- exports_external.instanceof(Buffer),
71843
- exports_external.url()
71844
- ]),
71845
- filename: exports_external.string().optional(),
71846
- mediaType: exports_external.string(),
71847
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
71848
- });
71849
- var ReasoningPartObject = exports_external.object({
71850
- type: exports_external.literal("reasoning"),
71851
- text: exports_external.string(),
71852
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
71853
- });
71854
- var ToolCallPartObject = exports_external.object({
71855
- type: exports_external.literal("tool-call"),
71856
- toolCallId: exports_external.string(),
71857
- toolName: exports_external.string(),
71858
- input: exports_external.unknown(),
71859
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional(),
71860
- providerExecuted: exports_external.boolean().optional()
71861
- });
71862
- var ToolResultOutputObject = exports_external.discriminatedUnion("type", [
71863
- exports_external.object({
71864
- type: exports_external.literal("text"),
71865
- value: exports_external.string()
71866
- }),
71867
- exports_external.object({
71868
- type: exports_external.literal("json"),
71869
- value: exports_external.any()
71870
- }),
71871
- exports_external.object({
71872
- type: exports_external.literal("error-text"),
71873
- value: exports_external.string()
71874
- }),
71875
- exports_external.object({
71876
- type: exports_external.literal("error-json"),
71877
- value: exports_external.any()
71878
- }),
71879
- exports_external.object({
71880
- type: exports_external.literal("content"),
71881
- value: exports_external.array(exports_external.discriminatedUnion("type", [
71882
- exports_external.object({
71883
- type: exports_external.literal("text"),
71884
- text: exports_external.string()
71885
- }),
71886
- exports_external.object({
71887
- type: exports_external.literal("media"),
71888
- data: exports_external.string(),
71889
- mediaType: exports_external.string()
71890
- })
71891
- ]))
71892
- })
71893
- ]);
71894
- var ToolResultPartObject = exports_external.object({
71895
- type: exports_external.literal("tool-result"),
71896
- toolCallId: exports_external.string(),
71897
- toolName: exports_external.string(),
71898
- output: ToolResultOutputObject,
71899
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
71900
- });
71901
- var AssistantModelMessageObject = exports_external.object({
71902
- role: exports_external.literal("assistant"),
71903
- content: exports_external.union([
71904
- exports_external.string(),
71905
- exports_external.array(exports_external.discriminatedUnion("type", [
71906
- TextPartObject,
71907
- FilePartObject,
71908
- ReasoningPartObject,
71909
- ToolCallPartObject,
71910
- ToolResultPartObject
71911
- ]))
71912
- ]),
71913
- createdAt: exports_external.coerce.date(),
71914
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
71915
- });
71916
- var UserModelMessageObject = exports_external.object({
71917
- role: exports_external.literal("user"),
71918
- content: exports_external.union([
71919
- exports_external.string(),
71920
- exports_external.array(exports_external.discriminatedUnion("type", [TextPartObject, FilePartObject]))
71921
- ]),
71922
- createdAt: exports_external.coerce.date(),
71923
- providerOptions: exports_external.record(exports_external.string(), exports_external.any()).optional()
71924
- });
71925
- var ModelMessageObject = exports_external.discriminatedUnion("role", [
71926
- SystemModelMessageObject,
71927
- UserModelMessageObject,
71928
- AssistantModelMessageObject,
71929
- ToolMessageObject
71930
- ]);
71931
-
71932
- // src/core/messages/index.ts
71933
- function getMessages(session) {
71934
- const messages = fs4.readFileSync(session.rootPath + "/messages.json", "utf8");
71935
- return ModelMessageObject.array().parse(JSON.parse(messages));
71936
- }
71937
- function saveMessages(session, messages) {
71938
- fs4.writeFileSync(session.rootPath + "/messages.json", JSON.stringify(messages, null, 2));
71939
- }
71940
- function saveSubagentMessages(orchestratorSession, subagentId, messages) {
71941
- const subagentDir = `${orchestratorSession.rootPath}/subagents/${subagentId}`;
71942
- if (!fs4.existsSync(`${orchestratorSession.rootPath}/subagents`)) {
71943
- fs4.mkdirSync(`${orchestratorSession.rootPath}/subagents`, {
71944
- recursive: true
71945
- });
71946
- }
71947
- if (!fs4.existsSync(subagentDir)) {
71948
- fs4.mkdirSync(subagentDir, { recursive: true });
71949
- }
71950
- fs4.writeFileSync(`${subagentDir}/messages.json`, JSON.stringify(messages, null, 2));
71951
- }
71952
-
71953
- // src/tui/components/commands/pentest-agent-display.tsx
71954
72069
  function PentestAgentDisplay() {
71955
72070
  const [focusedIndex, setFocusedIndex] = import_react20.useState(0);
71956
72071
  const [target, setTarget] = import_react20.useState("");
@@ -73152,7 +73267,14 @@ Remember: You are the orchestrator, not a testing agent. Your value is in strate
73152
73267
 
73153
73268
  // src/core/agent/thoroughPentestAgent/agent.ts
73154
73269
  import { join as join6 } from "path";
73155
- import { readFileSync as readFileSync5, existsSync as existsSync11, writeFileSync as writeFileSync6, copyFileSync, readdirSync as readdirSync4, mkdirSync as mkdirSync6 } from "fs";
73270
+ import {
73271
+ readFileSync as readFileSync5,
73272
+ existsSync as existsSync11,
73273
+ writeFileSync as writeFileSync6,
73274
+ copyFileSync,
73275
+ readdirSync as readdirSync4,
73276
+ mkdirSync as mkdirSync6
73277
+ } from "fs";
73156
73278
 
73157
73279
  // src/core/agent/attackSurfaceAgent/prompts.ts
73158
73280
  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.
@@ -74454,6 +74576,7 @@ import { writeFileSync as writeFileSync5, mkdirSync as mkdirSync5, existsSync as
74454
74576
  function runAgent2(opts) {
74455
74577
  const { target, model, onStepFinish, abortSignal } = opts;
74456
74578
  const session = opts.session || createSession(target);
74579
+ const subagentId = `attack-surface-${nanoid3(6)}`;
74457
74580
  console.log(`Created attack surface session: ${session.id}`);
74458
74581
  console.log(`Session path: ${session.rootPath}`);
74459
74582
  const assetsPath = join5(session.rootPath, "assets");
@@ -74600,10 +74723,13 @@ You MUST provide the details final report using create_attack_surface_report too
74600
74723
  stopWhen: stepCountIs(1e4),
74601
74724
  toolChoice: "auto",
74602
74725
  onStepFinish,
74603
- abortSignal
74726
+ abortSignal,
74727
+ onFinish: ({ response }) => {
74728
+ saveSubagentMessages(session, subagentId, mapMessages(response.messages));
74729
+ }
74604
74730
  });
74605
74731
  streamResult.session = session;
74606
- return { streamResult, session };
74732
+ return { streamResult, session, subagentId };
74607
74733
  }
74608
74734
 
74609
74735
  // node_modules/yocto-queue/index.js
@@ -74788,7 +74914,10 @@ Begin by using the get_attack_surface tool to map the complete attack surface of
74788
74914
  stopWhen: stepCountIs(1e4),
74789
74915
  toolChoice: "auto",
74790
74916
  onStepFinish,
74791
- abortSignal
74917
+ abortSignal,
74918
+ onFinish: ({ response }) => {
74919
+ saveMessages(session, mapMessages(response.messages));
74920
+ }
74792
74921
  });
74793
74922
  streamResult.session = session;
74794
74923
  return { streamResult, session };
@@ -74820,14 +74949,13 @@ Use this as the FIRST step in your thorough penetration test.`,
74820
74949
  execute: async ({ target, objective }) => {
74821
74950
  try {
74822
74951
  logger?.log(`[Orchestrator] Spawning attack surface agent for: ${target}`);
74823
- const { streamResult: result } = runAgent2({
74952
+ const { streamResult: result, subagentId } = runAgent2({
74824
74953
  session,
74825
74954
  target,
74826
74955
  objective,
74827
74956
  model,
74828
74957
  abortSignal
74829
74958
  });
74830
- const subagentId = `attack-surface-${result.session.id}`;
74831
74959
  const allMessages = [];
74832
74960
  let currentAssistantText = "";
74833
74961
  if (onSubagentSpawn) {
@@ -74852,8 +74980,8 @@ Objective: ${objective}`,
74852
74980
  if (onSubagentMessage) {
74853
74981
  onSubagentMessage(subagentId, initialMessage);
74854
74982
  }
74855
- for await (const delta of result.fullStream) {
74856
- if (delta.type === "text-delta") {
74983
+ await consumeStream2(result, {
74984
+ onTextDelta: (delta) => {
74857
74985
  currentAssistantText += delta.text;
74858
74986
  const lastMessage = allMessages[allMessages.length - 1];
74859
74987
  if (lastMessage && lastMessage.role === "assistant") {
@@ -74876,7 +75004,8 @@ Objective: ${objective}`,
74876
75004
  onSubagentMessage(subagentId, newMessage);
74877
75005
  }
74878
75006
  }
74879
- } else if (delta.type === "tool-call") {
75007
+ },
75008
+ onToolCall: (delta) => {
74880
75009
  if (currentAssistantText) {
74881
75010
  currentAssistantText = "";
74882
75011
  }
@@ -74893,7 +75022,8 @@ Objective: ${objective}`,
74893
75022
  if (onSubagentMessage) {
74894
75023
  onSubagentMessage(subagentId, toolMessage);
74895
75024
  }
74896
- } else if (delta.type === "tool-result") {
75025
+ },
75026
+ onToolResult: (delta) => {
74897
75027
  const existingToolMessageIndex = allMessages.findIndex((msg) => msg.role === "tool" && msg.toolCallId === delta.toolCallId);
74898
75028
  if (existingToolMessageIndex !== -1) {
74899
75029
  const existingMessage = allMessages[existingToolMessageIndex];
@@ -74908,11 +75038,10 @@ Objective: ${objective}`,
74908
75038
  }
74909
75039
  }
74910
75040
  }
74911
- }
75041
+ });
74912
75042
  if (onSubagentComplete) {
74913
75043
  onSubagentComplete(subagentId, true);
74914
75044
  }
74915
- saveSubagentMessages(session, subagentId, allMessages);
74916
75045
  const subagentMetadata = {
74917
75046
  type: "attack-surface",
74918
75047
  subagentId,
@@ -74995,14 +75124,13 @@ You can spawn multiple agents in parallel - they will run concurrently.`,
74995
75124
  const limit = pLimit(5);
74996
75125
  const promises = targets.map((targetInfo, index) => limit(async () => {
74997
75126
  try {
74998
- const { streamResult: result } = runAgent({
75127
+ const { streamResult: result, subagentId } = runAgent({
74999
75128
  session,
75000
75129
  target: targetInfo.target,
75001
75130
  objective: targetInfo.objective,
75002
75131
  model,
75003
75132
  abortSignal
75004
75133
  });
75005
- const subagentId = `pentest-${index + 1}-${result.session.id}`;
75006
75134
  const allMessages = [];
75007
75135
  let currentAssistantText = "";
75008
75136
  const startTime = new Date().toISOString();
@@ -75028,8 +75156,8 @@ Objective: ${targetInfo.objective}`,
75028
75156
  if (onSubagentMessage) {
75029
75157
  onSubagentMessage(subagentId, initialMessage);
75030
75158
  }
75031
- for await (const delta of result.fullStream) {
75032
- if (delta.type === "text-delta") {
75159
+ await consumeStream2(result, {
75160
+ onTextDelta: (delta) => {
75033
75161
  currentAssistantText += delta.text;
75034
75162
  const lastMessage = allMessages[allMessages.length - 1];
75035
75163
  if (lastMessage && lastMessage.role === "assistant") {
@@ -75052,7 +75180,8 @@ Objective: ${targetInfo.objective}`,
75052
75180
  onSubagentMessage(subagentId, newMessage);
75053
75181
  }
75054
75182
  }
75055
- } else if (delta.type === "tool-call") {
75183
+ },
75184
+ onToolCall: (delta) => {
75056
75185
  if (currentAssistantText) {
75057
75186
  currentAssistantText = "";
75058
75187
  }
@@ -75069,7 +75198,8 @@ Objective: ${targetInfo.objective}`,
75069
75198
  if (onSubagentMessage) {
75070
75199
  onSubagentMessage(subagentId, toolMessage);
75071
75200
  }
75072
- } else if (delta.type === "tool-result") {
75201
+ },
75202
+ onToolResult: (delta) => {
75073
75203
  const existingToolMessageIndex = allMessages.findIndex((msg) => msg.role === "tool" && msg.toolCallId === delta.toolCallId);
75074
75204
  if (existingToolMessageIndex !== -1) {
75075
75205
  const existingMessage = allMessages[existingToolMessageIndex];
@@ -75084,12 +75214,11 @@ Objective: ${targetInfo.objective}`,
75084
75214
  }
75085
75215
  }
75086
75216
  }
75087
- }
75088
- const endTime = new Date().toISOString();
75217
+ });
75089
75218
  if (onSubagentComplete) {
75090
75219
  onSubagentComplete(subagentId, true);
75091
75220
  }
75092
- saveSubagentMessages(session, subagentId, allMessages);
75221
+ const endTime = new Date().toISOString();
75093
75222
  const subagentMetadata = {
75094
75223
  type: "pentest",
75095
75224
  subagentId,
@@ -75474,8 +75603,8 @@ Mode: Pentest (Orchestrator)`,
75474
75603
  };
75475
75604
  const allMessages = [userMessage];
75476
75605
  let currentAssistantText = "";
75477
- for await (const delta of result.fullStream) {
75478
- if (delta.type === "text-delta") {
75606
+ await consumeStream2(result, {
75607
+ onTextDelta: (delta) => {
75479
75608
  currentAssistantText += delta.text;
75480
75609
  addTokens(1);
75481
75610
  const lastMessage = allMessages[allMessages.length - 1];
@@ -75489,7 +75618,8 @@ Mode: Pentest (Orchestrator)`,
75489
75618
  });
75490
75619
  }
75491
75620
  setMessages([...allMessages]);
75492
- } else if (delta.type === "tool-call") {
75621
+ },
75622
+ onToolCall: (delta) => {
75493
75623
  if (currentAssistantText) {
75494
75624
  currentAssistantText = "";
75495
75625
  }
@@ -75505,7 +75635,8 @@ Mode: Pentest (Orchestrator)`,
75505
75635
  createdAt: new Date
75506
75636
  });
75507
75637
  setMessages([...allMessages]);
75508
- } else if (delta.type === "tool-result") {
75638
+ },
75639
+ onToolResult: (delta) => {
75509
75640
  setThinking(true);
75510
75641
  const toolName = delta.toolName;
75511
75642
  const existingToolMessageIndex = allMessages.findIndex((msg) => msg.role === "tool" && msg.toolCallId === delta.toolCallId);
@@ -75519,8 +75650,7 @@ Mode: Pentest (Orchestrator)`,
75519
75650
  }
75520
75651
  setMessages([...allMessages]);
75521
75652
  }
75522
- saveMessages(result.session, allMessages);
75523
- }
75653
+ });
75524
75654
  if (fs6.existsSync(result.session.rootPath + "/comprehensive-pentest-report.md")) {
75525
75655
  setIsCompleted(true);
75526
75656
  }