@opengeni/sdk 3.3.2 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/README.md +1007 -72
  2. package/dist/adapters/express.d.ts +31 -0
  3. package/dist/adapters/express.js +87 -0
  4. package/dist/adapters/express.js.map +1 -0
  5. package/dist/adapters/hono.d.ts +16 -0
  6. package/dist/adapters/hono.js +8 -0
  7. package/dist/adapters/hono.js.map +1 -0
  8. package/dist/adapters/next.d.ts +29 -0
  9. package/dist/adapters/next.js +22 -0
  10. package/dist/adapters/next.js.map +1 -0
  11. package/dist/allowance-refusal.d.ts +2 -0
  12. package/dist/allowance-refusal.js +50 -0
  13. package/dist/allowance-refusal.js.map +1 -0
  14. package/dist/app-links.d.ts +42 -0
  15. package/dist/app-links.js +66 -0
  16. package/dist/app-links.js.map +1 -0
  17. package/dist/artifact-catalog.d.ts +40 -0
  18. package/dist/artifact-client.d.ts +20 -8
  19. package/dist/artifacts.d.ts +1 -1
  20. package/dist/artifacts.js +8 -6
  21. package/dist/automations.js +8 -2
  22. package/dist/automations.js.map +1 -1
  23. package/dist/azure-live-transport.d.ts +32 -0
  24. package/dist/browser.d.ts +7 -2
  25. package/dist/browser.js +27 -5
  26. package/dist/chat/fold.d.ts +75 -0
  27. package/dist/chat/handler.d.ts +41 -0
  28. package/dist/chat/http.d.ts +67 -0
  29. package/dist/chat/ids.d.ts +34 -0
  30. package/dist/chat/index.d.ts +9 -0
  31. package/dist/chat/index.js +1369 -0
  32. package/dist/chat/index.js.map +1 -0
  33. package/dist/chat/openai.d.ts +30 -0
  34. package/dist/chat/opengeni.d.ts +129 -0
  35. package/dist/chat/types.d.ts +207 -0
  36. package/dist/chat/vercel.d.ts +49 -0
  37. package/dist/chats.d.ts +8 -0
  38. package/dist/chunk-4AHR4KGA.js +301 -0
  39. package/dist/chunk-4AHR4KGA.js.map +1 -0
  40. package/dist/chunk-6GYGMLX4.js +332 -0
  41. package/dist/chunk-6GYGMLX4.js.map +1 -0
  42. package/dist/chunk-7EWT3PV6.js +368 -0
  43. package/dist/chunk-7EWT3PV6.js.map +1 -0
  44. package/dist/chunk-FTWVVPR6.js +1665 -0
  45. package/dist/chunk-FTWVVPR6.js.map +1 -0
  46. package/dist/{chunk-VYCTL62C.js → chunk-GZQSWAKD.js} +1 -1
  47. package/dist/chunk-GZQSWAKD.js.map +1 -0
  48. package/dist/chunk-KGEABAID.js +71 -0
  49. package/dist/chunk-KGEABAID.js.map +1 -0
  50. package/dist/{chunk-YKZME56C.js → chunk-KWADQ227.js} +3 -3
  51. package/dist/{chunk-YKZME56C.js.map → chunk-KWADQ227.js.map} +1 -1
  52. package/dist/{chunk-JUS2UYRP.js → chunk-NCU5OAN7.js} +27 -2
  53. package/dist/chunk-NCU5OAN7.js.map +1 -0
  54. package/dist/{chunk-YXQX7RQT.js → chunk-OI5YLASH.js} +73 -2
  55. package/dist/chunk-OI5YLASH.js.map +1 -0
  56. package/dist/chunk-OV3POE62.js +359 -0
  57. package/dist/chunk-OV3POE62.js.map +1 -0
  58. package/dist/chunk-P7UWKORG.js +561 -0
  59. package/dist/chunk-P7UWKORG.js.map +1 -0
  60. package/dist/chunk-QGEIL4TR.js +195 -0
  61. package/dist/chunk-QGEIL4TR.js.map +1 -0
  62. package/dist/{chunk-TRNI7KEO.js → chunk-S2NLS3ES.js} +3669 -1281
  63. package/dist/chunk-S2NLS3ES.js.map +1 -0
  64. package/dist/chunk-UM4ZXXJR.js +9 -0
  65. package/dist/chunk-UM4ZXXJR.js.map +1 -0
  66. package/dist/{chunk-QT3KFVDP.js → chunk-UME3X7CP.js} +28 -32
  67. package/dist/chunk-UME3X7CP.js.map +1 -0
  68. package/dist/chunk-VT4YM4XQ.js +210 -0
  69. package/dist/chunk-VT4YM4XQ.js.map +1 -0
  70. package/dist/chunk-WSYYXONG.js +1602 -0
  71. package/dist/chunk-WSYYXONG.js.map +1 -0
  72. package/dist/{chunk-C2H7HBNP.js → chunk-WVCJRSGJ.js} +119 -14
  73. package/dist/chunk-WVCJRSGJ.js.map +1 -0
  74. package/dist/chunk-X5ITQVXE.js +15 -0
  75. package/dist/chunk-X5ITQVXE.js.map +1 -0
  76. package/dist/chunk-XA7HVIHI.js +126 -0
  77. package/dist/chunk-XA7HVIHI.js.map +1 -0
  78. package/dist/{chunk-KKRO2VCP.js → chunk-YJCHB7R3.js} +60 -12
  79. package/dist/chunk-YJCHB7R3.js.map +1 -0
  80. package/dist/chunk-YKIHNLWD.js +153 -0
  81. package/dist/chunk-YKIHNLWD.js.map +1 -0
  82. package/dist/chunk-ZDUBPV33.js +277 -0
  83. package/dist/chunk-ZDUBPV33.js.map +1 -0
  84. package/dist/client.d.ts +1068 -118
  85. package/dist/codex-realtime-controller.d.ts +13 -0
  86. package/dist/codex-realtime-controller.js +4 -2
  87. package/dist/codex-realtime-v3-wire.d.ts +3 -2
  88. package/dist/codex-realtime.d.ts +5 -1
  89. package/dist/company-brain.d.ts +1 -11
  90. package/dist/core.d.ts +7 -2
  91. package/dist/core.js +25 -6
  92. package/dist/deprecation.d.ts +47 -0
  93. package/dist/document-authority-client.d.ts +24 -2
  94. package/dist/document-authority.js +7 -5
  95. package/dist/editable-artifacts/index.d.ts +1 -1
  96. package/dist/editable-artifacts/types.d.ts +12 -2
  97. package/dist/editable-artifacts.js +19 -3
  98. package/dist/editable-artifacts.js.map +1 -1
  99. package/dist/embedding-client.d.ts +129 -0
  100. package/dist/errors.d.ts +76 -1
  101. package/dist/external-vault-receiver.d.ts +203 -0
  102. package/dist/external-vault-receiver.js +564 -0
  103. package/dist/external-vault-receiver.js.map +1 -0
  104. package/dist/feedback.d.ts +23 -0
  105. package/dist/gateway-realtime-transport.js +1 -1
  106. package/dist/github-repositories.d.ts +10 -0
  107. package/dist/github-repositories.js +36 -0
  108. package/dist/github-repositories.js.map +1 -0
  109. package/dist/index.d.ts +62 -11
  110. package/dist/index.js +557 -338
  111. package/dist/index.js.map +1 -1
  112. package/dist/insights-usage.d.ts +33 -0
  113. package/dist/insights-usage.js +7 -0
  114. package/dist/insights-usage.js.map +1 -0
  115. package/dist/interaction.d.ts +165 -71
  116. package/dist/interaction.js +2 -2
  117. package/dist/knowledge.d.ts +7 -0
  118. package/dist/knowledge.js +20 -0
  119. package/dist/knowledge.js.map +1 -0
  120. package/dist/known-tools.d.ts +4 -0
  121. package/dist/message-links.d.ts +68 -0
  122. package/dist/model-context.d.ts +68 -0
  123. package/dist/model-display.d.ts +2 -0
  124. package/dist/model-display.js +17 -0
  125. package/dist/model-display.js.map +1 -0
  126. package/dist/model-picker-order.d.ts +1 -0
  127. package/dist/model-picker-order.js +10 -0
  128. package/dist/model-picker-order.js.map +1 -0
  129. package/dist/organization-integration-policy.d.ts +26 -0
  130. package/dist/organization-integration-policy.js +26 -0
  131. package/dist/organization-integration-policy.js.map +1 -0
  132. package/dist/pr-review-client.d.ts +1 -1
  133. package/dist/pr-review.d.ts +1 -1
  134. package/dist/pr-review.js.map +1 -1
  135. package/dist/preference-registry.d.ts +1 -1
  136. package/dist/prepared-mcp-setup.d.ts +5 -0
  137. package/dist/proxy.d.ts +13 -11
  138. package/dist/realtime.d.ts +1 -1
  139. package/dist/realtime.js +253 -7
  140. package/dist/realtime.js.map +1 -1
  141. package/dist/session-history-import.d.ts +22 -0
  142. package/dist/session-history-import.js +36 -0
  143. package/dist/session-history-import.js.map +1 -0
  144. package/dist/session-list-entries.d.ts +1 -0
  145. package/dist/session-list-entries.js +7 -0
  146. package/dist/session-list-entries.js.map +1 -0
  147. package/dist/session-message-search.d.ts +53 -0
  148. package/dist/session-proxy-client.d.ts +28 -0
  149. package/dist/session-proxy.d.ts +334 -0
  150. package/dist/session-proxy.js +24 -0
  151. package/dist/session-proxy.js.map +1 -0
  152. package/dist/session-titles.d.ts +2 -28
  153. package/dist/session-usage-limits.d.ts +10 -0
  154. package/dist/session-usage-limits.js +43 -0
  155. package/dist/session-usage-limits.js.map +1 -0
  156. package/dist/shared-catalog-loader.d.ts +34 -0
  157. package/dist/site-ai.d.ts +35 -0
  158. package/dist/site-bridge-host.d.ts +112 -0
  159. package/dist/site-bridge-host.js +286 -0
  160. package/dist/site-bridge-host.js.map +1 -0
  161. package/dist/site-browser-entry.d.ts +1 -0
  162. package/dist/site-browser-runtime.gen.d.ts +1 -0
  163. package/dist/site-data.d.ts +178 -0
  164. package/dist/site-document.d.ts +5 -0
  165. package/dist/site-document.js +20 -0
  166. package/dist/site-document.js.map +1 -0
  167. package/dist/site-document.test.d.ts +1 -0
  168. package/dist/site-http.d.ts +17 -0
  169. package/dist/site-sql.d.ts +31 -0
  170. package/dist/site-tool-bridge.d.ts +57 -0
  171. package/dist/site.d.ts +186 -0
  172. package/dist/site.js +63 -0
  173. package/dist/site.js.map +1 -0
  174. package/dist/skills.d.ts +75 -0
  175. package/dist/sse.d.ts +1 -1
  176. package/dist/stream.d.ts +2 -0
  177. package/dist/tenant-workspaces.d.ts +47 -0
  178. package/dist/tenant-workspaces.js +8 -0
  179. package/dist/tenant-workspaces.js.map +1 -0
  180. package/dist/tool-auth.d.ts +87 -0
  181. package/dist/tool-auth.js +23 -0
  182. package/dist/tool-auth.js.map +1 -0
  183. package/dist/tool-display-metadata.d.ts +3 -0
  184. package/dist/tools-37DCTCNZ.js +12 -0
  185. package/dist/tools-37DCTCNZ.js.map +1 -0
  186. package/dist/tools.d.ts +81 -0
  187. package/dist/transcription.d.ts +1 -1
  188. package/dist/types.d.ts +2807 -583
  189. package/dist/usage-allowances.d.ts +36 -0
  190. package/dist/usage-allowances.js +80 -0
  191. package/dist/usage-allowances.js.map +1 -0
  192. package/dist/vault-types.d.ts +324 -0
  193. package/dist/vaults-api.d.ts +65 -0
  194. package/dist/workspace-artifacts.d.ts +47 -5
  195. package/dist/workspace-instruction-policies.d.ts +2 -2
  196. package/dist/workspace-integrations.d.ts +74 -0
  197. package/dist/workspace-integrations.js +67 -0
  198. package/dist/workspace-integrations.js.map +1 -0
  199. package/dist/workspace-state.d.ts +8 -71
  200. package/package.json +103 -5
  201. package/src/adapters/express.ts +136 -0
  202. package/src/adapters/hono.ts +18 -0
  203. package/src/adapters/next.ts +42 -0
  204. package/src/allowance-refusal.ts +5 -0
  205. package/src/app-links.ts +117 -0
  206. package/src/artifact-catalog.ts +51 -0
  207. package/src/artifact-client.ts +40 -49
  208. package/src/artifacts.ts +1 -0
  209. package/src/automations-client.ts +8 -2
  210. package/src/azure-live-transport.ts +286 -0
  211. package/src/browser.ts +37 -0
  212. package/src/chat/fold.ts +431 -0
  213. package/src/chat/handler.ts +240 -0
  214. package/src/chat/http.ts +257 -0
  215. package/src/chat/ids.ts +85 -0
  216. package/src/chat/index.ts +88 -0
  217. package/src/chat/openai.ts +439 -0
  218. package/src/chat/opengeni.ts +737 -0
  219. package/src/chat/types.ts +219 -0
  220. package/src/chat/vercel.ts +204 -0
  221. package/src/chats.ts +16 -0
  222. package/src/client.ts +5697 -1833
  223. package/src/codex-realtime-controller.ts +163 -8
  224. package/src/codex-realtime-v3-wire.ts +4 -3
  225. package/src/codex-realtime-v3.ts +12 -3
  226. package/src/codex-realtime.ts +11 -3
  227. package/src/company-brain.ts +0 -40
  228. package/src/core.ts +20 -0
  229. package/src/deprecation.ts +149 -0
  230. package/src/document-authority-client.ts +104 -1
  231. package/src/editable-artifacts/controller.ts +36 -2
  232. package/src/editable-artifacts/index.ts +1 -0
  233. package/src/editable-artifacts/types.ts +29 -16
  234. package/src/embedding-client.ts +519 -0
  235. package/src/errors.ts +303 -4
  236. package/src/external-vault-receiver.ts +914 -0
  237. package/src/feedback.ts +20 -0
  238. package/src/gateway-realtime-transport.ts +3 -3
  239. package/src/github-repositories.ts +60 -0
  240. package/src/index.ts +603 -65
  241. package/src/insights-usage.ts +64 -0
  242. package/src/interaction.ts +315 -93
  243. package/src/knowledge.ts +72 -0
  244. package/src/known-tools.ts +279 -0
  245. package/src/message-links.ts +178 -0
  246. package/src/model-context.ts +113 -0
  247. package/src/model-display.ts +11 -0
  248. package/src/model-picker-order.ts +6 -0
  249. package/src/organization-integration-policy.ts +54 -0
  250. package/src/pr-review-client.ts +1 -1
  251. package/src/pr-review.ts +1 -1
  252. package/src/preference-registry.ts +2 -0
  253. package/src/prepared-mcp-setup.ts +123 -0
  254. package/src/proxy.ts +23 -12
  255. package/src/realtime.ts +15 -6
  256. package/src/session-history-import.ts +84 -0
  257. package/src/session-list-entries.ts +1 -0
  258. package/src/session-message-search.ts +47 -0
  259. package/src/session-proxy-client.ts +68 -0
  260. package/src/session-proxy.ts +2098 -0
  261. package/src/session-titles.ts +8 -82
  262. package/src/session-usage-limits.ts +71 -0
  263. package/src/shared-catalog-loader.ts +169 -0
  264. package/src/site-ai.ts +284 -0
  265. package/src/site-bridge-host.ts +422 -0
  266. package/src/site-browser-entry.ts +6 -0
  267. package/src/site-browser-runtime.gen.ts +2 -0
  268. package/src/site-data.ts +372 -0
  269. package/src/site-document.test.ts +64 -0
  270. package/src/site-document.ts +18 -0
  271. package/src/site-http.ts +171 -0
  272. package/src/site-sql.ts +153 -0
  273. package/src/site-tool-bridge.ts +401 -0
  274. package/src/site.ts +878 -0
  275. package/src/skills.ts +69 -0
  276. package/src/sse.ts +9 -3
  277. package/src/stream.ts +33 -10
  278. package/src/tenant-workspaces.ts +148 -0
  279. package/src/tool-auth.ts +301 -0
  280. package/src/tool-display-metadata.ts +27 -0
  281. package/src/tools.ts +452 -0
  282. package/src/transcription.ts +3 -0
  283. package/src/types.ts +3170 -582
  284. package/src/usage-allowances.ts +189 -0
  285. package/src/vault-types.ts +379 -0
  286. package/src/vaults-api.ts +339 -0
  287. package/src/workspace-artifacts.ts +55 -6
  288. package/src/workspace-instruction-policies.ts +2 -1
  289. package/src/workspace-integrations.ts +402 -0
  290. package/src/workspace-state.ts +8 -82
  291. package/dist/chunk-C2H7HBNP.js.map +0 -1
  292. package/dist/chunk-C4DJPZRU.js +0 -119
  293. package/dist/chunk-C4DJPZRU.js.map +0 -1
  294. package/dist/chunk-JUS2UYRP.js.map +0 -1
  295. package/dist/chunk-KKRO2VCP.js.map +0 -1
  296. package/dist/chunk-QT3KFVDP.js.map +0 -1
  297. package/dist/chunk-TRNI7KEO.js.map +0 -1
  298. package/dist/chunk-VYCTL62C.js.map +0 -1
  299. package/dist/chunk-YXQX7RQT.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../contracts/src/site-operations.ts","../../contracts/src/site-session-http.ts","../src/site-http.ts","../src/site-tool-bridge.ts","../src/site-data.ts","../src/site-sql.ts","../src/site-ai.ts","../src/site.ts"],"sourcesContent":["// Zod-free on purpose: browser bundles (the Site runtime, the console Site\n// bridge and the gateway shell) import this module, and must not pull in zod.\n\n// ---------------------------------------------------------------------------\n// Site operation allowlist\n// ---------------------------------------------------------------------------\n\n/**\n * Every HTTP operation Site code may perform through a host, as an explicit\n * allowlist (method + exact path shape) rather than a URL prefix. Paths are\n * the suffix after `/v1/workspaces/site-host` that the in-Site SDK client\n * uses; `/v1/config/client` is the one path outside that prefix.\n *\n * The console host forwards an allowed operation to the ordinary workspace\n * route with Site provenance. The gateway forwards it to `/_og/api<suffix>`\n * and the API serves it at `/v1/site-runtime<suffix>`. `agent: true` marks\n * operations that start or message an agent; every such route records which\n * Site (and version) originated it.\n */\nexport type SiteOperationMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\nexport type SiteOperation = {\n id: string;\n method: SiteOperationMethod;\n /** Anchored pattern on the site-host suffix (`\"\"` is the workspace itself). */\n pattern: RegExp;\n agent?: true;\n stream?: true;\n};\n\nconst ID = \"[A-Za-z0-9_-]{1,128}\";\nconst DATA = \"/published-artifacts/current/(?:data|files)(?:/[A-Za-z0-9._~:@!$&'()*+,;=-]+)*\";\n\nexport const SITE_OPERATIONS: readonly SiteOperation[] = Object.freeze([\n { id: \"config.client\", method: \"GET\", pattern: /^\\/v1\\/config\\/client$/u },\n { id: \"workspace.get\", method: \"GET\", pattern: /^$/u },\n { id: \"site.config\", method: \"GET\", pattern: /^\\/site\\/config$/u },\n { id: \"models.list\", method: \"GET\", pattern: /^\\/model-catalog$/u },\n { id: \"sessions.list\", method: \"GET\", pattern: /^\\/sessions$/u },\n { id: \"sessions.create\", method: \"POST\", pattern: /^\\/sessions$/u, agent: true },\n { id: \"sessions.get\", method: \"GET\", pattern: new RegExp(`^/sessions/${ID}$`, \"u\") },\n { id: \"sessions.events\", method: \"GET\", pattern: new RegExp(`^/sessions/${ID}/events$`, \"u\") },\n {\n id: \"sessions.stream\",\n method: \"GET\",\n pattern: new RegExp(`^/sessions/${ID}/events/stream$`, \"u\"),\n stream: true,\n },\n {\n id: \"sessions.send\",\n method: \"POST\",\n pattern: new RegExp(`^/sessions/${ID}/events$`, \"u\"),\n agent: true,\n },\n {\n id: \"sessions.steer\",\n method: \"POST\",\n pattern: new RegExp(`^/sessions/${ID}/steer$`, \"u\"),\n agent: true,\n },\n {\n id: \"sessions.control\",\n method: \"POST\",\n pattern: new RegExp(`^/sessions/${ID}/control$`, \"u\"),\n agent: true,\n },\n { id: \"sessions.queue\", method: \"GET\", pattern: new RegExp(`^/sessions/${ID}/queue$`, \"u\") },\n // SessionConversation's documented queue edit/delete/steer/move.\n {\n id: \"sessions.queue.item\",\n method: \"POST\",\n pattern: new RegExp(`^/sessions/${ID}/queue/${ID}/(?:move|edit|steer|delete)$`, \"u\"),\n agent: true,\n },\n // SessionConversation's durable composer draft and its Send.\n {\n id: \"sessions.composerDraft.get\",\n method: \"GET\",\n pattern: new RegExp(`^/sessions/${ID}/composer-draft$`, \"u\"),\n },\n {\n id: \"sessions.composerDraft.put\",\n method: \"PUT\",\n pattern: new RegExp(`^/sessions/${ID}/composer-draft$`, \"u\"),\n },\n {\n id: \"sessions.composerDraft.submit\",\n method: \"POST\",\n pattern: new RegExp(`^/sessions/${ID}/composer-draft/submit$`, \"u\"),\n agent: true,\n },\n {\n id: \"sessions.humanInput\",\n method: \"GET\",\n pattern: new RegExp(`^/sessions/${ID}/human-input-requests$`, \"u\"),\n },\n // SessionConversation's human-input form reads the one open request.\n {\n id: \"sessions.humanInput.get\",\n method: \"GET\",\n pattern: new RegExp(`^/sessions/${ID}/human-input-requests/${ID}$`, \"u\"),\n },\n { id: \"data.read\", method: \"GET\", pattern: new RegExp(`^${DATA}$`, \"u\") },\n { id: \"data.write\", method: \"POST\", pattern: new RegExp(`^${DATA}$`, \"u\") },\n { id: \"data.put\", method: \"PUT\", pattern: new RegExp(`^${DATA}$`, \"u\") },\n { id: \"data.patch\", method: \"PATCH\", pattern: new RegExp(`^${DATA}$`, \"u\") },\n { id: \"data.delete\", method: \"DELETE\", pattern: new RegExp(`^${DATA}$`, \"u\") },\n // Site SQL (PR B): run one named query the owner defined; never raw SQL.\n {\n id: \"sql.run\",\n method: \"POST\",\n pattern: /^\\/published-artifacts\\/current\\/sql\\/queries\\/[A-Za-z][A-Za-z0-9_-]{0,63}$/u,\n },\n { id: \"site.report\", method: \"POST\", pattern: /^\\/site\\/reports$/u },\n] satisfies SiteOperation[]);\n\n/**\n * Tool bridge methods (MessagePort, not HTTP). The gateway serves them at\n * POST /_og/api/tools/<method>; the console uses its tool gateway client.\n */\nexport const SITE_TOOL_METHODS = Object.freeze([\n \"catalog\",\n \"declarations\",\n \"call\",\n \"resolve\",\n \"invoke\",\n] as const);\nexport type SiteToolMethod = (typeof SITE_TOOL_METHODS)[number];\n\nconst SITE_HOST_PREFIX = \"/v1/workspaces/site-host\";\n\n/**\n * Match a Site-originated request against the allowlist. `path` is the\n * pathname the in-Site SDK used (`/v1/workspaces/site-host/...` or\n * `/v1/config/client`), without query. Returns the operation and the\n * site-host suffix, or null when the operation is not allowed. Refuses\n * encoded separators, dot segments and control characters.\n */\nexport function matchSiteOperation(\n method: string,\n path: string,\n): { operation: SiteOperation; suffix: string } | null {\n if (/[%\\\\#\\u0000-\\u0020\\u007f]/u.test(path)) return null;\n if (path.split(\"/\").some((part) => part === \".\" || part === \"..\")) return null;\n const upper = method.toUpperCase();\n let suffix: string;\n if (path === \"/v1/config/client\") suffix = path;\n else if (path === SITE_HOST_PREFIX) suffix = \"\";\n else if (path.startsWith(`${SITE_HOST_PREFIX}/`)) suffix = path.slice(SITE_HOST_PREFIX.length);\n else return null;\n const operation = SITE_OPERATIONS.find(\n (candidate) => candidate.method === upper && candidate.pattern.test(suffix),\n );\n return operation ? { operation, suffix } : null;\n}\n","import { matchSiteOperation, type SiteOperation } from \"./site-operations\";\n\nconst SITE_WORKSPACE_PREFIX = \"/v1/workspaces/site-host\";\n/** Site Data and Site SQL routes under any published Site: `<prefix>/published-artifacts/<id>/data|files|sql`. */\nconst SITE_DATA_PATH =\n /^\\/v1\\/workspaces\\/site-host\\/published-artifacts\\/([^/]+)\\/(?:data|files|sql)(?:\\/|$)/u;\n/** The list filter a frame without a published Site gets: it names no Site, so lists nothing. */\nexport const SITE_NO_ORIGIN_ID = \"00000000-0000-0000-0000-000000000000\";\n\n/**\n * The header a host sets on every request it forwards from a Site frame. The\n * value names the host: `1` for the console bridge, `preview` for a Codemode\n * local preview. The API treats a request carrying it (or the pinned Site id)\n * as Site code: only `SITE_OPERATIONS`, only the frame's own sessions.\n */\nexport const SITE_FRAME_HEADER = \"x-opengeni-site-frame\";\n/** SITE_FRAME_HEADER value a Codemode local preview sets. */\nexport const SITE_PREVIEW_FRAME = \"preview\";\n/**\n * A random id the host mints per mounted frame. A frame without a published\n * Site (inline HTML, previews) records it on the sessions it starts and may\n * reach only those sessions afterwards.\n */\nexport const SITE_FRAME_ID_HEADER = \"x-opengeni-site-frame-id\";\n/** The published Site (artifact id) a host pinned the frame to. */\nexport const SITE_ID_HEADER = \"x-opengeni-site-id\";\n/** The exact Site version the pinned frame runs. */\nexport const SITE_VERSION_HEADER = \"x-opengeni-site-version\";\n\n/** A Site/Codemode SDK request named a route outside the proxied surface. */\nexport class SiteSessionPathError extends Error {\n readonly code = \"site_session_path_unsupported\";\n\n constructor() {\n super(\"Unsupported Site session API path\");\n this.name = \"SiteSessionPathError\";\n }\n}\n\n/** The host serves no Site Data: it is not bound to a published Site (inline HTML, previews). */\nexport class SiteDataUnsupportedError extends Error {\n readonly code = \"site_data_unsupported\";\n\n constructor() {\n super(\"This Site host does not provide Site Data\");\n this.name = \"SiteDataUnsupportedError\";\n }\n}\n\nfunction unsafePathname(pathname: string): boolean {\n return (\n /[%\\\\#\\u0000-\\u0020\\u007f]/u.test(pathname) ||\n pathname.split(\"/\").some((part) => part === \".\" || part === \"..\")\n );\n}\n\nfunction hostWorkspacePath(path: string, workspaceId: string): string {\n return path.replace(\"/workspaces/site-host\", `/workspaces/${encodeURIComponent(workspaceId)}`);\n}\n\n/** Site Data: a Site reaches only its own data, as `current`, through a host bound to a published Site. */\nfunction siteDataPath(path: string, rewritten: string, workspaceId: string, siteId?: string) {\n // Inside the Site the alias stays unresolved; the host resolves it.\n if (workspaceId === \"site-host\") return path;\n // Only a host bound to a published Site serves its data.\n if (!siteId) throw new SiteDataUnsupportedError();\n return rewritten.replace(\n \"/published-artifacts/current/\",\n `/published-artifacts/${encodeURIComponent(siteId)}/`,\n );\n}\n\n/**\n * Route a request from Site code (the in-Site SDK, the console bridge, a\n * Codemode preview) to the host workspace. This is the `SITE_OPERATIONS`\n * allowlist: anything else is refused with SiteSessionPathError before any\n * request is made. Ordinary API handlers still authorize every allowed\n * operation with the viewer's own authority, and the API independently\n * refuses frame requests outside the allowlist or to another Site's sessions.\n *\n * `workspaceId` `site-host` checks a path inside the Site without rewriting\n * it. A session list must name `originSiteId=current`; the host binds it to\n * its pinned Site, or to no Site at all when the frame has none.\n */\nexport function siteSessionPath(\n path: string,\n workspaceId: string,\n method = \"GET\",\n siteId?: string,\n): string {\n const pathname = path.split(\"?\")[0]!;\n const match = matchSiteOperation(method, pathname);\n if (!match) throw new SiteSessionPathError();\n const rewritten = hostWorkspacePath(path, workspaceId);\n if (SITE_DATA_PATH.test(pathname)) return siteDataPath(path, rewritten, workspaceId, siteId);\n if (match.operation.id !== \"sessions.list\") return rewritten;\n // A Site lists only its own conversations. Never widen a Site list to the workspace.\n const url = new URL(rewritten, \"http://site.invalid\");\n const origins = url.searchParams.getAll(\"originSiteId\");\n if (origins.length !== 1 || origins[0] !== \"current\") throw new SiteSessionPathError();\n if (workspaceId === \"site-host\") return path;\n url.searchParams.set(\"originSiteId\", siteId ?? SITE_NO_ORIGIN_ID);\n return url.pathname + url.search;\n}\n\n/**\n * Route an agent's own SDK request through the Codemode SDK proxy to its\n * workspace. Unlike `siteSessionPath` this is a URL prefix boundary, not an\n * operation allowlist: the proxy signs a short-lived credential bounded by\n * the agent's own permission ceiling and ordinary handlers authorize every\n * operation. Site Data is not served here (an agent uses its tools).\n * Requests a Codemode preview forwards from Site code carry the frame marker\n * and use `siteSessionPath` instead.\n */\nexport function siteHostWorkspacePath(path: string, workspaceId: string): string {\n const pathname = path.split(\"?\")[0]!;\n const workspace =\n pathname === SITE_WORKSPACE_PREFIX || pathname.startsWith(`${SITE_WORKSPACE_PREFIX}/`);\n if ((!workspace && pathname !== \"/v1/config/client\") || unsafePathname(pathname))\n throw new SiteSessionPathError();\n const rewritten = hostWorkspacePath(path, workspaceId);\n const data = SITE_DATA_PATH.exec(pathname);\n if (data) {\n if (data[1] !== \"current\") throw new SiteSessionPathError();\n return siteDataPath(path, rewritten, workspaceId);\n }\n const url = new URL(rewritten, \"http://site.invalid\");\n if (url.searchParams.get(\"originSiteId\") === \"current\" && workspaceId !== \"site-host\") {\n url.searchParams.set(\"originSiteId\", SITE_NO_ORIGIN_ID);\n return url.pathname + url.search;\n }\n return rewritten;\n}\n\n/** The Site identity a host attached to a request, from its host-set headers. */\nexport type SiteFrameHeaders = {\n /** The pinned published Site id, or null for a frame without one. */\n siteId: string | null;\n versionId: string | null;\n /** The host's frame marker value (`1`, `preview`), or null when only the Site id was set. */\n marker: string | null;\n frameId: string | null;\n};\n\n/** Read the host-set frame headers. Null when the request did not come from a Site frame. */\nexport function siteFrameFromHeaders(\n header: (name: string) => string | null | undefined,\n): SiteFrameHeaders | null {\n const value = (name: string) => header(name) ?? null;\n const marker = value(SITE_FRAME_HEADER);\n const siteId = value(SITE_ID_HEADER);\n const versionId = value(SITE_VERSION_HEADER);\n const frameId = value(SITE_FRAME_ID_HEADER);\n if (marker === null && siteId === null && versionId === null && frameId === null) return null;\n return { siteId: siteId || null, versionId: versionId || null, marker, frameId: frameId || null };\n}\n\n/**\n * Match a request that reached a workspace route from a Site frame against\n * `SITE_OPERATIONS`. `pathname` is the raw request path\n * (`/v1/workspaces/<id>/...` or `/v1/config/client`). The frame's own pinned\n * Site id maps back to `current`; any other Site id does not match.\n */\nexport function siteFrameOperation(\n method: string,\n pathname: string,\n workspaceId: string,\n frameSiteId: string | null,\n): { operation: SiteOperation; suffix: string; sessionId: string | null } | null {\n if (unsafePathname(pathname)) return null;\n let sitePath = pathname;\n if (pathname !== \"/v1/config/client\") {\n const prefix = `/v1/workspaces/${workspaceId}`;\n if (pathname !== prefix && !pathname.startsWith(`${prefix}/`)) return null;\n sitePath = `${SITE_WORKSPACE_PREFIX}${pathname.slice(prefix.length)}`;\n const data = /^\\/v1\\/workspaces\\/site-host\\/published-artifacts\\/([^/]+)\\//u.exec(sitePath);\n if (data) {\n if (!frameSiteId || data[1] !== frameSiteId) return null;\n sitePath = sitePath.replace(\n `/published-artifacts/${frameSiteId}/`,\n \"/published-artifacts/current/\",\n );\n }\n }\n const match = matchSiteOperation(method, sitePath);\n if (!match) return null;\n const session = /^\\/sessions\\/([^/]+)(?:\\/|$)/u.exec(match.suffix);\n return { ...match, sessionId: session ? session[1]! : null };\n}\n\n/** Preserve SDK request semantics while the host supplies identity and transport headers. */\nexport function siteRequestHeaders(input: HeadersInit): Headers {\n const headers = new Headers(input);\n const connectionHeaders = (headers.get(\"connection\") ?? \"\")\n .split(\",\")\n .map((value) => value.trim().toLowerCase());\n for (const name of [...headers.keys()]) {\n if (\n connectionHeaders.includes(name) ||\n /^(authorization|proxy-authorization|cookie|cookie2|host|origin|referer|connection|keep-alive|proxy-connection|te|trailer|transfer-encoding|upgrade|content-length|accept-encoding|forwarded|x-api-key)$/i.test(\n name,\n ) ||\n /^(sec-|x-forwarded-|x-opengeni-(access-key|external-actor|site-|managed-actor))/i.test(name)\n )\n headers.delete(name);\n }\n return headers;\n}\n\n// ---------------------------------------------------------------------------\n// What a Site frame may put in a request body\n// ---------------------------------------------------------------------------\n\n/** Message fields a Site page may set: the text and how the model answers it. */\nconst SITE_FRAME_MESSAGE_FIELDS = [\n \"text\",\n \"annotations\",\n \"model\",\n \"reasoningEffort\",\n \"latencyMode\",\n \"controlEtag\",\n \"expectedDraftRevision\",\n] as const;\n\n/**\n * Body fields a Site frame may send per operation. Anything else with a\n * value (resources, personal resource attachments, MCP credential updates,\n * connection accounts, model context, approval decisions, human-input\n * answers) is the person's to give in the console, never a Site page's.\n */\nconst SITE_FRAME_BODY_FIELDS: Readonly<Record<string, readonly string[]>> = Object.freeze({\n \"sessions.send\": [\"type\", \"payload\", \"clientEventId\"],\n \"sessions.steer\": [...SITE_FRAME_MESSAGE_FIELDS, \"clientEventId\"],\n \"sessions.control\": [\"action\", \"reason\", \"clientEventId\", \"expectedControlEtag\"],\n \"sessions.composerDraft.put\": [\n \"text\",\n \"annotations\",\n \"resources\",\n \"model\",\n \"reasoningEffort\",\n \"latencyMode\",\n \"expectedRevision\",\n ],\n \"sessions.composerDraft.submit\": [\n ...SITE_FRAME_MESSAGE_FIELDS,\n \"resources\",\n \"connectionAccounts\",\n \"clientEventId\",\n \"delivery\",\n ],\n \"sessions.queue.move\": [\"clientEventId\", \"expectedQueueVersion\", \"beforeTurnId\"],\n \"sessions.queue.edit\": [\n \"clientEventId\",\n \"expectedTurnVersion\",\n \"expectedDraftRevision\",\n \"replaceDraft\",\n ],\n \"sessions.queue.steer\": [\"clientEventId\", \"expectedTurnVersion\", \"controlEtag\"],\n \"sessions.queue.delete\": [\"clientEventId\", \"expectedTurnVersion\", \"reason\"],\n});\n\n/** Fields allowed above only while empty: a draft carries no resources or accounts. */\nconst SITE_FRAME_EMPTY_ONLY_FIELDS = new Set([\"resources\", \"connectionAccounts\"]);\n\n/**\n * Session create fields a Site frame may send. The API starts the session\n * with a minimal Site profile: no tools, servers, connections, permissions,\n * vaults, sandbox or environment choice, resources, Skills, agent overrides,\n * hidden model context, learning overrides, goals, channels, visibility,\n * usage limits or nesting. Metadata keeps only keys outside `_opengeni`.\n */\nexport const SITE_FRAME_SESSION_CREATE_FIELDS: readonly string[] = Object.freeze([\n \"initialMessage\",\n \"requestedSessionId\",\n \"idempotencyKey\",\n \"clientEventId\",\n \"model\",\n \"reasoningEffort\",\n \"latencyMode\",\n \"startMode\",\n \"metadata\",\n]);\n\nfunction bodyRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\n/** Absent, null, an empty list or an empty object asks for nothing. */\nfunction emptyBodyValue(value: unknown): boolean {\n if (value === undefined || value === null) return true;\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value).length === 0;\n return false;\n}\n\nfunction refusedField(\n body: Record<string, unknown>,\n allowed: readonly string[],\n prefix = \"\",\n): string | null {\n for (const [name, value] of Object.entries(body)) {\n if (emptyBodyValue(value)) continue;\n if (!allowed.includes(name) || SITE_FRAME_EMPTY_ONLY_FIELDS.has(name))\n return `${prefix}${name}`;\n }\n return null;\n}\n\n/**\n * The first body field a Site frame may not send for this operation (for\n * example `payload.resources` or `type`), or null when the body is allowed.\n * `suffix` is the operation's site-host suffix (from `siteFrameOperation` or\n * `matchSiteOperation`). A body that is not a JSON object is left to the\n * route, which refuses it. Only `user.message` events are allowed:\n * approvals and answers to questions happen in the console.\n */\nexport function siteFrameBodyRefusal(\n operationId: string,\n suffix: string,\n body: unknown,\n): string | null {\n const record = bodyRecord(body);\n if (!record) return null;\n if (operationId === \"sessions.create\")\n return refusedField(record, SITE_FRAME_SESSION_CREATE_FIELDS);\n const action =\n operationId === \"sessions.queue.item\"\n ? /\\/queue\\/[^/]+\\/(move|edit|steer|delete)$/u.exec(suffix)?.[1]\n : undefined;\n const key = action ? `sessions.queue.${action}` : operationId;\n const allowed = SITE_FRAME_BODY_FIELDS[key];\n if (!allowed) return null;\n const refused = refusedField(record, allowed);\n if (refused) return refused;\n if (operationId !== \"sessions.send\") return null;\n if (record.type !== \"user.message\") return \"type\";\n const payload = bodyRecord(record.payload);\n return payload ? refusedField(payload, SITE_FRAME_MESSAGE_FIELDS, \"payload.\") : null;\n}\n","/** HTTP transport for the ordinary SDK. One response port per request keeps\n * event streams incremental and cancellation independent of other requests. */\nexport const SITE_HTTP = \"opengeni.site.http\";\nexport const SITE_WORKSPACE = \"site-host\";\nexport type SiteHttpRequest = {\n type: typeof SITE_HTTP;\n requestId: string;\n path: string;\n method: string;\n headers: [string, string][];\n /** Text for JSON requests; bytes for Site Data file uploads. */\n body?: string | ArrayBuffer;\n};\n\nimport { siteSessionPath } from \"@opengeni/contracts/site-session-http\";\nexport { siteSessionPath } from \"@opengeni/contracts/site-session-http\";\n\nexport function isSiteHttpRequest(value: unknown): value is SiteHttpRequest {\n if (!value || typeof value !== \"object\") return false;\n const v = value as SiteHttpRequest;\n return (\n v.type === SITE_HTTP &&\n typeof v.requestId === \"string\" &&\n typeof v.path === \"string\" &&\n typeof v.method === \"string\" &&\n /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(v.method) &&\n (v.body === undefined || typeof v.body === \"string\" || v.body instanceof ArrayBuffer) &&\n Array.isArray(v.headers) &&\n v.headers.every(\n (h) => Array.isArray(h) && h.length === 2 && h.every((x) => typeof x === \"string\"),\n )\n );\n}\n\nexport async function serveSiteHttp(\n message: SiteHttpRequest,\n port: MessagePort,\n fetchResponse: (request: SiteHttpRequest, signal: AbortSignal) => Promise<Response>,\n signal: AbortSignal,\n): Promise<void> {\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n let wake: (() => void) | undefined;\n let pulling = false;\n const onMessage = (event: MessageEvent) => {\n if (event.data === \"pull\") {\n pulling = true;\n wake?.();\n }\n };\n const abort = () => {\n void reader?.cancel(signal.reason).catch(() => {});\n wake?.();\n };\n port.addEventListener(\"message\", onMessage);\n signal.addEventListener(\"abort\", abort, { once: true });\n port.start();\n try {\n if (signal.aborted) throw signal.reason;\n const response = await fetchResponse(message, signal);\n reader = response.body?.getReader();\n port.postMessage({ status: response.status, headers: [...response.headers], body: !!reader });\n if (reader)\n while (!signal.aborted) {\n if (!pulling)\n await new Promise<void>((resolve) => {\n wake = resolve;\n });\n wake = undefined;\n if (signal.aborted) break;\n pulling = false;\n const part = await reader.read();\n if (part.done) {\n port.postMessage({ done: true });\n break;\n }\n port.postMessage({ chunk: part.value });\n }\n if (signal.aborted) throw signal.reason;\n } catch (error) {\n port.postMessage({ error: error instanceof Error ? error.message : \"Site request failed\" });\n } finally {\n signal.removeEventListener(\"abort\", abort);\n port.removeEventListener(\"message\", onMessage);\n await reader?.cancel().catch(() => {});\n port.close();\n }\n}\n\nexport async function sitePortFetch(\n port: MessagePort,\n input: RequestInfo | URL,\n init?: RequestInit,\n): Promise<Response> {\n const request = new Request(input, init);\n const url = new URL(request.url);\n const path = `${url.pathname}${url.search}`;\n siteSessionPath(path, SITE_WORKSPACE, request.method);\n const channel = new MessageChannel();\n const requestId = crypto.randomUUID();\n const binary =\n init?.body instanceof ArrayBuffer ||\n ArrayBuffer.isView(init?.body) ||\n (typeof Blob !== \"undefined\" && init?.body instanceof Blob);\n const body = request.body\n ? binary\n ? await request.arrayBuffer()\n : await request.text()\n : undefined;\n return await new Promise<Response>((resolve, reject) => {\n let controller: ReadableStreamDefaultController<Uint8Array> | undefined;\n let finished = false;\n const cleanup = () => {\n finished = true;\n request.signal.removeEventListener(\"abort\", abort);\n channel.port1.close();\n };\n const abort = () => {\n if (finished) return;\n port.postMessage({ type: \"opengeni.site.cancel\", version: 2, requestId });\n const error = request.signal.reason ?? new DOMException(\"Cancelled\", \"AbortError\");\n controller?.error(error);\n reject(error);\n cleanup();\n };\n channel.port1.onmessage = (event) => {\n const data = event.data;\n if (data.error) {\n const error = new Error(data.error);\n controller?.error(error);\n reject(error);\n cleanup();\n } else if (data.status) {\n const stream = data.body\n ? new ReadableStream<Uint8Array>({\n start(c) {\n controller = c;\n },\n pull() {\n channel.port1.postMessage(\"pull\");\n },\n cancel() {\n controller = undefined;\n abort();\n },\n })\n : null;\n resolve(new Response(stream, { status: data.status, headers: data.headers }));\n if (!data.body) cleanup();\n } else if (data.done) {\n controller?.close();\n cleanup();\n } else if (data.chunk) controller?.enqueue(data.chunk);\n };\n if (request.signal.aborted) {\n abort();\n return;\n }\n request.signal.addEventListener(\"abort\", abort, { once: true });\n port.postMessage(\n {\n type: SITE_HTTP,\n requestId,\n path,\n method: request.method,\n headers: [...request.headers],\n ...(body === undefined ? {} : { body }),\n } satisfies SiteHttpRequest,\n [channel.port2],\n );\n });\n}\n","import {\n SITE_FRAME_HEADER,\n SITE_FRAME_ID_HEADER,\n SITE_ID_HEADER,\n SITE_VERSION_HEADER,\n siteFrameBodyRefusal,\n siteFrameOperation,\n siteRequestHeaders,\n} from \"@opengeni/contracts/site-session-http\";\nimport { OpenGeniApiError } from \"./errors\";\nimport { createSharedCatalogLoader } from \"./shared-catalog-loader\";\nimport { siteSessionPath, type SiteHttpRequest } from \"./site-http\";\nimport type { OpenGeniSiteToolCatalog } from \"./site\";\nimport type { OpenGeniWorkspaceTools } from \"./tools\";\nimport type {\n ToolGatewayCallRequest,\n ToolGatewayCallResponse,\n ToolGatewayIdentity,\n ToolGatewayResolveRequest,\n ToolGatewayResolvedTool,\n ToolGatewayInvokeRequest,\n ToolGatewayInvokeResponse,\n} from \"./types\";\n\nexport type SiteToolCallRequest = ToolGatewayCallRequest & {\n siteArtifactId: string;\n siteVersionId: string;\n};\nexport type SiteToolCaller = (input: {\n workspaceId: string;\n request: ToolGatewayCallRequest &\n Partial<Pick<SiteToolCallRequest, \"siteArtifactId\" | \"siteVersionId\">>;\n signal: AbortSignal;\n}) => Promise<ToolGatewayCallResponse>;\nexport type SiteToolBridge = {\n resolve?: (\n request: ToolGatewayResolveRequest,\n options: { signal: AbortSignal },\n ) => Promise<ToolGatewayResolvedTool>;\n invoke?: (\n request: ToolGatewayInvokeRequest,\n options: { signal: AbortSignal },\n ) => Promise<ToolGatewayInvokeResponse>;\n fetch?: (request: SiteHttpRequest, signal: AbortSignal) => Promise<Response>;\n /** The host serves Site Data for its pinned published Site through `fetch`. */\n siteData?: boolean;\n catalog: (options: { signal: AbortSignal }) => Promise<OpenGeniSiteToolCatalog>;\n call: (\n request: ToolGatewayCallRequest,\n options: { signal: AbortSignal },\n ) => Promise<ToolGatewayCallResponse>;\n};\nexport type CreateSiteToolBridgeOptions = {\n workspaceTools: Pick<OpenGeniWorkspaceTools, \"$catalog\"> &\n Partial<Pick<OpenGeniWorkspaceTools, \"$targetProtocol\" | \"$resolve\" | \"$invoke\" | \"$manifest\">>;\n workspaceId: string;\n\n callTool: SiteToolCaller;\n isCatalogStale?: (error: unknown) => boolean;\n /** Optional authenticated host transport for the host-bound workspace API.\n * Omit to expose tools only. Site-provided authorization headers are never forwarded. */\n fetchResponse?: (path: string, init: RequestInit) => Promise<Response>;\n} & (\n | { artifactId: string; siteVersionId: string; requestedTools: readonly ToolGatewayIdentity[] }\n | { artifactId?: never; siteVersionId?: never; requestedTools?: never }\n);\n\n/** Host-side bridge for the opaque Site frame. Supply an authenticated transport;\n * the server independently checks live viewer access and the exact Site version.\n * Recreate on actor/version change. Never take these pinned fields from HTML.\n *\n * `fetch` forwards only the `SITE_OPERATIONS` allowlist (`siteSessionPath`);\n * every other route is refused before a request is made. Each bridge is one\n * frame: it mints a frame id, so a frame without a published Site reaches only\n * the sessions it started. */\nexport function createSiteToolBridge(input: CreateSiteToolBridgeOptions): SiteToolBridge {\n const allowed = input.requestedTools ? new Set(input.requestedTools.map(identityKey)) : null;\n const frameId = crypto.randomUUID();\n const targeted =\n input.workspaceTools.$targetProtocol === 1 &&\n input.workspaceTools.$resolve &&\n input.workspaceTools.$invoke &&\n input.workspaceTools.$manifest;\n const context = input.artifactId\n ? { siteArtifactId: input.artifactId, siteVersionId: input.siteVersionId }\n : {};\n const manifests = new Map<string, readonly ToolGatewayResolvedTool[]>();\n const resolve = async (\n request: ToolGatewayResolveRequest,\n { signal }: { signal: AbortSignal },\n ) => {\n if (\n allowed &&\n \"identity\" in request.target &&\n !allowed.has(identityKey(request.target.identity))\n )\n throw new Error(\"This tool is not available to the Site\");\n const tool = await input.workspaceTools.$resolve!(request.target, { signal, ...context });\n if (allowed && !allowed.has(identityKey(tool.entry.identity)))\n throw new Error(\"This tool is not available to the Site\");\n return tool;\n };\n const invoke = async (request: ToolGatewayInvokeRequest, { signal }: { signal: AbortSignal }) => {\n if (\n allowed &&\n \"identity\" in request.target &&\n !allowed.has(identityKey(request.target.identity))\n )\n throw new Error(\"This tool is not available to the Site\");\n return await input.workspaceTools.$invoke!(\n {\n target: request.target,\n operationId: request.operationId,\n arguments: request.arguments,\n ...(request.expectedDefinitionDigest === undefined\n ? {}\n : { expectedDefinitionDigest: request.expectedDefinitionDigest }),\n ...context,\n },\n { signal },\n );\n };\n // One shared load serves every concurrent Site request (cancelled only when\n // all of them abort); a stale rejection reloads once for all requests\n // rejected on that digest.\n const projectedCatalog = createSharedCatalogLoader<OpenGeniSiteToolCatalog>(\n async (refresh, signal) => {\n if (targeted && input.requestedTools) {\n const manifest = await input.workspaceTools.$manifest!(\n { identities: [...input.requestedTools], ...context },\n { signal },\n );\n signal.throwIfAborted();\n if (manifests.size >= 4) manifests.delete(manifests.keys().next().value!);\n manifests.set(manifest.digest, manifest.tools);\n return {\n version: 1,\n generation: 1,\n digest: manifest.digest,\n createdAt: new Date().toISOString(),\n entries: manifest.tools.map((tool) => tool.entry),\n };\n }\n const current = await input.workspaceTools.$catalog({\n signal,\n ...(refresh ? { refresh } : {}),\n });\n if (current.workspaceId !== input.workspaceId)\n throw new Error(\"Site catalog workspace mismatch\");\n return {\n version: current.version,\n generation: current.generation,\n digest: current.digest,\n createdAt: current.createdAt,\n entries: current.entries.filter(\n (entry) => !allowed || allowed.has(identityKey(entry.identity)),\n ),\n };\n },\n );\n const loadCatalog = async ({\n signal,\n staleDigest,\n }: {\n signal: AbortSignal;\n staleDigest?: string;\n }): Promise<OpenGeniSiteToolCatalog> => {\n signal.throwIfAborted();\n const catalog =\n staleDigest === undefined\n ? await projectedCatalog.load({ signal })\n : await projectedCatalog.reloadAfterStale(staleDigest, signal);\n signal.throwIfAborted();\n return catalog;\n };\n return {\n ...(targeted ? { resolve, invoke } : {}),\n ...(input.fetchResponse && input.artifactId ? { siteData: true } : {}),\n ...(input.fetchResponse\n ? {\n fetch: async (message: SiteHttpRequest, signal: AbortSignal) => {\n const path = siteSessionPath(\n message.path,\n input.workspaceId,\n message.method,\n input.artifactId,\n );\n // Site code sends message text, not approvals, answers, resources,\n // credentials or connection choices. The API refuses them too.\n const refused = siteFrameBodyFieldRefusal(path, message, input);\n if (refused) return refused;\n const headers = siteRequestHeaders(message.headers);\n // Host-set marker: the API treats every bridged request as a Site frame,\n // limited to SITE_OPERATIONS and to this frame's own sessions.\n headers.set(SITE_FRAME_HEADER, \"1\");\n headers.set(SITE_FRAME_ID_HEADER, frameId);\n if (input.artifactId) {\n headers.set(SITE_ID_HEADER, input.artifactId);\n headers.set(SITE_VERSION_HEADER, input.siteVersionId);\n }\n\n return input.fetchResponse!(path, {\n method: message.method,\n signal,\n headers: Object.fromEntries(headers),\n ...(message.body === undefined ? {} : { body: message.body }),\n });\n },\n }\n : {}),\n catalog: async ({ signal }) => await loadCatalog({ signal }),\n call: async (request, { signal }) => {\n if (allowed && !allowed.has(identityKey(request.identity)))\n throw new Error(\"This tool is not available to the Site\");\n if (targeted && input.requestedTools) {\n const tool = manifests\n .get(request.catalogDigest)\n ?.find(\n (candidate) => identityKey(candidate.entry.identity) === identityKey(request.identity),\n );\n if (!tool)\n throw new OpenGeniApiError(\n 409,\n JSON.stringify({\n error: { code: \"conflict\", details: { code: \"catalog_stale\" }, retryable: true },\n }),\n );\n try {\n const response = await invoke(\n {\n operationId: request.operationId ?? crypto.randomUUID(),\n target: { identity: request.identity },\n arguments: request.arguments,\n expectedDefinitionDigest: tool.definitionDigest,\n },\n { signal },\n );\n return {\n operationId: response.operationId,\n catalogDigest: request.catalogDigest,\n result: legacySiteToolResult(response.result),\n };\n } catch (error) {\n if (\n error instanceof OpenGeniApiError &&\n error.retryable !== false &&\n !error.outcomeUnknown &&\n error.details?.code === \"tool_definition_stale\"\n ) {\n projectedCatalog.invalidate(request.catalogDigest);\n manifests.delete(request.catalogDigest);\n throw new OpenGeniApiError(\n 409,\n JSON.stringify({\n error: {\n code: \"catalog_stale\",\n details: { code: \"catalog_stale\" },\n retryable: true,\n },\n }),\n );\n }\n throw error;\n }\n }\n let usedDigest: string | undefined;\n const call = async (staleDigest?: string) => {\n const catalog = await loadCatalog({\n signal,\n ...(staleDigest === undefined ? {} : { staleDigest }),\n });\n usedDigest = catalog.digest;\n if (\n !catalog.entries.some(\n (entry) => identityKey(entry.identity) === identityKey(request.identity),\n )\n )\n throw new Error(\"This requested tool is not enabled in the workspace\");\n const response = await input.callTool({\n workspaceId: input.workspaceId,\n signal,\n request: {\n ...(request.operationId ? { operationId: request.operationId } : {}),\n catalogDigest: catalog.digest,\n identity: request.identity,\n arguments: request.arguments,\n ...(input.artifactId\n ? { siteArtifactId: input.artifactId, siteVersionId: input.siteVersionId }\n : {}),\n },\n });\n return { ...response, result: legacySiteToolResult(response.result) };\n };\n try {\n return await call();\n } catch (error) {\n // Only pre-execution catalog rejection permits one retry. Never retry\n // transport failures, expired credentials or uncertain tool effects.\n if (\n staleRetryVetoed(error) ||\n !(input.isCatalogStale ?? isSiteCatalogStaleError)(error) ||\n usedDigest === undefined\n )\n throw error;\n return await call(usedDigest);\n }\n },\n };\n}\n\n/** Saved Site bundles may treat a provider's error.code as retry authorization.\n * An executed result is data, never a pre-execution control signal. Only wrap\n * colliding error results on the legacy call path; keep the original diagnostic\n * intact and do not project request arguments, tokens, or host credentials. */\nfunction legacySiteToolResult(\n result: ToolGatewayCallResponse[\"result\"],\n): ToolGatewayCallResponse[\"result\"] {\n if (!result?.isError) return result;\n const structured = result.structuredContent;\n const error = structured?.error;\n if (\n typeof error !== \"object\" ||\n error === null ||\n !(\"code\" in error) ||\n (error.code !== \"catalog_stale\" && error.code !== \"tool_definition_stale\")\n )\n return result;\n return {\n ...result,\n structuredContent: {\n ...structured,\n error: {\n code: \"site_tool_execution_failed\",\n message:\n \"message\" in error && typeof error.message === \"string\"\n ? error.message\n : \"Site tool execution failed\",\n retryable: false,\n outcomeUnknown: \"outcomeUnknown\" in error && error.outcomeUnknown === true,\n providerError: error,\n },\n },\n };\n}\n\nexport function isSiteCatalogStaleError(error: unknown): boolean {\n return (\n !staleRetryVetoed(error) &&\n error instanceof OpenGeniApiError &&\n error.status === 409 &&\n error.details?.code === \"catalog_stale\"\n );\n}\nfunction staleRetryVetoed(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n ((\"outcomeUnknown\" in error && error.outcomeUnknown === true) ||\n (\"retryable\" in error && error.retryable === false))\n );\n}\nfunction identityKey(identity: ToolGatewayIdentity): string {\n return `${identity.serverId}\\u0000${identity.toolName}`;\n}\n\n/** A 403 like the API's for a body field Site code may not send, or null. */\nfunction siteFrameBodyFieldRefusal(\n path: string,\n message: SiteHttpRequest,\n input: { workspaceId: string; artifactId?: string | undefined },\n): Response | null {\n if (typeof message.body !== \"string\" || message.method === \"GET\") return null;\n const operation = siteFrameOperation(\n message.method,\n path.split(\"?\")[0]!,\n input.workspaceId,\n input.artifactId ?? null,\n );\n if (!operation) return null;\n let body: unknown;\n try {\n body = JSON.parse(message.body);\n } catch {\n return null;\n }\n const field = siteFrameBodyRefusal(operation.operation.id, operation.suffix, body);\n if (!field) return null;\n return Response.json(\n {\n error: {\n status: 403,\n code: \"forbidden\",\n message:\n \"A Site page can send message text only. Approvals, answers, resources, credentials and connection choices happen in the console.\",\n retryable: false,\n details: { code: \"site_frame_field_forbidden\", field },\n },\n },\n { status: 403 },\n );\n}\n","/**\n * Site Data for Site HTML: persistent JSON collections and files that belong\n * to the published Site. Requests travel over the host's Site HTTP channel;\n * the host adds the viewer's credentials and pins the Site, and the API\n * enforces each collection's access mode. Stored records are untrusted input:\n * render them with textContent, never innerHTML.\n */\n\nexport type OpenGeniSiteDataErrorCode =\n | \"validation\"\n | \"conflict\"\n | \"not_found\"\n | \"forbidden\"\n /** This viewer may not do this on this Site (a role the Site's rules exclude). */\n | \"not_available_for_viewer\"\n | \"quota_exceeded\"\n | \"rate_limited\"\n | \"site_data_unsupported\"\n | \"request_failed\";\n\nexport class OpenGeniSiteDataError extends Error {\n constructor(\n readonly code: OpenGeniSiteDataErrorCode,\n message: string,\n readonly status: number,\n readonly details: Record<string, unknown> = {},\n ) {\n super(message);\n this.name = \"OpenGeniSiteDataError\";\n }\n}\n\nexport type OpenGeniSiteDataRecord<T extends Record<string, unknown> = Record<string, unknown>> = {\n id: string;\n key: string | null;\n data: T;\n /** Principal that owns the record, such as `user:<id>`. */\n owner: string;\n createdBy: string;\n updatedBy: string;\n version: number;\n sizeBytes: number;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type OpenGeniSiteDataScalar = string | number | boolean | null;\n\nexport type OpenGeniSiteDataFilter = {\n /** Dotted data path (up to 4 levels) or $id, $key, $owner, $createdAt, $updatedAt, $version. */\n field: string;\n op: \"eq\" | \"ne\" | \"in\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"contains\" | \"exists\";\n value?: OpenGeniSiteDataScalar | OpenGeniSiteDataScalar[];\n};\n\nexport type OpenGeniSiteDataListOptions = {\n where?: OpenGeniSiteDataFilter[];\n sort?: Array<{ field: string; direction?: \"asc\" | \"desc\" }>;\n /** 1 to 200; 50 by default. */\n limit?: number;\n cursor?: string | null;\n count?: boolean;\n /** `own` returns only the viewer's records. */\n scope?: \"own\" | \"all\";\n};\n\nexport type OpenGeniSiteDataPage<T extends Record<string, unknown> = Record<string, unknown>> = {\n records: OpenGeniSiteDataRecord<T>[];\n nextCursor: string | null;\n count?: number;\n};\n\n/** A record by id, or by your own key. A plain string is treated as a key. */\nexport type OpenGeniSiteDataRef = string | { id: string } | { key: string };\n\nexport type OpenGeniSiteDataOperation =\n | { op: \"insert\"; collection: string; key?: string; data: Record<string, unknown> }\n | {\n op: \"put\";\n collection: string;\n key: string;\n data: Record<string, unknown>;\n expectedVersion?: number;\n }\n | ({\n op: \"patch\";\n collection: string;\n data: Record<string, unknown>;\n expectedVersion?: number;\n } & RefFields)\n | ({ op: \"delete\"; collection: string; expectedVersion?: number } & RefFields)\n | ({ op: \"increment\"; collection: string; field: string; by?: number } & RefFields);\n\ntype RefFields = { id: string; key?: never } | { key: string; id?: never };\n\nexport type OpenGeniSiteDataWriteResult =\n | { op: \"insert\" | \"put\" | \"patch\" | \"increment\"; record: OpenGeniSiteDataRecord }\n | { op: \"delete\"; deleted: { id: string } };\n\nexport type OpenGeniSiteDataCollection<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n readonly name: string;\n list(options?: OpenGeniSiteDataListOptions): Promise<OpenGeniSiteDataPage<T>>;\n /** Resolves null when the record does not exist or is not visible to the viewer. */\n get(ref: OpenGeniSiteDataRef): Promise<OpenGeniSiteDataRecord<T> | null>;\n insert(data: T, options?: { key?: string }): Promise<OpenGeniSiteDataRecord<T>>;\n /** Create or replace the record with this key. */\n put(\n key: string,\n data: T,\n options?: { expectedVersion?: number },\n ): Promise<OpenGeniSiteDataRecord<T>>;\n /** Shallow-merge fields; expectedVersion turns concurrent edits into a conflict error. */\n patch(\n ref: OpenGeniSiteDataRef,\n data: Partial<T>,\n options?: { expectedVersion?: number },\n ): Promise<OpenGeniSiteDataRecord<T>>;\n delete(ref: OpenGeniSiteDataRef, options?: { expectedVersion?: number }): Promise<void>;\n /** Atomically add to a numeric field; a missing key is created. */\n increment(\n ref: OpenGeniSiteDataRef,\n field: string,\n by?: number,\n ): Promise<OpenGeniSiteDataRecord<T>>;\n count(where?: OpenGeniSiteDataFilter[], options?: { scope?: \"own\" | \"all\" }): Promise<number>;\n};\n\nexport type OpenGeniSiteData = {\n collection<T extends Record<string, unknown> = Record<string, unknown>>(\n name: string,\n ): OpenGeniSiteDataCollection<T>;\n /** Up to 100 operations across collections, applied together or not at all. */\n batch(operations: OpenGeniSiteDataOperation[]): Promise<OpenGeniSiteDataWriteResult[]>;\n count(collection: string, where?: OpenGeniSiteDataFilter[]): Promise<number>;\n};\n\nexport type OpenGeniSiteFile = {\n id: string;\n name: string;\n contentType: string;\n sizeBytes: number;\n sha256: string;\n /** shared: every viewer can open it. private: only the uploader and the Site's managers. */\n scope: \"shared\" | \"private\";\n owner: string;\n createdBy: string;\n createdAt: string;\n};\n\nexport type OpenGeniSiteFiles = {\n upload(\n file: Blob | ArrayBuffer | Uint8Array,\n options?: { name?: string; contentType?: string; scope?: \"shared\" | \"private\" },\n ): Promise<OpenGeniSiteFile>;\n list(options?: { limit?: number; cursor?: string | null }): Promise<{\n files: OpenGeniSiteFile[];\n nextCursor: string | null;\n }>;\n /** A short-lived download URL for an img/src, link or fetch. */\n url(fileId: string): Promise<{ url: string; expiresAt: string; file: OpenGeniSiteFile }>;\n delete(fileId: string): Promise<void>;\n};\n\n/** Path prefix the host rewrites to its pinned Site; Site code never names a Site id. */\nexport const SITE_DATA_PATH_PREFIX = \"/v1/workspaces/site-host/published-artifacts/current\";\n\ntype SiteDataFetch = (path: string, init: RequestInit) => Promise<Response>;\n\n/**\n * Build the typed Site Data facade over a Site HTTP fetch. `ready` resolves\n * once the host has said whether it serves Site Data.\n */\nexport function createOpenGeniSiteData(\n fetchSite: SiteDataFetch,\n ready: () => Promise<boolean>,\n): { data: OpenGeniSiteData; files: OpenGeniSiteFiles } {\n const send = async <T>(path: string, init: RequestInit = {}): Promise<T> => {\n if (!(await ready()))\n throw new OpenGeniSiteDataError(\n \"site_data_unsupported\",\n \"This Site host does not provide Site Data\",\n 0,\n );\n const response = await fetchSite(`${SITE_DATA_PATH_PREFIX}${path}`, init);\n const text = await response.text();\n let value: unknown = null;\n try {\n value = text ? JSON.parse(text) : null;\n } catch {\n value = null;\n }\n if (response.ok) return value as T;\n throw siteDataErrorFromResponse(response.status, value);\n };\n const json = (body: unknown): RequestInit => ({\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n const write = async (operations: OpenGeniSiteDataOperation[]) =>\n (await send<{ results: OpenGeniSiteDataWriteResult[] }>(\"/data/write\", json({ operations })))\n .results;\n const one = async (operation: OpenGeniSiteDataOperation) => {\n const [result] = await write([operation]);\n if (!result || !(\"record\" in result))\n throw new OpenGeniSiteDataError(\"request_failed\", \"Unexpected Site Data response\", 200);\n return result.record;\n };\n const count = async (\n collection: string,\n where?: OpenGeniSiteDataFilter[],\n scope?: \"own\" | \"all\",\n ) =>\n (\n await send<OpenGeniSiteDataPage>(\n \"/data/query\",\n json({\n collection,\n limit: 1,\n count: true,\n ...(where ? { where } : {}),\n ...(scope ? { scope } : {}),\n }),\n )\n ).count ?? 0;\n\n const data: OpenGeniSiteData = {\n collection<T extends Record<string, unknown> = Record<string, unknown>>(name: string) {\n const collection: OpenGeniSiteDataCollection<T> = {\n name,\n list: async (options = {}) =>\n await send<OpenGeniSiteDataPage<T>>(\n \"/data/query\",\n json({ collection: name, ...options }),\n ),\n get: async (ref) => {\n try {\n return (\n await send<{ record: OpenGeniSiteDataRecord<T> }>(\n \"/data/get\",\n json({ collection: name, ...refFields(ref) }),\n )\n ).record;\n } catch (error) {\n if (error instanceof OpenGeniSiteDataError && error.code === \"not_found\") return null;\n throw error;\n }\n },\n insert: async (value, options = {}) =>\n (await one({\n op: \"insert\",\n collection: name,\n data: value,\n ...(options.key === undefined ? {} : { key: options.key }),\n })) as OpenGeniSiteDataRecord<T>,\n put: async (key, value, options = {}) =>\n (await one({\n op: \"put\",\n collection: name,\n key,\n data: value,\n ...options,\n })) as OpenGeniSiteDataRecord<T>,\n patch: async (ref, value, options = {}) =>\n (await one({\n op: \"patch\",\n collection: name,\n ...refFields(ref),\n data: value as Record<string, unknown>,\n ...options,\n })) as OpenGeniSiteDataRecord<T>,\n delete: async (ref, options = {}) => {\n await write([{ op: \"delete\", collection: name, ...refFields(ref), ...options }]);\n },\n increment: async (ref, field, by) =>\n (await one({\n op: \"increment\",\n collection: name,\n ...refFields(ref),\n field,\n ...(by === undefined ? {} : { by }),\n })) as OpenGeniSiteDataRecord<T>,\n count: async (where, options = {}) => await count(name, where, options.scope),\n };\n return collection;\n },\n batch: write,\n count: async (collection, where) => await count(collection, where),\n };\n\n const files: OpenGeniSiteFiles = {\n upload: async (file, options = {}) => {\n const blob =\n file instanceof Blob\n ? file\n : new Blob([file instanceof Uint8Array ? file.slice() : file], {\n type: options.contentType ?? \"application/octet-stream\",\n });\n const name =\n options.name ?? (typeof File !== \"undefined\" && file instanceof File ? file.name : \"file\");\n const query = new URLSearchParams({ name, scope: options.scope ?? \"shared\" });\n return await send<OpenGeniSiteFile>(`/files?${query}`, {\n method: \"POST\",\n headers: {\n \"content-type\": options.contentType ?? (blob.type || \"application/octet-stream\"),\n },\n body: await blob.arrayBuffer(),\n });\n },\n list: async (options = {}) => {\n const query = new URLSearchParams();\n if (options.limit !== undefined) query.set(\"limit\", String(options.limit));\n if (options.cursor) query.set(\"cursor\", options.cursor);\n const suffix = query.size ? `?${query}` : \"\";\n return await send(`/files${suffix}`, { method: \"GET\" });\n },\n url: async (fileId) => await send(`/files/${encodeURIComponent(fileId)}`, { method: \"GET\" }),\n delete: async (fileId) => {\n await send(`/files/${encodeURIComponent(fileId)}`, { method: \"DELETE\" });\n },\n };\n return { data, files };\n}\n\nfunction refFields(ref: OpenGeniSiteDataRef): RefFields {\n if (typeof ref === \"string\") return { key: ref };\n if (\"id\" in ref) return { id: ref.id };\n return { key: ref.key };\n}\n\nconst KNOWN_CODES = new Set<OpenGeniSiteDataErrorCode>([\n \"validation\",\n \"conflict\",\n \"not_found\",\n \"forbidden\",\n \"not_available_for_viewer\",\n \"quota_exceeded\",\n \"rate_limited\",\n]);\n\nfunction siteDataErrorFromResponse(status: number, value: unknown): OpenGeniSiteDataError {\n const error =\n typeof value === \"object\" && value !== null && \"error\" in value\n ? (value as { error: unknown }).error\n : null;\n const record =\n typeof error === \"object\" && error !== null ? (error as Record<string, unknown>) : {};\n const details =\n typeof record.details === \"object\" && record.details !== null\n ? (record.details as Record<string, unknown>)\n : {};\n const detailCode = details.code as OpenGeniSiteDataErrorCode | undefined;\n const code: OpenGeniSiteDataErrorCode =\n detailCode && KNOWN_CODES.has(detailCode)\n ? detailCode\n : status === 404\n ? \"not_found\"\n : status === 403\n ? \"forbidden\"\n : status === 413\n ? \"quota_exceeded\"\n : status === 429\n ? \"rate_limited\"\n : \"request_failed\";\n const message =\n typeof record.message === \"string\" && record.message\n ? record.message\n : `Site Data request failed with HTTP ${status}`;\n return new OpenGeniSiteDataError(code, message, status, details);\n}\n","/**\n * Site SQL for Site HTML: run the named, parameterized queries the Site's\n * owner defined on its optional SQLite database. Sites never send SQL. The\n * request travels over the host's Site HTTP channel like Site Data; the API\n * checks who may run the query and binds `:viewer` (and the other `viewer_*`\n * parameters) from the signed-in viewer, never from the page. Returned rows\n * are untrusted input: render them with textContent, never innerHTML.\n */\nimport { SITE_DATA_PATH_PREFIX } from \"./site-data\";\n\nexport type OpenGeniSiteSqlErrorCode =\n | \"validation\"\n | \"not_found\"\n | \"forbidden\"\n /** This viewer may not do this on this Site (a role the Site's rules exclude). */\n | \"not_available_for_viewer\"\n | \"conflict\"\n | \"quota_exceeded\"\n | \"rate_limited\"\n | \"sql_error\"\n | \"unavailable\"\n | \"disabled\"\n | \"site_sql_unsupported\"\n | \"request_failed\";\n\nexport class OpenGeniSiteSqlError extends Error {\n constructor(\n readonly code: OpenGeniSiteSqlErrorCode,\n message: string,\n readonly status: number,\n readonly details: Record<string, unknown> = {},\n ) {\n super(message);\n this.name = \"OpenGeniSiteSqlError\";\n }\n}\n\n/** A parameter value. Booleans bind as 1 and 0. */\nexport type OpenGeniSiteSqlValue = string | number | boolean | null;\n\nexport type OpenGeniSiteSqlResult<Row extends Record<string, unknown> = Record<string, unknown>> = {\n columns: string[];\n /** Rows keyed by column name; blobs come back as `{ $base64: string }`. */\n rows: Row[];\n /** True when the query's row or size limit cut the result short. */\n truncated: boolean;\n rowsRead: number;\n rowsWritten: number;\n};\n\nexport type OpenGeniSiteSql = {\n /**\n * Run the named query `name` with `params` (names without the colon). Do\n * not pass `viewer` or any `viewer_*` parameter: the host binds them.\n */\n run<Row extends Record<string, unknown> = Record<string, unknown>>(\n name: string,\n params?: Record<string, OpenGeniSiteSqlValue>,\n ): Promise<OpenGeniSiteSqlResult<Row>>;\n};\n\nconst QUERY_NAME = /^[A-Za-z][A-Za-z0-9_-]{0,63}$/u;\n\nconst KNOWN_CODES = new Set<string>([\n \"validation\",\n \"not_found\",\n \"forbidden\",\n \"not_available_for_viewer\",\n \"conflict\",\n \"quota_exceeded\",\n \"rate_limited\",\n \"sql_error\",\n \"unavailable\",\n \"disabled\",\n]);\n\ntype SiteSqlFetch = (path: string, init: RequestInit) => Promise<Response>;\n\n/** Build `site.sql` over a Site HTTP fetch; `ready` says whether the host serves the pinned Site. */\nexport function createOpenGeniSiteSql(\n fetchSite: SiteSqlFetch,\n ready: () => Promise<boolean>,\n): OpenGeniSiteSql {\n return {\n async run<Row extends Record<string, unknown> = Record<string, unknown>>(\n name: string,\n params: Record<string, OpenGeniSiteSqlValue> = {},\n ): Promise<OpenGeniSiteSqlResult<Row>> {\n if (!QUERY_NAME.test(name))\n throw new OpenGeniSiteSqlError(\"validation\", \"Invalid query name\", 0);\n if (Object.keys(params).some((key) => key === \"viewer\" || key.startsWith(\"viewer_\")))\n throw new OpenGeniSiteSqlError(\n \"validation\",\n \"viewer parameters are bound by the host, not the Site\",\n 0,\n );\n if (!(await ready()))\n throw new OpenGeniSiteSqlError(\n \"site_sql_unsupported\",\n \"This Site host does not provide Site SQL\",\n 0,\n );\n const response = await fetchSite(\n `${SITE_DATA_PATH_PREFIX}/sql/queries/${encodeURIComponent(name)}`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ params }),\n },\n );\n const text = await response.text();\n let value: unknown = null;\n try {\n value = text ? JSON.parse(text) : null;\n } catch {\n value = null;\n }\n if (response.ok) return value as OpenGeniSiteSqlResult<Row>;\n throw siteSqlErrorFromResponse(response.status, value);\n },\n };\n}\n\nfunction siteSqlErrorFromResponse(status: number, value: unknown): OpenGeniSiteSqlError {\n const error =\n typeof value === \"object\" && value !== null && \"error\" in value\n ? (value as { error: unknown }).error\n : null;\n const record =\n typeof error === \"object\" && error !== null ? (error as Record<string, unknown>) : {};\n const details =\n typeof record.details === \"object\" && record.details !== null\n ? (record.details as Record<string, unknown>)\n : {};\n const detailCode = typeof details.code === \"string\" ? details.code : undefined;\n const code: OpenGeniSiteSqlErrorCode =\n detailCode && KNOWN_CODES.has(detailCode)\n ? (detailCode as OpenGeniSiteSqlErrorCode)\n : status === 404\n ? \"not_found\"\n : status === 403\n ? \"forbidden\"\n : status === 413\n ? \"quota_exceeded\"\n : status === 429\n ? \"rate_limited\"\n : \"request_failed\";\n const message =\n typeof record.message === \"string\" && record.message\n ? record.message\n : `Site SQL request failed with HTTP ${status}`;\n return new OpenGeniSiteSqlError(code, message, status, details);\n}\n","import type { OpenGeniClient } from \"./client\";\nimport { ChatTurnFold, asRecord, type ChatTurnTerminal } from \"./chat/fold\";\nimport { sessionEventStreamCoveredThrough } from \"./stream\";\nimport type { CreateSessionRequest, Session, SessionEvent } from \"./types\";\n\n/** App-authored input, unchanged: no built-in tasks, prompt templates or UI. */\nexport type OpenGeniSiteAiRequest = Pick<\n CreateSessionRequest,\n \"initialMessage\" | \"idempotencyKey\" | \"model\" | \"reasoningEffort\" | \"latencyMode\"\n> & { initialMessage: string };\n\nexport type OpenGeniSiteAiResult = {\n sessionId: string;\n turnId: string | null;\n text: string;\n status: \"completed\" | \"pending\" | \"cancelled\";\n /** Cursor for subsequent output. Resuming after it returns a suffix, not earlier text. */\n after: number;\n};\n\nexport type OpenGeniSiteAiOptions = {\n /** Stops observing, not the underlying work. Use the ordinary session control API to cancel. */\n signal?: AbortSignal;\n /** Retain the handle before waiting for output, including when observation is interrupted. */\n onSession?: (sessionId: string) => void;\n /** Append-only answer text, folded by the same SDK implementation as embedded chat. */\n onText?: (text: string) => void;\n};\n\nexport type OpenGeniSiteAi = {\n /** Starts an ordinary viewer-owned Site session and returns its first turn's output. */\n run(\n request: OpenGeniSiteAiRequest,\n options?: OpenGeniSiteAiOptions,\n ): Promise<OpenGeniSiteAiResult>;\n /** Observe without sending work. Omit `after` to replay the complete answer;\n * with `after`, text/onText contain only subsequent output. Pass the retained\n * turnId when resuming a pending turn, so another turn cannot settle it. */\n result(\n sessionId: string,\n options?: OpenGeniSiteAiOptions & { after?: number; turnId?: string },\n ): Promise<OpenGeniSiteAiResult>;\n};\n\n/** Native create, session state and replayable events; the host remains the authority. */\nexport function createOpenGeniSiteAi(\n client: Pick<OpenGeniClient, \"createSession\" | \"getSession\" | \"listEventPage\" | \"streamEvents\">,\n workspaceId: string,\n): OpenGeniSiteAi {\n const result: OpenGeniSiteAi[\"result\"] = async (sessionId, options = {}) => {\n options.signal?.throwIfAborted();\n const upstream = new AbortController();\n const onAbort = () => upstream.abort(options.signal?.reason);\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n const cutoff = options.after ?? 0;\n let after = 0;\n let text = \"\";\n let fold =\n options.turnId || cutoff === 0\n ? new ChatTurnFold(workspaceId, sessionId, options.turnId ?? null)\n : null;\n // Without a retained turn id, select the first turn after the cursor, as\n // live observation does. Keep the prefix only until that turn is known.\n let prefix: SessionEvent[] = [];\n let terminal: ChatTurnTerminal | null = null;\n const pending: { event: SessionEvent | null } = { event: null };\n let stream: ReturnType<OpenGeniClient[\"streamEvents\"]> | undefined;\n let streamAbort: AbortController | undefined;\n const closeStream = () => {\n streamAbort?.abort();\n // Some fetch implementations await request abort in iterator.return().\n // Abort first, and never make result delivery depend on its unwinding.\n if (stream) void Promise.resolve(stream.return(undefined)).catch(() => undefined);\n stream = undefined;\n streamAbort = undefined;\n };\n const onUpstreamAbort = () => streamAbort?.abort(upstream.signal.reason);\n upstream.signal.addEventListener(\"abort\", onUpstreamAbort);\n const emit = (chunks: ReturnType<ChatTurnFold[\"push\"]>[\"chunks\"]) => {\n for (const chunk of chunks)\n if (chunk.type === \"text\") {\n upstream.signal.throwIfAborted();\n text += chunk.text;\n options.onText?.(chunk.text);\n }\n };\n const selectTurn = (turnId: string | null) => {\n fold = new ChatTurnFold(workspaceId, sessionId, turnId);\n for (const event of prefix) {\n const step = fold.push(event);\n if (step.terminal && step.terminal !== \"pending\") terminal = step.terminal;\n }\n prefix = [];\n };\n const consume = (event: SessionEvent) => {\n const covered = eventCursor(event);\n if (covered <= after) return;\n after = covered;\n if (!fold) {\n if (covered <= cutoff) {\n prefix.push(event);\n return;\n }\n if (!isTurnOutput(event) && !isWait(event)) return;\n selectTurn(event.turnId ?? lastTurnId(prefix));\n }\n const current = fold!;\n const sameTurn = !event.turnId || !current.turnId || event.turnId === current.turnId;\n if (sameTurn && isWait(event)) {\n if (!current.turnId && event.turnId) current.turnId = event.turnId;\n if (event.type !== \"session.status.changed\") pending.event = event;\n // A historical wait is not a settlement. Only fold it here when\n // rebuilding text the caller already observed before their cursor.\n if (covered > cutoff) return;\n }\n const step = current.push(event);\n if (covered > cutoff) emit(step.chunks);\n if (step.terminal && step.terminal !== \"pending\") terminal = step.terminal;\n };\n const reply = (status: ChatTurnTerminal): OpenGeniSiteAiResult => {\n upstream.signal.throwIfAborted();\n if (status === \"failed\") throw fold!.failureError();\n return {\n sessionId,\n turnId: fold?.turnId ?? null,\n text,\n status:\n status === \"pending\" ? \"pending\" : status === \"cancelled\" ? \"cancelled\" : \"completed\",\n after: Math.max(cutoff, after),\n };\n };\n const readSession = () =>\n observe(\n () => client.getSession(workspaceId, sessionId, { fresh: true, signal: upstream.signal }),\n upstream.signal,\n );\n const replayThrough = async (through: number) => {\n while (after < through) {\n const previous = after;\n const page = await observe(\n () =>\n client.listEventPage(workspaceId, sessionId, {\n after,\n before: through + 1,\n direction: \"after\",\n limit: 200,\n mode: \"forensic\",\n payloadMode: \"full\",\n }),\n upstream.signal,\n );\n for (const event of page.events) {\n consume(event);\n if (terminal && after > cutoff) return;\n }\n // Byte-limited short pages are not EOF; follow durable coverage.\n after = Math.max(after, page.nextAfter ?? page.coveredSequence?.last ?? 0);\n if (after <= previous)\n throw new Error(\"The Site AI event replay did not reach the session cursor.\");\n }\n };\n const waiting = (session: Session) =>\n session.status === \"requires_action\" &&\n (!session.activeTurnId || !fold?.turnId || session.activeTurnId === fold.turnId);\n try {\n let session = await readSession();\n // Reconstruct the exact prefix separately: unlike SSE coalescing, this\n // bounded native page read cannot merge output from both sides of cutoff.\n await replayThrough(Math.min(cutoff, session.lastSequence));\n if (terminal) return reply(terminal);\n for (;;) {\n await replayThrough(session.lastSequence);\n if (terminal) return reply(terminal);\n if (waiting(session)) {\n const fresh = await readSession();\n if (fresh.lastSequence > after) {\n session = fresh;\n continue;\n }\n if (waiting(fresh)) {\n if (!fold) selectTurn(fresh.activeTurnId ?? lastTurnId(prefix));\n else if (!fold.turnId) fold.turnId = fresh.activeTurnId ?? null;\n if (pending.event && eventCursor(pending.event) > cutoff)\n emit(fold!.push(pending.event).chunks);\n return reply(\"pending\");\n }\n session = fresh;\n }\n streamAbort = new AbortController();\n stream = client.streamEvents(workspaceId, sessionId, {\n after: Math.max(cutoff, after),\n signal: streamAbort.signal,\n });\n for (;;) {\n const next = await observe(() => stream!.next(), upstream.signal);\n if (next.done) throw new Error(\"The Site AI event stream ended before the turn settled.\");\n consume(next.value);\n if (terminal) return reply(terminal);\n if (isWait(next.value) && (!next.value.turnId || next.value.turnId === fold?.turnId)) {\n // Reconcile the finite durable tail before declaring a live wait.\n // Reopen from its cursor so buffered SSE overlap cannot repeat text.\n closeStream();\n session = await readSession();\n break;\n }\n }\n }\n } finally {\n options.signal?.removeEventListener(\"abort\", onAbort);\n upstream.abort();\n closeStream();\n upstream.signal.removeEventListener(\"abort\", onUpstreamAbort);\n }\n };\n return {\n async run(request, options = {}) {\n options.signal?.throwIfAborted();\n // Pick the message fields rather than forwarding a caller's extra runtime\n // properties. Tools, ownership, credentials and limits belong to the host.\n const session = await client.createSession(workspaceId, {\n initialMessage: request.initialMessage,\n idempotencyKey: request.idempotencyKey ?? crypto.randomUUID(),\n ...(request.model === undefined ? {} : { model: request.model }),\n ...(request.reasoningEffort === undefined\n ? {}\n : { reasoningEffort: request.reasoningEffort }),\n ...(request.latencyMode === undefined ? {} : { latencyMode: request.latencyMode }),\n });\n options.onSession?.(session.id);\n return await result(session.id, options);\n },\n result,\n };\n}\n\nfunction isWait(event: SessionEvent): boolean {\n return (\n event.type === \"session.requiresAction\" ||\n event.type === \"session.humanInput.requested\" ||\n (event.type === \"session.status.changed\" &&\n asRecord(event.payload).status === \"requires_action\")\n );\n}\n\nfunction isTurnOutput(event: SessionEvent): boolean {\n return (\n event.type.startsWith(\"turn.\") ||\n event.type.startsWith(\"agent.\") ||\n event.type === \"user.message\"\n );\n}\n\nfunction lastTurnId(events: SessionEvent[]): string | null {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index]!;\n if (event.turnId && (isTurnOutput(event) || isWait(event))) return event.turnId;\n }\n return null;\n}\n\nfunction eventCursor(event: SessionEvent): number {\n return Math.max(\n event.sequence,\n event.coveredThrough ?? 0,\n sessionEventStreamCoveredThrough(event) ?? 0,\n );\n}\n\n/** Event-page reads have no signal option; observation can still stop immediately. */\nasync function observe<T>(read: () => Promise<T>, signal: AbortSignal): Promise<T> {\n signal.throwIfAborted();\n let onAbort: () => void = () => {};\n const aborted = new Promise<never>((_, reject) => {\n onAbort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n try {\n const value = await Promise.race([read(), aborted]);\n signal.throwIfAborted();\n return value;\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n}\n","export { createSiteToolBridge, isSiteCatalogStaleError } from \"./site-tool-bridge\";\nexport type {\n SiteToolBridge,\n SiteToolCaller,\n SiteToolCallRequest,\n CreateSiteToolBridgeOptions,\n} from \"./site-tool-bridge\";\nimport {\n OpenGeniToolsClient,\n type OpenGeniToolTransport,\n type OpenGeniWorkspaceTools,\n} from \"./tools\";\nimport { OpenGeniClient } from \"./client\";\nimport { sitePortFetch, siteSessionPath, SITE_WORKSPACE } from \"./site-http\";\nimport { createOpenGeniSiteData, type OpenGeniSiteData, type OpenGeniSiteFiles } from \"./site-data\";\nimport { createOpenGeniSiteSql, type OpenGeniSiteSql } from \"./site-sql\";\nimport { createOpenGeniSiteAi, type OpenGeniSiteAi } from \"./site-ai\";\nexport type {\n OpenGeniSiteAi,\n OpenGeniSiteAiRequest,\n OpenGeniSiteAiResult,\n OpenGeniSiteAiOptions,\n} from \"./site-ai\";\nexport {\n OpenGeniSiteSqlError,\n type OpenGeniSiteSql,\n type OpenGeniSiteSqlErrorCode,\n type OpenGeniSiteSqlResult,\n type OpenGeniSiteSqlValue,\n} from \"./site-sql\";\nexport {\n OpenGeniSiteDataError,\n SITE_DATA_PATH_PREFIX,\n type OpenGeniSiteData,\n type OpenGeniSiteDataCollection,\n type OpenGeniSiteDataErrorCode,\n type OpenGeniSiteDataFilter,\n type OpenGeniSiteDataListOptions,\n type OpenGeniSiteDataOperation,\n type OpenGeniSiteDataPage,\n type OpenGeniSiteDataRecord,\n type OpenGeniSiteDataRef,\n type OpenGeniSiteDataScalar,\n type OpenGeniSiteDataWriteResult,\n type OpenGeniSiteFile,\n type OpenGeniSiteFiles,\n} from \"./site-data\";\nexport {\n isSiteHttpRequest,\n serveSiteHttp,\n siteSessionPath,\n type SiteHttpRequest,\n} from \"./site-http\";\nimport type { SiteViewer, SiteViewerCapabilities } from \"@opengeni/contracts\";\nimport type {\n ToolGatewayCallRequest,\n ToolGatewayCallResponse,\n ToolGatewayCatalog,\n ToolGatewayDeclarationsResponse,\n ToolGatewayResolveRequest,\n ToolGatewayResolvedTool,\n ToolGatewayInvokeRequest,\n ToolGatewayInvokeResponse,\n} from \"./types\";\n\nexport const OPENGENI_SITE_BRIDGE_VERSION = 2 as const;\nexport const OPENGENI_SITE_BRIDGE_CONNECT = \"opengeni.site.connect\" as const;\nexport const OPENGENI_SITE_BRIDGE_READY = \"opengeni.site.ready\" as const;\nexport const OPENGENI_SITE_BRIDGE_REQUEST = \"opengeni.site.request\" as const;\nexport const OPENGENI_SITE_BRIDGE_RESPONSE = \"opengeni.site.response\" as const;\nexport const OPENGENI_SITE_BRIDGE_CANCEL = \"opengeni.site.cancel\" as const;\nexport const OPENGENI_SITE_BRIDGE_BOOTSTRAP_GLOBAL = \"__opengeniSiteBridgeBootstrapV2\" as const;\nexport const OPENGENI_SITE_LOCAL_CODEMODE_PATH = \"/__opengeni/site-tools\" as const;\n/** Bridge request method that returns the viewer (advertised by `viewer: 1`). */\nexport const OPENGENI_SITE_BRIDGE_VIEWER_METHOD = \"viewer\" as const;\n/** Bridge request method that asks the host to sign the viewer in (advertised by `viewer: 1`). */\nexport const OPENGENI_SITE_BRIDGE_SIGN_IN_METHOD = \"auth.signIn\" as const;\n\n/**\n * The person viewing a Site, as the host reports it. Guests of public\n * published Sites have no name or email. `id` is stable per Site and is the\n * Site Data owner principal; it is not an Opengeni subject id usable elsewhere.\n */\nexport type OpenGeniSiteViewer = SiteViewer;\n\n/**\n * What the current viewer may do on this published Site, so a page can hide\n * features instead of failing: `agent`, `workspaceTools` (workspace members\n * only), `siteData` (`\"guest\"` when a collection's guest access applies),\n * the Site SQL query audiences the viewer may call, and `viewAs` while a\n * member previews the Site as a visitor. Anything refused at call time\n * still answers with the error code `not_available_for_viewer`.\n */\nexport type OpenGeniSiteCapabilities = SiteViewerCapabilities;\n\n/** Result of `site.auth.signIn()`: `started` is true when the host began a sign-in navigation. */\nexport type OpenGeniSiteSignInResult = { started: boolean };\n\nexport type OpenGeniSiteBridgeConnectMessage = {\n type: typeof OPENGENI_SITE_BRIDGE_CONNECT;\n version: typeof OPENGENI_SITE_BRIDGE_VERSION;\n};\n\nexport type OpenGeniSiteBridgeReadyMessage = {\n type: typeof OPENGENI_SITE_BRIDGE_READY;\n version: typeof OPENGENI_SITE_BRIDGE_VERSION;\n targetTools?: 1;\n /** The host serves Site Data for this published Site over the Site HTTP channel. */\n siteData?: 1;\n /** The host answers the `viewer` and `auth.signIn` bridge methods. */\n viewer?: 1;\n};\n\n/** Site-originated calls cannot carry host-only approval tokens or Site-version authority. */\nexport type OpenGeniSiteToolCallRequest = Omit<\n ToolGatewayCallRequest,\n \"approvalToken\" | \"siteArtifactId\" | \"siteVersionId\"\n>;\n\n/** Host-filtered catalog projection. Tenant routing context never enters Site code. */\nexport type OpenGeniSiteToolCatalog = Omit<ToolGatewayCatalog, \"accountId\" | \"workspaceId\">;\n\nexport type OpenGeniSiteWorkspaceTools = OpenGeniWorkspaceTools<OpenGeniSiteToolCatalog>;\n\nexport type OpenGeniSiteBridgeRequestMessage = {\n type: typeof OPENGENI_SITE_BRIDGE_REQUEST;\n version: typeof OPENGENI_SITE_BRIDGE_VERSION;\n requestId: string;\n} & (\n | { method: \"catalog\" }\n | { method: \"call\"; payload: OpenGeniSiteToolCallRequest }\n | { method: \"declarations\" }\n | { method: \"resolve\"; payload: ToolGatewayResolveRequest }\n | { method: \"invoke\"; payload: ToolGatewayInvokeRequest }\n | { method: typeof OPENGENI_SITE_BRIDGE_VIEWER_METHOD }\n | { method: typeof OPENGENI_SITE_BRIDGE_SIGN_IN_METHOD }\n);\n\nexport type OpenGeniSiteBridgeCancelMessage = {\n type: typeof OPENGENI_SITE_BRIDGE_CANCEL;\n version: typeof OPENGENI_SITE_BRIDGE_VERSION;\n requestId: string;\n};\n\nexport type OpenGeniSiteBridgeResponseMessage = {\n type: typeof OPENGENI_SITE_BRIDGE_RESPONSE;\n version: typeof OPENGENI_SITE_BRIDGE_VERSION;\n requestId: string;\n} & (\n | {\n ok: true;\n value:\n | OpenGeniSiteToolCatalog\n | ToolGatewayCallResponse\n | ToolGatewayDeclarationsResponse\n | ToolGatewayResolvedTool\n | ToolGatewayInvokeResponse\n | OpenGeniSiteViewer\n | OpenGeniSiteSignInResult;\n }\n | {\n ok: false;\n error: {\n code: string;\n message: string;\n retryable: boolean;\n outcomeUnknown?: boolean;\n };\n }\n);\n\nexport type OpenGeniSiteClient = {\n /** Ordinary SDK, including React session/composer methods and SSE streams. */\n readonly client: OpenGeniClient;\n /** Inline AI over ordinary Site sessions. No conversation component is required. */\n readonly ai: OpenGeniSiteAi;\n /** Host-bound routing alias, not a credential or a caller-selected tenant. */\n readonly workspaceId: string;\n /** Workspace-bound typed facade. The parent host owns workspace identity and credentials. */\n readonly tools: OpenGeniSiteWorkspaceTools;\n /** Persistent collections of JSON records that belong to this published Site. */\n readonly data: OpenGeniSiteData;\n /** Files stored with this published Site. */\n readonly files: OpenGeniSiteFiles;\n /**\n * The Site's optional SQL database: run the named queries its owner\n * defined (`await site.sql.run(\"top_votes\", { limit: 10 })`). Served by\n * hosts bound to a published Site, like `data`; the owner turns it on.\n */\n readonly sql: OpenGeniSiteSql;\n /**\n * The person viewing this Site, resolved once from the host and cached for\n * the life of the client (`await site.viewer`). In the console this is the\n * signed-in workspace member; on a published Site it is the signed-in\n * viewer or an anonymous guest (`kind: \"guest\"`, `signedIn: false`).\n * Resolves `null` when the host does not report viewers (older hosts and\n * local previews). A failed lookup is not cached; reading again retries.\n */\n readonly viewer: Promise<OpenGeniSiteViewer | null>;\n /**\n * What this viewer may do on the published Site (`await site.capabilities`),\n * resolved once and cached like `viewer`. Resolves `null` when the host\n * does not report it (the console, older hosts and local previews): treat\n * null as \"everything the Site declares\", as for a workspace member.\n */\n readonly capabilities: Promise<OpenGeniSiteCapabilities | null>;\n readonly auth: {\n /**\n * Ask the host to sign the viewer in. On a published Site the host\n * navigates the whole page to sign-in and returns `{ started: true }`;\n * the page reloads signed in afterwards. Resolves `{ started: false }`\n * when the viewer is already signed in or the host has no sign-in.\n */\n signIn(): Promise<OpenGeniSiteSignInResult>;\n };\n close(): void;\n};\n\nexport type OpenGeniSiteClientOptions = {\n /** Explicit compatibility with hosts predating targeted tool calls; never an automatic fallback. */\n toolGatewayMode?: \"catalog\" | \"target\";\n /** Advanced embedding seam; ordinary Sites accept bootstrap only from their exact parent. */\n parentWindow?: MessageEventSource;\n /** Advanced embedding seam for listening to the host's document-bound bootstrap message. */\n siteWindow?: Pick<Window, \"parent\" | \"addEventListener\" | \"removeEventListener\">;\n /** Test/embedding seam for an already document-bound host bootstrap port. */\n bootstrapPort?: MessagePort;\n connectTimeoutMs?: number;\n requestTimeoutMs?: number;\n createMessageChannel?: () => MessageChannel;\n /** Local-preview seam. Top-level pages use this same-origin Codemode proxy automatically. */\n localCodemodePath?: string | false;\n /** Test/embedding seam for local-preview requests. */\n fetch?: typeof globalThis.fetch;\n};\n\nexport class OpenGeniSiteBridgeError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly retryable = false,\n readonly outcomeUnknown = false,\n ) {\n super(message);\n this.name = \"OpenGeniSiteBridgeError\";\n }\n}\n\n/**\n * Create the browser client used by a Site. Published iframes use the parent\n * MessagePort; top-level sandbox previews use the same-origin Codemode adapter.\n * Credentials remain in the selected host and never enter Site code.\n */\nexport function createOpenGeniSiteClient(\n options: OpenGeniSiteClientOptions = {},\n): OpenGeniSiteClient {\n const transport = shouldUseLocalCodemode(options)\n ? new OpenGeniSiteLocalCodemodeTransport(options)\n : new OpenGeniSiteBridgeTransport(options);\n const siteData = createOpenGeniSiteData(\n (path, init) => transport.fetch(`https://site.opengeni.invalid${path}`, init),\n () => transport.siteDataSupported(),\n );\n const siteSql = createOpenGeniSiteSql(\n (path, init) => transport.fetch(`https://site.opengeni.invalid${path}`, init),\n () => transport.siteDataSupported(),\n );\n let viewer: Promise<OpenGeniSiteViewer | null> | null = null;\n let capabilities: Promise<OpenGeniSiteCapabilities | null> | null = null;\n const client = new OpenGeniClient({\n baseUrl: \"https://site.opengeni.invalid\",\n toolGatewayMode: options.toolGatewayMode ?? \"target\",\n fetch: (input, init) => transport.fetch(input, init),\n });\n return {\n client,\n ai: createOpenGeniSiteAi(client, SITE_WORKSPACE),\n workspaceId: SITE_WORKSPACE,\n tools: new OpenGeniToolsClient(transport).forWorkspace(\"site-host\"),\n data: siteData.data,\n files: siteData.files,\n sql: siteSql,\n get viewer() {\n if (!viewer) {\n const pending = transport.viewer();\n viewer = pending;\n pending.catch(() => {\n if (viewer === pending) viewer = null;\n });\n }\n return viewer;\n },\n get capabilities() {\n capabilities ??= readSiteCapabilities(transport);\n return capabilities;\n },\n auth: { signIn: () => transport.signIn() },\n close: () => transport.close(),\n };\n}\n\nclass OpenGeniSiteLocalCodemodeTransport implements OpenGeniToolTransport {\n readonly toolGatewayMode: \"catalog\" | \"target\";\n private readonly fetchImpl: typeof globalThis.fetch;\n private readonly basePath: string;\n\n constructor(options: OpenGeniSiteClientOptions) {\n this.toolGatewayMode = options.toolGatewayMode ?? \"target\";\n this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);\n const configured = options.localCodemodePath;\n this.basePath = (\n typeof configured === \"string\" ? configured : OPENGENI_SITE_LOCAL_CODEMODE_PATH\n ).replace(/\\/+$/u, \"\");\n }\n\n close(): void {}\n\n /** Local previews have no published Site, so no Site Data. */\n async siteDataSupported(): Promise<boolean> {\n return false;\n }\n\n /** Local previews run outside any host that knows the viewer. */\n async viewer(): Promise<OpenGeniSiteViewer | null> {\n return null;\n }\n\n async signIn(): Promise<OpenGeniSiteSignInResult> {\n return { started: false };\n }\n\n async fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const request = new Request(input, init);\n const url = new URL(request.url);\n const path = `${url.pathname}${url.search}`;\n siteSessionPath(path, SITE_WORKSPACE, request.method);\n return this.fetchImpl(`${this.basePath}/sdk${path}`, {\n method: request.method,\n headers: request.headers,\n signal: request.signal,\n ...(request.body ? { body: await request.text() } : {}),\n });\n }\n\n async requestJson<T>(\n method: string,\n path: string,\n body?: unknown,\n _query?: Record<string, string>,\n options: { signal?: AbortSignal } = {},\n ): Promise<T> {\n const suffix = localCodemodeSuffix(method, path);\n const response = await this.fetchImpl(`${this.basePath}${suffix}`, {\n method,\n ...(options.signal ? { signal: options.signal } : {}),\n ...(body === undefined\n ? {}\n : {\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n }),\n });\n const value = (await response.json()) as unknown;\n if (response.ok) return value as T;\n const envelope = isRecord(value) && isRecord(value.error) ? value.error : {};\n throw new OpenGeniSiteBridgeError(\n typeof envelope.code === \"string\" ? envelope.code : \"local_codemode_error\",\n typeof envelope.message === \"string\"\n ? envelope.message\n : `Local Site tool request failed with HTTP ${response.status}`,\n envelope.retryable === true,\n envelope.outcomeUnknown === true,\n );\n }\n}\n\nfunction shouldUseLocalCodemode(options: OpenGeniSiteClientOptions): boolean {\n if (options.localCodemodePath === false || options.bootstrapPort) return false;\n if (typeof options.localCodemodePath === \"string\") return true;\n const siteWindow = options.siteWindow ?? globalThis.window;\n return Boolean(siteWindow && siteWindow.parent === siteWindow);\n}\n\nfunction localCodemodeSuffix(method: string, path: string): string {\n if (method === \"GET\" && path.endsWith(\"/tools/catalog\")) return \"/catalog\";\n if (method === \"GET\" && path.endsWith(\"/tools/declarations\")) return \"/declarations\";\n if (method === \"POST\" && path.endsWith(\"/tools/calls\")) return \"/calls\";\n if (method === \"POST\" && path.endsWith(\"/tools/resolve\")) return \"/resolve\";\n if (method === \"POST\" && path.endsWith(\"/tools/invoke\")) return \"/invoke\";\n throw new OpenGeniSiteBridgeError(\"unsupported_request\", \"Unsupported Site tool request\");\n}\n\nexport function isOpenGeniSiteBridgeConnectMessage(\n value: unknown,\n): value is OpenGeniSiteBridgeConnectMessage {\n return (\n isRecord(value) &&\n value.type === OPENGENI_SITE_BRIDGE_CONNECT &&\n value.version === OPENGENI_SITE_BRIDGE_VERSION\n );\n}\n\nexport function isOpenGeniSiteBridgeRequestMessage(\n value: unknown,\n): value is OpenGeniSiteBridgeRequestMessage {\n if (\n !isRecord(value) ||\n value.type !== OPENGENI_SITE_BRIDGE_REQUEST ||\n value.version !== OPENGENI_SITE_BRIDGE_VERSION ||\n typeof value.requestId !== \"string\" ||\n !value.requestId\n ) {\n return false;\n }\n if (\n value.method === \"catalog\" ||\n value.method === \"declarations\" ||\n value.method === OPENGENI_SITE_BRIDGE_VIEWER_METHOD ||\n value.method === OPENGENI_SITE_BRIDGE_SIGN_IN_METHOD\n )\n return true;\n return [\"call\", \"resolve\", \"invoke\"].includes(String(value.method)) && isRecord(value.payload);\n}\n\nexport function isOpenGeniSiteBridgeCancelMessage(\n value: unknown,\n): value is OpenGeniSiteBridgeCancelMessage {\n return (\n isRecord(value) &&\n value.type === OPENGENI_SITE_BRIDGE_CANCEL &&\n value.version === OPENGENI_SITE_BRIDGE_VERSION &&\n typeof value.requestId === \"string\" &&\n Boolean(value.requestId)\n );\n}\n\n/** Strip every host-only field before a call crosses the Site boundary. */\nexport function sanitizeOpenGeniSiteToolCallRequest(\n value: ToolGatewayCallRequest,\n): OpenGeniSiteToolCallRequest {\n return {\n ...(value.operationId === undefined ? {} : { operationId: value.operationId }),\n catalogDigest: value.catalogDigest,\n identity: value.identity,\n arguments: value.arguments,\n };\n}\n\nexport function sanitizeOpenGeniSiteToolInvokeRequest(\n value: ToolGatewayInvokeRequest,\n): ToolGatewayInvokeRequest {\n return {\n target: value.target,\n operationId: value.operationId,\n arguments: value.arguments,\n ...(value.expectedDefinitionDigest === undefined\n ? {}\n : { expectedDefinitionDigest: value.expectedDefinitionDigest }),\n };\n}\n\nclass OpenGeniSiteBridgeTransport implements OpenGeniToolTransport {\n readonly toolGatewayMode: \"catalog\" | \"target\";\n private targetTools = false;\n private siteData = false;\n private viewerSupported = false;\n private readonly options: OpenGeniSiteClientOptions;\n private readonly bootstrap: SiteBridgeBootstrap;\n private port: MessagePort | null = null;\n private connecting: Promise<MessagePort> | null = null;\n private closed = false;\n\n constructor(options: OpenGeniSiteClientOptions) {\n this.toolGatewayMode = options.toolGatewayMode ?? \"target\";\n this.options = options;\n this.bootstrap = createSiteBridgeBootstrap(options);\n }\n\n async fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n return sitePortFetch(await this.connect(), input, init);\n }\n\n async siteDataSupported(): Promise<boolean> {\n await this.connect();\n return this.siteData;\n }\n\n async viewer(): Promise<OpenGeniSiteViewer | null> {\n await this.connect();\n if (!this.viewerSupported) return null;\n const value = await this.request({ method: OPENGENI_SITE_BRIDGE_VIEWER_METHOD }, {});\n if (!isOpenGeniSiteViewer(value))\n throw new OpenGeniSiteBridgeError(\n \"invalid_viewer\",\n \"The Site host returned an invalid viewer\",\n );\n return value;\n }\n\n async signIn(): Promise<OpenGeniSiteSignInResult> {\n await this.connect();\n if (!this.viewerSupported) return { started: false };\n const value = await this.request({ method: OPENGENI_SITE_BRIDGE_SIGN_IN_METHOD }, {});\n return { started: isRecord(value) && value.started === true };\n }\n\n async requestJson<T>(\n method: string,\n path: string,\n body?: unknown,\n _query?: Record<string, string>,\n requestOptions: { signal?: AbortSignal; timeoutMs?: number } = {},\n ): Promise<T> {\n if (method === \"POST\" && (path.endsWith(\"/tools/resolve\") || path.endsWith(\"/tools/invoke\"))) {\n await this.connect();\n if (!this.targetTools)\n throw new OpenGeniSiteBridgeError(\n \"target_tools_unsupported\",\n \"Upgrade the Site host to use targeted tools\",\n );\n if (!isRecord(body)) throw new TypeError(\"Site target payload is required\");\n const request = body as ToolGatewayInvokeRequest;\n return (await this.request(\n path.endsWith(\"/tools/resolve\")\n ? { method: \"resolve\", payload: { target: request.target } }\n : { method: \"invoke\", payload: sanitizeOpenGeniSiteToolInvokeRequest(request) },\n requestOptions,\n )) as T;\n }\n if (method === \"GET\" && path.endsWith(\"/tools/catalog\")) {\n return (await this.request({ method: \"catalog\" }, requestOptions)) as T;\n }\n if (method === \"GET\" && path.endsWith(\"/tools/declarations\")) {\n return (await this.request({ method: \"declarations\" }, requestOptions)) as T;\n }\n if (method === \"POST\" && path.endsWith(\"/tools/calls\")) {\n if (!isRecord(body)) throw new TypeError(\"Site tool call payload is required\");\n return (await this.request(\n {\n method: \"call\",\n payload: sanitizeOpenGeniSiteToolCallRequest(body as ToolGatewayCallRequest),\n },\n requestOptions,\n )) as T;\n }\n throw new OpenGeniSiteBridgeError(\"unsupported_request\", \"Unsupported Site bridge request\");\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.bootstrap.close();\n this.port?.close();\n this.port = null;\n }\n\n private async request(\n request:\n | Omit<\n Extract<OpenGeniSiteBridgeRequestMessage, { method: \"resolve\" }>,\n \"type\" | \"version\" | \"requestId\"\n >\n | Omit<\n Extract<OpenGeniSiteBridgeRequestMessage, { method: \"invoke\" }>,\n \"type\" | \"version\" | \"requestId\"\n >\n | { method: \"catalog\" }\n | { method: \"call\"; payload: OpenGeniSiteToolCallRequest }\n | { method: \"declarations\" }\n | { method: typeof OPENGENI_SITE_BRIDGE_VIEWER_METHOD }\n | { method: typeof OPENGENI_SITE_BRIDGE_SIGN_IN_METHOD },\n options: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<unknown> {\n const port = await this.connect();\n const requestId = crypto.randomUUID();\n const timeoutMs = positiveTimeout(\n options.timeoutMs ?? this.options.requestTimeoutMs ?? 120_000,\n \"requestTimeoutMs\",\n );\n return await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n cancel(port, requestId);\n reject(\n request.method === \"call\" || request.method === \"invoke\"\n ? new OpenGeniSiteBridgeError(\n \"timeout\",\n \"Site tool request timed out after execution may have started\",\n false,\n true,\n )\n : new OpenGeniSiteBridgeError(\"timeout\", \"Site tool request timed out\", true),\n );\n }, timeoutMs);\n const abort = () => {\n cleanup();\n cancel(port, requestId);\n reject(options.signal?.reason ?? new DOMException(\"Request aborted\", \"AbortError\"));\n };\n const onMessage = (event: MessageEvent<unknown>) => {\n const response = event.data;\n if (\n !isRecord(response) ||\n response.type !== OPENGENI_SITE_BRIDGE_RESPONSE ||\n response.version !== OPENGENI_SITE_BRIDGE_VERSION ||\n response.requestId !== requestId ||\n typeof response.ok !== \"boolean\"\n ) {\n return;\n }\n cleanup();\n if (response.ok) {\n resolve(response.value);\n return;\n }\n const error = isRecord(response.error) ? response.error : {};\n reject(\n new OpenGeniSiteBridgeError(\n typeof error.code === \"string\" ? error.code : \"bridge_error\",\n typeof error.message === \"string\" ? error.message : \"Site tool request failed\",\n error.retryable === true,\n error.outcomeUnknown === true,\n ),\n );\n };\n const cleanup = () => {\n clearTimeout(timeout);\n options.signal?.removeEventListener(\"abort\", abort);\n port.removeEventListener(\"message\", onMessage);\n };\n if (options.signal?.aborted) {\n abort();\n return;\n }\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n port.addEventListener(\"message\", onMessage);\n port.postMessage({\n type: OPENGENI_SITE_BRIDGE_REQUEST,\n version: OPENGENI_SITE_BRIDGE_VERSION,\n requestId,\n ...request,\n } satisfies OpenGeniSiteBridgeRequestMessage);\n });\n }\n\n private async connect(): Promise<MessagePort> {\n if (this.closed) throw new OpenGeniSiteBridgeError(\"closed\", \"Site bridge is closed\");\n if (this.port) return this.port;\n if (this.connecting) return await this.connecting;\n const channel = (this.options.createMessageChannel ?? (() => new MessageChannel()))();\n const timeoutMs = positiveTimeout(this.options.connectTimeoutMs ?? 10_000, \"connectTimeoutMs\");\n this.connecting = new Promise<MessagePort>((resolve, reject) => {\n let active = true;\n const timeout = setTimeout(() => {\n cleanup();\n channel.port1.close();\n reject(new OpenGeniSiteBridgeError(\"host_timeout\", \"Opengeni Site host did not respond\"));\n }, timeoutMs);\n const onMessage = (event: MessageEvent<unknown>) => {\n const message = event.data;\n if (\n !isRecord(message) ||\n message.type !== OPENGENI_SITE_BRIDGE_READY ||\n message.version !== OPENGENI_SITE_BRIDGE_VERSION\n ) {\n return;\n }\n cleanup();\n this.targetTools = message.targetTools === 1;\n this.siteData = message.siteData === 1;\n this.viewerSupported = message.viewer === 1;\n this.port = channel.port1;\n resolve(channel.port1);\n };\n const cleanup = () => {\n active = false;\n clearTimeout(timeout);\n channel.port1.removeEventListener(\"message\", onMessage);\n };\n channel.port1.addEventListener(\"message\", onMessage);\n channel.port1.start();\n void this.bootstrap\n .port()\n .then((bootstrapPort) => {\n if (!active) return;\n if (this.closed) throw new OpenGeniSiteBridgeError(\"closed\", \"Site bridge is closed\");\n bootstrapPort.postMessage(\n {\n type: OPENGENI_SITE_BRIDGE_CONNECT,\n version: OPENGENI_SITE_BRIDGE_VERSION,\n } satisfies OpenGeniSiteBridgeConnectMessage,\n [channel.port2],\n );\n })\n .catch((error) => {\n cleanup();\n channel.port1.close();\n reject(error);\n });\n }).finally(() => {\n this.connecting = null;\n });\n return await this.connecting;\n }\n}\n\ntype SiteBridgeBootstrap = {\n port: () => Promise<MessagePort>;\n close: () => void;\n};\n\nfunction createSiteBridgeBootstrap(options: OpenGeniSiteClientOptions): SiteBridgeBootstrap {\n if (options.bootstrapPort) {\n return {\n port: async () => options.bootstrapPort!,\n close: () => options.bootstrapPort?.close(),\n };\n }\n const siteWindow = options.siteWindow ?? globalThis.window;\n const parentWindow = options.parentWindow ?? siteWindow?.parent;\n if (!siteWindow || !parentWindow || parentWindow === siteWindow) {\n return {\n port: async () => {\n throw new OpenGeniSiteBridgeError(\n \"host_unavailable\",\n \"Opengeni Site client must run inside a hosted iframe\",\n );\n },\n close: () => undefined,\n };\n }\n const retainedPort = retainedSiteBridgeBootstrapPort(siteWindow);\n if (retainedPort) {\n return {\n port: async () => retainedPort,\n close: () => undefined,\n };\n }\n let settledPort: MessagePort | null = null;\n let rejectBootstrap: ((reason?: unknown) => void) | null = null;\n const onMessage = (event: MessageEvent<unknown>) => {\n if (\n event.source !== parentWindow ||\n !isOpenGeniSiteBridgeReadyMessage(event.data) ||\n event.ports.length !== 1\n ) {\n return;\n }\n cleanup();\n settledPort = event.ports[0]!;\n settledPort.start();\n retainSiteBridgeBootstrapPort(siteWindow, settledPort);\n resolveBootstrap?.(settledPort);\n };\n let resolveBootstrap: ((port: MessagePort) => void) | null = null;\n const cleanup = () => siteWindow.removeEventListener(\"message\", onMessage as EventListener);\n const port = new Promise<MessagePort>((resolve, reject) => {\n resolveBootstrap = resolve;\n rejectBootstrap = reject;\n siteWindow.addEventListener(\"message\", onMessage as EventListener);\n });\n void port.catch(() => undefined);\n return {\n port: async () => await port,\n close: () => {\n cleanup();\n rejectBootstrap?.(new OpenGeniSiteBridgeError(\"closed\", \"Site bridge is closed\"));\n resolveBootstrap = null;\n rejectBootstrap = null;\n },\n };\n}\n\nfunction retainedSiteBridgeBootstrapPort(\n siteWindow: OpenGeniSiteClientOptions[\"siteWindow\"],\n): MessagePort | null {\n const state = (siteWindow as unknown as Record<string, unknown>)[\n OPENGENI_SITE_BRIDGE_BOOTSTRAP_GLOBAL\n ];\n if (!isRecord(state)) return null;\n const candidate = state.port as Partial<MessagePort> | undefined;\n return candidate &&\n typeof candidate.postMessage === \"function\" &&\n typeof candidate.addEventListener === \"function\" &&\n typeof candidate.start === \"function\"\n ? (candidate as MessagePort)\n : null;\n}\n\nfunction retainSiteBridgeBootstrapPort(\n siteWindow: OpenGeniSiteClientOptions[\"siteWindow\"],\n port: MessagePort,\n): void {\n try {\n Object.defineProperty(siteWindow, OPENGENI_SITE_BRIDGE_BOOTSTRAP_GLOBAL, {\n configurable: true,\n value: { port },\n });\n } catch {\n // The bootstrap event still serves the current client when the embedding\n // window refuses extension; only late construction loses this fallback.\n }\n}\n\nfunction isOpenGeniSiteBridgeReadyMessage(value: unknown): value is OpenGeniSiteBridgeReadyMessage {\n return (\n isRecord(value) &&\n value.type === OPENGENI_SITE_BRIDGE_READY &&\n value.version === OPENGENI_SITE_BRIDGE_VERSION\n );\n}\n\nconst SITE_VIEWER_KINDS: readonly string[] = [\"member\", \"invited\", \"user\", \"guest\"];\n\n/** `GET /site/config` over the Site HTTP channel; null when the host does not serve it. */\nasync function readSiteCapabilities(transport: {\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n siteDataSupported(): Promise<boolean>;\n}): Promise<OpenGeniSiteCapabilities | null> {\n try {\n if (!(await transport.siteDataSupported())) return null;\n const response = await transport.fetch(\n \"https://site.opengeni.invalid/v1/workspaces/site-host/site/config\",\n { method: \"GET\", headers: { accept: \"application/json\" } },\n );\n if (!response.ok) {\n await response.body?.cancel();\n return null;\n }\n const value = ((await response.json()) as { capabilities?: unknown } | null)?.capabilities;\n return isOpenGeniSiteCapabilities(value) ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction isOpenGeniSiteCapabilities(value: unknown): value is OpenGeniSiteCapabilities {\n return (\n isRecord(value) &&\n typeof value.agent === \"boolean\" &&\n typeof value.workspaceTools === \"boolean\" &&\n (value.siteData === \"viewer\" || value.siteData === \"guest\") &&\n Array.isArray(value.sqlQueryAudiences) &&\n value.sqlQueryAudiences.every(\n (audience) => audience === \"everyone\" || audience === \"signed_in\",\n ) &&\n (value.viewAs === null || value.viewAs === \"invited\" || value.viewAs === \"public\")\n );\n}\n\nfunction isOpenGeniSiteViewer(value: unknown): value is OpenGeniSiteViewer {\n return (\n isRecord(value) &&\n SITE_VIEWER_KINDS.includes(String(value.kind)) &&\n typeof value.id === \"string\" &&\n value.id.length > 0 &&\n (value.name === null || typeof value.name === \"string\") &&\n (value.email === null || typeof value.email === \"string\") &&\n typeof value.signedIn === \"boolean\"\n );\n}\n\nfunction cancel(port: MessagePort, requestId: string): void {\n port.postMessage({\n type: OPENGENI_SITE_BRIDGE_CANCEL,\n version: OPENGENI_SITE_BRIDGE_VERSION,\n requestId,\n } satisfies OpenGeniSiteBridgeCancelMessage);\n}\n\nfunction positiveTimeout(value: number, label: string): number {\n if (!Number.isFinite(value) || value <= 0) throw new RangeError(`${label} must be positive`);\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["KNOWN_CODES"]}