@xopcai/xopc 0.0.165 → 0.0.167

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 (180) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/{activity-store-DkALQFJT.js → activity-store-DjEDu38T.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CKVX2TyD.js → agent-avatar-dicebear-DQULz7qY.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-CnzkBgKC.js +2 -0
  7. package/dist/gateway/static/root/assets/{api-DPIXEcIq.js → api-DwVCuPOb.js} +1 -1
  8. package/dist/gateway/static/root/assets/{app-management-settings-panel-ClToHdDF.js → app-management-settings-panel-DOjWALVF.js} +1 -1
  9. package/dist/gateway/static/root/assets/{appearance-settings-Ci2jWAkQ.js → appearance-settings-C31COUIC.js} +1 -1
  10. package/dist/gateway/static/root/assets/{apps-page-DCow0nte.js → apps-page-lSC486eu.js} +1 -1
  11. package/dist/gateway/static/root/assets/{archive-plugin-CKv5A1_M.js → archive-plugin-DQPvLqfx.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-LgoN-Vwo.js → attachment-load-DwT1x1rc.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automation-suggestion-card-BwnZqDQE.js → automation-suggestion-card-ByYBiiMR.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automations-page-DWWHMqCZ.js → automations-page-iZTnc1YZ.js} +1 -1
  15. package/dist/gateway/static/root/assets/{binary-plugins-WwMRnBdP.js → binary-plugins-CRXiHoZS.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-CThEfJSn.js → block-editor-CHO6ILiz.js} +3 -3
  17. package/dist/gateway/static/root/assets/{browser-settings-page-7x8rKLOl.js → browser-settings-page-C-OOPZcJ.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflow-inputs-DCj9DG0A.js → browser-workflow-inputs-3UaarfXS.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-workflows-page-C1k2vHLV.js → browser-workflows-page-BFaa-N_D.js} +1 -1
  20. package/dist/gateway/static/root/assets/capabilities-settings-panel-BayH0Uom.js +7 -0
  21. package/dist/gateway/static/root/assets/capability-presets-api-DdCHSzcA.js +1 -0
  22. package/dist/gateway/static/root/assets/capability-presets-settings-panel-JlhjAhT7.js +2 -0
  23. package/dist/gateway/static/root/assets/{channel-recipient-api-B5rLegwk.js → channel-recipient-api-BOkLI89e.js} +1 -1
  24. package/dist/gateway/static/root/assets/{channels-settings-DU93p9RZ.js → channels-settings-C-Spmwr5.js} +1 -1
  25. package/dist/gateway/static/root/assets/channels-status-swr-ZrqadU60.js +1 -0
  26. package/dist/gateway/static/root/assets/{connector-logo-au5xzRMl.js → connector-logo-CbcC0T6i.js} +1 -1
  27. package/dist/gateway/static/root/assets/{connectors-page-B9sD56hT.js → connectors-page-DpDmJ3Nx.js} +1 -1
  28. package/dist/gateway/static/root/assets/{desktop-pet-CaTO9bAV.js → desktop-pet-CR7RGQff.js} +1 -1
  29. package/dist/gateway/static/root/assets/{desktop-pet-settings-CORq2BIE.js → desktop-pet-settings-BudmCcPE.js} +1 -1
  30. package/dist/gateway/static/root/assets/{directory-picker-path-field-Daf0tqrN.js → directory-picker-path-field-BLG2Oe6z.js} +1 -1
  31. package/dist/gateway/static/root/assets/{dreaming-settings-CJqJpvgc.js → dreaming-settings-BwBGC0SG.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-debug-page-0XmiUqsm.js → extension-debug-page-Pr65_hLC.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-page-C_9HSvyu.js → extension-page-BuJDcoKn.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-settings-page-DcmUCmOu.js → extension-settings-page-B3802tn5.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-config-api-CZqfsxJf.js → gateway-config-api-D-NVkfts.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-settings-CzX8TVmO.js → gateway-settings-DIdsKVXv.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-startup-retry-ulwTJovP.js → gateway-startup-retry-qnEmj-vL.js} +1 -1
  38. package/dist/gateway/static/root/assets/{goal-create-dialog-Dbj_sgV-.js → goal-create-dialog-51j_DxgV.js} +1 -1
  39. package/dist/gateway/static/root/assets/{goal-detail-page-BdkiZwW-.js → goal-detail-page-CeqMr5GF.js} +1 -1
  40. package/dist/gateway/static/root/assets/{goals-config-api-Cvlq3jyf.js → goals-config-api-BkVBh7ct.js} +1 -1
  41. package/dist/gateway/static/root/assets/{goals-page-BD9ztXNA.js → goals-page-lf3oM4Xa.js} +1 -1
  42. package/dist/gateway/static/root/assets/{goals-settings-CSGvHJDi.js → goals-settings-Cg7MJLvx.js} +1 -1
  43. package/dist/gateway/static/root/assets/{heartbeat-settings-BvXA7oNN.js → heartbeat-settings-BV3kJOcX.js} +1 -1
  44. package/dist/gateway/static/root/assets/{index-CfOzvGDb.js → index-B24B26og.js} +9 -9
  45. package/dist/gateway/static/root/assets/index-DfE2j0g8.css +1 -0
  46. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-B9K5rTZZ.js +1 -0
  47. package/dist/gateway/static/root/assets/{local-app-workbench-page-DH4nglP_.js → local-app-workbench-page-ehzr9CBG.js} +1 -1
  48. package/dist/gateway/static/root/assets/{local-apps-page-BScdXqMo.js → local-apps-page-BBx6mfAD.js} +1 -1
  49. package/dist/gateway/static/root/assets/locale-store-tnRLWdx2.js +1 -0
  50. package/dist/gateway/static/root/assets/{logs-page-BBpAWjyF.js → logs-page-xuwEkusZ.js} +1 -1
  51. package/dist/gateway/static/root/assets/{markdown-split-8hnAS25m.js → markdown-split-DRDddIt8.js} +1 -1
  52. package/dist/gateway/static/root/assets/{media-plugins-DzlHseMD.js → media-plugins-Dn3hxhOV.js} +1 -1
  53. package/dist/gateway/static/root/assets/{messages-C96Zjb0V.js → messages-B1EG4gdu.js} +2 -4
  54. package/dist/gateway/static/root/assets/{notes-page-DbDHFPiI.js → notes-page-BtKHSb4z.js} +1 -1
  55. package/dist/gateway/static/root/assets/{notes-workbench-B-A9whbg.js → notes-workbench-DXGXn5XF.js} +2 -2
  56. package/dist/gateway/static/root/assets/{page-tabs-CXJiygUJ.js → page-tabs-P2BEd1D8.js} +1 -1
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-Cq6aue5a.js → preview-open-alternatives-DrkjmW0F.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-nP8vuNlJ.js → product-open-page-CGzMEowb.js} +1 -1
  59. package/dist/gateway/static/root/assets/{project-detail-page-BXrscUbq.js → project-detail-page-IiE2ddWb.js} +1 -1
  60. package/dist/gateway/static/root/assets/{projects-page-m0EKUeaY.js → projects-page-DGOVhaYI.js} +1 -1
  61. package/dist/gateway/static/root/assets/{remote-access-hub-B16uQSY5.js → remote-access-hub-l_y_Shgl.js} +1 -1
  62. package/dist/gateway/static/root/assets/{save-bar-controls-BPgnLY1p.js → save-bar-controls-BkGrufxl.js} +1 -1
  63. package/dist/gateway/static/root/assets/{schedule-field-rHWpueWl.js → schedule-field-A8tDpL-9.js} +1 -1
  64. package/dist/gateway/static/root/assets/{schema-form-CHKIUrzk.js → schema-form-N6_hDWgx.js} +1 -1
  65. package/dist/gateway/static/root/assets/{sessions-page-C5_qtznc.js → sessions-page-CAX4ipPv.js} +1 -1
  66. package/dist/gateway/static/root/assets/settings-advanced-gate-eVlH9brU.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-form-section-CR4J0N4X.js → settings-form-section-Bb6yYt5f.js} +1 -1
  68. package/dist/gateway/static/root/assets/{settings-loading-skeleton-B8v-lHKT.js → settings-loading-skeleton-Q_Vh6HEl.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-page-BcLf8Rd5.js → settings-page-CjOtQpbR.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-layout-Co31Becn.js → settings-page-layout-CtESNNdx.js} +1 -1
  71. package/dist/gateway/static/root/assets/{setup-status-panel-BFLA1Fsj.js → setup-status-panel-CGxHXgJB.js} +1 -1
  72. package/dist/gateway/static/root/assets/{share-preview-page-B5vMe8DY.js → share-preview-page-C65IsFmd.js} +1 -1
  73. package/dist/gateway/static/root/assets/{shares-settings-DL2tKPq6.js → shares-settings-Ct3fcbHr.js} +1 -1
  74. package/dist/gateway/static/root/assets/skill-reload-api-ElA5kabh.js +1 -0
  75. package/dist/gateway/static/root/assets/{skills-page-DAOZXlp5.js → skills-page-FeieOEn3.js} +1 -1
  76. package/dist/gateway/static/root/assets/{system-settings-panel-CHt3FXI8.js → system-settings-panel-CdUl2I0D.js} +1 -1
  77. package/dist/gateway/static/root/assets/{theme-store-D37XLD_C.js → theme-store-H9T49Iar.js} +1 -1
  78. package/dist/gateway/static/root/assets/{time-picker-C9Rr1IUV.js → time-picker-EkhqT3fS.js} +1 -1
  79. package/dist/gateway/static/root/assets/{typed-models-lib-QMF30Yvh.js → typed-models-lib-5xRRUE9Y.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-channel-catalog-DBh0dOC9.js → use-channel-catalog-UACJTyH0.js} +1 -1
  81. package/dist/gateway/static/root/assets/{user-context-page-D6EEhj-e.js → user-context-page-DHiRvd4i.js} +1 -1
  82. package/dist/gateway/static/root/assets/{voice-api-key-field-Gjjs3qih.js → voice-api-key-field-Bql0SPCp.js} +1 -1
  83. package/dist/gateway/static/root/assets/{work-discovery-page-CDnL9daG.js → work-discovery-page-BcmZux7y.js} +1 -1
  84. package/dist/gateway/static/root/assets/{work-item-detail-page-BCoT4p1E.js → work-item-detail-page-D94Q5zVD.js} +1 -1
  85. package/dist/gateway/static/root/assets/{work-page-l8h2Y50w.js → work-page-DdFBMDcB.js} +1 -1
  86. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DnOfronD.js → workflow-run-setup-panel-Dow7ZztR.js} +1 -1
  87. package/dist/gateway/static/root/assets/{workflows-page-IVbQ83CW.js → workflows-page-wOVSoduy.js} +1 -1
  88. package/dist/gateway/static/root/index.html +8 -8
  89. package/dist/package.js +1 -1
  90. package/dist/src/agent/agent-manager.js +3 -3
  91. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
  92. package/dist/src/agent/embedded/model-runtime.js +1 -1
  93. package/dist/src/agent/goals/post-turn.js +1 -1
  94. package/dist/src/agent/image/generation/custom-openai-images-provider.d.ts +7 -0
  95. package/dist/src/agent/image/generation/custom-openai-images-provider.js +81 -0
  96. package/dist/src/agent/image/generation/{openai-compatible-image-provider.d.ts → openai-images-provider.d.ts} +10 -31
  97. package/dist/src/agent/image/generation/{openai-compatible-image-provider.js → openai-images-provider.js} +36 -23
  98. package/dist/src/agent/image/generation/provider-registry.d.ts +2 -0
  99. package/dist/src/agent/image/generation/provider-registry.js +50 -4
  100. package/dist/src/agent/image/generation/providers/openai.js +2 -2
  101. package/dist/src/agent/image/generation/runtime.js +5 -1
  102. package/dist/src/agent/image/generation/types.d.ts +11 -0
  103. package/dist/src/agent/image/tool-model-config.js +1 -1
  104. package/dist/src/agent/ipc/inbox.js +1 -1
  105. package/dist/src/agent/memory/dreaming/config.js +1 -1
  106. package/dist/src/agent/service.js +2 -2
  107. package/dist/src/agent/skills/hub-lock.js +1 -1
  108. package/dist/src/agent-runtime/index.js +1 -1
  109. package/dist/src/agent-runtime/runtime-profile.js +1 -1
  110. package/dist/src/auth/credentials.js +2 -2
  111. package/dist/src/auth/profiles/store.js +1 -1
  112. package/dist/src/auth/sync-provider-auth.js +2 -2
  113. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  114. package/dist/src/cli/commands/channels.js +1 -1
  115. package/dist/src/cli/commands/connectors.js +2 -2
  116. package/dist/src/cli/commands/doctor/checks/image-providers.d.ts +2 -0
  117. package/dist/src/cli/commands/doctor/checks/image-providers.js +68 -0
  118. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  119. package/dist/src/cli/commands/doctor/flow.js +2 -0
  120. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  121. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  122. package/dist/src/cli/commands/models.js +2 -2
  123. package/dist/src/cli/commands/onboard.js +1 -1
  124. package/dist/src/cli/commands/update.js +1 -1
  125. package/dist/src/config/agent-profile.js +1 -1
  126. package/dist/src/config/index.js +5 -5
  127. package/dist/src/config/loader.js +1 -1
  128. package/dist/src/config/models-json.d.ts +325 -0
  129. package/dist/src/config/models-json.js +140 -5
  130. package/dist/src/connectors/connector-memory-sync.js +1 -1
  131. package/dist/src/connectors/health.js +1 -1
  132. package/dist/src/extensions/lockfile.js +1 -1
  133. package/dist/src/extensions/sdk/index.js +1 -1
  134. package/dist/src/gateway/agents-admin.js +2 -2
  135. package/dist/src/gateway/custom-image-providers.d.ts +89 -0
  136. package/dist/src/gateway/custom-image-providers.js +59 -0
  137. package/dist/src/gateway/file-path-classifier.js +1 -1
  138. package/dist/src/gateway/heartbeat/service.js +1 -1
  139. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  140. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  141. package/dist/src/gateway/hono/routes/models.js +183 -2
  142. package/dist/src/gateway/hono/routes/update.js +2 -2
  143. package/dist/src/gateway/image-generation-setup.js +7 -1
  144. package/dist/src/gateway/index.js +1 -1
  145. package/dist/src/gateway/run-loop.js +1 -1
  146. package/dist/src/gateway/service/config-coordinator.js +3 -1
  147. package/dist/src/gateway/service.js +6 -6
  148. package/dist/src/goals/goal-workflow-judge.js +1 -1
  149. package/dist/src/heartbeat/index.js +1 -1
  150. package/dist/src/infra/gateway-processes.js +1 -1
  151. package/dist/src/infra/update-restart.js +1 -1
  152. package/dist/src/infra/update-runner.js +2 -2
  153. package/dist/src/infra/update-startup.js +1 -1
  154. package/dist/src/mcp/channel-bridge.js +1 -1
  155. package/dist/src/media-shared/http/index.d.ts +1 -1
  156. package/dist/src/media-shared/http/index.js +2 -2
  157. package/dist/src/media-shared/http/provider-http.d.ts +2 -0
  158. package/dist/src/media-shared/http/provider-http.js +43 -4
  159. package/dist/src/notes/service.js +1 -1
  160. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  161. package/dist/src/providers/index.js +7 -4
  162. package/dist/src/providers/model-ref.d.ts +6 -0
  163. package/dist/src/providers/model-ref.js +15 -0
  164. package/dist/src/providers/model-reference-auditor.d.ts +1 -0
  165. package/dist/src/providers/model-reference-auditor.js +23 -13
  166. package/dist/src/providers/model-registry.js +6 -3
  167. package/dist/src/tui/tui-startup-resources.js +2 -2
  168. package/dist/src/tui/tui.js +1 -1
  169. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  170. package/package.json +2 -2
  171. package/dist/gateway/static/root/assets/agents-F8749KZ_.js +0 -2
  172. package/dist/gateway/static/root/assets/capabilities-settings-panel-DIwGIpuS.js +0 -2
  173. package/dist/gateway/static/root/assets/capability-presets-api-C_NVbV7o.js +0 -1
  174. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DBdvIcV0.js +0 -2
  175. package/dist/gateway/static/root/assets/channels-status-swr-DZZq0upi.js +0 -1
  176. package/dist/gateway/static/root/assets/index-BXtJvaQl.css +0 -1
  177. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-xb6mna1C.js +0 -1
  178. package/dist/gateway/static/root/assets/locale-store-C_ax27uc.js +0 -1
  179. package/dist/gateway/static/root/assets/settings-advanced-gate-DQlbm1mA.js +0 -1
  180. package/dist/gateway/static/root/assets/skill-reload-api-C8jkuLob.js +0 -1
