@opengeni/sdk 0.52.1 → 1.0.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 (300) hide show
  1. package/README.md +1078 -33
  2. package/dist/accounts.d.ts +153 -0
  3. package/dist/accounts.js +307 -0
  4. package/dist/accounts.js.map +1 -0
  5. package/dist/adapters/express.d.ts +31 -0
  6. package/dist/adapters/express.js +87 -0
  7. package/dist/adapters/express.js.map +1 -0
  8. package/dist/adapters/hono.d.ts +16 -0
  9. package/dist/adapters/hono.js +8 -0
  10. package/dist/adapters/hono.js.map +1 -0
  11. package/dist/adapters/next.d.ts +29 -0
  12. package/dist/adapters/next.js +22 -0
  13. package/dist/adapters/next.js.map +1 -0
  14. package/dist/allowance-refusal.d.ts +2 -0
  15. package/dist/allowance-refusal.js +50 -0
  16. package/dist/allowance-refusal.js.map +1 -0
  17. package/dist/artifact-catalog.d.ts +31 -0
  18. package/dist/artifact-client.d.ts +23 -11
  19. package/dist/artifacts.d.ts +1 -1
  20. package/dist/artifacts.js +7 -5
  21. package/dist/automations-client.d.ts +17 -0
  22. package/dist/automations.d.ts +3 -0
  23. package/dist/automations.js +84 -0
  24. package/dist/automations.js.map +1 -0
  25. package/dist/browser.d.ts +11 -0
  26. package/dist/browser.js +47 -0
  27. package/dist/browser.js.map +1 -0
  28. package/dist/chat/fold.d.ts +75 -0
  29. package/dist/chat/handler.d.ts +41 -0
  30. package/dist/chat/http.d.ts +67 -0
  31. package/dist/chat/ids.d.ts +34 -0
  32. package/dist/chat/index.d.ts +9 -0
  33. package/dist/chat/index.js +1694 -0
  34. package/dist/chat/index.js.map +1 -0
  35. package/dist/chat/openai.d.ts +30 -0
  36. package/dist/chat/opengeni.d.ts +128 -0
  37. package/dist/chat/types.d.ts +207 -0
  38. package/dist/chat/vercel.d.ts +49 -0
  39. package/dist/chats.d.ts +8 -0
  40. package/dist/{chunk-KIHGPM7H.js → chunk-2UXZUCEZ.js} +309 -46
  41. package/dist/chunk-2UXZUCEZ.js.map +1 -0
  42. package/dist/chunk-4SMEOV3P.js +246 -0
  43. package/dist/chunk-4SMEOV3P.js.map +1 -0
  44. package/dist/{chunk-FHI4DFIG.js → chunk-AH5D5Q5V.js} +31 -35
  45. package/dist/chunk-AH5D5Q5V.js.map +1 -0
  46. package/dist/chunk-APXVSSSY.js +301 -0
  47. package/dist/chunk-APXVSSSY.js.map +1 -0
  48. package/dist/chunk-DUVIYER4.js +639 -0
  49. package/dist/chunk-DUVIYER4.js.map +1 -0
  50. package/dist/{chunk-ILQZR5N6.js → chunk-FG3OO5LM.js} +3484 -750
  51. package/dist/chunk-FG3OO5LM.js.map +1 -0
  52. package/dist/chunk-GZYZT22T.js +260 -0
  53. package/dist/chunk-GZYZT22T.js.map +1 -0
  54. package/dist/chunk-HMGADJGZ.js +150 -0
  55. package/dist/chunk-HMGADJGZ.js.map +1 -0
  56. package/dist/{chunk-DXDL7EEW.js → chunk-KWADQ227.js} +198 -114
  57. package/dist/chunk-KWADQ227.js.map +1 -0
  58. package/dist/chunk-LY2K6ELJ.js +126 -0
  59. package/dist/chunk-LY2K6ELJ.js.map +1 -0
  60. package/dist/chunk-MOTJYIYL.js +340 -0
  61. package/dist/chunk-MOTJYIYL.js.map +1 -0
  62. package/dist/{chunk-MZWTWOX6.js → chunk-NC57YMUO.js} +447 -3
  63. package/dist/chunk-NC57YMUO.js.map +1 -0
  64. package/dist/chunk-RWKB6YZG.js +1270 -0
  65. package/dist/chunk-RWKB6YZG.js.map +1 -0
  66. package/dist/chunk-U6CV2SXO.js +195 -0
  67. package/dist/chunk-U6CV2SXO.js.map +1 -0
  68. package/dist/chunk-UM4ZXXJR.js +9 -0
  69. package/dist/chunk-UM4ZXXJR.js.map +1 -0
  70. package/dist/chunk-V6GIY62B.js +229 -0
  71. package/dist/chunk-V6GIY62B.js.map +1 -0
  72. package/dist/chunk-WU6GQG25.js +268 -0
  73. package/dist/chunk-WU6GQG25.js.map +1 -0
  74. package/dist/{chunk-VWE2QIVO.js → chunk-XNG7YGR3.js} +23 -6
  75. package/dist/chunk-XNG7YGR3.js.map +1 -0
  76. package/dist/{chunk-FRJFNDIR.js → chunk-YIKA2QT4.js} +37 -2
  77. package/dist/chunk-YIKA2QT4.js.map +1 -0
  78. package/dist/chunk-ZKPY6YAJ.js +135 -0
  79. package/dist/chunk-ZKPY6YAJ.js.map +1 -0
  80. package/dist/client.d.ts +843 -107
  81. package/dist/codex-realtime-controller.d.ts +6 -0
  82. package/dist/codex-realtime-controller.js +2 -2
  83. package/dist/codex-realtime-v3.d.ts +13 -2
  84. package/dist/company-brain.d.ts +22 -0
  85. package/dist/company-profile.d.ts +14 -1
  86. package/dist/core.d.ts +9 -3
  87. package/dist/core.js +28 -9
  88. package/dist/deprecation.d.ts +47 -0
  89. package/dist/desktop.d.ts +8 -0
  90. package/dist/document-authority-client.d.ts +51 -0
  91. package/dist/document-authority.d.ts +2 -0
  92. package/dist/document-authority.js +12 -0
  93. package/dist/document-authority.js.map +1 -0
  94. package/dist/editable-artifacts/browser-session.d.ts +7 -3
  95. package/dist/editable-artifacts/controller.d.ts +4 -1
  96. package/dist/editable-artifacts/errors.d.ts +1 -1
  97. package/dist/editable-artifacts/http-live-transport.d.ts +6 -2
  98. package/dist/editable-artifacts/index.d.ts +2 -0
  99. package/dist/editable-artifacts/open-failure.d.ts +9 -0
  100. package/dist/editable-artifacts/types.d.ts +6 -3
  101. package/dist/editable-artifacts/worker/kernel-adapter.d.ts +1 -1
  102. package/dist/editable-artifacts-worker.js +44 -17
  103. package/dist/editable-artifacts-worker.js.map +1 -1
  104. package/dist/editable-artifacts.js +243 -124
  105. package/dist/editable-artifacts.js.map +1 -1
  106. package/dist/embedding-client.d.ts +129 -0
  107. package/dist/errors.d.ts +36 -1
  108. package/dist/feedback.d.ts +23 -0
  109. package/dist/gateway-realtime-transport.d.ts +1 -0
  110. package/dist/gateway-realtime-transport.js +5 -3
  111. package/dist/github-repositories.d.ts +10 -0
  112. package/dist/github-repositories.js +36 -0
  113. package/dist/github-repositories.js.map +1 -0
  114. package/dist/index.d.ts +61 -12
  115. package/dist/index.js +277 -126
  116. package/dist/index.js.map +1 -1
  117. package/dist/interaction-revision-stream.d.ts +11 -0
  118. package/dist/interaction.d.ts +687 -5
  119. package/dist/interaction.js +32 -1
  120. package/dist/knowledge.d.ts +7 -0
  121. package/dist/knowledge.js +20 -0
  122. package/dist/knowledge.js.map +1 -0
  123. package/dist/message-links.d.ts +68 -0
  124. package/dist/model-context.d.ts +68 -0
  125. package/dist/model-display.d.ts +2 -0
  126. package/dist/model-display.js +15 -0
  127. package/dist/model-display.js.map +1 -0
  128. package/dist/model-picker-order.d.ts +1 -0
  129. package/dist/model-picker-order.js +10 -0
  130. package/dist/model-picker-order.js.map +1 -0
  131. package/dist/organization-integration-policy.d.ts +26 -0
  132. package/dist/organization-integration-policy.js +26 -0
  133. package/dist/organization-integration-policy.js.map +1 -0
  134. package/dist/organization-private-session-settings.d.ts +6 -0
  135. package/dist/organization-private-session-settings.js +22 -0
  136. package/dist/organization-private-session-settings.js.map +1 -0
  137. package/dist/organization-user-setup.d.ts +8 -0
  138. package/dist/organization-user-setup.js +16 -0
  139. package/dist/organization-user-setup.js.map +1 -0
  140. package/dist/pr-review-client.d.ts +16 -0
  141. package/dist/pr-review.d.ts +4 -0
  142. package/dist/pr-review.js +62 -0
  143. package/dist/pr-review.js.map +1 -0
  144. package/dist/preference-registry.d.ts +9 -1
  145. package/dist/proxy.d.ts +7 -5
  146. package/dist/realtime.d.ts +6 -4
  147. package/dist/realtime.js +10 -6
  148. package/dist/realtime.js.map +1 -1
  149. package/dist/retained-artifacts.d.ts +5 -1
  150. package/dist/session-history-import.d.ts +22 -0
  151. package/dist/session-history-import.js +36 -0
  152. package/dist/session-history-import.js.map +1 -0
  153. package/dist/session-list-entries.d.ts +1 -0
  154. package/dist/session-list-entries.js +7 -0
  155. package/dist/session-list-entries.js.map +1 -0
  156. package/dist/session-message-search.d.ts +53 -0
  157. package/dist/session-proxy-client.d.ts +24 -0
  158. package/dist/session-proxy.d.ts +245 -0
  159. package/dist/session-proxy.js +24 -0
  160. package/dist/session-proxy.js.map +1 -0
  161. package/dist/session-titles.d.ts +2 -0
  162. package/dist/site-browser-entry.d.ts +1 -0
  163. package/dist/site-browser-runtime.gen.d.ts +1 -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 +16 -0
  169. package/dist/site-tool-bridge.d.ts +44 -0
  170. package/dist/site.d.ts +101 -0
  171. package/dist/site.js +49 -0
  172. package/dist/site.js.map +1 -0
  173. package/dist/skills.d.ts +75 -0
  174. package/dist/stream.d.ts +2 -0
  175. package/dist/tenant-workspaces.d.ts +47 -0
  176. package/dist/tenant-workspaces.js +8 -0
  177. package/dist/tenant-workspaces.js.map +1 -0
  178. package/dist/tool-auth.d.ts +87 -0
  179. package/dist/tool-auth.js +23 -0
  180. package/dist/tool-auth.js.map +1 -0
  181. package/dist/tool-display-metadata.d.ts +3 -0
  182. package/dist/tools-FXBLUWAE.js +12 -0
  183. package/dist/tools-FXBLUWAE.js.map +1 -0
  184. package/dist/tools.d.ts +61 -0
  185. package/dist/types.d.ts +3048 -406
  186. package/dist/usage-allowances.d.ts +36 -0
  187. package/dist/usage-allowances.js +80 -0
  188. package/dist/usage-allowances.js.map +1 -0
  189. package/dist/workspace-artifacts.d.ts +33 -5
  190. package/dist/workspace-instruction-policies.d.ts +24 -2
  191. package/dist/workspace-integrations.d.ts +74 -0
  192. package/dist/workspace-integrations.js +65 -0
  193. package/dist/workspace-integrations.js.map +1 -0
  194. package/dist/workspace-learning.d.ts +124 -0
  195. package/dist/workspace-live-stream.d.ts +14 -0
  196. package/dist/workspace-state.d.ts +8 -71
  197. package/package.json +108 -3
  198. package/src/accounts.ts +443 -0
  199. package/src/adapters/express.ts +136 -0
  200. package/src/adapters/hono.ts +18 -0
  201. package/src/adapters/next.ts +42 -0
  202. package/src/allowance-refusal.ts +5 -0
  203. package/src/artifact-catalog.ts +41 -0
  204. package/src/artifact-client.ts +43 -52
  205. package/src/artifacts.ts +7 -1
  206. package/src/automations-client.ts +124 -0
  207. package/src/automations.ts +15 -0
  208. package/src/browser.ts +54 -0
  209. package/src/chat/fold.ts +431 -0
  210. package/src/chat/handler.ts +240 -0
  211. package/src/chat/http.ts +257 -0
  212. package/src/chat/ids.ts +85 -0
  213. package/src/chat/index.ts +87 -0
  214. package/src/chat/openai.ts +439 -0
  215. package/src/chat/opengeni.ts +722 -0
  216. package/src/chat/types.ts +219 -0
  217. package/src/chat/vercel.ts +204 -0
  218. package/src/chats.ts +16 -0
  219. package/src/client.ts +5162 -792
  220. package/src/codex-realtime-controller.ts +260 -12
  221. package/src/codex-realtime-lifecycle.ts +1 -0
  222. package/src/codex-realtime-v3.ts +162 -31
  223. package/src/codex-realtime.ts +1 -1
  224. package/src/company-brain.ts +59 -0
  225. package/src/company-profile.ts +17 -1
  226. package/src/core.ts +23 -1
  227. package/src/deprecation.ts +149 -0
  228. package/src/desktop.ts +11 -1
  229. package/src/document-authority-client.ts +219 -0
  230. package/src/document-authority.ts +17 -0
  231. package/src/editable-artifacts/browser-session.ts +36 -22
  232. package/src/editable-artifacts/controller.ts +102 -47
  233. package/src/editable-artifacts/errors.ts +2 -0
  234. package/src/editable-artifacts/http-live-transport.ts +62 -37
  235. package/src/editable-artifacts/index.ts +6 -0
  236. package/src/editable-artifacts/open-failure.ts +79 -0
  237. package/src/editable-artifacts/storage.ts +31 -40
  238. package/src/editable-artifacts/types.ts +6 -3
  239. package/src/editable-artifacts/worker/kernel-adapter.ts +23 -7
  240. package/src/editable-artifacts/worker/runtime.ts +26 -13
  241. package/src/editable-artifacts/worker/wire-codec.ts +23 -5
  242. package/src/embedding-client.ts +519 -0
  243. package/src/errors.ts +185 -4
  244. package/src/feedback.ts +20 -0
  245. package/src/gateway-realtime-transport.ts +253 -110
  246. package/src/github-repositories.ts +60 -0
  247. package/src/index.ts +603 -54
  248. package/src/interaction-revision-stream.ts +117 -0
  249. package/src/interaction.ts +1367 -51
  250. package/src/knowledge.ts +72 -0
  251. package/src/message-links.ts +178 -0
  252. package/src/model-context.ts +112 -0
  253. package/src/model-display.ts +10 -0
  254. package/src/model-picker-order.ts +6 -0
  255. package/src/organization-integration-policy.ts +54 -0
  256. package/src/organization-private-session-settings.ts +33 -0
  257. package/src/organization-user-setup.ts +31 -0
  258. package/src/pr-review-client.ts +92 -0
  259. package/src/pr-review.ts +17 -0
  260. package/src/preference-registry.ts +11 -0
  261. package/src/proxy.ts +17 -6
  262. package/src/realtime.ts +15 -4
  263. package/src/retained-artifacts.ts +101 -0
  264. package/src/session-history-import.ts +84 -0
  265. package/src/session-list-entries.ts +1 -0
  266. package/src/session-message-search.ts +47 -0
  267. package/src/session-proxy-client.ts +64 -0
  268. package/src/session-proxy.ts +1473 -0
  269. package/src/session-titles.ts +10 -0
  270. package/src/site-browser-entry.ts +6 -0
  271. package/src/site-browser-runtime.gen.ts +2 -0
  272. package/src/site-document.test.ts +64 -0
  273. package/src/site-document.ts +18 -0
  274. package/src/site-http.ts +162 -0
  275. package/src/site-tool-bridge.ts +146 -0
  276. package/src/site.ts +585 -0
  277. package/src/skills.ts +69 -0
  278. package/src/sse.ts +8 -2
  279. package/src/stream.ts +38 -4
  280. package/src/tenant-workspaces.ts +148 -0
  281. package/src/tool-auth.ts +301 -0
  282. package/src/tool-display-metadata.ts +19 -0
  283. package/src/tools.ts +396 -0
  284. package/src/types.ts +3607 -493
  285. package/src/usage-allowances.ts +189 -0
  286. package/src/workspace-artifacts.ts +40 -6
  287. package/src/workspace-instruction-policies.ts +26 -1
  288. package/src/workspace-integrations.ts +402 -0
  289. package/src/workspace-learning.ts +138 -0
  290. package/src/workspace-live-stream.ts +137 -0
  291. package/src/workspace-state.ts +8 -82
  292. package/dist/chunk-DXDL7EEW.js.map +0 -1
  293. package/dist/chunk-FHI4DFIG.js.map +0 -1
  294. package/dist/chunk-FRJFNDIR.js.map +0 -1
  295. package/dist/chunk-ILQZR5N6.js.map +0 -1
  296. package/dist/chunk-KIHGPM7H.js.map +0 -1
  297. package/dist/chunk-MZWTWOX6.js.map +0 -1
  298. package/dist/chunk-V5F253OG.js +0 -116
  299. package/dist/chunk-V5F253OG.js.map +0 -1
  300. package/dist/chunk-VWE2QIVO.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chat/ids.ts","../src/tenant-workspaces.ts"],"sourcesContent":["/**\n * Deterministic chat identities. A conversation id maps to exactly one\n * session id per workspace, so any process can address the same session\n * without storing a mapping, and a double-submitted create collapses through\n * the idempotency key. The optional legacy label argument is retained only to\n * reproduce historical addresses. New chat calls do not use it: authorization\n * is independent of addressing, so collaborators can share a conversation.\n */\n\n/** The end-user label a conversation is namespaced to: the product `source` plus the opaque user id. */\nexport type ChatUserLabel = { source: string; id: string };\n\n/** Fixed RFC 4122 namespace for chat session ids. Never change it. */\nexport const CHAT_SESSION_NAMESPACE = \"7c1e6d3a-5b2f-4e8a-9d4c-0f3b6a8e2c17\";\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** RFC 4122 version 5 (SHA-1) UUID of `name` inside `namespace`. */\nexport async function uuidV5(name: string, namespace: string): Promise<string> {\n const namespaceBytes = parseUuid(namespace);\n const nameBytes = new TextEncoder().encode(name);\n const input = new Uint8Array(namespaceBytes.length + nameBytes.length);\n input.set(namespaceBytes, 0);\n input.set(nameBytes, namespaceBytes.length);\n const digest = new Uint8Array(await crypto.subtle.digest(\"SHA-1\", input)).slice(0, 16);\n digest[6] = ((digest[6] ?? 0) & 0x0f) | 0x50;\n digest[8] = ((digest[8] ?? 0) & 0x3f) | 0x80;\n return formatUuid(digest);\n}\n\n/**\n * The session id of `conversation` in `workspaceId`: RFC 4122 v5 of the JSON\n * tuple `[workspaceId, conversation]`, or `[workspaceId, source, id, conversation]`\n * when the conversation belongs to an end user. JSON encoding keeps the tuple\n * unambiguous: an id containing `:` or any other delimiter can never make two\n * different (user, conversation) pairs share a session.\n */\nexport async function chatSessionId(\n workspaceId: string,\n conversation: string,\n user?: ChatUserLabel | undefined,\n): Promise<string> {\n return await uuidV5(chatIdentityName(workspaceId, conversation, user), CHAT_SESSION_NAMESPACE);\n}\n\n/** The exact v5 name behind {@link chatSessionId}; exported for tests and audits. */\nexport function chatIdentityName(\n workspaceId: string,\n conversation: string,\n user?: ChatUserLabel | undefined,\n): string {\n return JSON.stringify(\n user ? [workspaceId, user.source, user.id, conversation] : [workspaceId, conversation],\n );\n}\n\n/**\n * The create idempotency key for a chat session: `chat:<sessionId>`. The\n * session id already encodes the workspace, user label, and conversation as an\n * unambiguous tuple, so the key inherits that and stays bounded.\n */\nexport function chatIdempotencyKey(sessionId: string): string {\n return `chat:${sessionId}`;\n}\n\nexport function isUuid(value: string): boolean {\n return UUID_PATTERN.test(value);\n}\n\nfunction parseUuid(value: string): Uint8Array {\n if (!UUID_PATTERN.test(value)) {\n throw new TypeError(`Invalid UUID namespace: ${value}`);\n }\n const hex = value.replace(/-/g, \"\");\n const bytes = new Uint8Array(16);\n for (let index = 0; index < 16; index += 1) {\n bytes[index] = Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16);\n }\n return bytes;\n}\n\nfunction formatUuid(bytes: Uint8Array): string {\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;\n}\n","import type { OpenGeniEmbeddingClient } from \"./embedding-client\";\nimport type { Permission } from \"./types\";\nimport { OpenGeniApiError } from \"./errors\";\nimport { uuidV5 } from \"./chat/ids\";\n\nconst ISOLATION_NAMESPACE = \"fc398712-b4db-5b0b-8842-57cb4f2a65f9\";\n/**\n * Conversation-only member permissions. The API grants exactly this set when\n * an organization key first acts as a user on a workspace (keep equal to\n * `EXTERNAL_FIRST_USE_MEMBER_PERMISSIONS` in `packages/core/src/access`).\n */\nconst CONVERSATION_PERMISSIONS = [\n \"workspace:read\",\n \"sessions:create\",\n \"sessions:read\",\n \"sessions:control\",\n \"files:upload\",\n \"files:read\",\n \"mcp_servers:attach\",\n] as const;\n\nexport type WorkspaceIdTarget = {\n /**\n * Your tenant id. With user isolation and no tenant, the user gets one\n * workspace of their own, independent of any tenant.\n */\n tenant?: string | undefined;\n user?: string | undefined;\n /** External user identity source; defaults to the resolver's source. */\n source?: string | undefined;\n};\n\nexport type WorkspaceIdOptions = {\n /**\n * `tenant`: one workspace per tenant. `user`: a separate workspace for the\n * user (per tenant when a tenant is given, otherwise one per user).\n */\n isolation: \"tenant\" | \"user\";\n};\n\nexport type WorkspaceIdResolverOptions = {\n /** The organization id, or a lazy lookup (for example derived from the API key). */\n organizationId: string | (() => Promise<string>);\n source: string;\n /** Workspace display name; receives the tenant id, or the user id for a per-user workspace. */\n workspaceName?: ((tenant: string) => string) | undefined;\n /**\n * Per-user workspaces only (user isolation): permissions for the one member\n * this resolver adds explicitly, its owner. Replaces the defaults: workspace\n * read, session create/read/control (including sending messages), file\n * upload/read, and attaching the host's per-session MCP servers. No admin\n * permissions are granted by default. Tenant workspaces rely on the API,\n * which adds a missing member with those defaults on their first request.\n * Existing grants are never changed here; change them with\n * `updateExternalWorkspaceMember`. The organization API key must also allow\n * the selected permissions.\n */\n memberPermissions?: readonly Permission[] | undefined;\n};\n\n/**\n * Server-only workspace resolution using external workspace provisioning.\n * Workspaces are created on first use and cached. A tenant workspace's members\n * are added by the API on their first `asUser` request (the organization key\n * needs `members:manage`). A per-user workspace stays single-user: the API\n * never auto-admits anyone there, and this resolver adds its owner with a\n * stable onboarding key, so retries never restore a revoked grant.\n */\nexport function createWorkspaceIdResolver(\n client: Pick<OpenGeniEmbeddingClient, \"ensureWorkspace\" | \"addExternalWorkspaceMember\">,\n options: WorkspaceIdResolverOptions,\n): (target: WorkspaceIdTarget, resolution: WorkspaceIdOptions) => Promise<string> {\n const memberPermissions = [...(options.memberPermissions ?? CONVERSATION_PERMISSIONS)];\n const cache = new Map<string, Promise<string>>();\n const organizationId = async () =>\n typeof options.organizationId === \"function\"\n ? await options.organizationId()\n : options.organizationId;\n return async (target, resolution) => {\n const isolated = resolution.isolation === \"user\";\n if (!isolated && !target.tenant) throw new TypeError(\"workspaceIdFor requires a tenant.\");\n if (isolated && !target.user) {\n throw new TypeError(\"User isolation requires an authenticated product user.\");\n }\n const source = target.source ?? options.source;\n // A per-user workspace without a tenant has its own key shape, so it can\n // never alias a tenant-scoped isolated workspace.\n const key = target.tenant\n ? JSON.stringify([\n resolution.isolation,\n options.source,\n source,\n target.tenant,\n isolated ? target.user : null,\n ])\n : JSON.stringify([\"user\", options.source, source, target.user]);\n let pending = cache.get(key);\n if (!pending) {\n pending = (async () => {\n const productSource = options.source.trim();\n const isolatedSource = `opengeni-sdk:user-isolation:${await uuidV5(productSource, ISOLATION_NAMESPACE)}`;\n const label = target.tenant ?? target.user!;\n const { workspace } = await client.ensureWorkspace({\n accountId: await organizationId(),\n externalSource: isolated\n ? isolatedSource === productSource\n ? `${isolatedSource}:user`\n : isolatedSource\n : options.source,\n externalId: isolated ? await uuidV5(key, ISOLATION_NAMESPACE) : target.tenant!,\n name: options.workspaceName?.(label) ?? label,\n });\n if (isolated) {\n try {\n await client.addExternalWorkspaceMember(workspace.id, {\n identity: { source, externalId: target.user! },\n permissions: [...memberPermissions],\n operationId: await uuidV5(\n JSON.stringify([\"member\", workspace.id, source, target.user]),\n ISOLATION_NAMESPACE,\n ),\n });\n } catch (error) {\n // Defaults/custom permissions may have changed since this stable\n // onboarding key committed, or the grant may have been cancelled.\n // A definitive conflict must never mint a new key or update access.\n // Return only the address: every asUser operation still checks the\n // live membership, including reduced or withdrawn permissions.\n if (\n !(error instanceof OpenGeniApiError) ||\n error.status !== 409 ||\n error.code !== \"conflict\" ||\n error.outcomeUnknown\n )\n throw error;\n }\n }\n return workspace.id;\n })();\n pending.catch(() => {\n if (cache.get(key) === pending) cache.delete(key);\n });\n if (cache.size >= 1_000) cache.delete(cache.keys().next().value!);\n cache.set(key, pending);\n }\n return await pending;\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,340 @@
