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

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 (238) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/bundle/.build-manifest.json +500 -434
  3. package/dist/bundle/chunks/anthropic-messages-ALDZBUKI.js +6 -0
  4. package/dist/bundle/chunks/anthropic.js +2 -2
  5. package/dist/bundle/chunks/{azure-openai-responses-WQCZWFAH.js → azure-openai-responses-A2WJWZFB.js} +1 -1
  6. package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
  7. package/dist/bundle/chunks/chunk-A7GUOX2H.js +141 -0
  8. package/dist/bundle/chunks/{chunk-WGLBM2BP.js → chunk-CIX3FSBK.js} +1 -1
  9. package/dist/bundle/chunks/{chunk-RK2X2KU2.js → chunk-EALJ5DDX.js} +111 -101
  10. package/dist/bundle/chunks/chunk-OO6DJ3CL.js +31 -0
  11. package/dist/bundle/chunks/{chunk-N6BQJSGH.js → chunk-SQFG22WN.js} +3 -3
  12. package/dist/bundle/chunks/{chunk-V46XUTK3.js → chunk-Y7HXTASS.js} +1 -1
  13. package/dist/bundle/chunks/{chunk-3WE3W52L.js → chunk-YJCQVXW5.js} +1 -1
  14. package/dist/bundle/chunks/github-copilot.js +1 -1
  15. package/dist/bundle/chunks/google-generative-ai-NIB4WONV.js +2 -0
  16. package/dist/bundle/chunks/google-vertex-DCPYUEUO.js +2 -0
  17. package/dist/bundle/chunks/mistral-conversations-OC6LA5XL.js +5 -0
  18. package/dist/bundle/chunks/{openai-codex-responses-YDJSZOIH.js → openai-codex-responses-IO2X4Y7L.js} +1 -1
  19. package/dist/bundle/chunks/openai-codex.js +2 -2
  20. package/dist/bundle/chunks/{openai-completions-UPRWTQPT.js → openai-completions-XYQQHETU.js} +1 -1
  21. package/dist/bundle/chunks/{openai-responses-O63W6HQ3.js → openai-responses-DLIRN3CI.js} +1 -1
  22. package/dist/bundle/chunks/{openrouter-images-G3GT5BVT.js → openrouter-images-G4GQRUSG.js} +1 -1
  23. package/dist/bundle/chunks/openrouter.js +2 -2
  24. package/dist/bundle/chunks/{pi-messages-SLF355GF.js → pi-messages-E6RRYBO7.js} +1 -1
  25. package/dist/bundle/chunks/radius.js +2 -2
  26. package/dist/bundle/chunks/{virtual-modules-O72ICTMQ.js → virtual-modules-3IZ4MYSQ.js} +1 -1
  27. package/dist/bundle/cli.js +1 -1
  28. package/dist/bundle/index.js +1 -1
  29. package/dist/bundle/rpc-entry.js +1 -1
  30. package/dist/capabilities/builtin.d.ts +4 -2
  31. package/dist/capabilities/builtin.d.ts.map +1 -1
  32. package/dist/capabilities/builtin.js +5 -1
  33. package/dist/capabilities/builtin.js.map +1 -1
  34. package/dist/cli/plugin-command.d.ts.map +1 -1
  35. package/dist/cli/plugin-command.js +51 -5
  36. package/dist/cli/plugin-command.js.map +1 -1
  37. package/dist/core/agent-session-compaction.d.ts +2 -2
  38. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  39. package/dist/core/agent-session-compaction.js +54 -6
  40. package/dist/core/agent-session-compaction.js.map +1 -1
  41. package/dist/core/agent-session-internal.d.ts +2 -4
  42. package/dist/core/agent-session-internal.d.ts.map +1 -1
  43. package/dist/core/agent-session-internal.js.map +1 -1
  44. package/dist/core/agent-session-paths.d.ts +2 -0
  45. package/dist/core/agent-session-paths.d.ts.map +1 -1
  46. package/dist/core/agent-session-paths.js +2 -1
  47. package/dist/core/agent-session-paths.js.map +1 -1
  48. package/dist/core/agent-session-projection.d.ts +10 -4
  49. package/dist/core/agent-session-projection.d.ts.map +1 -1
  50. package/dist/core/agent-session-projection.js +17 -4
  51. package/dist/core/agent-session-projection.js.map +1 -1
  52. package/dist/core/agent-session.d.ts +19 -5
  53. package/dist/core/agent-session.d.ts.map +1 -1
  54. package/dist/core/agent-session.js +30 -4
  55. package/dist/core/agent-session.js.map +1 -1
  56. package/dist/core/extensions/bootstrap-compaction-policy.d.ts.map +1 -1
  57. package/dist/core/extensions/bootstrap-compaction-policy.js +1 -2
  58. package/dist/core/extensions/bootstrap-compaction-policy.js.map +1 -1
  59. package/dist/core/extensions/bootstrap-lifecycle.d.ts +1 -1
  60. package/dist/core/extensions/bootstrap-lifecycle.d.ts.map +1 -1
  61. package/dist/core/extensions/bootstrap-lifecycle.js +5 -2
  62. package/dist/core/extensions/bootstrap-lifecycle.js.map +1 -1
  63. package/dist/core/extensions/capability-runtime-store.d.ts.map +1 -1
  64. package/dist/core/extensions/capability-runtime-store.js +1 -0
  65. package/dist/core/extensions/capability-runtime-store.js.map +1 -1
  66. package/dist/core/extensions/capability-runtime-types.d.ts +16 -1
  67. package/dist/core/extensions/capability-runtime-types.d.ts.map +1 -1
  68. package/dist/core/extensions/capability-runtime-types.js.map +1 -1
  69. package/dist/core/extensions/capability-runtime.d.ts.map +1 -1
  70. package/dist/core/extensions/capability-runtime.js +38 -2
  71. package/dist/core/extensions/capability-runtime.js.map +1 -1
  72. package/dist/core/extensions/index.d.ts +1 -1
  73. package/dist/core/extensions/index.d.ts.map +1 -1
  74. package/dist/core/extensions/index.js.map +1 -1
  75. package/dist/core/extensions/lifecycle-catalog.d.ts +46 -0
  76. package/dist/core/extensions/lifecycle-catalog.d.ts.map +1 -1
  77. package/dist/core/extensions/lifecycle-catalog.js +101 -0
  78. package/dist/core/extensions/lifecycle-catalog.js.map +1 -1
  79. package/dist/core/extensions/microcompact.d.ts +16 -8
  80. package/dist/core/extensions/microcompact.d.ts.map +1 -1
  81. package/dist/core/extensions/microcompact.js +9 -7
  82. package/dist/core/extensions/microcompact.js.map +1 -1
  83. package/dist/core/extensions/provider-failover.d.ts +106 -0
  84. package/dist/core/extensions/provider-failover.d.ts.map +1 -0
  85. package/dist/core/extensions/provider-failover.js +692 -0
  86. package/dist/core/extensions/provider-failover.js.map +1 -0
  87. package/dist/core/facade/coding-agent-facade.d.ts +13 -6
  88. package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
  89. package/dist/core/facade/coding-agent-facade.js +3 -1
  90. package/dist/core/facade/coding-agent-facade.js.map +1 -1
  91. package/dist/core/keybindings.d.ts +6 -6
  92. package/dist/core/keybindings.d.ts.map +1 -1
  93. package/dist/core/keybindings.js +23 -6
  94. package/dist/core/keybindings.js.map +1 -1
  95. package/dist/core/model-config.d.ts +102 -0
  96. package/dist/core/model-config.d.ts.map +1 -1
  97. package/dist/core/model-config.js +46 -14
  98. package/dist/core/model-config.js.map +1 -1
  99. package/dist/core/model-resolver.d.ts.map +1 -1
  100. package/dist/core/model-resolver.js +1 -1
  101. package/dist/core/model-resolver.js.map +1 -1
  102. package/dist/core/model-runtime.d.ts +15 -0
  103. package/dist/core/model-runtime.d.ts.map +1 -1
  104. package/dist/core/model-runtime.js +30 -18
  105. package/dist/core/model-runtime.js.map +1 -1
  106. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  107. package/dist/core/remote-catalog-provider.js +4 -9
  108. package/dist/core/remote-catalog-provider.js.map +1 -1
  109. package/dist/core/sdk.d.ts.map +1 -1
  110. package/dist/core/sdk.js +107 -24
  111. package/dist/core/sdk.js.map +1 -1
  112. package/dist/core/session-manager.d.ts +2 -0
  113. package/dist/core/session-manager.d.ts.map +1 -1
  114. package/dist/core/session-manager.js +10 -5
  115. package/dist/core/session-manager.js.map +1 -1
  116. package/dist/core/settings-manager.d.ts +74 -5
  117. package/dist/core/settings-manager.d.ts.map +1 -1
  118. package/dist/core/settings-manager.js +143 -10
  119. package/dist/core/settings-manager.js.map +1 -1
  120. package/dist/core/slash-commands.d.ts.map +1 -1
  121. package/dist/core/slash-commands.js +17 -2
  122. package/dist/core/slash-commands.js.map +1 -1
  123. package/dist/core/tools/bash.d.ts.map +1 -1
  124. package/dist/core/tools/bash.js +9 -10
  125. package/dist/core/tools/bash.js.map +1 -1
  126. package/dist/core/tools/render-utils.d.ts +6 -0
  127. package/dist/core/tools/render-utils.d.ts.map +1 -1
  128. package/dist/core/tools/render-utils.js +26 -0
  129. package/dist/core/tools/render-utils.js.map +1 -1
  130. package/dist/core/tools/tool-definition.d.ts +21 -2
  131. package/dist/core/tools/tool-definition.d.ts.map +1 -1
  132. package/dist/core/tools/tool-definition.js.map +1 -1
  133. package/dist/main.d.ts.map +1 -1
  134. package/dist/main.js +3 -6
  135. package/dist/main.js.map +1 -1
  136. package/dist/modes/interactive/components/agents-view.d.ts +57 -0
  137. package/dist/modes/interactive/components/agents-view.d.ts.map +1 -0
  138. package/dist/modes/interactive/components/agents-view.js +260 -0
  139. package/dist/modes/interactive/components/agents-view.js.map +1 -0
  140. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  141. package/dist/modes/interactive/components/custom-editor.js +2 -2
  142. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  143. package/dist/modes/interactive/components/footer.d.ts +15 -0
  144. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  145. package/dist/modes/interactive/components/footer.js +90 -9
  146. package/dist/modes/interactive/components/footer.js.map +1 -1
  147. package/dist/modes/interactive/components/scoped-models-selector.d.ts +1 -1
  148. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  149. package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
  150. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  151. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  152. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  153. package/dist/modes/interactive/components/settings-selector.js +12 -2
  154. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  155. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  156. package/dist/modes/interactive/components/thinking-selector.js +1 -1
  157. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  158. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  159. package/dist/modes/interactive/components/tool-execution.js +89 -10
  160. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  161. package/dist/modes/interactive/components/user-message-selector.d.ts +3 -0
  162. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  163. package/dist/modes/interactive/components/user-message-selector.js +9 -3
  164. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  165. package/dist/modes/interactive/components/workflow-view.d.ts +119 -0
  166. package/dist/modes/interactive/components/workflow-view.d.ts.map +1 -0
  167. package/dist/modes/interactive/components/workflow-view.js +638 -0
  168. package/dist/modes/interactive/components/workflow-view.js.map +1 -0
  169. package/dist/modes/interactive/interactive-commands.d.ts +22 -0
  170. package/dist/modes/interactive/interactive-commands.d.ts.map +1 -1
  171. package/dist/modes/interactive/interactive-commands.js +56 -0
  172. package/dist/modes/interactive/interactive-commands.js.map +1 -1
  173. package/dist/modes/interactive/interactive-mode.d.ts +51 -1
  174. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  175. package/dist/modes/interactive/interactive-mode.js +218 -37
  176. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  177. package/dist/modes/interactive/interactive-selectors.d.ts +2 -4
  178. package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
  179. package/dist/modes/interactive/interactive-selectors.js +10 -1
  180. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  181. package/dist/modes/print-mode.d.ts.map +1 -1
  182. package/dist/modes/print-mode.js +5 -0
  183. package/dist/modes/print-mode.js.map +1 -1
  184. package/dist/modes/rpc/rpc-client.d.ts +3 -1
  185. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  186. package/dist/modes/rpc/rpc-client.js +4 -2
  187. package/dist/modes/rpc/rpc-client.js.map +1 -1
  188. package/dist/modes/rpc/rpc-types.d.ts +1 -0
  189. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  190. package/dist/modes/rpc/rpc-types.js.map +1 -1
  191. package/dist/plugins/ecosystem/bootstrap-factory-manifest.d.ts.map +1 -1
  192. package/dist/plugins/ecosystem/bootstrap-factory-manifest.js +7 -0
  193. package/dist/plugins/ecosystem/bootstrap-factory-manifest.js.map +1 -1
  194. package/dist/plugins/ecosystem/cli.d.ts.map +1 -1
  195. package/dist/plugins/ecosystem/cli.js +1 -1
  196. package/dist/plugins/ecosystem/cli.js.map +1 -1
  197. package/dist/plugins/ecosystem/install-store-paths.d.ts +15 -0
  198. package/dist/plugins/ecosystem/install-store-paths.d.ts.map +1 -0
  199. package/dist/plugins/ecosystem/install-store-paths.js +58 -0
  200. package/dist/plugins/ecosystem/install-store-paths.js.map +1 -0
  201. package/dist/plugins/ecosystem/node-disk-registry-source.d.ts.map +1 -1
  202. package/dist/plugins/ecosystem/node-disk-registry-source.js +3 -8
  203. package/dist/plugins/ecosystem/node-disk-registry-source.js.map +1 -1
  204. package/dist/plugins/ecosystem/node-package-install-host.d.ts.map +1 -1
  205. package/dist/plugins/ecosystem/node-package-install-host.js +9 -1
  206. package/dist/plugins/ecosystem/node-package-install-host.js.map +1 -1
  207. package/dist/plugins/ecosystem/node-package-install-persistence.d.ts.map +1 -1
  208. package/dist/plugins/ecosystem/node-package-install-persistence.js +3 -8
  209. package/dist/plugins/ecosystem/node-package-install-persistence.js.map +1 -1
  210. package/dist/profile/plugin-profiles.d.ts +2 -0
  211. package/dist/profile/plugin-profiles.d.ts.map +1 -1
  212. package/dist/profile/plugin-profiles.js +4 -0
  213. package/dist/profile/plugin-profiles.js.map +1 -1
  214. package/dist/profiles/builtin-suites.d.ts +19 -2
  215. package/dist/profiles/builtin-suites.d.ts.map +1 -1
  216. package/dist/profiles/builtin-suites.js +20 -2
  217. package/dist/profiles/builtin-suites.js.map +1 -1
  218. package/dist/profiles/suite-loader.d.ts.map +1 -1
  219. package/dist/profiles/suite-loader.js +4 -1
  220. package/dist/profiles/suite-loader.js.map +1 -1
  221. package/dist/utils/clipboard.d.ts.map +1 -1
  222. package/dist/utils/clipboard.js +10 -10
  223. package/dist/utils/clipboard.js.map +1 -1
  224. package/dist/utils/shell.d.ts +1 -3
  225. package/dist/utils/shell.d.ts.map +1 -1
  226. package/dist/utils/shell.js +3 -30
  227. package/dist/utils/shell.js.map +1 -1
  228. package/docs/keybindings.md +8 -8
  229. package/docs/models.md +1 -1
  230. package/docs/rpc.md +3 -1
  231. package/docs/settings.md +2 -1
  232. package/package.json +4 -4
  233. package/dist/bundle/chunks/anthropic-messages-EVFQ6MLR.js +0 -6
  234. package/dist/bundle/chunks/chunk-F6SBZUJG.js +0 -141
  235. package/dist/bundle/chunks/chunk-NUHFSC37.js +0 -25
  236. package/dist/bundle/chunks/google-generative-ai-ISTTUZMW.js +0 -2
  237. package/dist/bundle/chunks/google-vertex-NS7ZF7DK.js +0 -2
  238. package/dist/bundle/chunks/mistral-conversations-GINO6Z4I.js +0 -5