@@ -4,5 +4,5 @@ import { BlockedPrivateNetworkError, assertNotPrivateNetwork, classifyHost, defa
4
4
  import { resolveProviderHttpRequestConfig } from "./resolve-provider-http-request-config.js";
5
5
  import { ProviderHttpError, assertOk, assertOkOrThrowHttpError, assertOkOrThrowProviderError, createProviderHttpError, extractProviderErrorDetail, extractProviderRequestId, extractVendorErrorFields, formatProviderErrorPayload, formatProviderHttpErrorMessage, readResponseTextLimited, truncateErrorDetail } from "./provider-http-errors.js";
6
6
  import { SsrfBlockedError, assertSafeUrl, isPrivateIpAddress, isPrivateIpv4, isPrivateIpv6 } from "./ssrf-guard.js";
7
- import { createProviderOperationDeadline, fetchWithTimeoutGuarded, getJsonRequest, normalizeBaseUrl, postJsonRequest, postMultipartRequest, waitProviderOperationPollInterval } from "./provider-http.js";
8
- export { BlockedPrivateNetworkError, ProviderHttpError, SsrfBlockedError, TimeoutAbortError, assertNotPrivateNetwork, assertOk, assertOkOrThrowHttpError, assertOkOrThrowProviderError, assertSafeUrl, classifyHost, collectProviderApiKeysForExecution, createProviderHttpError, createProviderOperationDeadline, defaultPolicy as defaultPrivateNetworkPolicy, executeWithApiKeyRotation, extractProviderErrorDetail, extractProviderRequestId, extractVendorErrorFields, fetchWithTimeoutGuarded, formatProviderErrorPayload, formatProviderHttpErrorMessage, getJsonRequest, isPrivateIpAddress, isPrivateIpv4, isPrivateIpv6, isRotatableAuthFailure, isTimeoutAbortError, normalizeBaseUrl, pickEffectiveTimeoutMs, pickTimeoutMsOrFallback, postJsonRequest, postMultipartRequest, privateNetworkPolicyToSsrfGuardOptions, readResponseTextLimited, resolveDeadline, resolveProviderHttpRequestConfig, truncateErrorDetail, waitProviderOperationPollInterval };
7
+ import { createProviderOperationDeadline, fetchWithTimeoutGuarded, getJsonRequest, normalizeBaseUrl, postJsonRequest, postMultipartRequest, readJsonResponseLimited, waitProviderOperationPollInterval } from "./provider-http.js";
8
+ export { BlockedPrivateNetworkError, ProviderHttpError, SsrfBlockedError, TimeoutAbortError, assertNotPrivateNetwork, assertOk, assertOkOrThrowHttpError, assertOkOrThrowProviderError, assertSafeUrl, classifyHost, collectProviderApiKeysForExecution, createProviderHttpError, createProviderOperationDeadline, defaultPolicy as defaultPrivateNetworkPolicy, executeWithApiKeyRotation, extractProviderErrorDetail, extractProviderRequestId, extractVendorErrorFields, fetchWithTimeoutGuarded, formatProviderErrorPayload, formatProviderHttpErrorMessage, getJsonRequest, isPrivateIpAddress, isPrivateIpv4, isPrivateIpv6, isRotatableAuthFailure, isTimeoutAbortError, normalizeBaseUrl, pickEffectiveTimeoutMs, pickTimeoutMsOrFallback, postJsonRequest, postMultipartRequest, privateNetworkPolicyToSsrfGuardOptions, readJsonResponseLimited, readResponseTextLimited, resolveDeadline, resolveProviderHttpRequestConfig, truncateErrorDetail, waitProviderOperationPollInterval };
@@ -39,6 +39,8 @@ export interface GetJsonRequestOptions extends ProviderHttpRequestConfig {
39
39
  headers?: Record<string, string> | Headers;
40
40
  }
41
41
  export declare function getJsonRequest(url: string | URL, options: GetJsonRequestOptions): Promise<Response>;
42
+ /** Read and parse a JSON response without allowing an unbounded body allocation. */
43
+ export declare function readJsonResponseLimited(response: Response, maxBytes: number): Promise<unknown>;
42
44
  /**
43
45
  * Normalize a base URL: trim trailing slash, force http(s) scheme.
44
46
  */
@@ -49,7 +49,8 @@ async function postJsonRequest(url, options) {
49
49
  init: {
50
50
  method: "POST",
51
51
  headers,
52
- body: JSON.stringify(options.body)
52
+ body: JSON.stringify(options.body),
53
+ redirect: "error"
53
54
  }
54
55
  });
