@opengeni/sdk 3.3.2 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/README.md +1007 -72
  2. package/dist/adapters/express.d.ts +31 -0
  3. package/dist/adapters/express.js +87 -0
  4. package/dist/adapters/express.js.map +1 -0
  5. package/dist/adapters/hono.d.ts +16 -0
  6. package/dist/adapters/hono.js +8 -0
  7. package/dist/adapters/hono.js.map +1 -0
  8. package/dist/adapters/next.d.ts +29 -0
  9. package/dist/adapters/next.js +22 -0
  10. package/dist/adapters/next.js.map +1 -0
  11. package/dist/allowance-refusal.d.ts +2 -0
  12. package/dist/allowance-refusal.js +50 -0
  13. package/dist/allowance-refusal.js.map +1 -0
  14. package/dist/app-links.d.ts +42 -0
  15. package/dist/app-links.js +66 -0
  16. package/dist/app-links.js.map +1 -0
  17. package/dist/artifact-catalog.d.ts +40 -0
  18. package/dist/artifact-client.d.ts +20 -8
  19. package/dist/artifacts.d.ts +1 -1
  20. package/dist/artifacts.js +8 -6
  21. package/dist/automations.js +8 -2
  22. package/dist/automations.js.map +1 -1
  23. package/dist/azure-live-transport.d.ts +32 -0
  24. package/dist/browser.d.ts +7 -2
  25. package/dist/browser.js +27 -5
  26. package/dist/chat/fold.d.ts +75 -0
  27. package/dist/chat/handler.d.ts +41 -0
  28. package/dist/chat/http.d.ts +67 -0
  29. package/dist/chat/ids.d.ts +34 -0
  30. package/dist/chat/index.d.ts +9 -0
  31. package/dist/chat/index.js +1369 -0
  32. package/dist/chat/index.js.map +1 -0
  33. package/dist/chat/openai.d.ts +30 -0
  34. package/dist/chat/opengeni.d.ts +129 -0
  35. package/dist/chat/types.d.ts +207 -0
  36. package/dist/chat/vercel.d.ts +49 -0
  37. package/dist/chats.d.ts +8 -0
  38. package/dist/chunk-4AHR4KGA.js +301 -0
  39. package/dist/chunk-4AHR4KGA.js.map +1 -0
  40. package/dist/chunk-6GYGMLX4.js +332 -0
  41. package/dist/chunk-6GYGMLX4.js.map +1 -0
  42. package/dist/chunk-7EWT3PV6.js +368 -0
  43. package/dist/chunk-7EWT3PV6.js.map +1 -0
  44. package/dist/chunk-FTWVVPR6.js +1665 -0
  45. package/dist/chunk-FTWVVPR6.js.map +1 -0
  46. package/dist/{chunk-VYCTL62C.js → chunk-GZQSWAKD.js} +1 -1
  47. package/dist/chunk-GZQSWAKD.js.map +1 -0
  48. package/dist/chunk-KGEABAID.js +71 -0
  49. package/dist/chunk-KGEABAID.js.map +1 -0
  50. package/dist/{chunk-YKZME56C.js → chunk-KWADQ227.js} +3 -3
  51. package/dist/{chunk-YKZME56C.js.map → chunk-KWADQ227.js.map} +1 -1
  52. package/dist/{chunk-JUS2UYRP.js → chunk-NCU5OAN7.js} +27 -2
  53. package/dist/chunk-NCU5OAN7.js.map +1 -0
  54. package/dist/{chunk-YXQX7RQT.js → chunk-OI5YLASH.js} +73 -2
  55. package/dist/chunk-OI5YLASH.js.map +1 -0
  56. package/dist/chunk-OV3POE62.js +359 -0
  57. package/dist/chunk-OV3POE62.js.map +1 -0
  58. package/dist/chunk-P7UWKORG.js +561 -0
  59. package/dist/chunk-P7UWKORG.js.map +1 -0
  60. package/dist/chunk-QGEIL4TR.js +195 -0
  61. package/dist/chunk-QGEIL4TR.js.map +1 -0
  62. package/dist/{chunk-TRNI7KEO.js → chunk-S2NLS3ES.js} +3669 -1281
  63. package/dist/chunk-S2NLS3ES.js.map +1 -0
  64. package/dist/chunk-UM4ZXXJR.js +9 -0
  65. package/dist/chunk-UM4ZXXJR.js.map +1 -0
  66. package/dist/{chunk-QT3KFVDP.js → chunk-UME3X7CP.js} +28 -32
  67. package/dist/chunk-UME3X7CP.js.map +1 -0
  68. package/dist/chunk-VT4YM4XQ.js +210 -0
  69. package/dist/chunk-VT4YM4XQ.js.map +1 -0
  70. package/dist/chunk-WSYYXONG.js +1602 -0
  71. package/dist/chunk-WSYYXONG.js.map +1 -0
  72. package/dist/{chunk-C2H7HBNP.js → chunk-WVCJRSGJ.js} +119 -14
  73. package/dist/chunk-WVCJRSGJ.js.map +1 -0
  74. package/dist/chunk-X5ITQVXE.js +15 -0
  75. package/dist/chunk-X5ITQVXE.js.map +1 -0
  76. package/dist/chunk-XA7HVIHI.js +126 -0
  77. package/dist/chunk-XA7HVIHI.js.map +1 -0
  78. package/dist/{chunk-KKRO2VCP.js → chunk-YJCHB7R3.js} +60 -12
  79. package/dist/chunk-YJCHB7R3.js.map +1 -0
  80. package/dist/chunk-YKIHNLWD.js +153 -0
  81. package/dist/chunk-YKIHNLWD.js.map +1 -0
  82. package/dist/chunk-ZDUBPV33.js +277 -0
  83. package/dist/chunk-ZDUBPV33.js.map +1 -0
  84. package/dist/client.d.ts +1068 -118
  85. package/dist/codex-realtime-controller.d.ts +13 -0
  86. package/dist/codex-realtime-controller.js +4 -2
  87. package/dist/codex-realtime-v3-wire.d.ts +3 -2
  88. package/dist/codex-realtime.d.ts +5 -1
  89. package/dist/company-brain.d.ts +1 -11
  90. package/dist/core.d.ts +7 -2
  91. package/dist/core.js +25 -6
  92. package/dist/deprecation.d.ts +47 -0
  93. package/dist/document-authority-client.d.ts +24 -2
  94. package/dist/document-authority.js +7 -5
  95. package/dist/editable-artifacts/index.d.ts +1 -1
  96. package/dist/editable-artifacts/types.d.ts +12 -2
  97. package/dist/editable-artifacts.js +19 -3
  98. package/dist/editable-artifacts.js.map +1 -1
  99. package/dist/embedding-client.d.ts +129 -0
  100. package/dist/errors.d.ts +76 -1
  101. package/dist/external-vault-receiver.d.ts +203 -0
  102. package/dist/external-vault-receiver.js +564 -0
  103. package/dist/external-vault-receiver.js.map +1 -0
  104. package/dist/feedback.d.ts +23 -0
  105. package/dist/gateway-realtime-transport.js +1 -1
  106. package/dist/github-repositories.d.ts +10 -0
  107. package/dist/github-repositories.js +36 -0
  108. package/dist/github-repositories.js.map +1 -0
  109. package/dist/index.d.ts +62 -11
  110. package/dist/index.js +557 -338
  111. package/dist/index.js.map +1 -1
  112. package/dist/insights-usage.d.ts +33 -0
  113. package/dist/insights-usage.js +7 -0
  114. package/dist/insights-usage.js.map +1 -0
  115. package/dist/interaction.d.ts +165 -71
  116. package/dist/interaction.js +2 -2
  117. package/dist/knowledge.d.ts +7 -0
  118. package/dist/knowledge.js +20 -0
  119. package/dist/knowledge.js.map +1 -0
  120. package/dist/known-tools.d.ts +4 -0
  121. package/dist/message-links.d.ts +68 -0
  122. package/dist/model-context.d.ts +68 -0
  123. package/dist/model-display.d.ts +2 -0
  124. package/dist/model-display.js +17 -0
  125. package/dist/model-display.js.map +1 -0
  126. package/dist/model-picker-order.d.ts +1 -0
  127. package/dist/model-picker-order.js +10 -0
  128. package/dist/model-picker-order.js.map +1 -0
  129. package/dist/organization-integration-policy.d.ts +26 -0
  130. package/dist/organization-integration-policy.js +26 -0
  131. package/dist/organization-integration-policy.js.map +1 -0
  132. package/dist/pr-review-client.d.ts +1 -1
  133. package/dist/pr-review.d.ts +1 -1
  134. package/dist/pr-review.js.map +1 -1
  135. package/dist/preference-registry.d.ts +1 -1
  136. package/dist/prepared-mcp-setup.d.ts +5 -0
  137. package/dist/proxy.d.ts +13 -11
  138. package/dist/realtime.d.ts +1 -1
  139. package/dist/realtime.js +253 -7
  140. package/dist/realtime.js.map +1 -1
  141. package/dist/session-history-import.d.ts +22 -0
  142. package/dist/session-history-import.js +36 -0
  143. package/dist/session-history-import.js.map +1 -0
  144. package/dist/session-list-entries.d.ts +1 -0
  145. package/dist/session-list-entries.js +7 -0
  146. package/dist/session-list-entries.js.map +1 -0
  147. package/dist/session-message-search.d.ts +53 -0
  148. package/dist/session-proxy-client.d.ts +28 -0
  149. package/dist/session-proxy.d.ts +334 -0
  150. package/dist/session-proxy.js +24 -0
  151. package/dist/session-proxy.js.map +1 -0
  152. package/dist/session-titles.d.ts +2 -28
  153. package/dist/session-usage-limits.d.ts +10 -0
  154. package/dist/session-usage-limits.js +43 -0
  155. package/dist/session-usage-limits.js.map +1 -0
  156. package/dist/shared-catalog-loader.d.ts +34 -0
  157. package/dist/site-ai.d.ts +35 -0
  158. package/dist/site-bridge-host.d.ts +112 -0
  159. package/dist/site-bridge-host.js +286 -0
  160. package/dist/site-bridge-host.js.map +1 -0
  161. package/dist/site-browser-entry.d.ts +1 -0
  162. package/dist/site-browser-runtime.gen.d.ts +1 -0
  163. package/dist/site-data.d.ts +178 -0
  164. package/dist/site-document.d.ts +5 -0
  165. package/dist/site-document.js +20 -0
  166. package/dist/site-document.js.map +1 -0
  167. package/dist/site-document.test.d.ts +1 -0
  168. package/dist/site-http.d.ts +17 -0
  169. package/dist/site-sql.d.ts +31 -0
  170. package/dist/site-tool-bridge.d.ts +57 -0
  171. package/dist/site.d.ts +186 -0
  172. package/dist/site.js +63 -0
  173. package/dist/site.js.map +1 -0
  174. package/dist/skills.d.ts +75 -0
  175. package/dist/sse.d.ts +1 -1
  176. package/dist/stream.d.ts +2 -0
  177. package/dist/tenant-workspaces.d.ts +47 -0
  178. package/dist/tenant-workspaces.js +8 -0
  179. package/dist/tenant-workspaces.js.map +1 -0
  180. package/dist/tool-auth.d.ts +87 -0
  181. package/dist/tool-auth.js +23 -0
  182. package/dist/tool-auth.js.map +1 -0
  183. package/dist/tool-display-metadata.d.ts +3 -0
  184. package/dist/tools-37DCTCNZ.js +12 -0
  185. package/dist/tools-37DCTCNZ.js.map +1 -0
  186. package/dist/tools.d.ts +81 -0
  187. package/dist/transcription.d.ts +1 -1
  188. package/dist/types.d.ts +2807 -583
  189. package/dist/usage-allowances.d.ts +36 -0
  190. package/dist/usage-allowances.js +80 -0
  191. package/dist/usage-allowances.js.map +1 -0
  192. package/dist/vault-types.d.ts +324 -0
  193. package/dist/vaults-api.d.ts +65 -0
  194. package/dist/workspace-artifacts.d.ts +47 -5
  195. package/dist/workspace-instruction-policies.d.ts +2 -2
  196. package/dist/workspace-integrations.d.ts +74 -0
  197. package/dist/workspace-integrations.js +67 -0
  198. package/dist/workspace-integrations.js.map +1 -0
  199. package/dist/workspace-state.d.ts +8 -71
  200. package/package.json +103 -5
  201. package/src/adapters/express.ts +136 -0
  202. package/src/adapters/hono.ts +18 -0
  203. package/src/adapters/next.ts +42 -0
  204. package/src/allowance-refusal.ts +5 -0
  205. package/src/app-links.ts +117 -0
  206. package/src/artifact-catalog.ts +51 -0
  207. package/src/artifact-client.ts +40 -49
  208. package/src/artifacts.ts +1 -0
  209. package/src/automations-client.ts +8 -2
  210. package/src/azure-live-transport.ts +286 -0
  211. package/src/browser.ts +37 -0
  212. package/src/chat/fold.ts +431 -0
  213. package/src/chat/handler.ts +240 -0
  214. package/src/chat/http.ts +257 -0
  215. package/src/chat/ids.ts +85 -0
  216. package/src/chat/index.ts +88 -0
  217. package/src/chat/openai.ts +439 -0
  218. package/src/chat/opengeni.ts +737 -0
  219. package/src/chat/types.ts +219 -0
  220. package/src/chat/vercel.ts +204 -0
  221. package/src/chats.ts +16 -0
  222. package/src/client.ts +5697 -1833
  223. package/src/codex-realtime-controller.ts +163 -8
  224. package/src/codex-realtime-v3-wire.ts +4 -3
  225. package/src/codex-realtime-v3.ts +12 -3
  226. package/src/codex-realtime.ts +11 -3
  227. package/src/company-brain.ts +0 -40
  228. package/src/core.ts +20 -0
  229. package/src/deprecation.ts +149 -0
  230. package/src/document-authority-client.ts +104 -1
  231. package/src/editable-artifacts/controller.ts +36 -2
  232. package/src/editable-artifacts/index.ts +1 -0
  233. package/src/editable-artifacts/types.ts +29 -16
  234. package/src/embedding-client.ts +519 -0
  235. package/src/errors.ts +303 -4
  236. package/src/external-vault-receiver.ts +914 -0
  237. package/src/feedback.ts +20 -0
  238. package/src/gateway-realtime-transport.ts +3 -3
  239. package/src/github-repositories.ts +60 -0
  240. package/src/index.ts +603 -65
  241. package/src/insights-usage.ts +64 -0
  242. package/src/interaction.ts +315 -93
  243. package/src/knowledge.ts +72 -0
  244. package/src/known-tools.ts +279 -0
  245. package/src/message-links.ts +178 -0
  246. package/src/model-context.ts +113 -0
  247. package/src/model-display.ts +11 -0
  248. package/src/model-picker-order.ts +6 -0
  249. package/src/organization-integration-policy.ts +54 -0
  250. package/src/pr-review-client.ts +1 -1
  251. package/src/pr-review.ts +1 -1
  252. package/src/preference-registry.ts +2 -0
  253. package/src/prepared-mcp-setup.ts +123 -0
  254. package/src/proxy.ts +23 -12
  255. package/src/realtime.ts +15 -6
  256. package/src/session-history-import.ts +84 -0
  257. package/src/session-list-entries.ts +1 -0
  258. package/src/session-message-search.ts +47 -0
  259. package/src/session-proxy-client.ts +68 -0
  260. package/src/session-proxy.ts +2098 -0
  261. package/src/session-titles.ts +8 -82
  262. package/src/session-usage-limits.ts +71 -0
  263. package/src/shared-catalog-loader.ts +169 -0
  264. package/src/site-ai.ts +284 -0
  265. package/src/site-bridge-host.ts +422 -0
  266. package/src/site-browser-entry.ts +6 -0
  267. package/src/site-browser-runtime.gen.ts +2 -0
  268. package/src/site-data.ts +372 -0
  269. package/src/site-document.test.ts +64 -0
  270. package/src/site-document.ts +18 -0
  271. package/src/site-http.ts +171 -0
  272. package/src/site-sql.ts +153 -0
  273. package/src/site-tool-bridge.ts +401 -0
  274. package/src/site.ts +878 -0
  275. package/src/skills.ts +69 -0
  276. package/src/sse.ts +9 -3
  277. package/src/stream.ts +33 -10
  278. package/src/tenant-workspaces.ts +148 -0
  279. package/src/tool-auth.ts +301 -0
  280. package/src/tool-display-metadata.ts +27 -0
  281. package/src/tools.ts +452 -0
  282. package/src/transcription.ts +3 -0
  283. package/src/types.ts +3170 -582
  284. package/src/usage-allowances.ts +189 -0
  285. package/src/vault-types.ts +379 -0
  286. package/src/vaults-api.ts +339 -0
  287. package/src/workspace-artifacts.ts +55 -6
  288. package/src/workspace-instruction-policies.ts +2 -1
  289. package/src/workspace-integrations.ts +402 -0
  290. package/src/workspace-state.ts +8 -82
  291. package/dist/chunk-C2H7HBNP.js.map +0 -1
  292. package/dist/chunk-C4DJPZRU.js +0 -119
  293. package/dist/chunk-C4DJPZRU.js.map +0 -1
  294. package/dist/chunk-JUS2UYRP.js.map +0 -1
  295. package/dist/chunk-KKRO2VCP.js.map +0 -1
  296. package/dist/chunk-QT3KFVDP.js.map +0 -1
  297. package/dist/chunk-TRNI7KEO.js.map +0 -1
  298. package/dist/chunk-VYCTL62C.js.map +0 -1
  299. package/dist/chunk-YXQX7RQT.js.map +0 -1