package/dist/core/sdk.js CHANGED
@@ -2,7 +2,7 @@ import { existsSync, realpathSync } from "node:fs";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { join, resolve } from "node:path";
4
4
  import { Agent, setDefaultStreamFn, } from "@agent-forge/agent-core";
5
- import { clampThinkingLevel, streamSimple } from "@agent-forge/ai/compat";
5
+ import { clampThinkingLevel, streamSimple, } from "@agent-forge/ai/compat";
6
6
  import { createSubagentMailbox } from "@agent-forge/protocol/subagent";
7
7
  import { satisfies } from "semver";
8
8
  import { BUILTIN_CAPABILITY_PACKAGE_IDS } from "../capabilities/builtin.js";
@@ -20,6 +20,7 @@ import { formatNoModelsAvailableMessage } from "./auth-guidance.js";
20
20
  import { DEFAULT_THINKING_LEVEL } from "./defaults.js";
21
21
  import { discoverCapabilityPluginManifests, parseCapabilityPluginManifest } from "./extensions/capability-plugin.js";
22
22
  import { resolvePluginCapabilityOrder } from "./extensions/capability-runtime.js";
23
+ import { installProviderFailoverPlugin, readProviderFailoverSettingsNode } from "./extensions/provider-failover.js";
23
24
  import { createCodingAgentFacade } from "./facade/coding-agent-facade.js";