55
56
  await assertOkOrThrowProviderError(response, options.label);
@@ -62,7 +63,8 @@ async function postMultipartRequest(url, options) {
62
63
  init: {
63
64
  method: "POST",
64
65
  headers,
65
- body: options.body
66
+ body: options.body,
67
+ redirect: "error"
66
68
  }
67
69
  });
68
70
  await assertOkOrThrowProviderError(response, options.label);
@@ -75,12 +77,49 @@ async function getJsonRequest(url, options) {
75
77
  ...options,
76
78
  init: {
77
79
  method: "GET",
78
- headers
80
+ headers,
81
+ redirect: "error"
79
82
  }
80
83
  });
81
84
  await assertOkOrThrowProviderError(response, options.label);
82
85
  return response;
83
86
  }
87
+ /** Read and parse a JSON response without allowing an unbounded body allocation. */
88
+ async function readJsonResponseLimited(response, maxBytes) {
89
+ if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0) throw new Error("JSON response byte limit must be a positive safe integer.");
90
+ const declaredLength = Number.parseInt(response.headers.get("content-length") ?? "", 10);
91
+ if (Number.isFinite(declaredLength) && declaredLength > maxBytes) throw new Error(`Provider JSON response exceeds ${maxBytes} bytes.`);
92
+ const reader = response.body?.getReader();
93
+ if (!reader) throw new Error("Provider returned an empty JSON response.");
94
+ const chunks = [];
95
+ let total = 0;
96
+ try {
97
+ while (true) {
98
+ const { value, done } = await reader.read();
99
+ if (done) break;
100
+ if (!value?.byteLength) continue;
101
+ total += value.byteLength;
102
+ if (total > maxBytes) {
103
+ await reader.cancel().catch(() => {});
104
+ throw new Error(`Provider JSON response exceeds ${maxBytes} bytes.`);
105
+ }
106
+ chunks.push(value);
107
+ }
108
+ } finally {
109
+ reader.releaseLock();
110
+ }
111
+ const body = new Uint8Array(total);
112
+ let offset = 0;
113
+ for (const chunk of chunks) {
114
+ body.set(chunk, offset);
115
+ offset += chunk.byteLength;
116
+ }
117
+ try {
118
+ return JSON.parse(new TextDecoder().decode(body));
119
+ } catch {
120
+ throw new Error("Provider returned invalid JSON.");
121
+ }
122
+ }
84
123
  /**
85
124
  * Normalize a base URL: trim trailing slash, force http(s) scheme.
86
125
  */
