@opengeni/sdk 0.57.0 → 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 (291) hide show
  1. package/README.md +1017 -26
  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-JDLDDRNE.js → chunk-2UXZUCEZ.js} +291 -34
  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-JRPFWI6T.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-PKQ377ED.js → chunk-FG3OO5LM.js} +2686 -611
  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-YKZME56C.js → chunk-KWADQ227.js} +3 -3
  57. package/dist/{chunk-YKZME56C.js.map → chunk-KWADQ227.js.map} +1 -1
  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-ST5DDKJP.js → chunk-NC57YMUO.js} +121 -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-HJ3HHUT5.js → chunk-YIKA2QT4.js} +33 -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 +740 -94
  81. package/dist/codex-realtime-controller.d.ts +3 -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 +25 -6
  88. package/dist/deprecation.d.ts +47 -0
  89. package/dist/document-authority-client.d.ts +51 -0
  90. package/dist/document-authority.d.ts +2 -0
  91. package/dist/document-authority.js +12 -0
  92. package/dist/document-authority.js.map +1 -0
  93. package/dist/editable-artifacts/browser-session.d.ts +7 -3
  94. package/dist/editable-artifacts/controller.d.ts +4 -1
  95. package/dist/editable-artifacts/errors.d.ts +1 -1
  96. package/dist/editable-artifacts/http-live-transport.d.ts +6 -2
  97. package/dist/editable-artifacts/index.d.ts +2 -0
  98. package/dist/editable-artifacts/open-failure.d.ts +9 -0
  99. package/dist/editable-artifacts/types.d.ts +6 -3
  100. package/dist/editable-artifacts/worker/kernel-adapter.d.ts +1 -1
  101. package/dist/editable-artifacts-worker.js +44 -17
  102. package/dist/editable-artifacts-worker.js.map +1 -1
  103. package/dist/editable-artifacts.js +240 -121
  104. package/dist/editable-artifacts.js.map +1 -1
  105. package/dist/embedding-client.d.ts +129 -0
  106. package/dist/errors.d.ts +36 -1
  107. package/dist/feedback.d.ts +23 -0
  108. package/dist/gateway-realtime-transport.js +1 -1
  109. package/dist/github-repositories.d.ts +10 -0
  110. package/dist/github-repositories.js +36 -0
  111. package/dist/github-repositories.js.map +1 -0
  112. package/dist/index.d.ts +56 -11
  113. package/dist/index.js +242 -125
  114. package/dist/index.js.map +1 -1
  115. package/dist/interaction.d.ts +84 -1
  116. package/dist/interaction.js +6 -1
  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/message-links.d.ts +68 -0
  121. package/dist/model-context.d.ts +68 -0
  122. package/dist/model-display.d.ts +2 -0
  123. package/dist/model-display.js +15 -0
  124. package/dist/model-display.js.map +1 -0
  125. package/dist/model-picker-order.d.ts +1 -0
  126. package/dist/model-picker-order.js +10 -0
  127. package/dist/model-picker-order.js.map +1 -0
  128. package/dist/organization-integration-policy.d.ts +26 -0
  129. package/dist/organization-integration-policy.js +26 -0
  130. package/dist/organization-integration-policy.js.map +1 -0
  131. package/dist/organization-private-session-settings.d.ts +6 -0
  132. package/dist/organization-private-session-settings.js +22 -0
  133. package/dist/organization-private-session-settings.js.map +1 -0
  134. package/dist/organization-user-setup.d.ts +8 -0
  135. package/dist/organization-user-setup.js +16 -0
  136. package/dist/organization-user-setup.js.map +1 -0
  137. package/dist/pr-review-client.d.ts +16 -0
  138. package/dist/pr-review.d.ts +4 -0
  139. package/dist/pr-review.js +62 -0
  140. package/dist/pr-review.js.map +1 -0
  141. package/dist/preference-registry.d.ts +9 -1
  142. package/dist/proxy.d.ts +7 -5
  143. package/dist/realtime.d.ts +3 -1
  144. package/dist/realtime.js +6 -6
  145. package/dist/realtime.js.map +1 -1
  146. package/dist/retained-artifacts.d.ts +5 -1
  147. package/dist/session-history-import.d.ts +22 -0
  148. package/dist/session-history-import.js +36 -0
  149. package/dist/session-history-import.js.map +1 -0
  150. package/dist/session-list-entries.d.ts +1 -0
  151. package/dist/session-list-entries.js +7 -0
  152. package/dist/session-list-entries.js.map +1 -0
  153. package/dist/session-message-search.d.ts +53 -0
  154. package/dist/session-proxy-client.d.ts +24 -0
  155. package/dist/session-proxy.d.ts +245 -0
  156. package/dist/session-proxy.js +24 -0
  157. package/dist/session-proxy.js.map +1 -0
  158. package/dist/session-titles.d.ts +2 -0
  159. package/dist/site-browser-entry.d.ts +1 -0
  160. package/dist/site-browser-runtime.gen.d.ts +1 -0
  161. package/dist/site-document.d.ts +5 -0
  162. package/dist/site-document.js +20 -0
  163. package/dist/site-document.js.map +1 -0
  164. package/dist/site-document.test.d.ts +1 -0
  165. package/dist/site-http.d.ts +16 -0
  166. package/dist/site-tool-bridge.d.ts +44 -0
  167. package/dist/site.d.ts +101 -0
  168. package/dist/site.js +49 -0
  169. package/dist/site.js.map +1 -0
  170. package/dist/skills.d.ts +75 -0
  171. package/dist/stream.d.ts +2 -0
  172. package/dist/tenant-workspaces.d.ts +47 -0
  173. package/dist/tenant-workspaces.js +8 -0
  174. package/dist/tenant-workspaces.js.map +1 -0
  175. package/dist/tool-auth.d.ts +87 -0
  176. package/dist/tool-auth.js +23 -0
  177. package/dist/tool-auth.js.map +1 -0
  178. package/dist/tool-display-metadata.d.ts +3 -0
  179. package/dist/tools-FXBLUWAE.js +12 -0
  180. package/dist/tools-FXBLUWAE.js.map +1 -0
  181. package/dist/tools.d.ts +61 -0
  182. package/dist/types.d.ts +2863 -424
  183. package/dist/usage-allowances.d.ts +36 -0
  184. package/dist/usage-allowances.js +80 -0
  185. package/dist/usage-allowances.js.map +1 -0
  186. package/dist/workspace-artifacts.d.ts +33 -5
  187. package/dist/workspace-instruction-policies.d.ts +24 -2
  188. package/dist/workspace-integrations.d.ts +74 -0
  189. package/dist/workspace-integrations.js +65 -0
  190. package/dist/workspace-integrations.js.map +1 -0
  191. package/dist/workspace-learning.d.ts +124 -0
  192. package/dist/workspace-state.d.ts +8 -71
  193. package/package.json +108 -3
  194. package/src/accounts.ts +443 -0
  195. package/src/adapters/express.ts +136 -0
  196. package/src/adapters/hono.ts +18 -0
  197. package/src/adapters/next.ts +42 -0
  198. package/src/allowance-refusal.ts +5 -0
  199. package/src/artifact-catalog.ts +41 -0
  200. package/src/artifact-client.ts +43 -52
  201. package/src/artifacts.ts +7 -1
  202. package/src/automations-client.ts +124 -0
  203. package/src/automations.ts +15 -0
  204. package/src/browser.ts +54 -0
  205. package/src/chat/fold.ts +431 -0
  206. package/src/chat/handler.ts +240 -0
  207. package/src/chat/http.ts +257 -0
  208. package/src/chat/ids.ts +85 -0
  209. package/src/chat/index.ts +87 -0
  210. package/src/chat/openai.ts +439 -0
  211. package/src/chat/opengeni.ts +722 -0
  212. package/src/chat/types.ts +219 -0
  213. package/src/chat/vercel.ts +204 -0
  214. package/src/chats.ts +16 -0
  215. package/src/client.ts +4084 -515
  216. package/src/codex-realtime-controller.ts +235 -5
  217. package/src/codex-realtime-v3.ts +162 -31
  218. package/src/codex-realtime.ts +1 -1
  219. package/src/company-brain.ts +59 -0
  220. package/src/company-profile.ts +17 -1
  221. package/src/core.ts +23 -1
  222. package/src/deprecation.ts +149 -0
  223. package/src/document-authority-client.ts +219 -0
  224. package/src/document-authority.ts +17 -0
  225. package/src/editable-artifacts/browser-session.ts +36 -22
  226. package/src/editable-artifacts/controller.ts +102 -47
  227. package/src/editable-artifacts/errors.ts +2 -0
  228. package/src/editable-artifacts/http-live-transport.ts +62 -37
  229. package/src/editable-artifacts/index.ts +6 -0
  230. package/src/editable-artifacts/open-failure.ts +79 -0
  231. package/src/editable-artifacts/storage.ts +31 -40
  232. package/src/editable-artifacts/types.ts +6 -3
  233. package/src/editable-artifacts/worker/kernel-adapter.ts +23 -7
  234. package/src/editable-artifacts/worker/runtime.ts +26 -13
  235. package/src/editable-artifacts/worker/wire-codec.ts +23 -5
  236. package/src/embedding-client.ts +519 -0
  237. package/src/errors.ts +169 -2
  238. package/src/feedback.ts +20 -0
  239. package/src/gateway-realtime-transport.ts +3 -3
  240. package/src/github-repositories.ts +60 -0
  241. package/src/index.ts +561 -41
  242. package/src/interaction.ts +276 -4
  243. package/src/knowledge.ts +72 -0
  244. package/src/message-links.ts +178 -0
  245. package/src/model-context.ts +112 -0
  246. package/src/model-display.ts +10 -0
  247. package/src/model-picker-order.ts +6 -0
  248. package/src/organization-integration-policy.ts +54 -0
  249. package/src/organization-private-session-settings.ts +33 -0
  250. package/src/organization-user-setup.ts +31 -0
  251. package/src/pr-review-client.ts +92 -0
  252. package/src/pr-review.ts +17 -0
  253. package/src/preference-registry.ts +11 -0
  254. package/src/proxy.ts +17 -6
  255. package/src/realtime.ts +1 -0
  256. package/src/retained-artifacts.ts +101 -0
  257. package/src/session-history-import.ts +84 -0
  258. package/src/session-list-entries.ts +1 -0
  259. package/src/session-message-search.ts +47 -0
  260. package/src/session-proxy-client.ts +64 -0
  261. package/src/session-proxy.ts +1473 -0
  262. package/src/session-titles.ts +10 -0
  263. package/src/site-browser-entry.ts +6 -0
  264. package/src/site-browser-runtime.gen.ts +2 -0
  265. package/src/site-document.test.ts +64 -0
  266. package/src/site-document.ts +18 -0
  267. package/src/site-http.ts +162 -0
  268. package/src/site-tool-bridge.ts +146 -0
  269. package/src/site.ts +585 -0
  270. package/src/skills.ts +69 -0
  271. package/src/sse.ts +8 -2
  272. package/src/stream.ts +38 -4
  273. package/src/tenant-workspaces.ts +148 -0
  274. package/src/tool-auth.ts +301 -0
  275. package/src/tool-display-metadata.ts +19 -0
  276. package/src/tools.ts +396 -0
  277. package/src/types.ts +3346 -501
  278. package/src/usage-allowances.ts +189 -0
  279. package/src/workspace-artifacts.ts +40 -6
  280. package/src/workspace-instruction-policies.ts +26 -1
  281. package/src/workspace-integrations.ts +402 -0
  282. package/src/workspace-learning.ts +138 -0
  283. package/src/workspace-state.ts +8 -82
  284. package/dist/chunk-GU6JF75T.js +0 -119
  285. package/dist/chunk-GU6JF75T.js.map +0 -1
  286. package/dist/chunk-HJ3HHUT5.js.map +0 -1
  287. package/dist/chunk-JDLDDRNE.js.map +0 -1
  288. package/dist/chunk-JRPFWI6T.js.map +0 -1
  289. package/dist/chunk-PKQ377ED.js.map +0 -1
  290. package/dist/chunk-ST5DDKJP.js.map +0 -1
  291. package/dist/chunk-VWE2QIVO.js.map +0 -1