24
25
  import { createCodingAgentRuntimeFacade, } from "./facade/coding-agent-runtime-facade.js";
25
26
  import { convertToLlm } from "./messages.js";
@@ -118,6 +119,18 @@ const SUBAGENT_DELEGATE_PACKAGE_ID = "agent-forge.plugin.subagent-delegate";
118
119
  * membership set entirely (禁用 = 不装配, plus one startup diagnostic).
119
120
  */
120
121
  const MEMORY_PACKAGE_ID = "agent-forge.plugin.memory";
122
+ /**
123
+ * Plugin id of the standalone image-generation package (供应商能力槽位设计
124
+ * §3.3 装配注入): at load the assembler overrides its manifest config with the
125
+ * settings slot (`capabilities.imageGeneration`, validated fail-closed by
126
+ * `SettingsManager.getCapabilitiesSettings()`) plus the models.json image-model
127
+ * catalog snapshot (`imageModelCatalog`, projected by
128
+ * `ModelRuntime.getImageModelCatalog()`) — the exact config keys the package's
129
+ * capability reads (`api.config.imageGeneration` / `api.config.imageModelCatalog`).
130
+ * The agent-dir config file still merges over it inside the plugin entry, so
131
+ * users keep the final say.
132
+ */
133
+ const IMAGE_GENERATION_PACKAGE_ID = "agent-forge.plugin.image-generation";
121
134
  const isMemoryModeV1 = (value) => value === "off" || value === "light" || value === "full";