@@ -107,4 +146,4 @@ async function waitProviderOperationPollInterval(intervalMs, signal) {
107
146
  await setTimeout$1(intervalMs, void 0, { signal });
108
147
  }
109
148
  //#endregion
110
- export { createProviderOperationDeadline, fetchWithTimeoutGuarded, getJsonRequest, normalizeBaseUrl, postJsonRequest, postMultipartRequest, waitProviderOperationPollInterval };
149
+ export { createProviderOperationDeadline, fetchWithTimeoutGuarded, getJsonRequest, normalizeBaseUrl, postJsonRequest, postMultipartRequest, readJsonResponseLimited, waitProviderOperationPollInterval };
@@ -4,8 +4,8 @@ import { buildNoteAttachmentRef } from "./attachment-ref.js";
4
4
  import { parseNoteMarkdown } from "./note-markdown.js";
5
5
  import { changedFieldsFromPatch, emitActivity, previewText, systemActivityActor, systemActivitySource } from "../activity/emitter.js";
6
6
  import { getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
7
- import { completeWithResolvedCredentials } from "../providers/model-call.js";
8
7
  import { publishAutomationProductEvent } from "../automations/product-events.js";
8
+ import { completeWithResolvedCredentials } from "../providers/model-call.js";
9
9
  import { NotesStore } from "./store.js";
10
10
  import { partitionAttachmentsByReference } from "./note-attachment-sync.js";
11
11
  import { buildNoteAgentContextArtifact, getCachedNoteAgentContextArtifact } from "./agent-context.js";
@@ -1,5 +1,5 @@
1
- import { getApiKeyFromEnv, init_env_keys } from "../env-keys.js";
2
1
  import { init_sync_provider_auth, resolveProviderApiKeyForAgentSync } from "../../auth/sync-provider-auth.js";
2
+ import { getApiKeyFromEnv, init_env_keys } from "../env-keys.js";
3
3
  import { getDefaultAuthProfileStore } from "./auth-profile-store.js";
4
4
  //#region src/providers/auth-runtime/resolve-auth.ts
5
5
  init_env_keys();
@@ -1,10 +1,11 @@
1
1
  import { __esmMin, __exportAll } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
3
+ import { getOAuthProviderIds, init_registry } from "../auth/oauth/registry.js";
4
+ import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync-provider-auth.js";
3
5
  import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
6
+ import { init_model_ref, splitProviderModelRef } from "./model-ref.js";
4
7
  import { ModelRegistry, getModelRegistry, init_model_registry, prewarmModelRegistry, resetModelRegistry } from "./model-registry.js";
5
- import { getOAuthProviderIds, init_registry } from "../auth/oauth/registry.js";
6
8
  import { CredentialResolver, hasCredentials, init_credentials, resolveApiKey } from "../auth/credentials.js";
7
- import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync-provider-auth.js";
8
9
  import { EXTENSION_PROVIDER_BASE_URL, init_constants } from "./constants.js";
9
10
  import { getSupplementalModels, init_model_supplements } from "./model-supplements.js";
10
11
  import { getProviderRegistry, init_plugin_registry } from "./plugin-registry.js";
@@ -90,8 +91,9 @@ function resolveModel(ref) {
90
91
  if (!trimmedRef) throw new Error("No default model configured. Choose a model in onboarding or set agents.capabilityPresets.default.models.roles.<role>.model.");
91
92
  const customModel = getModelRegistry().resolve(trimmedRef);
92
93
  if (customModel) return customModel;
93
- if (trimmedRef.includes("/")) {
94
- const [provider, modelId] = trimmedRef.split("/");
94
+ const qualifiedRef = splitProviderModelRef(trimmedRef);
95
+ if (qualifiedRef) {
96
+ const { provider, modelId } = qualifiedRef;
95
97
  const piAiModel = getModel(provider, modelId);
96
98
  if (piAiModel) return normalizeProviderModel(piAiModel);
97
99
  const supplementalModel = getSupplementalModels().find((m) => m.provider === provider && m.id === modelId);
@@ -316,6 +318,7 @@ var init_providers = __esmMin((() => {
316
318
  init_env_keys();
317
319
  init_constants();
318
320
  init_model_supplements();
321
+ init_model_ref();
319
322
  init_plugin_registry();
320
323
  OPENAI_CODEX_CANONICAL_BASE_URL = "https://chatgpt.com/backend-api/codex";
321
324
  PROVIDER_META = {
@@ -0,0 +1,6 @@
1
+ export interface ProviderModelRef {
2
+ provider: string;
3
+ modelId: string;
4
+ }
5
+ /** Split a provider-qualified model reference while preserving slashes in the model ID. */
6
+ export declare function splitProviderModelRef(ref: string): ProviderModelRef | undefined;
@@ -0,0 +1,15 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ //#region src/providers/model-ref.ts
3
+ /** Split a provider-qualified model reference while preserving slashes in the model ID. */
4
+ function splitProviderModelRef(ref) {
5
+ const slashIndex = ref.indexOf("/");
6
+ if (slashIndex <= 0 || slashIndex === ref.length - 1) return void 0;
7
+ return {
8
+ provider: ref.slice(0, slashIndex),
9
+ modelId: ref.slice(slashIndex + 1)
10
+ };
11
+ }
12
+ var init_model_ref = __esmMin((() => {}));
13
+ //#endregion
14
+ init_model_ref();
15
+ export { init_model_ref, splitProviderModelRef };
@@ -11,4 +11,5 @@ export interface ModelReferenceHealth {
11
11
  export declare function auditModelReferences(config: Config, sessionConfigs?: ReadonlyMap<string, SessionAgentConfig>, deps?: {
12
12
  registry?: ModelRegistry;
13
13
  catalog?: ModelCatalogSnapshot;
14
+ resolveImageGenerationModel?: (ref: string) => boolean;
14
15
  }): ModelReferenceHealth[];
@@ -1,22 +1,25 @@
1
1
  import { getModelCatalogStore, init_model_catalog_store } from "./model-catalog-store.js";
2
2
  import { getModelRegistry, init_model_registry } from "./model-registry.js";
3
+ import { parseImageGenerationModelRef } from "../agent/image/generation/model-ref.js";
4
+ import { getImageGenerationProvider } from "../agent/image/generation/provider-registry.js";
3
5
  //#region src/providers/model-reference-auditor.ts
4
6
  init_model_catalog_store();
5
7
  init_model_registry();
6
8
  function asRecord(value) {
7
9
  return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
8
10
  }
9
- function addRef(out, value, location) {
11
+ function addRef(out, value, location, kind = "text") {
10
12
  if (typeof value === "string" && value.trim()) out.push({
11
13
  ref: value.trim(),
12
- location
14
+ location,
15
+ kind
13
16
  });
14
17
  }
15
- function collectToolModel(out, value, location) {
18
+ function collectToolModel(out, value, location, kind = "text") {
16
19
  const model = asRecord(value);
17
20
  if (!model) return;
18
- addRef(out, model.primary, `${location}.primary`);
19
- if (Array.isArray(model.fallbacks)) model.fallbacks.forEach((ref, index) => addRef(out, ref, `${location}.fallbacks[${index}]`));
21
+ addRef(out, model.primary, `${location}.primary`, kind);
22
+ if (Array.isArray(model.fallbacks)) model.fallbacks.forEach((ref, index) => addRef(out, ref, `${location}.fallbacks[${index}]`, kind));
20
23
  }
21
24
  function collectModelPolicy(out, value, location) {
22
25
  const policy = asRecord(value);
@@ -29,7 +32,7 @@ function collectModelPolicy(out, value, location) {
29
32
  if (Array.isArray(role.fallbacks)) role.fallbacks.forEach((ref, index) => addRef(out, ref, `${location}.roles.${roleId}.fallbacks[${index}]`));
30
33
  }
31
34
  collectToolModel(out, policy.imageModel, `${location}.imageModel`);
32
- collectToolModel(out, policy.imageGenerationModel, `${location}.imageGenerationModel`);
35
+ collectToolModel(out, policy.imageGenerationModel, `${location}.imageGenerationModel`, "image-generation");
33
36
  }
34
37
  function collectReferences(config, sessionConfigs) {
35
38
  const out = [];
@@ -47,22 +50,29 @@ function suggestedRef(ref, catalog) {
47
50
  const first = source.models.find((model) => model.availability === "available");
48
51
  return first ? `${providerId}/${first.id}` : void 0;
49
52
  }
53
+ function hasImageGenerationModel(ref) {
54
+ const parsed = parseImageGenerationModelRef(ref);
55
+ if (!parsed) return false;
56
+ return getImageGenerationProvider(parsed.provider)?.models.includes(parsed.model) ?? false;
57
+ }
50
58
  function auditModelReferences(config, sessionConfigs = /* @__PURE__ */ new Map(), deps = {}) {
51
59
  const registry = deps.registry ?? getModelRegistry();
52
60
  const catalog = deps.catalog ?? getModelCatalogStore().load();
61
+ const resolveImageGenerationModel = deps.resolveImageGenerationModel ?? hasImageGenerationModel;
53
62
  const grouped = /* @__PURE__ */ new Map();
54
63
  for (const reference of collectReferences(config, sessionConfigs)) {
55
- const locations = grouped.get(reference.ref) ?? [];
56
- locations.push(reference.location);
57
- grouped.set(reference.ref, locations);
64
+ const references = grouped.get(reference.ref) ?? [];
65
+ references.push(reference);
66
+ grouped.set(reference.ref, references);
58
67
  }
59
- return [...grouped.entries()].map(([ref, locations]) => {
60
- const availability = registry.resolve(ref) ? "available" : "unavailable";
61
- const suggestion = availability === "unavailable" ? suggestedRef(ref, catalog) : void 0;
68
+ return [...grouped.entries()].map(([ref, references]) => {
69
+ const availability = references.every((reference) => reference.kind === "image-generation" ? resolveImageGenerationModel(ref) : Boolean(registry.resolve(ref))) ? "available" : "unavailable";
70
+ const textOnly = references.every((reference) => reference.kind === "text");
71
+ const suggestion = availability === "unavailable" && textOnly ? suggestedRef(ref, catalog) : void 0;
62
72
  return {
63
73
  ref,
64
74
  availability,
65
- locations,
75
+ locations: references.map((reference) => reference.location),
66
76
  ...suggestion ? { suggestedRef: suggestion } : {}
67
77
  };
68
78
  }).sort((a, b) => a.ref.localeCompare(b.ref));
@@ -1,11 +1,12 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
- import { init_resolve_config_value, resolveConfigValue, resolveHeaders } from "../config/resolve-config-value.js";
5
4
  import { resolveModelsJsonPath } from "../config/paths.js";
5
+ import { init_resolve_config_value, resolveConfigValue, resolveHeaders } from "../config/resolve-config-value.js";
6
6
  import { getDefaultModelValues, init_models_json, validateModelsConfig } from "../config/models-json.js";
7
7
  import { getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
8
8
  import { getModelCatalogStore, init_model_catalog_store } from "./model-catalog-store.js";
9
+ import { init_model_ref, splitProviderModelRef } from "./model-ref.js";
9
10
  import { existsSync, readFileSync } from "fs";
10
11
  import { getModels, getProviders } from "@earendil-works/pi-ai/compat";
11
12
  //#region src/providers/model-registry.ts
@@ -96,6 +97,7 @@ var init_model_registry = __esmMin((() => {
96
97
  init_logger();
97
98
  init_env_keys();
98
99
  init_model_catalog_store();
100
+ init_model_ref();
99
101
  log = createLogger("ModelRegistry");
100
102
  ModelRegistry = class {
101
103
  models = [];
@@ -176,8 +178,9 @@ var init_model_registry = __esmMin((() => {
176
178
  */
177
179
  resolve(ref) {
178
180
  this.ensureLoaded();
179
- if (ref.includes("/")) {
180
- const [provider, modelId] = ref.split("/");
181
+ const qualifiedRef = splitProviderModelRef(ref);
182
+ if (qualifiedRef) {
183
+ const { provider, modelId } = qualifiedRef;
181
184
  return this.find(provider, modelId);
182
185
  }
183
186
  for (const model of this.models) if (model.id === ref) return model;
@@ -1,13 +1,13 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
- import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir, resolveUserProfilePath } from "../config/paths.js";
3
2
  import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
3
+ import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir, resolveUserProfilePath } from "../config/paths.js";
4
4
  import { resolveBootstrapFilesSync } from "../agent/bootstrap/bootstrap-files.js";
5
5
  import { createSkillConfigManager, isSkillEnabled } from "../agent/skills/config.js";
6
6
  import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
7
7
  import { loadSkills } from "../agent/skills/index.js";
8
+ import { listConnectorInstances } from "../connectors/instances.js";
8
9
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
9
10
  import "../config/index.js";
10
- import { listConnectorInstances } from "../connectors/instances.js";
11
11
  import { basename } from "node:path";
12
12
  //#region src/tui/tui-startup-resources.ts
13
13
  init_paths();
@@ -2,10 +2,10 @@ import { version } from "../../package.js";
2
2
  import { resolveStateDir, resolveXopcDatabasePath } from "../config/paths-state.js";
3
3
  import { parseAgentSessionKey } from "../routing/session-key-utils.js";
4
4
  import { init_agent_session_key, normalizeAgentId } from "../routing/agent-session-key.js";
5
+ import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
5
6
  import { init_paths } from "../config/paths.js";
6
7
  import { loadConfig } from "../config/loader.js";
7
8
  import { getAllModels, getAllProviders, getApiKey, init_providers, isProviderConfiguredSync } from "../providers/index.js";
8
- import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
9
9
  import { renderWorkflowFinalSummary, renderWorkflowPanel } from "../agent/workflow/snapshot.js";
10
10
  import { runViewToSnapshot } from "../workflows/service/run-view-to-snapshot.js";
11
11
  import { ProjectTrustStore, hasTrustRequiringProjectResources } from "../project-trust/trust-store.js";
@@ -1,5 +1,5 @@
1
- import { init_providers, resolveModel } from "../../providers/index.js";
2
1
  import { extractProfileAgentId } from "../../config/agent-profile.js";
2
+ import { init_providers, resolveModel } from "../../providers/index.js";
3
3
  import { publishAutomationProductEvent } from "../../automations/product-events.js";
4
4
  import { GoalService } from "../../goals/goal-service.js";
5
5
  import "../../goals/index.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.165",
3
+ "version": "0.0.167",
4
4
  "description": "Local-first AI system that remembers context, coordinates AI, and sustains long-term progress.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -100,7 +100,7 @@
100
100
  "semver": "^7.8.1",
101
101
  "silk-wasm": "^3.7.1",
102
102
  "thread-stream": "^4.2.0",
103
- "undici": "^8.5.0",
103
+ "undici": "^8.9.0",
104
104
  "uuid": "^14.0.0",
105
105
  "ws": "^8.21.0",
106
106
  "zod": "^4.4.3"