@ai-agent-forge/agent-forge 0.86.1 → 0.86.3

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.
Files changed (146) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/bundle/.build-manifest.json +158 -152
  3. package/dist/bundle/chunks/{anthropic-messages-RJYU4TCY.js → anthropic-messages-EVFQ6MLR.js} +3 -3
  4. package/dist/bundle/chunks/{azure-openai-responses-LESTCUL7.js → azure-openai-responses-WQCZWFAH.js} +1 -1
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
  6. package/dist/bundle/chunks/{chunk-MDOTREMR.js → chunk-3WE3W52L.js} +2 -2
  7. package/dist/bundle/chunks/chunk-F6SBZUJG.js +141 -0
  8. package/dist/bundle/chunks/{chunk-SER2HCLE.js → chunk-N6BQJSGH.js} +1 -1
  9. package/dist/bundle/chunks/chunk-RK2X2KU2.js +1442 -0
  10. package/dist/bundle/chunks/chunk-TBPTHASB.js +2 -0
  11. package/dist/bundle/chunks/github-copilot.js +1 -1
  12. package/dist/bundle/chunks/{google-generative-ai-NZ66X6K7.js → google-generative-ai-ISTTUZMW.js} +1 -1
  13. package/dist/bundle/chunks/{google-vertex-2ZZOFBNQ.js → google-vertex-NS7ZF7DK.js} +1 -1
  14. package/dist/bundle/chunks/jiti-static-loader-CDSTNEDU.js +2 -0
  15. package/dist/bundle/chunks/{mistral-conversations-B6DZRMEK.js → mistral-conversations-GINO6Z4I.js} +1 -1
  16. package/dist/bundle/chunks/{openai-codex-responses-UFH6O5K6.js → openai-codex-responses-YDJSZOIH.js} +1 -1
  17. package/dist/bundle/chunks/{openai-completions-A55GHA4O.js → openai-completions-UPRWTQPT.js} +3 -3
  18. package/dist/bundle/chunks/openai-responses-O63W6HQ3.js +2 -0
  19. package/dist/bundle/chunks/virtual-modules-O72ICTMQ.js +2 -0
  20. package/dist/bundle/cli.js +1 -1
  21. package/dist/bundle/index.js +1 -1
  22. package/dist/bundle/rpc-entry.js +1 -1
  23. package/dist/cli/args.d.ts.map +1 -1
  24. package/dist/cli/args.js +14 -4
  25. package/dist/cli/args.js.map +1 -1
  26. package/dist/cli/session-picker.d.ts +1 -1
  27. package/dist/cli/session-picker.d.ts.map +1 -1
  28. package/dist/cli/session-picker.js +8 -2
  29. package/dist/cli/session-picker.js.map +1 -1
  30. package/dist/core/agent-session-compaction.d.ts +7 -2
  31. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  32. package/dist/core/agent-session-compaction.js +137 -43
  33. package/dist/core/agent-session-compaction.js.map +1 -1
  34. package/dist/core/agent-session-internal.d.ts +6 -0
  35. package/dist/core/agent-session-internal.d.ts.map +1 -1
  36. package/dist/core/agent-session-internal.js.map +1 -1
  37. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  38. package/dist/core/agent-session-runtime.js +1 -1
  39. package/dist/core/agent-session-runtime.js.map +1 -1
  40. package/dist/core/agent-session.d.ts +21 -4
  41. package/dist/core/agent-session.d.ts.map +1 -1
  42. package/dist/core/agent-session.js +104 -93
  43. package/dist/core/agent-session.js.map +1 -1
  44. package/dist/core/compaction/compaction.d.ts +15 -0
  45. package/dist/core/compaction/compaction.d.ts.map +1 -1
  46. package/dist/core/compaction/compaction.js +20 -1
  47. package/dist/core/compaction/compaction.js.map +1 -1
  48. package/dist/core/export-html/template.css +10 -0
  49. package/dist/core/export-html/template.js +50 -17
  50. package/dist/core/extensions/bootstrap-compaction-policy.d.ts.map +1 -1
  51. package/dist/core/extensions/bootstrap-compaction-policy.js +3 -1
  52. package/dist/core/extensions/bootstrap-compaction-policy.js.map +1 -1
  53. package/dist/core/extensions/capability-plugin.d.ts.map +1 -1
  54. package/dist/core/extensions/capability-plugin.js +25 -30
  55. package/dist/core/extensions/capability-plugin.js.map +1 -1
  56. package/dist/core/extensions/jiti-static-loader.d.ts +2 -0
  57. package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -0
  58. package/dist/core/extensions/jiti-static-loader.js +5 -0
  59. package/dist/core/extensions/jiti-static-loader.js.map +1 -0
  60. package/dist/core/extensions/microcompact.d.ts +3 -2
  61. package/dist/core/extensions/microcompact.d.ts.map +1 -1
  62. package/dist/core/extensions/microcompact.js +14 -5
  63. package/dist/core/extensions/microcompact.js.map +1 -1
  64. package/dist/core/extensions/virtual-modules.d.ts +3 -0
  65. package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
  66. package/dist/core/extensions/virtual-modules.js +32 -0
  67. package/dist/core/extensions/virtual-modules.js.map +1 -0
  68. package/dist/core/facade/coding-agent-facade.d.ts +3 -3
  69. package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
  70. package/dist/core/facade/coding-agent-facade.js.map +1 -1
  71. package/dist/core/facade/coding-agent-runtime-facade.d.ts +2 -2
  72. package/dist/core/facade/coding-agent-runtime-facade.d.ts.map +1 -1
  73. package/dist/core/facade/coding-agent-runtime-facade.js +4 -4
  74. package/dist/core/facade/coding-agent-runtime-facade.js.map +1 -1
  75. package/dist/core/model-resolver.d.ts.map +1 -1
  76. package/dist/core/model-resolver.js +2 -2
  77. package/dist/core/model-resolver.js.map +1 -1
  78. package/dist/core/package-install-host.d.ts +1 -1
  79. package/dist/core/package-install-host.d.ts.map +1 -1
  80. package/dist/core/package-install-host.js +4 -3
  81. package/dist/core/package-install-host.js.map +1 -1
  82. package/dist/core/prompt-templates.d.ts +6 -1
  83. package/dist/core/prompt-templates.d.ts.map +1 -1
  84. package/dist/core/prompt-templates.js +61 -35
  85. package/dist/core/prompt-templates.js.map +1 -1
  86. package/dist/core/resource-loader.d.ts.map +1 -1
  87. package/dist/core/resource-loader.js +6 -2
  88. package/dist/core/resource-loader.js.map +1 -1
  89. package/dist/core/session-manager.d.ts +23 -4
  90. package/dist/core/session-manager.d.ts.map +1 -1
  91. package/dist/core/session-manager.js +146 -108
  92. package/dist/core/session-manager.js.map +1 -1
  93. package/dist/core/settings-manager.d.ts +3 -0
  94. package/dist/core/settings-manager.d.ts.map +1 -1
  95. package/dist/core/settings-manager.js +4 -0
  96. package/dist/core/settings-manager.js.map +1 -1
  97. package/dist/core/tools/bash.d.ts +2 -1
  98. package/dist/core/tools/bash.d.ts.map +1 -1
  99. package/dist/core/tools/bash.js +18 -3
  100. package/dist/core/tools/bash.js.map +1 -1
  101. package/dist/main.d.ts.map +1 -1
  102. package/dist/main.js +6 -7
  103. package/dist/main.js.map +1 -1
  104. package/dist/modes/interactive/components/session-selector.d.ts +5 -5
  105. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  106. package/dist/modes/interactive/components/session-selector.js +74 -50
  107. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  108. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  109. package/dist/modes/interactive/components/tool-execution.js +18 -9
  110. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  111. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  112. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  113. package/dist/modes/interactive/interactive-mode.js +35 -32
  114. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  115. package/dist/modes/rpc/rpc-client.d.ts +14 -6
  116. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  117. package/dist/modes/rpc/rpc-client.js +47 -10
  118. package/dist/modes/rpc/rpc-client.js.map +1 -1
  119. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  120. package/dist/modes/rpc/rpc-mode.js +9 -10
  121. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  122. package/dist/modes/rpc/rpc-types.d.ts +10 -1
  123. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  124. package/dist/modes/rpc/rpc-types.js.map +1 -1
  125. package/dist/remote/server-assembly.d.ts.map +1 -1
  126. package/dist/remote/server-assembly.js +1 -1
  127. package/dist/remote/server-assembly.js.map +1 -1
  128. package/dist/utils/clipboard-image.d.ts.map +1 -1
  129. package/dist/utils/clipboard-image.js +1 -12
  130. package/dist/utils/clipboard-image.js.map +1 -1
  131. package/dist/utils/clipboard.d.ts.map +1 -1
  132. package/dist/utils/clipboard.js +88 -13
  133. package/dist/utils/clipboard.js.map +1 -1
  134. package/dist/utils/mime.d.ts.map +1 -1
  135. package/dist/utils/mime.js +1 -1
  136. package/dist/utils/mime.js.map +1 -1
  137. package/dist/utils/wsl.d.ts +3 -0
  138. package/dist/utils/wsl.d.ts.map +1 -0
  139. package/dist/utils/wsl.js +15 -0
  140. package/dist/utils/wsl.js.map +1 -0
  141. package/docs/rpc.md +7 -5
  142. package/docs/sdk.md +9 -8
  143. package/package.json +1 -1
  144. package/dist/bundle/chunks/chunk-KQEGUM34.js +0 -2
  145. package/dist/bundle/chunks/chunk-S3YLY4MG.js +0 -1581
  146. package/dist/bundle/chunks/openai-responses-TJLXRAXR.js +0 -2
