@ai-agent-forge/agent-forge 0.86.2 → 0.86.4

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 (154) hide show
  1. package/CHANGELOG.md +38 -1
  2. package/dist/bundle/.build-manifest.json +183 -177
  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-PE3XUHPT.js} +3 -3
  9. package/dist/bundle/chunks/chunk-TBPTHASB.js +2 -0
  10. package/dist/bundle/chunks/chunk-ZV3W36HK.js +1445 -0
  11. package/dist/bundle/chunks/github-copilot.js +1 -1
  12. package/dist/bundle/chunks/google-generative-ai-LQ375GYC.js +2 -0
  13. package/dist/bundle/chunks/google-vertex-HXSRAKEZ.js +2 -0
  14. package/dist/bundle/chunks/jiti-static-loader-CDSTNEDU.js +2 -0
  15. package/dist/bundle/chunks/mistral-conversations-CSNMFR4J.js +5 -0
  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 +4 -4
  31. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  32. package/dist/core/agent-session-compaction.js +161 -45
  33. package/dist/core/agent-session-compaction.js.map +1 -1
  34. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  35. package/dist/core/agent-session-runtime.js +1 -1
  36. package/dist/core/agent-session-runtime.js.map +1 -1
  37. package/dist/core/agent-session.d.ts +13 -4
  38. package/dist/core/agent-session.d.ts.map +1 -1
  39. package/dist/core/agent-session.js +91 -93
  40. package/dist/core/agent-session.js.map +1 -1
  41. package/dist/core/compaction/compaction.d.ts +15 -0
  42. package/dist/core/compaction/compaction.d.ts.map +1 -1
  43. package/dist/core/compaction/compaction.js +20 -1
  44. package/dist/core/compaction/compaction.js.map +1 -1
  45. package/dist/core/export-html/template.css +10 -0
  46. package/dist/core/export-html/template.js +50 -17
  47. package/dist/core/extensions/bootstrap-compaction-policy.d.ts.map +1 -1
  48. package/dist/core/extensions/bootstrap-compaction-policy.js +1 -2
  49. package/dist/core/extensions/bootstrap-compaction-policy.js.map +1 -1
  50. package/dist/core/extensions/capability-plugin.d.ts.map +1 -1
  51. package/dist/core/extensions/capability-plugin.js +25 -30
  52. package/dist/core/extensions/capability-plugin.js.map +1 -1
  53. package/dist/core/extensions/jiti-static-loader.d.ts +2 -0
  54. package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -0
  55. package/dist/core/extensions/jiti-static-loader.js +5 -0
  56. package/dist/core/extensions/jiti-static-loader.js.map +1 -0
  57. package/dist/core/extensions/microcompact.d.ts +16 -8
  58. package/dist/core/extensions/microcompact.d.ts.map +1 -1
  59. package/dist/core/extensions/microcompact.js +9 -7
  60. package/dist/core/extensions/microcompact.js.map +1 -1
  61. package/dist/core/extensions/virtual-modules.d.ts +3 -0
  62. package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
  63. package/dist/core/extensions/virtual-modules.js +32 -0
  64. package/dist/core/extensions/virtual-modules.js.map +1 -0
  65. package/dist/core/facade/coding-agent-facade.d.ts +3 -3
  66. package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
  67. package/dist/core/facade/coding-agent-facade.js.map +1 -1
  68. package/dist/core/facade/coding-agent-runtime-facade.d.ts +2 -2
  69. package/dist/core/facade/coding-agent-runtime-facade.d.ts.map +1 -1
  70. package/dist/core/facade/coding-agent-runtime-facade.js +4 -4
  71. package/dist/core/facade/coding-agent-runtime-facade.js.map +1 -1
  72. package/dist/core/model-resolver.d.ts.map +1 -1
  73. package/dist/core/model-resolver.js +2 -2
  74. package/dist/core/model-resolver.js.map +1 -1
  75. package/dist/core/package-install-host.d.ts +1 -1
  76. package/dist/core/package-install-host.d.ts.map +1 -1
  77. package/dist/core/package-install-host.js +4 -3
  78. package/dist/core/package-install-host.js.map +1 -1
  79. package/dist/core/prompt-templates.d.ts +6 -1
  80. package/dist/core/prompt-templates.d.ts.map +1 -1
  81. package/dist/core/prompt-templates.js +61 -35
  82. package/dist/core/prompt-templates.js.map +1 -1
  83. package/dist/core/resource-loader.d.ts.map +1 -1
  84. package/dist/core/resource-loader.js +6 -2
  85. package/dist/core/resource-loader.js.map +1 -1
  86. package/dist/core/session-manager.d.ts +23 -4
  87. package/dist/core/session-manager.d.ts.map +1 -1
  88. package/dist/core/session-manager.js +146 -108
  89. package/dist/core/session-manager.js.map +1 -1
  90. package/dist/core/settings-manager.d.ts +3 -0
  91. package/dist/core/settings-manager.d.ts.map +1 -1
  92. package/dist/core/settings-manager.js +5 -1
  93. package/dist/core/settings-manager.js.map +1 -1
  94. package/dist/core/tools/bash.d.ts +2 -1
  95. package/dist/core/tools/bash.d.ts.map +1 -1
  96. package/dist/core/tools/bash.js +27 -13
  97. package/dist/core/tools/bash.js.map +1 -1
  98. package/dist/main.d.ts.map +1 -1
  99. package/dist/main.js +6 -7
  100. package/dist/main.js.map +1 -1
  101. package/dist/modes/interactive/components/footer.d.ts +8 -0
  102. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  103. package/dist/modes/interactive/components/footer.js +40 -4
  104. package/dist/modes/interactive/components/footer.js.map +1 -1
  105. package/dist/modes/interactive/components/session-selector.d.ts +5 -5
  106. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  107. package/dist/modes/interactive/components/session-selector.js +74 -50
  108. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  109. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  110. package/dist/modes/interactive/components/tool-execution.js +18 -9
  111. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  112. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  113. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  114. package/dist/modes/interactive/interactive-mode.js +35 -32
  115. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  116. package/dist/modes/rpc/rpc-client.d.ts +14 -6
  117. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  118. package/dist/modes/rpc/rpc-client.js +47 -10
  119. package/dist/modes/rpc/rpc-client.js.map +1 -1
  120. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  121. package/dist/modes/rpc/rpc-mode.js +9 -10
  122. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  123. package/dist/modes/rpc/rpc-types.d.ts +10 -1
  124. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  125. package/dist/modes/rpc/rpc-types.js.map +1 -1
  126. package/dist/remote/server-assembly.d.ts.map +1 -1
  127. package/dist/remote/server-assembly.js +1 -1
  128. package/dist/remote/server-assembly.js.map +1 -1
  129. package/dist/utils/clipboard-image.d.ts.map +1 -1
  130. package/dist/utils/clipboard-image.js +1 -12
  131. package/dist/utils/clipboard-image.js.map +1 -1
  132. package/dist/utils/clipboard.d.ts.map +1 -1
  133. package/dist/utils/clipboard.js +88 -13
  134. package/dist/utils/clipboard.js.map +1 -1
  135. package/dist/utils/mime.d.ts.map +1 -1
  136. package/dist/utils/mime.js +1 -1
  137. package/dist/utils/mime.js.map +1 -1
  138. package/dist/utils/shell.d.ts +1 -3
  139. package/dist/utils/shell.d.ts.map +1 -1
  140. package/dist/utils/shell.js +3 -30
  141. package/dist/utils/shell.js.map +1 -1
  142. package/dist/utils/wsl.d.ts +3 -0
  143. package/dist/utils/wsl.d.ts.map +1 -0
  144. package/dist/utils/wsl.js +15 -0
  145. package/dist/utils/wsl.js.map +1 -0
  146. package/docs/rpc.md +7 -5
  147. package/docs/sdk.md +9 -8
  148. package/package.json +1 -1
  149. package/dist/bundle/chunks/chunk-JR3Q27QP.js +0 -1581
  150. package/dist/bundle/chunks/chunk-KQEGUM34.js +0 -2
  151. package/dist/bundle/chunks/google-generative-ai-NZ66X6K7.js +0 -2
  152. package/dist/bundle/chunks/google-vertex-2ZZOFBNQ.js +0 -2
  153. package/dist/bundle/chunks/mistral-conversations-B6DZRMEK.js +0 -5
  154. package/dist/bundle/chunks/openai-responses-TJLXRAXR.js +0 -2