122
135
  function resolveSdkMemoryMode(explicitMode, env, settingsMode) {
123
136
  if (explicitMode !== undefined) {
@@ -594,31 +607,53 @@ export async function createAgentSession(options = {}) {
594
607
  const effectiveTimeoutMs = httpIdleTimeoutMs === 0 ? 2147483647 : httpIdleTimeoutMs;
595
608
  const timeoutMs = options?.timeoutMs ?? providerRetrySettings.timeoutMs ?? effectiveTimeoutMs;
596
609
  const websocketConnectTimeoutMs = options?.websocketConnectTimeoutMs ?? settingsManager.getWebSocketConnectTimeoutMs();
597
- try {
598
- return modelRuntime.streamSimple(model, context, {
599
- ...options,
600
- timeoutMs,
601
- websocketConnectTimeoutMs,
602
- maxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,
603
- maxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,
604
- transformHeaders: async (requestHeaders) => {
605
- const session = agentSessionRef.current;
606
- // v8 ignore next -- 流式请求仅在会话初始化后发生,session 恒已赋值
607
- if (!session)
608
- throw new Error("Capability runtime is not initialized for provider request");
609
- return session.getCapabilityRuntime().transformProviderHeaders({
610
- model,
611
- ...(options?.sessionId === undefined ? {} : { sessionId: options.sessionId }),
612
- headers: requestHeaders,
613
- });
614
- },
610
+ // 默认闭包:底层 streamSimple 调用(请求预算/超时按本次调用捕获;header
611
+ // 变换闭包绑定请求模型参数,使换道重放后的备用模型也走各自变换)。
612
+ const baseStreamFn = (requestModel, requestContext, requestOptions) => {
613
+ try {
614
+ return modelRuntime.streamSimple(requestModel, requestContext, {
615
+ ...requestOptions,
616
+ timeoutMs,
617
+ websocketConnectTimeoutMs,
618
+ maxRetries: requestOptions?.maxRetries ?? providerRetrySettings.maxRetries,
619
+ maxRetryDelayMs: requestOptions?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,
620
+ transformHeaders: async (requestHeaders) => {
621
+ const session = agentSessionRef.current;
622
+ // v8 ignore next -- 流式请求仅在会话初始化后发生,session 恒已赋值
623
+ if (!session)
624
+ throw new Error("Capability runtime is not initialized for provider request");
625
+ return session.getCapabilityRuntime().transformProviderHeaders({
626
+ model: requestModel,
627
+ ...(requestOptions?.sessionId === undefined
628
+ ? {}
629
+ : { sessionId: requestOptions.sessionId }),
630
+ headers: requestHeaders,
631
+ });
632
+ },
633
+ });
634
+ }
635
+ catch (error) {
636
+ // streamFn 错误路径打点(设计 §5.2):保留原始错误向上传播。
637
+ hostLogger?.error("sdk", "provider stream failed", { cause: error });
638
+ throw error;
639
+ }
640
+ };
641
+ // streamFn wrapper 链(provider-failover 家族注册面,设计 供应商能力槽位
642
+ // 与主备切换 §4.8):注册的 wrapper 按注册序包在默认闭包外层(先注册者最
643
+ // 外层),wrapper 拿到的 next 即链上下一个直至底层默认调用。每次请求时从
644
+ // 会话 capability runtime 读取,使嵌入式 failover 插件(会话构造后装配)与
645
+ // 后续加载的第三方 wrapper 都进入链中。调用方显式传 options.streamFn 的会话
646
+ // 整体绕过本装配(含 wrapper),不参与 failover——已知边界。
647
+ const wrappers = agentSessionRef.current?.getCapabilityRuntime().getStreamFnWrappers() ?? [];
648
+ let chain = baseStreamFn;
649
+ for (let index = wrappers.length - 1; index >= 0; index -= 1) {
650
+ const wrapper = wrappers[index];
651
+ const inner = chain;
652
+ chain = (requestModel, requestContext, requestOptions) => wrapper(requestModel, requestContext, requestOptions, (nextModel, nextContext, nextOptions) => inner(nextModel, nextContext, nextOptions), {
653
+ resolveModel: (provider, modelId) => modelRuntime.getModel(provider, modelId),
615
654
  });
616
655
  }
617
- catch (error) {
618
- // streamFn 错误路径打点(设计 §5.2):保留原始错误向上传播。
619
- hostLogger?.error("sdk", "provider stream failed", { cause: error });
620
- throw error;
621
- }
656
+ return chain(model, context, options);
622
657
  },
623
658
  onPayload: async (payload, model) => {
624
659
  // 轨迹快照(设计 §4.2 llm.request):最终 payload 转发给装配域收集器;
@@ -784,6 +819,28 @@ export async function createAgentSession(options = {}) {
784
819
  ...(capabilitySkillsFilter === undefined ? {} : { capabilitySkillsFilter }),
785
820
  });
786
821
  agentSessionRef.current = session;
822
+ // provider-failover 装配(设计 供应商能力槽位与主备切换 §4.8):嵌入式第一方
823
+ // 插件经公共 registerStreamFnWrapper 注册面挂进上方默认 streamFn 装配(此处早于
824
+ // 下方外部插件装载,故 failover wrapper 位于链最外层,观察到的是其余 wrapper 与
825
+ // 默认闭包之后的最终流)。熔断状态是模块级单例,随进程生命周期跨会话共享(§4.2)。
826
+ // 配置从 settings `failover` 节原始读出(未配置 / enabled:false / 配置错误则不装配);
827
+ // 装配失败只警告——可靠性能力不得阻断会话构造。装载预检(§4.6)随装配同步执行:
828
+ // 检查面全部为 modelRuntime 静态读取(目录解析/provider 存在/凭据条目快照),
829
+ // 零网络请求、不触发 OAuth 刷新。
830
+ try {
831
+ installProviderFailoverPlugin(session.getCapabilityRuntime(), {
832
+ failoverSettings: readProviderFailoverSettingsNode(settingsManager),
833
+ preflight: {
834
+ resolveModel: (provider, modelId) => modelRuntime.getModel(provider, modelId),
835
+ hasProvider: (providerId) => modelRuntime.getProvider(providerId) !== undefined,
836
+ hasConfiguredAuth: (providerId) => modelRuntime.hasConfiguredAuth(providerId),
837
+ },
838
+ hostLogger,
839
+ });
840
+ }
841
+ catch (error) {
842
+ hostLogger?.warn("sdk", "provider failover plugin load failed", { cause: error });
843
+ }
787
844
  // Session-suite binding (设计 §10.1): record the suite as session protocol
788
845
  // data via the existing custom-entry extension point. New sessions only;
789
846
  // resumed sessions keep their original binding.
@@ -1014,6 +1071,11 @@ export async function createAgentSession(options = {}) {
1014
1071
  }
1015
1072
  }
1016
1073
  const pathByManifest = new Map([...survivors].map((entry) => [entry.manifest, entry.path]));
1074
+ // 生图槽位注入供料(供应商能力槽位设计 §3.3):settings 槽位经 settings-manager
1075
+ // 校验后的读面取(非法形状已 fail-closed 丢弃并记 warning),目录快照经
1076
+ // ModelRuntime 投影 models.json 登记项(装配期静态数据)。
1077
+ const imageGenerationSlot = settingsManager.getCapabilitiesSettings()?.imageGeneration;
1078
+ const imageModelCatalog = modelRuntime.getImageModelCatalog();
1017
1079
  for (const manifest of resolvePluginCapabilityOrder([...survivors].map((entry) => entry.manifest))) {
1018
1080
  const manifestPath = pathByManifest.get(manifest);
1019
1081
  // v8 ignore next -- 顺序解析返回的 manifest 均来自同一 survivors 集合,路径恒存在
@@ -1042,6 +1104,27 @@ export async function createAgentSession(options = {}) {
1042
1104
  },
1043
1105
  }
1044
1106
  : {}),
1107
+ // 生图槽位注入(供应商能力槽位设计 §3.3):settings 槽位(provider/model,
1108
+ // model 可省)与 models.json 生图目录快照经公共 configOverride 通道注入
1109
+ // image-generation 插件包;插件按六层取值链消费(设计 §3.2)。槽位缺省时
1110
+ // 只注入快照——插件回落到 env/主推断/唯一候选推断。
1111
+ ...(manifest.id === IMAGE_GENERATION_PACKAGE_ID
1112
+ ? {
1113
+ configOverride: {
1114
+ ...(imageGenerationSlot === undefined
1115
+ ? {}
1116
+ : {
1117
+ imageGeneration: {
1118
+ provider: imageGenerationSlot.provider,
1119
+ ...(imageGenerationSlot.model === undefined
1120
+ ? {}
1121
+ : { model: imageGenerationSlot.model }),
1122
+ },
1123
+ }),
1124
+ imageModelCatalog,
1125
+ },
1126
+ }
1127
+ : {}),
1045
1128
  });
1046
1129
  }
1047
1130
  catch (error) {