@@ -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":[]}
@@ -1,3 +1,13 @@
1
+ import {
2
+ OpenGeniApiError
3
+ } from "./chunk-V6GIY62B.js";
4
+
5
+ // ../contracts/src/browser-storage.ts
6
+ var EPHEMERAL_CHROMIUM_DRIVER_ID = "opengeni.cdp.ephemeral-context.v1";
7
+ function browserSessionStorageMode(session) {
8
+ return session.driverId === EPHEMERAL_CHROMIUM_DRIVER_ID ? "ephemeral_context" : "private_profile";
9
+ }
10
+
1
11
  // src/interaction.ts
2
12
  var INTERACTION_PROTOCOL_VERSION = 1;
3
13
  var BROWSER_CONTROL_WEBSOCKET_PROTOCOL = "opengeni.browser.v1";
@@ -7,6 +17,46 @@ var BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES = 64 * 1024;
7
17
  var BROWSER_FRAME_MAX_BYTES = 24 * 1024 * 1024;
8
18
  var BROWSER_FRAME_MAX_DIMENSION = 32768;
9
19
  var BROWSER_FRAME_MAX_PIXELS = 1e8;
20
+ function interactionControlFailureFromError(error) {
21
+ if (!(error instanceof OpenGeniApiError)) return null;
22
+ const details = error.details;
23
+ if (!details || details.interactionLayer !== "connected_machine") return null;
24
+ const surface = details.interactionSurface;
25
+ const code = details.controlFailureCode;
26
+ if (surface !== "browser" && surface !== "computer" || !isControlFailureCode(code)) {
27
+ return null;
28
+ }
29
+ const controlRequestId = boundedOpaqueCorrelation(details.controlRequestId);
30
+ return {
31
+ layer: "connected_machine",
32
+ surface,
33
+ code,
34
+ retryable: error.retryable,
35
+ outcomeUnknown: error.outcomeUnknown,
36
+ requestId: error.correlationId,
37
+ controlRequestId,
38
+ message: error.message
39
+ };
40
+ }
41
+ function isControlFailureCode(value) {
42
+ return typeof value === "string" && [
43
+ "unknown",
44
+ "unsupported",
45
+ "os",
46
+ "not_found",
47
+ "consent_required",
48
+ "timeout",
49
+ "draining",
50
+ "protocol",
51
+ "stream",
52
+ "agent_offline",
53
+ "fenced",
54
+ "payload_too_large"
55
+ ].includes(value);
56
+ }
57
+ function boundedOpaqueCorrelation(value) {
58
+ return typeof value === "string" && value.length <= 128 && /^[A-Za-z0-9._:-]+$/u.test(value) ? value : void 0;
59
+ }
10
60
  var OpenGeniInteractionClient = class {
11
61
  attachedBrowsers;
12
62
  authRuns;
@@ -294,7 +344,12 @@ var BrowserSessionCollection = class {
294
344
  async currentOrOpen(options) {
295
345
  const requestOptions = options.signal ? { signal: options.signal } : {};
296
346
  const listed = await this.list(options.workspaceId, requestOptions);
297
- const current = newestRelevantBrowser(listed.sessions, options.associationSessionId);
347
+ const current = newestRelevantBrowser(
348
+ listed.sessions.filter(
349
+ (session) => browserSessionStorageMode(session) === (options.storageMode ?? "private_profile")
350
+ ),
351
+ options.associationSessionId
352
+ );
298
353
  if (current) {
299
354
  const resource = this.session(options.workspaceId, current.id);
300
355
  if (current.lifecycle === "suspended") {
@@ -313,6 +368,7 @@ var BrowserSessionCollection = class {
313
368
  ...options.name !== void 0 ? { name: options.name } : {},
314
369
  ...options.initialUrl !== void 0 ? { initialUrl: options.initialUrl } : {},
315
370
  ...options.headless !== void 0 ? { headless: options.headless } : {},
371
+ ...options.storageMode !== void 0 ? { storageMode: options.storageMode } : {},
316
372
  ...options.placement !== void 0 ? { placement: options.placement } : {},
317
373
  ...options.identityId !== void 0 ? { identityId: options.identityId } : {},
318
374
  ...options.baseRevisionId !== void 0 ? { baseRevisionId: options.baseRevisionId } : {},
@@ -346,6 +402,30 @@ var BrowserSessionResource = class {
346
402
  async observe(targetId, options = {}) {
347
403
  return await this.transport.observeBrowserTarget(this.workspaceId, this.id, targetId, options);
348
404
  }
405
+ async targetState(targetId, options = {}) {
406
+ return await this.transport.getBrowserTargetState(this.workspaceId, this.id, targetId, options);
407
+ }
408
+ async readDom(targetId, request, options = {}) {
409
+ return await this.transport.readBrowserDom(
410
+ this.workspaceId,
411
+ this.id,
412
+ targetId,
413
+ request,
414
+ options
415
+ );
416
+ }
417
+ async capture(targetId, options = {}, captureOptions = {}) {
418
+ return await this.transport.captureBrowserTarget(
419
+ this.workspaceId,
420
+ this.id,
421
+ targetId,
422
+ options,
423
+ captureOptions
424
+ );
425
+ }
426
+ async screenshot(targetId, captureOptions = {}, options = {}) {
427
+ return await this.capture(targetId, options, captureOptions);
428
+ }
349
429
  async act(request, options = {}) {
350
430
  return await this.transport.actInBrowser(this.workspaceId, this.id, request, options);
351
431
  }
@@ -557,6 +637,9 @@ var ComputerSessionResource = class {
557
637
  async observe(targetId, options = {}) {
558
638
  return await this.transport.observeComputerTarget(this.workspaceId, this.id, targetId, options);
559
639
  }
640
+ async capture(targetId, options = {}) {
641
+ return await this.transport.captureComputerTarget(this.workspaceId, this.id, targetId, options);
642
+ }
560
643
  async act(request, options = {}) {
561
644
  return await this.transport.actInComputer(this.workspaceId, this.id, request, options);
562
645
  }
@@ -571,6 +654,12 @@ var ComputerSessionResource = class {
571
654
  async attach(request, options = {}) {
572
655
  return await this.transport.attachComputerSession(this.workspaceId, this.id, request, options);
573
656
  }
657
+ async inputPosture(options = {}) {
658
+ if (!this.transport.getComputerInputPosture) {
659
+ throw new Error("Computer input posture requires a current interaction transport.");
660
+ }
661
+ return await this.transport.getComputerInputPosture(this.workspaceId, this.id, options);
662
+ }
574
663
  async heartbeat(options = {}) {
575
664
  return await this.transport.heartbeatComputerSession(this.workspaceId, this.id, options);
576
665
  }
@@ -620,6 +709,7 @@ function browserFrameSocketUrl(attachment, options = {}) {
620
709
  else if (url.protocol !== "ws:" && url.protocol !== "wss:") {
621
710
  throw new Error("browser frame attachment did not contain an HTTP or WebSocket URL");
622
711
  }
712
+ upgradeMixedContentWebSocket(url);
623
713
  if (options.format !== void 0) url.searchParams.set("format", options.format);
624
714
  setBoundedIntegerQuery(url, "quality", options.quality, 1, 100);
625
715
  setBoundedIntegerQuery(url, "maxWidth", options.maxWidth, 1, 4096);
@@ -637,6 +727,7 @@ function computerFrameSocketUrl(attachment, options = {}) {
637
727
  else if (url.protocol !== "ws:" && url.protocol !== "wss:") {
638
728
  throw new Error("computer frame attachment did not contain an HTTP or WebSocket URL");
639
729
  }
730
+ upgradeMixedContentWebSocket(url);
640
731
  if (options.format !== void 0) url.searchParams.set("format", options.format);
641
732
  setBoundedIntegerQuery(url, "quality", options.quality, 1, 100);
642
733
  setBoundedIntegerQuery(url, "maxWidth", options.maxWidth, 1, 4096);
@@ -837,6 +928,27 @@ function parseComputerFrameMetadata(value) {
837
928
  }
838
929
  return metadata;
839
930
  }
931
+ function decodeComputerFrameMetadataHeader(value) {
932
+ if (!value || value.length > 32 * 1024 || !/^[A-Za-z0-9_-]+$/u.test(value)) {
933
+ throw new Error("computer frame metadata header is invalid");
934
+ }
935
+ const normalized = value.replace(/-/gu, "+").replace(/_/gu, "/");
936
+ const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, "=");
937
+ let decoded;
938
+ try {
939
+ decoded = atob(padded);
940
+ } catch {
941
+ throw new Error("computer frame metadata header is invalid");
942
+ }
943
+ const bytes = Uint8Array.from(decoded, (character) => character.charCodeAt(0));
944
+ let metadata;
945
+ try {
946
+ metadata = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
947
+ } catch {
948
+ throw new Error("computer frame metadata header is invalid");
949
+ }
950
+ return parseComputerFrameMetadata(metadata);
951
+ }
840
952
  function newestRelevantBrowser(sessions, associationSessionId) {
841
953
  const live = sessions.filter(
842
954
  (session) => !["ending", "ended", "failed", "lost"].includes(session.lifecycle) && session.associations.some((association) => association.sessionId === associationSessionId)
@@ -865,6 +977,10 @@ function computerRelevance(session, associationSessionId) {
865
977
  const used = Date.parse(session.lastUsedAt);
866
978
  return Math.max(association, Number.isFinite(used) ? used : 0);
867
979
  }
980
+ function upgradeMixedContentWebSocket(url) {
981
+ const protocol = globalThis.location?.protocol;
982
+ if (protocol === "https:" && url.protocol === "ws:") url.protocol = "wss:";
983
+ }
868
984
  function setBoundedIntegerQuery(url, name, value, min, max) {
869
985
  if (value === void 0) return;
870
986
  if (!Number.isSafeInteger(value) || value < min || value > max) {
@@ -953,6 +1069,7 @@ export {
953
1069
  BROWSER_FRAME_MAX_BYTES,
954
1070
  BROWSER_FRAME_MAX_DIMENSION,
955
1071
  BROWSER_FRAME_MAX_PIXELS,
1072
+ interactionControlFailureFromError,
956
1073
  OpenGeniInteractionClient,
957
1074
  NetworkRouteCollection,
958
1075
  NetworkRouteResource,
@@ -982,6 +1099,7 @@ export {
982
1099
  decodeBrowserFrameMessage,
983
1100
  decodeComputerFrameMessage,
984
1101
  parseBrowserFrameMetadata,
985
- parseComputerFrameMetadata
1102
+ parseComputerFrameMetadata,
1103
+ decodeComputerFrameMetadataHeader
986
1104
  };
987
- //# sourceMappingURL=chunk-ST5DDKJP.js.map
1105
+ //# sourceMappingURL=chunk-NC57YMUO.js.map