@@ -799,7 +799,8 @@ export class AgentSession {
799
799
  getMessages: () => detachedSessionSnapshot(this.agent.state.messages),
800
800
  isIdle: () => this.isIdle,
801
801
  prompt: (text) => this.prompt(text),
802
- steer: (text) => this.steer(text),
802
+ // SessionAPI 契约固定 Promise<void>;disposition("queued"/"handled")不外泄到该面。
803
+ steer: (text) => this.steer(text).then(() => undefined),
803
804
  queueFollowUp: (text) => this.sendUserMessage(text, { deliverAs: "followUp" }),
804
805
  abort: () => this.abort(),
805
806
  waitForIdle: () => this.waitForIdle(),
@@ -1192,107 +1193,101 @@ export class AgentSession {
1192
1193
  const expandPromptTemplates = options?.expandPromptTemplates ?? true;
1193
1194
  const preflightResult = options?.preflightResult;
1194
1195
  let messages;
1195
- try {
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?.(true);
1202
- return { status: "done" };
1203
- }
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.");
1221
- }
1222
- if (options.streamingBehavior === "followUp") {
1223
- await this._queueFollowUp(expandedText, currentImages);
1224
- }
1225
- else {
1226
- await this._queueSteer(expandedText, currentImages);
1227
- }
1228
- 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");
1229
1202
  return { status: "done" };
1230
1203
  }
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);
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.");
1262
1221
  }
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);
1222
+ if (options.streamingBehavior === "followUp") {
1223
+ await this._queueFollowUp(expandedText, currentImages);
1271
1224
  }
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;
1225
+ else {
1226
+ await this._queueSteer(expandedText, currentImages);
1285
1227
  }