@@ -0,0 +1,368 @@
1
+ // ../contracts/src/session-usage-limit-refusal.ts
2
+ var SESSION_USAGE_LIMIT_SEGMENT = "session_usage_limit";
3
+ var SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON = "session_usage_limit";
4
+ var BASIS = "model_api_equivalent_v1";
5
+ var MAX_LIMIT_MICROS = 1e7 * 1e6;
6
+ var MESSAGE_MAX_UTF8_BYTES = 1024;
7
+ var UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
8
+ function record(value) {
9
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
10
+ }
11
+ function micros(value, max = Number.MAX_SAFE_INTEGER) {
12
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 && value <= max;
13
+ }
14
+ function boundedMessage(value) {
15
+ const normalized = value.slice(0, MESSAGE_MAX_UTF8_BYTES * 2).replace(/[\u0000-\u001f\u007f]+/g, " ").trim();
16
+ const bytes = new TextEncoder().encode(normalized);
17
+ let end = Math.min(bytes.length, MESSAGE_MAX_UTF8_BYTES);
18
+ while (end > 0 && end < bytes.length && (bytes[end] & 192) === 128) end -= 1;
19
+ return new TextDecoder().decode(bytes.slice(0, end)).trim();
20
+ }
21
+ function parseSessionUsageLimitReachedRefusal(value) {
22
+ const outer = record(value);
23
+ if (!outer) return null;
24
+ const source = record(outer.sessionUsageLimit) ?? outer;
25
+ if (source.code !== "session_usage_limit_reached") return null;
26
+ const fields = record(source.details) ?? source;
27
+ if (fields.basis !== BASIS || typeof fields.rootSessionId !== "string" || !UUID.test(fields.rootSessionId) || !micros(fields.limitMicros, MAX_LIMIT_MICROS) || !micros(fields.usedMicros)) {
28
+ return null;
29
+ }
30
+ const refusal = {
31
+ code: "session_usage_limit_reached",
32
+ basis: BASIS,
33
+ rootSessionId: fields.rootSessionId.toLowerCase(),
34
+ limitMicros: fields.limitMicros,
35
+ usedMicros: fields.usedMicros,
36
+ message: ""
37
+ };
38
+ const message = typeof source.message === "string" ? boundedMessage(source.message) : "";
39
+ return { ...refusal, message: message || sessionUsageLimitReachedMessage(refusal) };
40
+ }
41
+ function formatSessionUsageMicros(value) {
42
+ if (value > 0 && value < 1e4) return "<$0.01";
43
+ const dollars = value / 1e6;
44
+ return `$${dollars.toLocaleString("en-US", {
45
+ minimumFractionDigits: 2,
46
+ maximumFractionDigits: 2
47
+ })}`;
48
+ }
49
+ function sessionUsageLimitReachedMessage(refusal) {
50
+ return `This task's usage limit is reached (${formatSessionUsageMicros(refusal.usedMicros)} of ${formatSessionUsageMicros(refusal.limitMicros)} API-equivalent model usage). A person can raise or remove the limit to continue.`;
51
+ }
52
+
53
+ // src/errors.ts
54
+ var OpenGeniApiError = class extends Error {
55
+ status;
56
+ code;
57
+ retryable;
58
+ correlationId;
59
+ /** True only when an uncontrolled transport failed after a mutation may have been accepted. */
60
+ outcomeUnknown;
61
+ body;
62
+ details;
63
+ constructor(status, body, options = {}) {
64
+ const decoded = decodeApiErrorBody(body);
65
+ const correlationId = decoded?.requestId ?? boundedCorrelationId(options.correlationId);
66
+ const gatewayFailure = status >= 502 && status <= 504;
67
+ const fromResponse = options.mutation !== void 0;
68
+ const message = decoded?.message ?? (fromResponse ? "Request failed." : body || "(empty body)");
69
+ const displayMessage = options.displayMessage ?? (gatewayFailure && fromResponse ? decoded?.message ?? "Opengeni is temporarily unavailable \u2014 retry." : `Opengeni API ${status}: ${message}`);
70
+ super(correlationId ? `${displayMessage} Reference: ${correlationId}.` : displayMessage);
71
+ this.name = "OpenGeniApiError";
72
+ this.status = status;
73
+ this.code = options.code ?? decoded?.code ?? (gatewayFailure && fromResponse ? "upstream_unavailable" : void 0);
74
+ this.retryable = options.retryable ?? decoded?.retryable ?? retryableApiStatus(status);
75
+ this.correlationId = correlationId;
76
+ this.outcomeUnknown = options.outcomeUnknown ?? decoded?.outcomeUnknown ?? (gatewayFailure && !!options.mutation && !decoded);
77
+ this.body = !fromResponse || decoded ? body : "";
78
+ this.details = decoded?.details;
79
+ }
80
+ };
81
+ var OpenGeniSetupError = class extends OpenGeniApiError {
82
+ constructor(error) {
83
+ super(error.status, error.body, {
84
+ code: "OPENGENI_SETUP_REQUIRED",
85
+ retryable: false,
86
+ correlationId: error.correlationId,
87
+ displayMessage: "Private chats require organization_private_session_settings.enabled (migration 0323). An organization owner or admin can enable Only me chats in the web app under Organization settings > Security & data, or use updateOrganizationPrivateSessionSettings from @opengeni/sdk/organization-private-session-settings with enabled: true, the current expectedVersion and a stable operationId (PATCH /v1/organizations/:organizationId/private-session-settings; an organization key needs workspace:admin). If platform readiness is unavailable, ask the deployment operator to activate session tenancy first."
88
+ });
89
+ this.name = "OpenGeniSetupError";
90
+ }
91
+ };
92
+ var OpenGeniAllowanceExhaustedError = class extends OpenGeniApiError {
93
+ scope;
94
+ resetsAt;
95
+ subjectId;
96
+ constructor(status, body, options = {}) {
97
+ super(status, body, {
98
+ ...options,
99
+ code: "allowance_exhausted",
100
+ retryable: false,
101
+ outcomeUnknown: false
102
+ });
103
+ this.name = "OpenGeniAllowanceExhaustedError";
104
+ const refusal = allowanceExhaustedFields(body);
105
+ this.scope = refusal?.scope ?? "workspace";
106
+ this.resetsAt = refusal?.resetsAt ?? null;
107
+ this.subjectId = refusal?.subjectId;
108
+ }
109
+ };
110
+ var OpenGeniSessionUsageLimitReachedError = class extends OpenGeniApiError {
111
+ rootSessionId;
112
+ limitMicros;
113
+ usedMicros;
114
+ constructor(status, body, options = {}) {
115
+ super(status, body, {
116
+ ...options,
117
+ code: "session_usage_limit_reached",
118
+ retryable: false,
119
+ outcomeUnknown: false
120
+ });
121
+ this.name = "OpenGeniSessionUsageLimitReachedError";
122
+ const refusal = sessionUsageLimitReachedFields(body);
123
+ this.rootSessionId = refusal?.rootSessionId;
124
+ this.limitMicros = refusal?.limitMicros;
125
+ this.usedMicros = refusal?.usedMicros;
126
+ }
127
+ };
128
+ var OpenGeniSessionUsageLimitUnsupportedError = class extends Error {
129
+ code = "session_usage_limit_unsupported";
130
+ sessionId;
131
+ constructor(message, options = {}) {
132
+ super(message, options.cause === void 0 ? void 0 : { cause: options.cause });
133
+ this.name = "OpenGeniSessionUsageLimitUnsupportedError";
134
+ this.sessionId = options.sessionId ?? null;
135
+ }
136
+ };
137
+ function rejectsStartModeField(error) {
138
+ if (error.status !== 400 && error.status !== 422) return false;
139
+ let parsed;
140
+ try {
141
+ parsed = JSON.parse(error.body);
142
+ } catch {
143
+ return false;
144
+ }
145
+ if (!parsed || typeof parsed !== "object") return false;
146
+ const record2 = parsed;
147
+ const envelope = record2.error && typeof record2.error === "object" ? record2.error : record2;
148
+ const message = typeof envelope.message === "string" ? envelope.message : "";
149
+ const fields = /^Invalid session create request: (.+) failed schema validation$/.exec(message);
150
+ if (envelope.code === "INVALID_SESSION_CREATE_REQUEST" && fields?.[1]?.split(/,\s*/).includes("startMode")) {
151
+ return true;
152
+ }
153
+ const details = envelope.details && typeof envelope.details === "object" ? envelope.details : null;
154
+ const issues = Array.isArray(details?.issues) ? details.issues : [];
155
+ return issues.some((issue) => {
156
+ if (!issue || typeof issue !== "object") return false;
157
+ const path = issue.path;
158
+ return path === "startMode" || Array.isArray(path) && path.length === 1 && path[0] === "startMode";
159
+ });
160
+ }
161
+ function sessionUsageLimitNotConfirmed(sessionId) {
162
+ return new OpenGeniSessionUsageLimitUnsupportedError(
163
+ "The server did not confirm the requested usage limit; it may not support usage limits. Read the limit again before relying on it.",
164
+ { sessionId }
165
+ );
166
+ }
167
+ function sessionUsageLimitReachedFields(body) {
168
+ try {
169
+ const parsed = JSON.parse(body);
170
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return null;
171
+ const root = parsed;
172
+ return parseSessionUsageLimitReachedRefusal(
173
+ root.error && typeof root.error === "object" && !Array.isArray(root.error) ? root.error : root
174
+ );
175
+ } catch {
176
+ return null;
177
+ }
178
+ }
179
+ function allowanceExhaustedFields(body) {
180
+ try {
181
+ const parsed = JSON.parse(body);
182
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return null;
183
+ const root = parsed;
184
+ const error = root.error && typeof root.error === "object" && !Array.isArray(root.error) ? root.error : root;
185
+ if (error.code !== "allowance_exhausted") return null;
186
+ const fields = error.details && typeof error.details === "object" && !Array.isArray(error.details) ? error.details : error;
187
+ if (fields.scope !== "workspace" && fields.scope !== "member") return null;
188
+ if (fields.resetsAt !== null && typeof fields.resetsAt !== "string") return null;
189
+ return {
190
+ scope: fields.scope,
191
+ resetsAt: fields.resetsAt,
192
+ ...typeof fields.subjectId === "string" ? { subjectId: fields.subjectId } : {}
193
+ };
194
+ } catch {
195
+ return null;
196
+ }
197
+ }
198
+ var OpenGeniSecureContextRequiredError = class extends Error {
199
+ code = "secure_context_required";
200
+ retryable = false;
201
+ reason;
202
+ constructor(reason) {
203
+ super(
204
+ reason === "insecure_context" ? "Couldn\u2019t attach this file because Opengeni is open over HTTP. Attachments require a secure HTTPS connection. Open the secure site or configure HTTPS for this deployment." : "Couldn\u2019t attach this file because secure browser cryptography is unavailable. Attachments require HTTPS and Web Crypto support. Open a secure site in a supported browser or configure HTTPS for this deployment."
205
+ );
206
+ this.name = "OpenGeniSecureContextRequiredError";
207
+ this.reason = reason;
208
+ }
209
+ };
210
+ function decodeApiErrorBody(body) {
211
+ if (!body) return null;
212
+ try {
213
+ const decoded = JSON.parse(body);
214
+ if (!decoded || typeof decoded !== "object" || Array.isArray(decoded)) return null;
215
+ const record2 = decoded;
216
+ const nested = record2.error && typeof record2.error === "object" && !Array.isArray(record2.error) ? record2.error : record2;
217
+ const code = boundedApiField(nested.code);
218
+ const message = boundedApiField(nested.message);
219
+ const requestId = boundedCorrelationId(nested.requestId);
220
+ const retryable = typeof nested.retryable === "boolean" ? nested.retryable : void 0;
221
+ const outcomeUnknown = typeof nested.outcomeUnknown === "boolean" ? nested.outcomeUnknown : void 0;
222
+ const details = boundedApiDetails(nested.details);
223
+ if (!code && !message && !requestId && retryable === void 0 && outcomeUnknown === void 0 && !details)
224
+ return null;
225
+ return {
226
+ code,
227
+ message,
228
+ requestId,
229
+ retryable,
230
+ outcomeUnknown,
231
+ details
232
+ };
233
+ } catch {
234
+ return null;
235
+ }
236
+ }
237
+ function boundedApiDetails(value) {
238
+ if (!value || typeof value !== "object" || Array.isArray(value)) return;
239
+ const entries = Object.entries(value).slice(0, 16);
240
+ const details = {};
241
+ for (const [key, entry] of entries) {
242
+ if (!/^[a-zA-Z][\w.-]{0,63}$/.test(key)) continue;
243
+ if (typeof entry === "string") {
244
+ const bounded = boundedApiField(entry);
245
+ if (bounded !== void 0) details[key] = bounded;
246
+ } else if (typeof entry === "number" || typeof entry === "boolean" || entry === null) {
247
+ details[key] = entry;
248
+ }
249
+ }
250
+ return Object.keys(details).length > 0 ? details : void 0;
251
+ }
252
+ function boundedApiField(value) {
253
+ if (typeof value !== "string") return;
254
+ const bytes = new TextEncoder().encode(value);
255
+ return bytes.byteLength <= 512 ? value : new TextDecoder().decode(bytes.slice(0, 512));
256
+ }
257
+ function retryableApiStatus(status) {
258
+ return status === 408 || status === 409 || status === 425 || status === 429 || status >= 500;
259
+ }
260
+ function boundedCorrelationId(value) {
261
+ if (typeof value !== "string" || value.length > 128 || !/^[\w.:-]+$/.test(value)) {
262
+ return;
263
+ }
264
+ return value;
265
+ }
266
+ var OpenGeniSessionListCursorError = class extends OpenGeniApiError {
267
+ };
268
+ var OpenGeniApiContractMismatchError = class extends Error {
269
+ expected;
270
+ actual;
271
+ constructor(expected, actual) {
272
+ super(`Opengeni API contract mismatch: client expects ${expected}, API serves ${actual}`);
273
+ this.name = "OpenGeniApiContractMismatchError";
274
+ this.expected = expected;
275
+ this.actual = actual;
276
+ }
277
+ };
278
+ var OpenGeniStreamError = class extends Error {
279
+ constructor(message) {
280
+ super(message);
281
+ this.name = "OpenGeniStreamError";
282
+ }
283
+ };
284
+ function formatErrorMessage(error, fallback = "The request could not be completed.") {
285
+ if (error instanceof OpenGeniApiError) {
286
+ let message;
287
+ if (error.outcomeUnknown) {
288
+ message = "The request could not be confirmed. Check its status before retrying.";
289
+ } else if (error instanceof OpenGeniSetupError || error.code === "OPENGENI_SETUP_REQUIRED" || error.code === "SESSION_TENANCY_NOT_ACTIVATED") {
290
+ message = "Private conversations are unavailable. Ask an administrator to enable them.";
291
+ } else if (error.details?.code === "not_available_for_viewer") {
292
+ message = "This Site's assistant is not available for this viewer.";
293
+ } else if (error.details?.code === "site_budget_exhausted") {
294
+ message = "This Site's assistant has reached its usage limit for now.";
295
+ } else if (error.details?.code === "site_budget_busy") {
296
+ message = "This Site's assistant is busy. Try again in a moment.";
297
+ } else if (error.details?.code === "site_platform_brake_engaged") {
298
+ message = "This Site's assistant is paused for visitors right now.";
299
+ } else if (error.code === "allowance_exhausted") {
300
+ message = "Usage limit reached. Wait for the reset or ask an administrator for more usage.";
301
+ } else if (error instanceof OpenGeniSessionListCursorError) {
302
+ message = "The conversation list changed. Refresh and try again.";
303
+ } else if (error.status === 401) {
304
+ message = "Sign in to continue.";
305
+ } else if (error.status === 403) {
306
+ message = "You don\u2019t have permission to do that.";
307
+ } else if (error.status === 404) {
308
+ message = "The requested item is unavailable.";
309
+ } else if (error.status === 402 || error.code === "payment_required") {
310
+ message = "There are not enough credits to continue.";
311
+ } else if (error.status === 429 || error.code === "rate_limited") {
312
+ message = error.retryable ? "Too many requests. Wait a moment and try again." : "This request is unavailable. Ask an administrator for help.";
313
+ } else if (error.status === 409) {
314
+ message = "The request conflicts with the current state. Refresh and try again.";
315
+ } else if (error.status === 400 || error.status === 422) {
316
+ message = "The request could not be accepted. Check your input and try again.";
317
+ } else if (error.status === 408 || error.status === 425 || error.status === 0) {
318
+ message = error.retryable ? "The connection could not be completed. Try again later." : fallback;
319
+ } else if (error.status >= 500) {
320
+ message = error.retryable ? "The service is temporarily unavailable. Try again later." : "The service is unavailable. Ask an administrator for help.";
321
+ } else {
322
+ message = fallback;
323
+ }
324
+ return error.correlationId ? `${message} Reference: ${error.correlationId}.` : message;
325
+ }
326
+ if (error instanceof OpenGeniSecureContextRequiredError || error instanceof Error && "code" in error && error.code === "secure_context_required") {
327
+ return "reason" in error && error.reason === "insecure_context" ? "Attachments require HTTPS. Open this page over a secure connection." : "Attachments require secure browser cryptography. Use a supported browser over HTTPS.";
328
+ }
329
+ if (error instanceof OpenGeniApiContractMismatchError) {
330
+ return "This page is out of date. Reload it before trying again.";
331
+ }
332
+ if (error instanceof OpenGeniStreamError) {
333
+ return "The live connection could not be restored. Refresh to check the latest state.";
334
+ }
335
+ return fallback;
336
+ }
337
+ function isAbortError(error) {
338
+ return error instanceof DOMException && error.name === "AbortError" || error instanceof Error && error.name === "AbortError";
339
+ }
340
+ function isRetryableStreamError(error) {
341
+ if (error instanceof OpenGeniApiError) return error.retryable;
342
+ return error instanceof TypeError;
343
+ }
344
+
345
+ export {
346
+ SESSION_USAGE_LIMIT_SEGMENT,
347
+ SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON,
348
+ parseSessionUsageLimitReachedRefusal,
349
+ formatSessionUsageMicros,
350
+ sessionUsageLimitReachedMessage,
351
+ OpenGeniApiError,
352
+ OpenGeniSetupError,
353
+ OpenGeniAllowanceExhaustedError,
354
+ OpenGeniSessionUsageLimitReachedError,
355
+ OpenGeniSessionUsageLimitUnsupportedError,
356
+ rejectsStartModeField,
357
+ sessionUsageLimitNotConfirmed,
358
+ sessionUsageLimitReachedFields,
359
+ allowanceExhaustedFields,
360
+ OpenGeniSecureContextRequiredError,
361
+ OpenGeniSessionListCursorError,
362
+ OpenGeniApiContractMismatchError,
363
+ OpenGeniStreamError,
364
+ formatErrorMessage,
365
+ isAbortError,
366
+ isRetryableStreamError
367
+ };
368
+ //# sourceMappingURL=chunk-7EWT3PV6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../contracts/src/session-usage-limit-refusal.ts","../src/errors.ts"],"sourcesContent":["/**\n * Browser/React Native-safe session usage limit helpers. Deliberately free of\n * the zod runtime so synchronous timeline projection can use it; contract\n * parity tests keep it aligned with `session-usage-limits.ts`.\n */\n\n/** `turn.completed.segmentLimit` for a stop caused by a task usage limit. */\nexport const SESSION_USAGE_LIMIT_SEGMENT = \"session_usage_limit\" as const;\n/** `SessionGoal.pausedReason` for a goal paused by a task usage limit. */\nexport const SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON = \"session_usage_limit\" as const;\n\nconst BASIS = \"model_api_equivalent_v1\";\nconst MAX_LIMIT_MICROS = 10_000_000 * 1_000_000;\nconst MESSAGE_MAX_UTF8_BYTES = 1_024;\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport type ParsedSessionUsageLimitReachedRefusal = {\n code: \"session_usage_limit_reached\";\n basis: \"model_api_equivalent_v1\";\n rootSessionId: string;\n limitMicros: number;\n usedMicros: number;\n message: string;\n};\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction micros(value: unknown, max = Number.MAX_SAFE_INTEGER): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 && value <= max;\n}\n\nfunction boundedMessage(value: string): string {\n const normalized = value\n .slice(0, MESSAGE_MAX_UTF8_BYTES * 2)\n .replace(/[\\u0000-\\u001f\\u007f]+/g, \" \")\n .trim();\n const bytes = new TextEncoder().encode(normalized);\n let end = Math.min(bytes.length, MESSAGE_MAX_UTF8_BYTES);\n while (end > 0 && end < bytes.length && (bytes[end]! & 0xc0) === 0x80) end -= 1;\n return new TextDecoder().decode(bytes.slice(0, end)).trim();\n}\n\n/**\n * Select only the public refusal fields from an API error body (fields may sit\n * in `details`), a `turn.completed` payload's `sessionUsageLimit` record, or a\n * refusal object. Anything malformed returns null instead of a guessed amount.\n */\nexport function parseSessionUsageLimitReachedRefusal(\n value: unknown,\n): ParsedSessionUsageLimitReachedRefusal | null {\n const outer = record(value);\n if (!outer) return null;\n const source = record(outer.sessionUsageLimit) ?? outer;\n if (source.code !== \"session_usage_limit_reached\") return null;\n const fields = record(source.details) ?? source;\n if (\n fields.basis !== BASIS ||\n typeof fields.rootSessionId !== \"string\" ||\n !UUID.test(fields.rootSessionId) ||\n !micros(fields.limitMicros, MAX_LIMIT_MICROS) ||\n !micros(fields.usedMicros)\n ) {\n return null;\n }\n const refusal = {\n code: \"session_usage_limit_reached\" as const,\n basis: BASIS as \"model_api_equivalent_v1\",\n rootSessionId: fields.rootSessionId.toLowerCase(),\n limitMicros: fields.limitMicros,\n usedMicros: fields.usedMicros,\n message: \"\",\n };\n const message = typeof source.message === \"string\" ? boundedMessage(source.message) : \"\";\n return { ...refusal, message: message || sessionUsageLimitReachedMessage(refusal) };\n}\n\n/**\n * \"$12.34\" for known amounts, \"<$0.01\" for a positive amount under a cent.\n * Callers must not pass unknown usage: render \"Preparing usage\" or\n * \"Usage unavailable\" instead of a dollar figure.\n */\nexport function formatSessionUsageMicros(value: number): string {\n if (value > 0 && value < 10_000) return \"<$0.01\";\n const dollars = value / 1_000_000;\n return `$${dollars.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}`;\n}\n\n/** Fixed, bounded wording: no reset date, purchase remedy or invoice claim. */\nexport function sessionUsageLimitReachedMessage(refusal: {\n limitMicros: number;\n usedMicros: number;\n}): string {\n return `This task's usage limit is reached (${formatSessionUsageMicros(refusal.usedMicros)} of ${formatSessionUsageMicros(refusal.limitMicros)} API-equivalent model usage). A person can raise or remove the limit to continue.`;\n}\n","import {\n parseSessionUsageLimitReachedRefusal,\n type ParsedSessionUsageLimitReachedRefusal,\n} from \"@opengeni/contracts/session-usage-limit-refusal\";\n\n/** Error for a non-2xx Opengeni API response. */\nexport class OpenGeniApiError extends Error {\n readonly status: number;\n readonly code: string | undefined;\n readonly retryable: boolean;\n readonly correlationId: string | undefined;\n /** True only when an uncontrolled transport failed after a mutation may have been accepted. */\n readonly outcomeUnknown: boolean;\n readonly body: string;\n readonly details: Record<string, unknown> | undefined;\n\n constructor(\n status: number,\n body: string,\n options: {\n code?: string | undefined;\n retryable?: boolean | undefined;\n correlationId?: string | undefined;\n outcomeUnknown?: boolean | undefined;\n displayMessage?: string | undefined;\n mutation?: boolean | undefined;\n } = {},\n ) {\n const decoded = decodeApiErrorBody(body);\n const correlationId = decoded?.requestId ?? boundedCorrelationId(options.correlationId);\n const gatewayFailure = status >= 502 && status <= 504;\n const fromResponse = options.mutation !== undefined;\n const message = decoded?.message ?? (fromResponse ? \"Request failed.\" : body || \"(empty body)\");\n const displayMessage =\n options.displayMessage ??\n (gatewayFailure && fromResponse\n ? (decoded?.message ?? \"Opengeni is temporarily unavailable — retry.\")\n : `Opengeni API ${status}: ${message}`);\n super(correlationId ? `${displayMessage} Reference: ${correlationId}.` : displayMessage);\n this.name = \"OpenGeniApiError\";\n this.status = status;\n this.code =\n options.code ??\n decoded?.code ??\n (gatewayFailure && fromResponse ? \"upstream_unavailable\" : undefined);\n this.retryable = options.retryable ?? decoded?.retryable ?? retryableApiStatus(status);\n this.correlationId = correlationId;\n this.outcomeUnknown =\n options.outcomeUnknown ??\n decoded?.outcomeUnknown ??\n (gatewayFailure && !!options.mutation && !decoded);\n this.body = !fromResponse || decoded ? body : \"\";\n this.details = decoded?.details;\n }\n}\n\n/** Deployment or organization setup must be completed before private chats can be created. */\nexport class OpenGeniSetupError extends OpenGeniApiError {\n constructor(error: OpenGeniApiError) {\n super(error.status, error.body, {\n code: \"OPENGENI_SETUP_REQUIRED\",\n retryable: false,\n correlationId: error.correlationId,\n displayMessage:\n \"Private chats require organization_private_session_settings.enabled (migration 0323). \" +\n \"An organization owner or admin can enable Only me chats in the web app under Organization settings > Security & data, \" +\n \"or use updateOrganizationPrivateSessionSettings from @opengeni/sdk/organization-private-session-settings \" +\n \"with enabled: true, the current expectedVersion and a stable operationId \" +\n \"(PATCH /v1/organizations/:organizationId/private-session-settings; an organization key needs workspace:admin). \" +\n \"If platform readiness is unavailable, ask the deployment operator to activate session tenancy first.\",\n });\n this.name = \"OpenGeniSetupError\";\n }\n}\n\n/** A settled usage ceiling refuses the next call; retry after reset or an authorized grant. */\nexport class OpenGeniAllowanceExhaustedError extends OpenGeniApiError {\n readonly scope: \"workspace\" | \"member\";\n readonly resetsAt: string | null;\n readonly subjectId: string | undefined;\n\n constructor(\n status: number,\n body: string,\n options: ConstructorParameters<typeof OpenGeniApiError>[2] = {},\n ) {\n super(status, body, {\n ...options,\n code: \"allowance_exhausted\",\n retryable: false,\n outcomeUnknown: false,\n });\n this.name = \"OpenGeniAllowanceExhaustedError\";\n const refusal = allowanceExhaustedFields(body);\n this.scope = refusal?.scope ?? \"workspace\";\n this.resetsAt = refusal?.resetsAt ?? null;\n this.subjectId = refusal?.subjectId;\n }\n}\n\n/**\n * The task's root usage limit is reached: recorded API-equivalent model usage\n * is at or above the limit. Not a credit or billing failure and not retryable\n * by waiting; a person can raise or remove the limit, then send again.\n */\nexport class OpenGeniSessionUsageLimitReachedError extends OpenGeniApiError {\n readonly rootSessionId: string | undefined;\n readonly limitMicros: number | undefined;\n readonly usedMicros: number | undefined;\n\n constructor(\n status: number,\n body: string,\n options: ConstructorParameters<typeof OpenGeniApiError>[2] = {},\n ) {\n super(status, body, {\n ...options,\n code: \"session_usage_limit_reached\",\n retryable: false,\n outcomeUnknown: false,\n });\n this.name = \"OpenGeniSessionUsageLimitReachedError\";\n const refusal = sessionUsageLimitReachedFields(body);\n this.rootSessionId = refusal?.rootSessionId;\n this.limitMicros = refusal?.limitMicros;\n this.usedMicros = refusal?.usedMicros;\n }\n}\n\n/**\n * The server did not accept or confirm a requested task usage limit, so it\n * predates usage limits (or limits are not enabled there). `sessionId` is null\n * when the server rejected the create before creating anything; otherwise the\n * session exists without a confirmed limit and no initial work was started by\n * this SDK's request (an older server rejects it up front).\n */\nexport class OpenGeniSessionUsageLimitUnsupportedError extends Error {\n readonly code = \"session_usage_limit_unsupported\";\n readonly sessionId: string | null;\n\n constructor(message: string, options: { sessionId?: string | null; cause?: unknown } = {}) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"OpenGeniSessionUsageLimitUnsupportedError\";\n this.sessionId = options.sessionId ?? null;\n }\n}\n\n/**\n * True only when a create was refused because the server rejected the\n * `startMode` field itself: servers that predate usage limits accept only\n * `realtime` there. Matches the session create route's 422 validation\n * envelope (`Invalid session create request: <fields> failed schema\n * validation`) and a 400 request-body envelope whose issues name `startMode`.\n * Any other validation error stays an ordinary API error.\n */\nexport function rejectsStartModeField(error: OpenGeniApiError): boolean {\n if (error.status !== 400 && error.status !== 422) return false;\n let parsed: unknown;\n try {\n parsed = JSON.parse(error.body);\n } catch {\n return false;\n }\n if (!parsed || typeof parsed !== \"object\") return false;\n const record = parsed as Record<string, unknown>;\n const envelope =\n record.error && typeof record.error === \"object\"\n ? (record.error as Record<string, unknown>)\n : record;\n const message = typeof envelope.message === \"string\" ? envelope.message : \"\";\n const fields = /^Invalid session create request: (.+) failed schema validation$/.exec(message);\n if (\n envelope.code === \"INVALID_SESSION_CREATE_REQUEST\" &&\n fields?.[1]?.split(/,\\s*/).includes(\"startMode\")\n ) {\n return true;\n }\n const details =\n envelope.details && typeof envelope.details === \"object\"\n ? (envelope.details as Record<string, unknown>)\n : null;\n const issues = Array.isArray(details?.issues) ? details.issues : [];\n return issues.some((issue) => {\n if (!issue || typeof issue !== \"object\") return false;\n const path = (issue as Record<string, unknown>).path;\n return (\n path === \"startMode\" || (Array.isArray(path) && path.length === 1 && path[0] === \"startMode\")\n );\n });\n}\n\n/** The committed limit differs from the one requested: never report success. */\nexport function sessionUsageLimitNotConfirmed(\n sessionId: string,\n): OpenGeniSessionUsageLimitUnsupportedError {\n return new OpenGeniSessionUsageLimitUnsupportedError(\n \"The server did not confirm the requested usage limit; it may not support usage limits. Read the limit again before relying on it.\",\n { sessionId },\n );\n}\n\n/** Parse a session usage limit refusal from an API error envelope body. */\nexport function sessionUsageLimitReachedFields(\n body: string,\n): ParsedSessionUsageLimitReachedRefusal | null {\n try {\n const parsed: unknown = JSON.parse(body);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return null;\n const root = parsed as Record<string, unknown>;\n return parseSessionUsageLimitReachedRefusal(\n root.error && typeof root.error === \"object\" && !Array.isArray(root.error)\n ? root.error\n : root,\n );\n } catch {\n return null;\n }\n}\n\n/** Accept both the API error envelope and the standalone admission refusal. */\nexport function allowanceExhaustedFields(body: string): {\n scope: \"workspace\" | \"member\";\n resetsAt: string | null;\n subjectId?: string;\n} | null {\n try {\n const parsed: unknown = JSON.parse(body);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return null;\n const root = parsed as Record<string, unknown>;\n const error =\n root.error && typeof root.error === \"object\" && !Array.isArray(root.error)\n ? (root.error as Record<string, unknown>)\n : root;\n if (error.code !== \"allowance_exhausted\") return null;\n const fields =\n error.details && typeof error.details === \"object\" && !Array.isArray(error.details)\n ? (error.details as Record<string, unknown>)\n : error;\n if (fields.scope !== \"workspace\" && fields.scope !== \"member\") return null;\n if (fields.resetsAt !== null && typeof fields.resetsAt !== \"string\") return null;\n return {\n scope: fields.scope,\n resetsAt: fields.resetsAt,\n ...(typeof fields.subjectId === \"string\" ? { subjectId: fields.subjectId } : {}),\n };\n } catch {\n return null;\n }\n}\n\nexport type OpenGeniSecureContextRequiredReason = \"insecure_context\" | \"web_crypto_unavailable\";\n\n/**\n * A browser operation requires secure-context-only platform capabilities.\n * Callers may key UI behavior on the stable `secure_context_required` code;\n * `reason` exists only to keep the human guidance truthful.\n */\nexport class OpenGeniSecureContextRequiredError extends Error {\n readonly code = \"secure_context_required\" as const;\n readonly retryable = false;\n readonly reason: OpenGeniSecureContextRequiredReason;\n\n constructor(reason: OpenGeniSecureContextRequiredReason) {\n super(\n reason === \"insecure_context\"\n ? \"Couldn’t attach this file because Opengeni is open over HTTP. Attachments require a secure HTTPS connection. Open the secure site or configure HTTPS for this deployment.\"\n : \"Couldn’t attach this file because secure browser cryptography is unavailable. Attachments require HTTPS and Web Crypto support. Open a secure site in a supported browser or configure HTTPS for this deployment.\",\n );\n this.name = \"OpenGeniSecureContextRequiredError\";\n this.reason = reason;\n }\n}\n\nfunction decodeApiErrorBody(body: string): {\n code: string | undefined;\n message: string | undefined;\n requestId: string | undefined;\n retryable: boolean | undefined;\n outcomeUnknown: boolean | undefined;\n details: Record<string, unknown> | undefined;\n} | null {\n if (!body) return null;\n try {\n const decoded: unknown = JSON.parse(body);\n if (!decoded || typeof decoded !== \"object\" || Array.isArray(decoded)) return null;\n const record = decoded as Record<string, unknown>;\n const nested =\n record.error && typeof record.error === \"object\" && !Array.isArray(record.error)\n ? (record.error as Record<string, unknown>)\n : record;\n const code = boundedApiField(nested.code);\n const message = boundedApiField(nested.message);\n const requestId = boundedCorrelationId(nested.requestId);\n const retryable = typeof nested.retryable === \"boolean\" ? nested.retryable : undefined;\n const outcomeUnknown =\n typeof nested.outcomeUnknown === \"boolean\" ? nested.outcomeUnknown : undefined;\n const details = boundedApiDetails(nested.details);\n if (\n !code &&\n !message &&\n !requestId &&\n retryable === undefined &&\n outcomeUnknown === undefined &&\n !details\n )\n return null;\n return {\n code,\n message,\n requestId,\n retryable,\n outcomeUnknown,\n details,\n };\n } catch {\n return null;\n }\n}\n\nfunction boundedApiDetails(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return;\n const entries = Object.entries(value as Record<string, unknown>).slice(0, 16);\n const details: Record<string, unknown> = {};\n for (const [key, entry] of entries) {\n if (!/^[a-zA-Z][\\w.-]{0,63}$/.test(key)) continue;\n if (typeof entry === \"string\") {\n const bounded = boundedApiField(entry);\n if (bounded !== undefined) details[key] = bounded;\n } else if (typeof entry === \"number\" || typeof entry === \"boolean\" || entry === null) {\n details[key] = entry;\n }\n }\n return Object.keys(details).length > 0 ? details : undefined;\n}\n\nfunction boundedApiField(value: unknown): string | undefined {\n if (typeof value !== \"string\") return;\n const bytes = new TextEncoder().encode(value);\n return bytes.byteLength <= 512 ? value : new TextDecoder().decode(bytes.slice(0, 512));\n}\n\nfunction retryableApiStatus(status: number): boolean {\n return status === 408 || status === 409 || status === 425 || status === 429 || status >= 500;\n}\n\nfunction boundedCorrelationId(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length > 128 || !/^[\\w.:-]+$/.test(value)) {\n return;\n }\n return value;\n}\n\n/** A legacy short-lived session-list snapshot cursor can no longer be continued. */\nexport class OpenGeniSessionListCursorError extends OpenGeniApiError {}\n\n/** The browser bundle and API disagree about their state-changing wire contract. */\nexport class OpenGeniApiContractMismatchError extends Error {\n readonly expected: string;\n readonly actual: string;\n\n constructor(expected: string, actual: string) {\n super(`Opengeni API contract mismatch: client expects ${expected}, API serves ${actual}`);\n this.name = \"OpenGeniApiContractMismatchError\";\n this.expected = expected;\n this.actual = actual;\n }\n}\n\n/** Error for an unrecoverable event-stream condition (not a transient drop). */\nexport class OpenGeniStreamError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OpenGeniStreamError\";\n }\n}\n\n/**\n * Brand-neutral end-user copy for a failed SDK operation. Error.message, body,\n * details and typed fields remain unchanged for diagnostics and host policy.\n * Never use this to rewrite user, assistant or tool content.\n */\nexport function formatErrorMessage(\n error: unknown,\n fallback = \"The request could not be completed.\",\n): string {\n if (error instanceof OpenGeniApiError) {\n let message: string;\n if (error.outcomeUnknown) {\n message = \"The request could not be confirmed. Check its status before retrying.\";\n } else if (\n error instanceof OpenGeniSetupError ||\n error.code === \"OPENGENI_SETUP_REQUIRED\" ||\n error.code === \"SESSION_TENANCY_NOT_ACTIVATED\"\n ) {\n message = \"Private conversations are unavailable. Ask an administrator to enable them.\";\n } else if (error.details?.code === \"not_available_for_viewer\") {\n message = \"This Site's assistant is not available for this viewer.\";\n } else if (error.details?.code === \"site_budget_exhausted\") {\n message = \"This Site's assistant has reached its usage limit for now.\";\n } else if (error.details?.code === \"site_budget_busy\") {\n message = \"This Site's assistant is busy. Try again in a moment.\";\n } else if (error.details?.code === \"site_platform_brake_engaged\") {\n message = \"This Site's assistant is paused for visitors right now.\";\n } else if (error.code === \"allowance_exhausted\") {\n message = \"Usage limit reached. Wait for the reset or ask an administrator for more usage.\";\n } else if (error instanceof OpenGeniSessionListCursorError) {\n message = \"The conversation list changed. Refresh and try again.\";\n } else if (error.status === 401) {\n message = \"Sign in to continue.\";\n } else if (error.status === 403) {\n message = \"You don’t have permission to do that.\";\n } else if (error.status === 404) {\n message = \"The requested item is unavailable.\";\n } else if (error.status === 402 || error.code === \"payment_required\") {\n message = \"There are not enough credits to continue.\";\n } else if (error.status === 429 || error.code === \"rate_limited\") {\n message = error.retryable\n ? \"Too many requests. Wait a moment and try again.\"\n : \"This request is unavailable. Ask an administrator for help.\";\n } else if (error.status === 409) {\n message = \"The request conflicts with the current state. Refresh and try again.\";\n } else if (error.status === 400 || error.status === 422) {\n message = \"The request could not be accepted. Check your input and try again.\";\n } else if (error.status === 408 || error.status === 425 || error.status === 0) {\n message = error.retryable\n ? \"The connection could not be completed. Try again later.\"\n : fallback;\n } else if (error.status >= 500) {\n message = error.retryable\n ? \"The service is temporarily unavailable. Try again later.\"\n : \"The service is unavailable. Ask an administrator for help.\";\n } else {\n message = fallback;\n }\n return error.correlationId ? `${message} Reference: ${error.correlationId}.` : message;\n }\n if (\n error instanceof OpenGeniSecureContextRequiredError ||\n (error instanceof Error && \"code\" in error && error.code === \"secure_context_required\")\n ) {\n return \"reason\" in error && error.reason === \"insecure_context\"\n ? \"Attachments require HTTPS. Open this page over a secure connection.\"\n : \"Attachments require secure browser cryptography. Use a supported browser over HTTPS.\";\n }\n if (error instanceof OpenGeniApiContractMismatchError) {\n return \"This page is out of date. Reload it before trying again.\";\n }\n if (error instanceof OpenGeniStreamError) {\n return \"The live connection could not be restored. Refresh to check the latest state.\";\n }\n return fallback;\n}\n\nexport function isAbortError(error: unknown): boolean {\n return (\n (error instanceof DOMException && error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\n/**\n * Transient conditions worth a reconnect: network-level failures (`fetch`\n * rejects with `TypeError`) and HTTP statuses that signal a temporary server\n * or contention condition. Auth/validation failures (401/403/404/...) are\n * permanent and surface to the caller instead.\n */\nexport function isRetryableStreamError(error: unknown): boolean {\n if (error instanceof OpenGeniApiError) return error.retryable;\n return error instanceof TypeError;\n}\n"],"mappings":"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","names":["record"]}