@@ -103,6 +103,14 @@ export class AgentSession {
103
103
  _overflowRecoveryAttempted = false;
104
104
  // biome-ignore lint/correctness/noUnusedPrivateClassMembers: read and written via the agent-session-* submodule facade
105
105
  _overflowTrimStage = 0;
106
+ /**
107
+ * microcompact 冷却(按模型请求计数,0 = 不冷却):relief 落地时置
108
+ * MICROCOMPACT_COOLDOWN_ASSISTANT_RESPONSES,此后每次 assistant message_end
109
+ * (无论 stopReason)减 1、下限 0;user message_start 不复位。冷却期内阈值
110
+ * decide 以 microcompactEnabled:false 关闭便宜缓解。微观经济动机见
111
+ * agent-session-compaction.ts 的常量注释(中部历史改写 × 不稳定前缀缓存)。
112
+ */
113
+ _microcompactCooldown = 0;
106
114
  // Branch summarization state
107
115
  _branchSummaryAbortController = undefined;
108
116
  _branchSummaryPromise = undefined;
@@ -506,6 +514,11 @@ export class AgentSession {
506
514
  this._overflowRecoveryAttempted = false;
507
515
  this._overflowTrimStage = 0;
508
516
  }
517
+ // microcompact 冷却按模型请求计数:每个完成的 assistant 响应(无论
518
+ // stopReason)释放一档,下限 0;冷却期内的阈值 decide 不做便宜缓解。
519
+ if (this._microcompactCooldown > 0) {
520
+ this._microcompactCooldown -= 1;
521
+ }
509
522
  // Reset retry counter immediately on successful assistant response
510
523
  // This prevents accumulation across multiple LLM calls within a turn
511
524
  if (assistantMsg.stopReason !== "error" && this._retryAttempt > 0) {
@@ -786,7 +799,8 @@ export class AgentSession {
786
799
  getMessages: () => detachedSessionSnapshot(this.agent.state.messages),
787
800
  isIdle: () => this.isIdle,
788
801
  prompt: (text) => this.prompt(text),
789
- steer: (text) => this.steer(text),
802
+ // SessionAPI 契约固定 Promise<void>;disposition("queued"/"handled")不外泄到该面。
803
+ steer: (text) => this.steer(text).then(() => undefined),
790
804
  queueFollowUp: (text) => this.sendUserMessage(text, { deliverAs: "followUp" }),
791
805
  abort: () => this.abort(),
792
806
  waitForIdle: () => this.waitForIdle(),
@@ -1179,107 +1193,101 @@ export class AgentSession {
1179
1193
  const expandPromptTemplates = options?.expandPromptTemplates ?? true;
1180
1194
  const preflightResult = options?.preflightResult;
1181
1195
  let messages;
1182
- try {
1183
- // Handle plugin commands first (execute immediately, even during streaming).
1184
- if (expandPromptTemplates && text.startsWith("/")) {
1185
- const handled = await this._tryExecuteExtensionCommand(text);
1186
- if (handled) {
1187
- // Extension command executed, no prompt to send
1188
- preflightResult?.(true);
1189
- return { status: "done" };
1190
- }
1191
- }
1192
- if (this._compactionAbortController !== undefined) {
1193
- throw new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");
1194
- }
1195
- // Dispatch the input.gate chain, then the input.received facts (both
1196
- // before skill/template expansion)
1197
- const { text: currentText, images: currentImages } = await this._runInputHandlers(text, options?.images, options?.source ?? "interactive");
1198
- // Expand skill commands (/skill:name args) and prompt templates (/template args)
1199
- let expandedText = currentText;
1200
- if (expandPromptTemplates) {
1201
- expandedText = this._expandSkillCommand(expandedText);
1202
- expandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);
1203
- }
1204
- // If streaming, queue via steer() or followUp() based on option
1205
- if (this.isStreaming) {
1206
- if (!options?.streamingBehavior) {
1207
- throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");
1208
- }
1209
- if (options.streamingBehavior === "followUp") {
1210
- await this._queueFollowUp(expandedText, currentImages);
1211
- }
1212
- else {
1213
- await this._queueSteer(expandedText, currentImages);
1214
- }
1215
- preflightResult?.(true);
1196
+ // Handle plugin commands first (execute immediately, even during streaming).
1197
+ if (expandPromptTemplates && text.startsWith("/")) {
1198
+ const handled = await this._tryExecuteExtensionCommand(text);
1199
+ if (handled) {
1200
+ // Extension command executed, no prompt to send
1201
+ preflightResult?.("handled");
1216
1202
  return { status: "done" };
1217
1203
  }
1218
- // Flush any pending bash and custom messages before the new prompt
1219
- this._flushPendingBashMessages();
1220
- this._flushPendingCustomMessages();
1221
- // Validate model
1222
- if (!this.model) {
1223
- throw new Error(formatNoModelSelectedMessage());
1224
- }
1225
- const hasConfiguredAuth = this.agent.streamFunction !== streamSimple ||
1226
- this._modelRuntime.hasConfiguredAuth(this.model.provider) ||
1227
- (await this._modelRuntime.checkAuth(this.model.provider)) !== undefined;
1228
- if (!hasConfiguredAuth) {
1229
- const isOAuth = this._modelRuntime.isUsingOAuth(this.model.provider);
1230
- if (isOAuth) {
1231
- throw new Error(`Authentication failed for "${this.model.provider}". ` +
1232
- `Credentials may have expired or network is unavailable. ` +
1233
- `Run '/login ${this.model.provider}' to re-authenticate.`);
1234
- }
1235
- throw new Error(formatNoApiKeyFoundMessage(this.model.provider));
1236
- }
1237
- // Check if we need to compact before sending (catches aborted responses).
1238
- // The user's new prompt is sent below, so do not call agent.continue() here.
1239
- const lastAssistant = this._findLastAssistantMessage();
1240
- if (lastAssistant) {
1241
- await this._checkCompaction(lastAssistant, false);
1204
+ }
1205
+ if (this._compactionAbortController !== undefined) {
1206
+ throw new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");
1207
+ }
1208
+ // Dispatch the input.gate chain, then the input.received facts (both
1209
+ // before skill/template expansion)
1210
+ const { text: currentText, images: currentImages } = await this._runInputHandlers(text, options?.images, options?.source ?? "interactive");
1211
+ // Expand skill commands (/skill:name args) and prompt templates (/template args)
1212
+ let expandedText = currentText;
1213
+ if (expandPromptTemplates) {
1214
+ expandedText = this._expandSkillCommand(expandedText);
1215
+ expandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);
1216
+ }
1217
+ // If streaming, queue via steer() or followUp() based on option
1218
+ if (this.isStreaming) {
1219
+ if (!options?.streamingBehavior) {
1220
+ throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");
1242
1221
  }
1243
- // Build messages array (custom message if any, then user message)
1244
- messages = [];
1245
- // Add user message
1246
- const userContent = [{ type: "text", text: expandedText }];
1247
- if (currentImages) {
1248
- userContent.push(...currentImages);
1222
+ if (options.streamingBehavior === "followUp") {
1223
+ await this._queueFollowUp(expandedText, currentImages);
1249
1224
  }
1250
- messages.push({
1251
- role: "user",
1252
- content: userContent,
1253
- timestamp: Date.now(),
1254
- });
1255
- // Inject any pending "nextTurn" messages as context alongside the user message
1256
- for (const msg of this._pendingNextTurnMessages) {
1257
- messages.push(msg);
1258
- }
1259
- this._pendingNextTurnMessages = [];
1260
- await dispatchBeforeAgentStartLifecycle(this._internal, (currentImages?.length ?? 0) > 0);
1261
- // Reset to the base prompt (in case a previous turn had an override),
1262
- // then apply the before.agent.start@2 candidate transform (capability
1263
- // channel). A transform yielding a different systemPrompt is the later
1264
- // writer and wins; a missing registration, a verbatim result, or a
1265
- // failed delivery keeps the base prompt.
1266
- this._systemPromptOverride = undefined;
1267
- this.agent.state.systemPrompt = this._baseSystemPrompt;
1268
- const capabilitySystemPrompt = await dispatchBeforeAgentStartV2Lifecycle(this._internal, this._baseSystemPrompt, this._baseSystemPromptOptions);
1269
- if (capabilitySystemPrompt !== undefined) {
1270
- this._systemPromptOverride = capabilitySystemPrompt;
1271
- this.agent.state.systemPrompt = capabilitySystemPrompt;
1225
+ else {
1226
+ await this._queueSteer(expandedText, currentImages);
1272
1227
  }
1228
+ preflightResult?.("queued");
1229
+ return { status: "done" };
1273
1230
  }
1274
- catch (error) {
1275
- preflightResult?.(false);
1276
- throw error;
1231
+ // Flush any pending bash and custom messages before the new prompt
1232
+ this._flushPendingBashMessages();
1233
+ this._flushPendingCustomMessages();
1234
+ // Validate model
1235
+ if (!this.model) {
1236
+ throw new Error(formatNoModelSelectedMessage());
1237
+ }
1238
+ const hasConfiguredAuth = this.agent.streamFunction !== streamSimple ||
1239
+ this._modelRuntime.hasConfiguredAuth(this.model.provider) ||
1240
+ (await this._modelRuntime.checkAuth(this.model.provider)) !== undefined;
1241
+ if (!hasConfiguredAuth) {
1242
+ const isOAuth = this._modelRuntime.isUsingOAuth(this.model.provider);
1243
+ if (isOAuth) {
1244
+ throw new Error(`Authentication failed for "${this.model.provider}". ` +
1245
+ `Credentials may have expired or network is unavailable. ` +
1246
+ `Run '/login ${this.model.provider}' to re-authenticate.`);
1247
+ }
1248
+ throw new Error(formatNoApiKeyFoundMessage(this.model.provider));
1249
+ }
1250
+ // Check if we need to compact before sending (catches aborted responses).
1251
+ // The user's new prompt is sent below, so do not call agent.continue() here.
1252
+ const lastAssistant = this._findLastAssistantMessage();
1253
+ if (lastAssistant) {
1254
+ await this._checkCompaction(lastAssistant, false);
1255
+ }
1256
+ // Build messages array (custom message if any, then user message)
1257
+ messages = [];
1258
+ // Add user message
1259
+ const userContent = [{ type: "text", text: expandedText }];
1260
+ if (currentImages) {
1261
+ userContent.push(...currentImages);
1262
+ }
1263
+ messages.push({
1264
+ role: "user",
1265
+ content: userContent,
1266
+ timestamp: Date.now(),
1267
+ });
1268
+ // Inject any pending "nextTurn" messages as context alongside the user message
1269
+ for (const msg of this._pendingNextTurnMessages) {
1270
+ messages.push(msg);
1271
+ }
1272
+ this._pendingNextTurnMessages = [];
1273
+ await dispatchBeforeAgentStartLifecycle(this._internal, (currentImages?.length ?? 0) > 0);
1274
+ // Reset to the base prompt (in case a previous turn had an override),
1275
+ // then apply the before.agent.start@2 candidate transform (capability
1276
+ // channel). A transform yielding a different systemPrompt is the later
1277
+ // writer and wins; a missing registration, a verbatim result, or a
1278
+ // failed delivery keeps the base prompt.
1279
+ this._systemPromptOverride = undefined;
1280
+ this.agent.state.systemPrompt = this._baseSystemPrompt;
1281
+ const capabilitySystemPrompt = await dispatchBeforeAgentStartV2Lifecycle(this._internal, this._baseSystemPrompt, this._baseSystemPromptOptions);
1282
+ if (capabilitySystemPrompt !== undefined) {
1283
+ this._systemPromptOverride = capabilitySystemPrompt;
1284
+ this.agent.state.systemPrompt = capabilitySystemPrompt;
1277
1285
  }
1278
1286
  // v8 ignore next -- try 块内所有不发送路径均已提前 return,messages 必然已赋值
1279
1287
  if (!messages) {
1280
1288
  return { status: "done" };
1281
1289
  }
1282
- preflightResult?.(true);
1290
+ preflightResult?.("started");
1283
1291
  return this._runAgentPrompt(messages);
1284
1292
  }
1285
1293
  /**
@@ -1374,6 +1382,7 @@ export class AgentSession {
1374
1382
  else {
1375
1383
  await this._queueFollowUp(expandedText, processedInput.images);
1376
1384
  }
1385
+ return "queued";
1377
1386
  }
1378
1387
  /**
1379
1388
  * Queue a steering message while the agent is running.
@@ -1382,10 +1391,11 @@ export class AgentSession {
1382
1391
  * Expands skill commands and prompt templates. Errors on extension commands.
1383
1392
  * @param images Optional image attachments to include with the message
1384
1393
  * @param options Input source; defaults to interactive
1394
+ * @returns How the input was dispatched ("queued"; "handled" if a handler consumed it)
1385
1395
  * @throws Error if text is an extension command
1386
1396
  */
1387
1397
  async steer(text, images, options) {
1388
- await this._queueUserInput(text, images, "steer", options?.source ?? "interactive");
1398
+ return this._queueUserInput(text, images, "steer", options?.source ?? "interactive");
1389
1399
  }
1390
1400
  /**
1391
1401
  * Queue a follow-up message to be processed after the agent finishes.
@@ -1393,10 +1403,11 @@ export class AgentSession {
1393
1403
  * Expands skill commands and prompt templates. Errors on extension commands.
1394
1404
  * @param images Optional image attachments to include with the message
1395
1405
  * @param options Input source; defaults to interactive
1406
+ * @returns How the input was dispatched ("queued"; "handled" if a handler consumed it)
1396
1407
  * @throws Error if text is an extension command
1397
1408
  */
1398
1409
  async followUp(text, images, options) {
1399
- await this._queueUserInput(text, images, "followUp", options?.source ?? "interactive");
1410
+ return this._queueUserInput(text, images, "followUp", options?.source ?? "interactive");
1400
1411
  }
1401
1412
  /**
1402
1413
  * Internal: Queue a steering message (already expanded, no extension command check).