1
+ import {
2
+ OpenGeniClient
3
+ } from "./chunk-AH5D5Q5V.js";
4
+
5
+ // src/embedding-client.ts
6
+ function hasStaticHeader(options, names) {
7
+ return typeof options.headers !== "function" && Object.keys(options.headers ?? {}).some((key) => names.includes(key.toLowerCase()));
8
+ }
9
+ function serializeServiceContext(context) {
10
+ if (!context || typeof context !== "object" || Array.isArray(context) || Object.getPrototypeOf(context) !== Object.prototype && Object.getPrototypeOf(context) !== null)
11
+ throw new Error("Invalid service context: expected a flat JSON object");
12
+ const snapshot = /* @__PURE__ */ Object.create(null);
13
+ for (const [key, value] of Object.entries(context)) {
14
+ if (typeof value !== "string" && typeof value !== "boolean" && !(typeof value === "number" && Number.isFinite(value)))
15
+ throw new Error(
16
+ "Invalid service context: values must be strings, finite numbers, or booleans"
17
+ );
18
+ snapshot[key] = value;
19
+ }
20
+ const json = JSON.stringify(snapshot).replace(
21
+ /[\u007f-\uffff]/g,
22
+ (character) => `\\u${character.charCodeAt(0).toString(16).padStart(4, "0")}`
23
+ );
24
+ if (new TextEncoder().encode(json).byteLength > 2048)
25
+ throw new Error("Invalid service context: serialized JSON must not exceed 2 KiB");
26
+ return json;
27
+ }
28
+ var OpenGeniEmbeddingClient = class extends OpenGeniClient {
29
+ /** Read configuration (null means no configured ceiling). Requires admin or organization-key read authority. */
30
+ async getWorkspaceAllowance(workspaceId) {
31
+ return this.requestJson("GET", `/v1/workspaces/${encodeURIComponent(workspaceId)}/allowance`);
32
+ }
33
+ /**
34
+ * Read the lifecycle version even after clear (config=null). version=0 means
35
+ * never configured. Use the returned version to recreate or reconcile a 409;
36
+ * do not guess a CAS version or silently retry a new mutation.
37
+ * Requires the same budget-read authority as getWorkspaceAllowance.
38
+ */
39
+ async getWorkspaceAllowanceState(workspaceId) {
40
+ return this.requestJson(
41
+ "GET",
42
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/allowance/state`
43
+ );
44
+ }
45
+ /**
46
+ * Set a USD-micro ceiling with exact-version CAS (0 only for first creation;
47
+ * after clear reuse its returned version or getWorkspaceAllowanceState). Requires
48
+ * organization key-control authority or account:admin, never workspace admin
49
+ * alone. Shares may oversubscribe the pool; actual post-call settlement can
50
+ * overshoot before the next admission check.
51
+ */
52
+ async setWorkspaceAllowance(workspaceId, request) {
53
+ return this.requestJson(
54
+ "PUT",
55
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/allowance`,
56
+ request
57
+ );
58
+ }
59
+ /**
60
+ * Clear with the exact version; grants and settled usage are not a billing
61
+ * refund. Supply operationId and replay the exact request after a lost response.
62
+ * Replays recheck authority and conflict after a later lifecycle change.
63
+ * On 409 read getWorkspaceAllowanceState before deciding on a new operation.
64
+ */
65
+ async clearWorkspaceAllowance(workspaceId, request) {
66
+ return this.requestJson(
67
+ "DELETE",
68
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/allowance`,
69
+ request
70
+ );
71
+ }
72
+ /** Grant USD micros once. Reuse the operationId and exact request after an uncertain response. */
73
+ async grantWorkspaceCredits(workspaceId, request) {
74
+ return this.requestJson(
75
+ "POST",
76
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/allowance/grants`,
77
+ request
78
+ );
79
+ }
80
+ /**
81
+ * Administer an existing member by canonical subject or external identity.
82
+ * null restores memberDefault; shares >1 are valid ceilings, not reservations.
83
+ * Concurrent calls may exceed the ceiling until their actual cost settles.
84
+ */
85
+ async setMemberAllowance(workspaceId, member, request) {
86
+ const path = typeof member === "string" ? encodeURIComponent(member) : `external/${encodeURIComponent(member.source)}/${encodeURIComponent(member.externalId)}`;
87
+ return this.requestJson(
88
+ "PUT",
89
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/members/${path}/allowance`,
90
+ request
91
+ );
92
+ }
93
+ /** Paginated settled usage, current or YYYY-MM. Requires admin or organization-key read authority. */
94
+ async getUsage(workspaceId, query = {}, options = {}) {
95
+ return this.requestJson(
96
+ "GET",
97
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/usage`,
98
+ void 0,
99
+ usageQuery(query),
100
+ options
101
+ );
102
+ }
103
+ /** Own usage only. On your backend use asUser(authenticatedUser); subject selectors are not accepted. */
104
+ async getMyUsage(workspaceId, query = {}, options = {}) {
105
+ return this.requestJson(
106
+ "GET",
107
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/usage/me`,
108
+ void 0,
109
+ usageQuery(query),
110
+ options
111
+ );
112
+ }
113
+ /** Recover this actor's connection creation result without resending secrets.
114
+ * A 404 means no visible committed result, not proof that an in-flight write failed. */
115
+ async getConnectionCreationResult(workspaceId, operationId) {
116
+ const response = await this.requestJson(
117
+ "GET",
118
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/connections/operations/${encodeURIComponent(operationId)}`
119
+ );
120
+ return response.connection;
121
+ }
122
+ /** Rotate existing inline credentials only while no credential-consuming work
123
+ * is pending or active. Reuse the operation key and exact request to reconcile
124
+ * a lost response. This operation never schedules or retries model work. */
125
+ async rotateSessionMcpCredentials(workspaceId, sessionId, request) {
126
+ return this.requestJson(
127
+ "POST",
128
+ `/v1/workspaces/${workspaceId}/sessions/${sessionId}/mcp-credentials/rotate`,
129
+ request
130
+ );
131
+ }
132
+ /** Contract-checked successful JSON GET with its headers intact, for same-origin
133
+ * proxies that must forward paging metadata. Non-2xx responses throw. */
134
+ async requestJsonResponse(path, query = {}, options = {}) {
135
+ return await this.requestResponse("GET", path, query, {
136
+ ...options,
137
+ accept: "application/json"
138
+ });
139
+ }
140
+ /** Server-side organization-key client scoped to one host-authenticated user.
141
+ * Does not mutate this client, provision workspace membership, or link native
142
+ * identities. The API verifies key and membership authority on each request. */
143
+ asUser(externalId, options = {}) {
144
+ if (typeof window !== "undefined")
145
+ throw new Error("asUser is a server-side API; keep organization keys on your backend");
146
+ if (this.serviceInitiatorHeader !== void 0 || hasStaticHeader(this.options, ["x-opengeni-service-initiator", "x-opengeni-service-context"]))
147
+ throw new Error(
148
+ "asUser and asService are mutually exclusive; start from the unscoped client"
149
+ );
150
+ const source = options.source ?? "default";
151
+ const validOpaqueText = (value, maxBytes) => typeof value === "string" && value.length > 0 && value.length <= maxBytes && !value.includes("\0") && !/[\uD800-\uDFFF]/u.test(value) && new TextEncoder().encode(value).byteLength <= maxBytes;
152
+ if (!validOpaqueText(externalId, 1024) || !validOpaqueText(source, 200)) {
153
+ throw new Error("Invalid external identity reference");
154
+ }
155
+ const Client = this.constructor;
156
+ const client = new Client({ ...this.options });
157
+ client.externalActorHeader = encodeURIComponent(
158
+ JSON.stringify({ mode: "external", identity: { externalId, source } })
159
+ );
160
+ return client;
161
+ }
162
+ /** Server-side automation attribution under this client's existing credential.
163
+ * Returns a new client of the same class; grants no permissions or human/personal
164
+ * resource authority. Cannot be combined with asUser or asLinkedUser.
165
+ * Reapplying asService replaces the name and context rather than merging them. */
166
+ asService(name, context) {
167
+ if (typeof window !== "undefined")
168
+ throw new Error("asService is a server-side API; keep API keys on your backend");
169
+ if (this.externalActorHeader !== void 0 || hasStaticHeader(this.options, ["x-opengeni-external-actor"]))
170
+ throw new Error(
171
+ "asUser and asService are mutually exclusive; start from the unscoped client"
172
+ );
173
+ if (typeof name !== "string" || !/^[a-z0-9][a-z0-9:._-]{0,63}$/.test(name) || name.trim() !== name)
174
+ throw new Error("Invalid service initiator name");
175
+ const serializedContext = context === void 0 ? void 0 : serializeServiceContext(context);
176
+ const Client = this.constructor;
177
+ const client = new Client({ ...this.options });
178
+ client.serviceInitiatorHeader = name;
179
+ client.serviceContextHeader = serializedContext;
180
+ return client;
181
+ }
182
+ /** Explicitly use a confirmed native delegation. Unlike asUser, new resources
183
+ * belong to the native user. Existing external resources are never reassigned.
184
+ * A stale, expired or revoked link is rejected by the server on every request. */
185
+ asLinkedUser(externalId, options) {
186
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(options.linkId) || !Number.isSafeInteger(options.expectedLinkRevision) || options.expectedLinkRevision < 1)
187
+ throw new Error("A confirmed identity link and its exact revision are required");
188
+ const client = this.asUser(
189
+ externalId,
190
+ options.source === void 0 ? {} : { source: options.source }
191
+ );
192
+ const identity = JSON.parse(decodeURIComponent(client.externalActorHeader)).identity;
193
+ client.externalActorHeader = encodeURIComponent(
194
+ JSON.stringify({
195
+ mode: "linked_native",
196
+ identity,
197
+ linkId: options.linkId,
198
+ expectedLinkRevision: options.expectedLinkRevision
199
+ })
200
+ );
201
+ return client;
202
+ }
203
+ /** Optional native-account delegation. Invoke on a server-side asUser client.
204
+ * Pass the one-time challenge to the native consent screen, never a URL query
205
+ * or analytics event. Ordinary external embedding needs none of this. */
206
+ async beginIdentityLink(workspaceId, input) {
207
+ return this.requestJson(
208
+ "POST",
209
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links`,
210
+ input
211
+ );
212
+ }
213
+ async getIdentityLink(workspaceId, linkId) {
214
+ return this.requestJson(
215
+ "GET",
216
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links/${encodeURIComponent(linkId)}`
217
+ );
218
+ }
219
+ /** Only links belonging to the effective participant; no organization-wide directory. */
220
+ async listIdentityLinks(workspaceId, cursor) {
221
+ return this.requestJson(
222
+ "GET",
223
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links${cursor ? `?cursor=${encodeURIComponent(cursor)}` : ""}`
224
+ );
225
+ }
226
+ /** Requires a canonical native browser session, not an organization API key. */
227
+ async previewIdentityLink(workspaceId, linkId, challenge) {
228
+ return this.requestJson(
229
+ "POST",
230
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links/${encodeURIComponent(linkId)}/preview`,
231
+ { challenge }
232
+ );
233
+ }
234
+ async confirmIdentityLink(workspaceId, linkId, input) {
235
+ return this.requestJson(
236
+ "POST",
237
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links/${encodeURIComponent(linkId)}/confirm`,
238
+ input
239
+ );
240
+ }
241
+ async revokeIdentityLink(workspaceId, linkId, expectedRevision) {
242
+ return this.requestJson(
243
+ "POST",
244
+ `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links/${encodeURIComponent(linkId)}/revoke`,
245
+ { expectedRevision }
246
+ );
247
+ }
248
+ /** Service-only lifecycle for an external actor's organization membership.
249
+ * A successful reactivation does not restore revoked workspace grants. */
250
+ async updateExternalIdentityMembership(organizationId, membershipId, request, options = {}) {
251
+ return this.requestJson(
252
+ "PATCH",
253
+ `/v1/organizations/${encodeURIComponent(organizationId)}/external-members/${encodeURIComponent(membershipId)}`,
254
+ request,
255
+ void 0,
256
+ options
257
+ );
258
+ }
259
+ /** Non-provisioning, content-free service lookup, including inactive identities. */
260
+ async lookupExternalIdentity(organizationId, identity) {
261
+ return this.requestJson(
262
+ "POST",
263
+ `/v1/organizations/${encodeURIComponent(organizationId)}/external-identities/lookup`,
264
+ identity
265
+ );
266
+ }
267
+ /** Withdraw an external member's shared-workspace access and fence an exact
268
+ * pending keyed grant. Reuse the exact cancellation body after response loss. */
269
+ async cancelExternalWorkspaceMemberGrant(organizationId, workspaceId, membershipId, request) {
270
+ return this.requestJson(
271
+ "POST",
272
+ `/v1/organizations/${encodeURIComponent(organizationId)}/workspaces/${encodeURIComponent(workspaceId)}/members/${encodeURIComponent(membershipId)}/revoke`,
273
+ request
274
+ );
275
+ }
276
+ /** Replace an existing external member's permissions in one shared
277
+ * workspace. Keyed by `operationId`: reuse the exact body after response
278
+ * loss. Narrowing makes live authority re-check; nothing is cancelled. */
279
+ async updateExternalWorkspaceMember(organizationId, workspaceId, membershipId, request) {
280
+ return this.requestJson(
281
+ "PATCH",
282
+ `/v1/organizations/${encodeURIComponent(organizationId)}/workspaces/${encodeURIComponent(workspaceId)}/external-members/${encodeURIComponent(membershipId)}`,
283
+ request
284
+ );
285
+ }
286
+ async listConnectProviders(workspaceId) {
287
+ return this.requestJson("GET", `/v1/workspaces/${workspaceId}/connect/catalog`);
288
+ }
289
+ async listConnectAccounts(workspaceId) {
290
+ return this.requestJson("GET", `/v1/workspaces/${workspaceId}/connect/accounts`);
291
+ }
292
+ async getConnectAttempt(workspaceId, attemptId) {
293
+ return this.requestJson("GET", `/v1/workspaces/${workspaceId}/connect/attempts/${attemptId}`);
294
+ }
295
+ async listPendingConnectAttempts(workspaceId) {
296
+ return this.requestJson("GET", `/v1/workspaces/${workspaceId}/connect/attempts`);
297
+ }
298
+ async advanceConnectAttempt(workspaceId, attemptId, request) {
299
+ return this.requestJson(
300
+ "POST",
301
+ `/v1/workspaces/${workspaceId}/connect/attempts/${attemptId}/advance`,
302
+ request
303
+ );
304
+ }
305
+ /** Stops setup; does not revoke already committed provider credentials. */
306
+ async cancelConnectAttempt(workspaceId, attemptId, request) {
307
+ return this.requestJson(
308
+ "POST",
309
+ `/v1/workspaces/${workspaceId}/connect/attempts/${attemptId}/cancel`,
310
+ request
311
+ );
312
+ }
313
+ /**
314
+ * Explicit organization-service-key onboarding with chosen permissions. Not
315
+ * needed for the default path: an `asUser` request through a key with
316
+ * `members:manage` adds a missing member with conversation permissions on
317
+ * first use. Change an existing member with `updateExternalWorkspaceMember`.
318
+ */
319
+ async addExternalWorkspaceMember(workspaceId, request) {
320
+ return this.requestJson("POST", `/v1/workspaces/${workspaceId}/external-members`, request);
321
+ }
322
+ };
323
+ function usageQuery(query) {
324
+ return Object.fromEntries(
325
+ Object.entries(query).filter(([, value]) => value !== void 0).map(([key, value]) => [key, String(value)])
326
+ );
327
+ }
328
+
329
+ // ../contracts/src/session-final-reply.ts
330
+ var EMPTY_FINAL_REPLY_NOTICE = "The model returned no final reply after a reply reminder. Completed work is preserved; the goal and later updates are unaffected.";
331
+ function turnCompletedWithEmptyFinalReply(payload) {
332
+ return payload !== null && typeof payload === "object" && !Array.isArray(payload) && payload.emptyFinalReply === true;
333
+ }
334
+
335
+ export {
336
+ OpenGeniEmbeddingClient,
337
+ EMPTY_FINAL_REPLY_NOTICE,
338
+ turnCompletedWithEmptyFinalReply
339
+ };
340
+ //# sourceMappingURL=chunk-MOTJYIYL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/embedding-client.ts","../../contracts/src/session-final-reply.ts"],"sourcesContent":["import { OpenGeniClient as OpenGeniArtifactClient } from \"./artifact-client\";\nimport type { OpenGeniClientOptions } from \"./client\";\nimport type { AddWorkspaceMemberRequest } from \"./types\";\nimport type {\n ExternalIdentityLink,\n BeginExternalIdentityLinkRequest,\n BeginExternalIdentityLinkResponse,\n ConfirmExternalIdentityLinkRequest,\n ExternalIdentityLinkPreview,\n ExternalIdentityLinkPage,\n} from \"@opengeni/contracts/external-identities\";\n\n/** Non-secret service attribution, serialized as a flat JSON object of at most 2 KiB. */\nexport type ServiceContext = Record<string, string | number | boolean>;\n\nfunction hasStaticHeader(options: OpenGeniClientOptions, names: string[]): boolean {\n return (\n typeof options.headers !== \"function\" &&\n Object.keys(options.headers ?? {}).some((key) => names.includes(key.toLowerCase()))\n );\n}\n\nfunction serializeServiceContext(context: ServiceContext): string {\n if (\n !context ||\n typeof context !== \"object\" ||\n Array.isArray(context) ||\n (Object.getPrototypeOf(context) !== Object.prototype && Object.getPrototypeOf(context) !== null)\n )\n throw new Error(\"Invalid service context: expected a flat JSON object\");\n const snapshot: ServiceContext = Object.create(null);\n for (const [key, value] of Object.entries(context)) {\n if (\n typeof value !== \"string\" &&\n typeof value !== \"boolean\" &&\n !(typeof value === \"number\" && Number.isFinite(value))\n )\n throw new Error(\n \"Invalid service context: values must be strings, finite numbers, or booleans\",\n );\n snapshot[key] = value;\n }\n // HTTP Headers require byte strings. JSON escapes preserve Unicode without\n // percent-encoding the object or passing non-byte characters to fetch.\n const json = JSON.stringify(snapshot).replace(\n /[\\u007f-\\uffff]/g,\n (character) => `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n if (new TextEncoder().encode(json).byteLength > 2048)\n throw new Error(\"Invalid service context: serialized JSON must not exceed 2 KiB\");\n return json;\n}\n\n/** Public product embedding administration, kept out of the native browser client. */\nexport class OpenGeniEmbeddingClient extends OpenGeniArtifactClient {\n /** Read configuration (null means no configured ceiling). Requires admin or organization-key read authority. */\n async getWorkspaceAllowance(\n workspaceId: string,\n ): Promise<import(\"@opengeni/contracts/usage-allowances\").WorkspaceAllowance | null> {\n return this.requestJson(\"GET\", `/v1/workspaces/${encodeURIComponent(workspaceId)}/allowance`);\n }\n\n /**\n * Read the lifecycle version even after clear (config=null). version=0 means\n * never configured. Use the returned version to recreate or reconcile a 409;\n * do not guess a CAS version or silently retry a new mutation.\n * Requires the same budget-read authority as getWorkspaceAllowance.\n */\n async getWorkspaceAllowanceState(\n workspaceId: string,\n ): Promise<import(\"@opengeni/contracts/usage-allowances\").WorkspaceAllowanceState> {\n return this.requestJson(\n \"GET\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/allowance/state`,\n );\n }\n\n /**\n * Set a USD-micro ceiling with exact-version CAS (0 only for first creation;\n * after clear reuse its returned version or getWorkspaceAllowanceState). Requires\n * organization key-control authority or account:admin, never workspace admin\n * alone. Shares may oversubscribe the pool; actual post-call settlement can\n * overshoot before the next admission check.\n */\n async setWorkspaceAllowance(\n workspaceId: string,\n request: import(\"@opengeni/contracts/usage-allowances\").SetWorkspaceAllowanceRequest,\n ): Promise<import(\"@opengeni/contracts/usage-allowances\").WorkspaceAllowance> {\n return this.requestJson(\n \"PUT\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/allowance`,\n request,\n );\n }\n\n /**\n * Clear with the exact version; grants and settled usage are not a billing\n * refund. Supply operationId and replay the exact request after a lost response.\n * Replays recheck authority and conflict after a later lifecycle change.\n * On 409 read getWorkspaceAllowanceState before deciding on a new operation.\n */\n async clearWorkspaceAllowance(\n workspaceId: string,\n request: import(\"@opengeni/contracts/usage-allowances\").ClearWorkspaceAllowanceRequest,\n ): Promise<import(\"@opengeni/contracts/usage-allowances\").ClearWorkspaceAllowanceResponse> {\n return this.requestJson(\n \"DELETE\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/allowance`,\n request,\n );\n }\n\n /** Grant USD micros once. Reuse the operationId and exact request after an uncertain response. */\n async grantWorkspaceCredits(\n workspaceId: string,\n request: import(\"@opengeni/contracts/usage-allowances\").GrantWorkspaceCreditsRequest,\n ): Promise<import(\"@opengeni/contracts/usage-allowances\").WorkspaceCreditGrant> {\n return this.requestJson(\n \"POST\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/allowance/grants`,\n request,\n );\n }\n\n /**\n * Administer an existing member by canonical subject or external identity.\n * null restores memberDefault; shares >1 are valid ceilings, not reservations.\n * Concurrent calls may exceed the ceiling until their actual cost settles.\n */\n async setMemberAllowance(\n workspaceId: string,\n member: string | { source: string; externalId: string },\n request: import(\"@opengeni/contracts/usage-allowances\").SetMemberAllowanceRequest,\n ): Promise<import(\"@opengeni/contracts/usage-allowances\").MemberAllowance> {\n const path =\n typeof member === \"string\"\n ? encodeURIComponent(member)\n : `external/${encodeURIComponent(member.source)}/${encodeURIComponent(member.externalId)}`;\n return this.requestJson(\n \"PUT\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/members/${path}/allowance`,\n request,\n );\n }\n\n /** Paginated settled usage, current or YYYY-MM. Requires admin or organization-key read authority. */\n async getUsage(\n workspaceId: string,\n query: import(\"@opengeni/contracts/usage-allowances\").GetUsageRequest = {},\n options: import(\"./client\").OpenGeniRequestOptions = {},\n ): Promise<import(\"@opengeni/contracts/usage-allowances\").WorkspaceUsageResponse> {\n return this.requestJson(\n \"GET\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/usage`,\n undefined,\n usageQuery(query),\n options,\n );\n }\n\n /** Own usage only. On your backend use asUser(authenticatedUser); subject selectors are not accepted. */\n async getMyUsage(\n workspaceId: string,\n query: import(\"@opengeni/contracts/usage-allowances\").GetMyUsageRequest = {},\n options: import(\"./client\").OpenGeniRequestOptions = {},\n ): Promise<import(\"@opengeni/contracts/usage-allowances\").WorkspaceUsageResponse> {\n return this.requestJson(\n \"GET\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/usage/me`,\n undefined,\n usageQuery(query),\n options,\n );\n }\n\n /** Recover this actor's connection creation result without resending secrets.\n * A 404 means no visible committed result, not proof that an in-flight write failed. */\n async getConnectionCreationResult(\n workspaceId: string,\n operationId: string,\n ): Promise<import(\"./types\").ConnectionMetadata> {\n const response = await this.requestJson<import(\"./types\").ConnectionResponse>(\n \"GET\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/connections/operations/${encodeURIComponent(operationId)}`,\n );\n return response.connection;\n }\n\n /** Rotate existing inline credentials only while no credential-consuming work\n * is pending or active. Reuse the operation key and exact request to reconcile\n * a lost response. This operation never schedules or retries model work. */\n async rotateSessionMcpCredentials(\n workspaceId: string,\n sessionId: string,\n request: import(\"./types\").RotateSessionMcpCredentialsRequest,\n ): Promise<import(\"./types\").RotateSessionMcpCredentialsReceipt> {\n return this.requestJson(\n \"POST\",\n `/v1/workspaces/${workspaceId}/sessions/${sessionId}/mcp-credentials/rotate`,\n request,\n );\n }\n\n /** Contract-checked successful JSON GET with its headers intact, for same-origin\n * proxies that must forward paging metadata. Non-2xx responses throw. */\n async requestJsonResponse(\n path: string,\n query: Record<string, string> = {},\n options: import(\"./client\").OpenGeniRequestOptions = {},\n ): Promise<import(\"./client\").FetchResponse> {\n return await this.requestResponse(\"GET\", path, query, {\n ...options,\n accept: \"application/json\",\n });\n }\n\n /** Server-side organization-key client scoped to one host-authenticated user.\n * Does not mutate this client, provision workspace membership, or link native\n * identities. The API verifies key and membership authority on each request. */\n asUser(externalId: string, options: { source?: string } = {}): this {\n if (typeof window !== \"undefined\")\n throw new Error(\"asUser is a server-side API; keep organization keys on your backend\");\n if (\n this.serviceInitiatorHeader !== undefined ||\n hasStaticHeader(this.options, [\"x-opengeni-service-initiator\", \"x-opengeni-service-context\"])\n )\n throw new Error(\n \"asUser and asService are mutually exclusive; start from the unscoped client\",\n );\n const source = options.source ?? \"default\";\n const validOpaqueText = (value: unknown, maxBytes: number): value is string =>\n typeof value === \"string\" &&\n value.length > 0 &&\n value.length <= maxBytes &&\n !value.includes(\"\\0\") &&\n !/[\\uD800-\\uDFFF]/u.test(value) &&\n new TextEncoder().encode(value).byteLength <= maxBytes;\n if (!validOpaqueText(externalId, 1024) || !validOpaqueText(source, 200)) {\n throw new Error(\"Invalid external identity reference\");\n }\n const Client = this.constructor as new (options: OpenGeniClientOptions) => this;\n const client = new Client({ ...this.options });\n client.externalActorHeader = encodeURIComponent(\n JSON.stringify({ mode: \"external\", identity: { externalId, source } }),\n );\n return client;\n }\n\n /** Server-side automation attribution under this client's existing credential.\n * Returns a new client of the same class; grants no permissions or human/personal\n * resource authority. Cannot be combined with asUser or asLinkedUser.\n * Reapplying asService replaces the name and context rather than merging them. */\n asService(name: string, context?: ServiceContext): this {\n if (typeof window !== \"undefined\")\n throw new Error(\"asService is a server-side API; keep API keys on your backend\");\n if (\n this.externalActorHeader !== undefined ||\n hasStaticHeader(this.options, [\"x-opengeni-external-actor\"])\n )\n throw new Error(\n \"asUser and asService are mutually exclusive; start from the unscoped client\",\n );\n if (\n typeof name !== \"string\" ||\n !/^[a-z0-9][a-z0-9:._-]{0,63}$/.test(name) ||\n name.trim() !== name\n )\n throw new Error(\"Invalid service initiator name\");\n const serializedContext = context === undefined ? undefined : serializeServiceContext(context);\n const Client = this.constructor as new (options: OpenGeniClientOptions) => this;\n const client = new Client({ ...this.options });\n client.serviceInitiatorHeader = name;\n client.serviceContextHeader = serializedContext;\n return client;\n }\n\n /** Explicitly use a confirmed native delegation. Unlike asUser, new resources\n * belong to the native user. Existing external resources are never reassigned.\n * A stale, expired or revoked link is rejected by the server on every request. */\n asLinkedUser(\n externalId: string,\n options: { source?: string; linkId: string; expectedLinkRevision: number },\n ): this {\n if (\n !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(options.linkId) ||\n !Number.isSafeInteger(options.expectedLinkRevision) ||\n options.expectedLinkRevision < 1\n )\n throw new Error(\"A confirmed identity link and its exact revision are required\");\n const client = this.asUser(\n externalId,\n options.source === undefined ? {} : { source: options.source },\n );\n const identity = JSON.parse(decodeURIComponent(client.externalActorHeader!)).identity;\n client.externalActorHeader = encodeURIComponent(\n JSON.stringify({\n mode: \"linked_native\",\n identity,\n linkId: options.linkId,\n expectedLinkRevision: options.expectedLinkRevision,\n }),\n );\n return client;\n }\n\n /** Optional native-account delegation. Invoke on a server-side asUser client.\n * Pass the one-time challenge to the native consent screen, never a URL query\n * or analytics event. Ordinary external embedding needs none of this. */\n async beginIdentityLink(\n workspaceId: string,\n input: BeginExternalIdentityLinkRequest,\n ): Promise<BeginExternalIdentityLinkResponse> {\n return this.requestJson(\n \"POST\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links`,\n input,\n );\n }\n\n async getIdentityLink(workspaceId: string, linkId: string): Promise<ExternalIdentityLink> {\n return this.requestJson(\n \"GET\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links/${encodeURIComponent(linkId)}`,\n );\n }\n\n /** Only links belonging to the effective participant; no organization-wide directory. */\n async listIdentityLinks(workspaceId: string, cursor?: string): Promise<ExternalIdentityLinkPage> {\n return this.requestJson(\n \"GET\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links${cursor ? `?cursor=${encodeURIComponent(cursor)}` : \"\"}`,\n );\n }\n\n /** Requires a canonical native browser session, not an organization API key. */\n async previewIdentityLink(\n workspaceId: string,\n linkId: string,\n challenge: string,\n ): Promise<ExternalIdentityLinkPreview> {\n return this.requestJson(\n \"POST\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links/${encodeURIComponent(linkId)}/preview`,\n { challenge },\n );\n }\n\n async confirmIdentityLink(\n workspaceId: string,\n linkId: string,\n input: ConfirmExternalIdentityLinkRequest,\n ): Promise<ExternalIdentityLink> {\n return this.requestJson(\n \"POST\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links/${encodeURIComponent(linkId)}/confirm`,\n input,\n );\n }\n\n async revokeIdentityLink(\n workspaceId: string,\n linkId: string,\n expectedRevision: number,\n ): Promise<ExternalIdentityLink> {\n return this.requestJson(\n \"POST\",\n `/v1/workspaces/${encodeURIComponent(workspaceId)}/identity-links/${encodeURIComponent(linkId)}/revoke`,\n { expectedRevision },\n );\n }\n\n /** Service-only lifecycle for an external actor's organization membership.\n * A successful reactivation does not restore revoked workspace grants. */\n async updateExternalIdentityMembership(\n organizationId: string,\n membershipId: string,\n request: import(\"@opengeni/contracts/external-identities\").UpdateExternalIdentityMembershipRequest,\n options: { signal?: AbortSignal } = {},\n ): Promise<import(\"@opengeni/contracts\").OrganizationMember> {\n return this.requestJson(\n \"PATCH\",\n `/v1/organizations/${encodeURIComponent(organizationId)}/external-members/${encodeURIComponent(membershipId)}`,\n request,\n undefined,\n options,\n );\n }\n\n /** Non-provisioning, content-free service lookup, including inactive identities. */\n async lookupExternalIdentity(\n organizationId: string,\n identity: import(\"@opengeni/contracts/external-identities\").ExternalIdentityReference,\n ): Promise<import(\"@opengeni/contracts/external-identities\").ExternalIdentityLookup> {\n return this.requestJson(\n \"POST\",\n `/v1/organizations/${encodeURIComponent(organizationId)}/external-identities/lookup`,\n identity,\n );\n }\n\n /** Withdraw an external member's shared-workspace access and fence an exact\n * pending keyed grant. Reuse the exact cancellation body after response loss. */\n async cancelExternalWorkspaceMemberGrant(\n organizationId: string,\n workspaceId: string,\n membershipId: string,\n request: import(\"@opengeni/contracts/external-identities\").CancelExternalWorkspaceMemberGrantRequest,\n ): Promise<\n import(\"@opengeni/contracts/external-identities\").CancelExternalWorkspaceMemberGrantResponse\n > {\n return this.requestJson(\n \"POST\",\n `/v1/organizations/${encodeURIComponent(organizationId)}/workspaces/${encodeURIComponent(workspaceId)}/members/${encodeURIComponent(membershipId)}/revoke`,\n request,\n );\n }\n\n /** Replace an existing external member's permissions in one shared\n * workspace. Keyed by `operationId`: reuse the exact body after response\n * loss. Narrowing makes live authority re-check; nothing is cancelled. */\n async updateExternalWorkspaceMember(\n organizationId: string,\n workspaceId: string,\n membershipId: string,\n request: import(\"@opengeni/contracts/external-identities\").UpdateExternalWorkspaceMemberRequest,\n ): Promise<\n import(\"@opengeni/contracts/external-identities\").UpdateExternalWorkspaceMemberResponse\n > {\n return this.requestJson(\n \"PATCH\",\n `/v1/organizations/${encodeURIComponent(organizationId)}/workspaces/${encodeURIComponent(workspaceId)}/external-members/${encodeURIComponent(membershipId)}`,\n request,\n );\n }\n\n async listConnectProviders(\n workspaceId: string,\n ): Promise<import(\"@opengeni/contracts/connect\").ConnectProvider[]> {\n return this.requestJson(\"GET\", `/v1/workspaces/${workspaceId}/connect/catalog`);\n }\n\n async listConnectAccounts(\n workspaceId: string,\n ): Promise<import(\"@opengeni/contracts/connect\").ConnectAccount[]> {\n return this.requestJson(\"GET\", `/v1/workspaces/${workspaceId}/connect/accounts`);\n }\n\n async getConnectAttempt(\n workspaceId: string,\n attemptId: string,\n ): Promise<import(\"@opengeni/contracts/connect\").ConnectAttempt> {\n return this.requestJson(\"GET\", `/v1/workspaces/${workspaceId}/connect/attempts/${attemptId}`);\n }\n\n async listPendingConnectAttempts(\n workspaceId: string,\n ): Promise<import(\"@opengeni/contracts/connect\").ConnectAttempt[]> {\n return this.requestJson(\"GET\", `/v1/workspaces/${workspaceId}/connect/attempts`);\n }\n\n async advanceConnectAttempt(\n workspaceId: string,\n attemptId: string,\n request: {\n expectedRevision: number;\n idempotencyKey: string;\n action: import(\"@opengeni/contracts/connect\").ConnectAdvance;\n },\n ): Promise<import(\"@opengeni/contracts/connect\").ConnectAttempt> {\n return this.requestJson(\n \"POST\",\n `/v1/workspaces/${workspaceId}/connect/attempts/${attemptId}/advance`,\n request,\n );\n }\n\n /** Stops setup; does not revoke already committed provider credentials. */\n async cancelConnectAttempt(\n workspaceId: string,\n attemptId: string,\n request: {\n expectedRevision: number;\n idempotencyKey: string;\n },\n ): Promise<import(\"@opengeni/contracts/connect\").ConnectAttempt> {\n return this.requestJson(\n \"POST\",\n `/v1/workspaces/${workspaceId}/connect/attempts/${attemptId}/cancel`,\n request,\n );\n }\n\n /**\n * Explicit organization-service-key onboarding with chosen permissions. Not\n * needed for the default path: an `asUser` request through a key with\n * `members:manage` adds a missing member with conversation permissions on\n * first use. Change an existing member with `updateExternalWorkspaceMember`.\n */\n async addExternalWorkspaceMember(\n workspaceId: string,\n request: {\n identity: { externalId: string; source?: string };\n permissions: AddWorkspaceMemberRequest[\"permissions\"];\n operationId?: string;\n },\n ): Promise<import(\"@opengeni/contracts/external-identities\").ExternalIdentity> {\n return this.requestJson(\"POST\", `/v1/workspaces/${workspaceId}/external-members`, request);\n }\n}\n\nfunction usageQuery(\n query: import(\"@opengeni/contracts/usage-allowances\").GetUsageRequest,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(query)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, String(value)]),\n );\n}\n","/** A response-quality notice, not a failed turn or a completed deliverable. */\nexport const EMPTY_FINAL_REPLY_NOTICE =\n \"The model returned no final reply after a reply reminder. Completed work is preserved; the goal and later updates are unaffected.\";\n\nexport type EmptyFinalReplyCompletion = {\n emptyFinalReply: true;\n};\n\nexport function turnCompletedWithEmptyFinalReply(payload: unknown): boolean {\n return (\n payload !== null &&\n typeof payload === \"object\" &&\n !Array.isArray(payload) &&\n (payload as { emptyFinalReply?: unknown }).emptyFinalReply === true\n );\n}\n"],"mappings":"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","names":[]}