1228
+ preflightResult?.("queued");
1229
+ return { status: "done" };
1286
1230
  }
1287
- catch (error) {
1288
- preflightResult?.(false);
1289
- 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;
1290
1285
  }
1291
1286
  // v8 ignore next -- try 块内所有不发送路径均已提前 return,messages 必然已赋值
1292
1287
  if (!messages) {
1293
1288
  return { status: "done" };
1294
1289
  }
1295
- preflightResult?.(true);
1290
+ preflightResult?.("started");
1296
1291
  return this._runAgentPrompt(messages);
1297
1292
  }
1298
1293
  /**
@@ -1387,6 +1382,7 @@ export class AgentSession {
1387
1382
  else {
1388
1383
  await this._queueFollowUp(expandedText, processedInput.images);
1389
1384
  }
1385
+ return "queued";
1390
1386
  }
1391
1387
  /**
1392
1388
  * Queue a steering message while the agent is running.
@@ -1395,10 +1391,11 @@ export class AgentSession {
1395
1391
  * Expands skill commands and prompt templates. Errors on extension commands.
1396
1392
  * @param images Optional image attachments to include with the message
1397
1393
  * @param options Input source; defaults to interactive
1394
+ * @returns How the input was dispatched ("queued"; "handled" if a handler consumed it)
1398
1395
  * @throws Error if text is an extension command
1399
1396
  */
1400
1397
  async steer(text, images, options) {
1401
- await this._queueUserInput(text, images, "steer", options?.source ?? "interactive");
1398
+ return this._queueUserInput(text, images, "steer", options?.source ?? "interactive");
1402
1399
  }
1403
1400
  /**
1404
1401
  * Queue a follow-up message to be processed after the agent finishes.
@@ -1406,10 +1403,11 @@ export class AgentSession {
1406
1403
  * Expands skill commands and prompt templates. Errors on extension commands.
1407
1404
  * @param images Optional image attachments to include with the message
1408
1405
  * @param options Input source; defaults to interactive
1406
+ * @returns How the input was dispatched ("queued"; "handled" if a handler consumed it)
1409
1407
  * @throws Error if text is an extension command
1410
1408
  */
1411
1409
  async followUp(text, images, options) {
1412
- await this._queueUserInput(text, images, "followUp", options?.source ?? "interactive");
1410
+ return this._queueUserInput(text, images, "followUp", options?.source ?? "interactive");
1413
1411
  }
1414
1412
  /**
1415
1413
  * Internal: Queue a steering message (already expanded, no extension command check).