@fungi.computer/oyster 0.1.0 → 0.3.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 (292) hide show
  1. package/README.md +376 -72
  2. package/dist/agent-avatars.d.ts +103 -0
  3. package/dist/agent-avatars.js +66 -0
  4. package/dist/agents.d.ts +15 -4
  5. package/dist/agents.js +43 -4
  6. package/dist/app-builds.d.ts +81 -8
  7. package/dist/app-builds.js +210 -60
  8. package/dist/app-storage.d.ts +3 -3
  9. package/dist/approval-capability.d.ts +5 -0
  10. package/dist/approval-capability.js +46 -0
  11. package/dist/approval-home.d.ts +51 -0
  12. package/dist/approval-home.js +226 -0
  13. package/dist/apps/catalog.d.ts +335 -0
  14. package/dist/apps/catalog.js +46 -0
  15. package/dist/apps/gate.d.ts +26 -12
  16. package/dist/apps/gate.js +48 -22
  17. package/dist/apps/index.d.ts +3 -1
  18. package/dist/apps/index.js +3 -1
  19. package/dist/apps/installation.d.ts +147 -66
  20. package/dist/apps/installation.js +193 -86
  21. package/dist/apps/permissions.d.ts +247 -0
  22. package/dist/apps/permissions.js +255 -0
  23. package/dist/boot-capability-route.d.ts +15 -0
  24. package/dist/boot-capability-route.js +196 -0
  25. package/dist/boot-capability.d.ts +103 -0
  26. package/dist/boot-capability.js +141 -0
  27. package/dist/boot-construction.d.ts +12 -0
  28. package/dist/boot-construction.js +175 -0
  29. package/dist/boot-gate.d.ts +267 -0
  30. package/dist/boot-gate.js +236 -0
  31. package/dist/boot-host-script.d.ts +2 -0
  32. package/dist/boot-host-script.js +1 -0
  33. package/dist/boot-mount.d.ts +21 -0
  34. package/dist/boot-mount.js +65 -0
  35. package/dist/browser/boot.d.ts +73 -0
  36. package/dist/browser/boot.js +502 -0
  37. package/dist/browser/browser.d.ts +104 -0
  38. package/dist/browser/browser.js +374 -0
  39. package/dist/browser/capability-source.d.ts +76 -0
  40. package/dist/browser/capability-source.js +338 -0
  41. package/dist/browser/cdp-client.d.ts +56 -0
  42. package/dist/browser/cdp-client.js +184 -0
  43. package/dist/browser/errors.d.ts +79 -0
  44. package/dist/browser/errors.js +32 -0
  45. package/dist/browser/index.d.ts +16 -0
  46. package/dist/browser/index.js +14 -0
  47. package/dist/browser/lease-registry.d.ts +61 -0
  48. package/dist/browser/lease-registry.js +101 -0
  49. package/dist/browser/operations.d.ts +225 -0
  50. package/dist/browser/operations.js +137 -0
  51. package/dist/browser/page.d.ts +25 -0
  52. package/dist/browser/page.js +172 -0
  53. package/dist/browser/quick-reads.d.ts +29 -0
  54. package/dist/browser/quick-reads.js +160 -0
  55. package/dist/browser/sessions.d.ts +52 -0
  56. package/dist/browser/sessions.js +118 -0
  57. package/dist/browser/url-policy.d.ts +18 -0
  58. package/dist/browser/url-policy.js +58 -0
  59. package/dist/build/app-imports.d.ts +12 -0
  60. package/dist/build/app-imports.js +105 -0
  61. package/dist/build/build-policy.d.ts +5 -3
  62. package/dist/build/build-policy.js +5 -3
  63. package/dist/build/candidate-builder.d.ts +1 -1
  64. package/dist/build/candidate-cli.mjs +8428 -337
  65. package/dist/build/local-build.d.ts +2 -0
  66. package/dist/build/local-build.js +28 -6
  67. package/dist/build/snapshot-package-store.d.ts +1 -1
  68. package/dist/build/snapshot-package-store.js +7 -2
  69. package/dist/build/workspace-build.d.ts +92 -5
  70. package/dist/build/workspace-build.js +93 -19
  71. package/dist/build-egress.js +4 -4
  72. package/dist/build.d.ts +1 -1
  73. package/dist/build.js +1 -1
  74. package/dist/catalog-frame.js +1 -1
  75. package/dist/cloudflare.d.ts +13 -3
  76. package/dist/cloudflare.js +106 -8
  77. package/dist/frame-binding-wire-script.js +1 -1
  78. package/dist/frame-binding-wire.d.ts +1 -1
  79. package/dist/frame-binding-wire.js +5 -3
  80. package/dist/git-auth.d.ts +0 -2
  81. package/dist/git-auth.js +0 -2
  82. package/dist/git-journal.js +4 -4
  83. package/dist/git.d.ts +0 -1
  84. package/dist/git.js +0 -2
  85. package/dist/host.d.ts +39 -13
  86. package/dist/host.js +268 -142
  87. package/dist/index.d.ts +26 -15
  88. package/dist/index.js +40 -16
  89. package/dist/install-release-cli.d.ts +2 -0
  90. package/dist/install-release-cli.js +46 -0
  91. package/dist/installation-client.d.ts +43 -0
  92. package/dist/installation-client.js +178 -0
  93. package/dist/installation-execution.d.ts +11 -0
  94. package/dist/installation-execution.js +184 -0
  95. package/dist/installation-operations.d.ts +1437 -0
  96. package/dist/installation-operations.js +664 -0
  97. package/dist/installation-store-generation.d.ts +3 -0
  98. package/dist/installation-store-generation.js +16 -0
  99. package/dist/instance-id.d.ts +10 -0
  100. package/dist/instance-id.js +10 -0
  101. package/dist/instance-refusal.d.ts +11 -0
  102. package/dist/instance-refusal.js +21 -0
  103. package/dist/internal/delivery.js +4 -2
  104. package/dist/internal/host-gate.js +7 -1
  105. package/dist/internal/registry-installations.js +4 -4
  106. package/dist/keys.d.ts +5 -1
  107. package/dist/keys.js +10 -2
  108. package/dist/machine-link/authority.d.ts +89 -0
  109. package/dist/machine-link/authority.js +37 -0
  110. package/dist/machine-link/client.d.ts +66 -0
  111. package/dist/machine-link/client.js +94 -0
  112. package/dist/machine-link/delivery.d.ts +18 -0
  113. package/dist/machine-link/delivery.js +55 -0
  114. package/dist/machine-link/enrollment.d.ts +111 -0
  115. package/dist/machine-link/enrollment.js +286 -0
  116. package/dist/machine-link/fences.d.ts +37 -0
  117. package/dist/machine-link/fences.js +166 -0
  118. package/dist/machine-link/home.d.ts +20 -0
  119. package/dist/machine-link/home.js +24 -0
  120. package/dist/machine-link/host.d.ts +43 -0
  121. package/dist/machine-link/host.js +189 -0
  122. package/dist/machine-link/index.d.ts +15 -0
  123. package/dist/machine-link/index.js +15 -0
  124. package/dist/machine-link/link.d.ts +48 -0
  125. package/dist/machine-link/link.js +223 -0
  126. package/dist/machine-link/presence.d.ts +10 -0
  127. package/dist/machine-link/presence.js +25 -0
  128. package/dist/machine-link/workers.d.ts +6 -0
  129. package/dist/machine-link/workers.js +6 -0
  130. package/dist/mcp-owner.d.ts +2 -2
  131. package/dist/mcp-owner.js +41 -33
  132. package/dist/mcp.d.ts +15 -3
  133. package/dist/mcp.js +146 -25
  134. package/dist/pack.d.ts +14 -3
  135. package/dist/pack.js +44 -19
  136. package/dist/page/app-access.d.ts +7 -0
  137. package/dist/page/app-access.js +75 -0
  138. package/dist/page/boot-host.js +57 -0
  139. package/dist/page/capabilities.d.ts +3 -3
  140. package/dist/page/capabilities.js +16 -12
  141. package/dist/page/computer-handles.d.ts +3 -3
  142. package/dist/page/computer-target.d.ts +3 -0
  143. package/dist/page/computer-target.js +9 -0
  144. package/dist/page/mount.d.ts +23 -7
  145. package/dist/page/mount.js +152 -16
  146. package/dist/page-assets.d.ts +22 -0
  147. package/dist/page-assets.js +28 -0
  148. package/dist/page-script.d.ts +3 -0
  149. package/dist/page-script.js +5 -4
  150. package/dist/release.d.ts +13 -6
  151. package/dist/release.js +10 -7
  152. package/dist/root-data.d.ts +16 -6
  153. package/dist/root-data.js +2 -2
  154. package/dist/source/index.d.ts +1 -1
  155. package/dist/source/team-source.d.ts +20 -8
  156. package/dist/source/team-source.js +39 -10
  157. package/dist/source/template-seed.d.ts +2 -2
  158. package/dist/standalone/agent-mail.d.ts +24 -0
  159. package/dist/standalone/agent-mail.js +62 -0
  160. package/dist/standalone/agent-store.d.ts +9 -0
  161. package/dist/standalone/agent-store.js +30 -0
  162. package/dist/standalone/agents.d.ts +78 -12
  163. package/dist/standalone/agents.js +470 -59
  164. package/dist/standalone/app-builds-binding.d.ts +20 -2
  165. package/dist/standalone/app-builds-binding.js +151 -27
  166. package/dist/standalone/app-set.d.ts +5 -2
  167. package/dist/standalone/app-set.js +174 -143
  168. package/dist/standalone/browser.d.ts +11 -0
  169. package/dist/standalone/browser.js +72 -0
  170. package/dist/standalone/builds.d.ts +13 -4
  171. package/dist/standalone/builds.js +28 -44
  172. package/dist/standalone/computer-egress.d.ts +2 -0
  173. package/dist/standalone/computer-egress.js +13 -4
  174. package/dist/standalone/computer-fleet.d.ts +43 -0
  175. package/dist/standalone/computer-fleet.js +200 -0
  176. package/dist/standalone/computer.d.ts +44 -9
  177. package/dist/standalone/computer.js +132 -25
  178. package/dist/standalone/install-apps-cli.js +43 -6
  179. package/dist/standalone/instance.d.ts +2 -2
  180. package/dist/standalone/instance.js +8 -11
  181. package/dist/standalone/machine-link.d.ts +354 -0
  182. package/dist/standalone/machine-link.js +368 -0
  183. package/dist/standalone/media.d.ts +2 -2
  184. package/dist/standalone/media.js +19 -16
  185. package/dist/standalone/preview.d.ts +2 -2
  186. package/dist/standalone/preview.js +39 -12
  187. package/dist/standalone/registry.d.ts +149 -9
  188. package/dist/standalone/registry.js +299 -8
  189. package/dist/standalone/worker.d.ts +19 -5
  190. package/dist/standalone/worker.js +90 -54
  191. package/dist/standalone/workflow-binding.d.ts +28 -32
  192. package/dist/standalone/workflow-binding.js +20 -20
  193. package/dist/standalone/workflow-control.d.ts +4 -0
  194. package/dist/standalone/workflow-control.js +40 -0
  195. package/dist/standalone/workflow-events.d.ts +2 -2
  196. package/dist/standalone/workflow-events.js +9 -10
  197. package/dist/standalone/workflow-git-capture.js +4 -3
  198. package/dist/standalone/workflow-host.d.ts +177 -152
  199. package/dist/standalone/workflow-host.js +137 -30
  200. package/dist/standalone/workflow-node-capture.js +11 -4
  201. package/dist/standalone/workflow-schedules.d.ts +5 -2
  202. package/dist/standalone/workflow-schedules.js +9 -10
  203. package/dist/standalone/workflow-trigger-host.d.ts +88 -6
  204. package/dist/standalone/workflow-trigger-host.js +2 -2
  205. package/dist/standalone/workflow-webhooks.d.ts +22 -0
  206. package/dist/standalone/workflow-webhooks.js +39 -0
  207. package/dist/standalone/workflows.d.ts +203 -50
  208. package/dist/standalone/workflows.js +198 -39
  209. package/dist/storage-frame.d.ts +6 -6
  210. package/dist/testing/capabilities.js +14 -3
  211. package/dist/testing/installation.js +26 -2
  212. package/dist/testing/worker.js +1 -1
  213. package/dist/testing/workers-runtime.d.ts +8 -2
  214. package/dist/testing/workers-runtime.js +20 -2
  215. package/dist/webhook-abuse.d.ts +25 -0
  216. package/dist/webhook-abuse.js +54 -0
  217. package/dist/webhook-custody.d.ts +144 -0
  218. package/dist/webhook-custody.js +222 -0
  219. package/dist/webhook-ingress.d.ts +36 -0
  220. package/dist/webhook-ingress.js +146 -0
  221. package/dist/webhooks.d.ts +111 -0
  222. package/dist/webhooks.js +189 -0
  223. package/dist/workers-git.d.ts +12 -17
  224. package/dist/workers-git.js +60 -55
  225. package/dist/workers.d.ts +224 -13
  226. package/dist/workers.js +351 -51
  227. package/dist/workflow-agent-authority.d.ts +8 -0
  228. package/dist/workflow-agent-authority.js +42 -0
  229. package/dist/workflows.d.ts +66 -0
  230. package/dist/workflows.js +97 -0
  231. package/docs/api/README.md +63 -37
  232. package/docs/api/agents.md +17 -0
  233. package/docs/api/app-storage.md +1 -1
  234. package/docs/api/apps.md +1394 -543
  235. package/docs/api/browser/boot.md +132 -0
  236. package/docs/api/browser.md +1440 -0
  237. package/docs/api/build-contract.md +38 -25
  238. package/docs/api/build.md +263 -84
  239. package/docs/api/cloudflare.md +93 -7
  240. package/docs/api/git.md +3 -13
  241. package/docs/api/host.md +944 -118
  242. package/docs/api/index.md +320 -18
  243. package/docs/api/keys.md +24 -1
  244. package/docs/api/mcp.md +59 -12
  245. package/docs/api/modules.md +33 -40
  246. package/docs/api/pack.md +57 -8
  247. package/docs/api/page/mount.md +92 -4
  248. package/docs/api/workers-git.md +103 -24
  249. package/docs/api/workers.md +1581 -244
  250. package/docs/site/agent-quickstart.mdx +28 -14
  251. package/examples/standalone/worker.ts +3 -1
  252. package/examples/standalone/wrangler.jsonc +2 -0
  253. package/package.json +73 -69
  254. package/dist/installation-consent.d.ts +0 -79
  255. package/dist/installation-consent.js +0 -82
  256. package/dist/shell/app-directory.d.ts +0 -542
  257. package/dist/shell/app-directory.js +0 -199
  258. package/dist/shell/browser-actions.d.ts +0 -7
  259. package/dist/shell/browser-actions.js +0 -56
  260. package/dist/shell/command-host.d.ts +0 -112
  261. package/dist/shell/command-host.js +0 -502
  262. package/dist/shell/commands.d.ts +0 -25
  263. package/dist/shell/commands.js +0 -78
  264. package/dist/shell/index.d.ts +0 -8
  265. package/dist/shell/index.js +0 -8
  266. package/dist/shell/keys.d.ts +0 -41
  267. package/dist/shell/keys.js +0 -134
  268. package/dist/shell/shell-module.d.ts +0 -55
  269. package/dist/shell/shell-module.js +0 -86
  270. package/dist/shell/window-manager.d.ts +0 -124
  271. package/dist/shell/window-manager.js +0 -711
  272. package/dist/shell/workbench-contract.d.ts +0 -68
  273. package/dist/shell/workbench-directory.d.ts +0 -332
  274. package/dist/shell/workbench-directory.js +0 -35
  275. package/dist/shell/workbench-host-types.d.ts +0 -96
  276. package/dist/shell/workbench-host-types.js +0 -1
  277. package/dist/shell/workbench-host.d.ts +0 -34
  278. package/dist/shell/workbench-host.js +0 -347
  279. package/dist/shell/workbench-model.d.ts +0 -192
  280. package/dist/shell/workbench-model.js +0 -53
  281. package/dist/shell/workbench.d.ts +0 -4
  282. package/dist/shell/workbench.js +0 -2
  283. package/docs/api/shell/app-directory.md +0 -599
  284. package/docs/api/shell/command-host.md +0 -224
  285. package/docs/api/shell/commands.md +0 -197
  286. package/docs/api/shell/keys.md +0 -183
  287. package/docs/api/shell/shell-module.md +0 -204
  288. package/docs/api/shell/window-manager.md +0 -267
  289. package/docs/api/shell/workbench-directory.md +0 -119
  290. package/docs/api/shell/workbench.md +0 -205
  291. package/docs/api/shell.md +0 -1915
  292. /package/dist/{shell/workbench-contract.js → page/boot-host.d.ts} +0 -0
@@ -45,11 +45,11 @@ new OysterMcpOwner<Env>(
45
45
 
46
46
  ###### Parameters
47
47
 
48
- | Parameter | Type |
49
- | ------------ | ------------------------------------------------------ |
50
- | `ctx` | `DurableObjectState` |
51
- | `env` | `Env` |
52
- | `createHost` | (`env`, `scope`) => [`OysterHost`](host.md#oysterhost) |
48
+ | Parameter | Type |
49
+ | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
50
+ | `ctx` | `DurableObjectState` |
51
+ | `env` | `Env` |
52
+ | `createHost` | (`env`, `scope`) => \| `Readonly`\<\{ `approvals?`: `Readonly`\<\{ `submit`: `Promise`\< \| \{ `kind`: `"pending_approval"`; `recordId`: `string`; `description`: \{ `title`: ...; `inputBytes`: ...; `inputSha256`: ...; \}; \} \| `ApprovalApplyResult`\>; \}\>; `workflows?`: (`principal`) => `Promise`\< \| `Readonly`\<\{ `status`: `Promise`\<...\>; `cancel`: `Promise`\<...\>; \}\> \| `null`\>; `auth`: [`OysterAuth`](host.md#oysterauth); `backgroundOriginKey?`: () => `Promise`\<`CryptoKey`\>; `artifacts`: [`ArtifactStore`](host.md#artifactstore); `installations`: [`InstallationStore`](host.md#installationstore); `instances`: [`InstanceDirectory`](host.md#instancedirectory); `bootUi`: (`release`) => `Promise`\< \| \{ `kind`: `"passed"`; \} \| \{ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{ `failedPredicate`: ... \| ... \| ... \| ... \| ...; `errorName?`: ... \| ... \| ... \| ... \| ... \| ... \| ... \| ...; `finalUrlPath`: `string`; `consoleErrors`: ...[]; `pageErrors`: ...[]; `failedRequests`: ...[]; `droppedCount`: `number`; \}; \} \| \{ `kind`: `"not_checked"`; `code`: \| `"boot_runner_unavailable"` \| `"boot_browser_binding_missing"` \| `"boot_clone_unavailable"` \| `"boot_timeout"` \| `"boot_cleanup_failed"` \| `"ui_check_not_run_on_host"`; \}\>; `computerId?`: `string`; `computer?`: (`principal`) => \| `Readonly`\<\{ `getCapabilities`: (`signal`) => `Promise`\<...\>; `call`: (`capabilityId`, `input`, `context`) => `Promise`\<...\>; \}\> \| `Promise`\< \| `Readonly`\<\{ `getCapabilities`: ...; `call`: ...; \}\> \| `null`\> \| `null`; `appToolPolicy?`: (`actor`) => \| \{ `level`: `"read"` \| `"write"`; `revision`: `string`; `grantedBy`: `string`; \} \| `Promise`\< \| \{ `level`: ... \| ...; `revision`: `string`; `grantedBy`: `string`; \} \| `null`\> \| `null`; `keys?`: `Readonly`\<\{ `live`: `Promise`\< \| `Readonly`\<\{ `keyId`: ...; `owner`: ...; `grantVersion`: ...; `grants`: ...; \}\> \| `null`\>; \}\>; `guestLimits?`: `Partial`\<`Readonly`\<\{ `cpuMs`: `number`; `subRequests`: `number`; \}\>\>; `mcp?`: `Readonly`\<\{ `handleRequest`: (`request`) => `Promise`\<`Response`\>; `close?`: () => `Promise`\<`void`\>; \}\>; `git?`: `Readonly`\<\{ `writerOf`: `Extract`\<`GitWriter`, \{ `kind`: `"actor"`; \}\>; `workflowPass?`: `Promise`\< \| `Readonly`\<\{ `kind`: ...; `actor`: ...; `role?`: ...; `workflow?`: ...; \}\> \| `null`\>; `buildPass?`: `Promise`\< \| `Readonly`\<\{ `kind`: ...; `actor`: ...; `role?`: ...; `workflow?`: ...; \}\> \| `null`\>; `git`: `Promise`\<`Readonly`\<\{ `push`: `Promise`\<...\>; `read`: `Promise`\<...\>; `binding`: `GitBinding`; \}\>\>; \}\>; `ownerRoutes?`: `Hono`\<[`OysterEnv`](host.md#oysterenv), `BlankSchema`, `"/"`\>; `capabilities?`: readonly `Readonly`\<`object` & `object`\>[]; `workbench?`: `Readonly`\<\{ `directory`: `Promise`\<`Readonly`\<\{ `apps`: readonly ...[]; `roles`: [`OysterRootRoles`](root-data.md#oysterrootroles); `computer?`: ... \| ...; \}\>\>; `storage`: `Pick`\<`AppStorageWire`, `"read"` \| `"write"` \| `"reset"`\> & `Readonly`\<\{ `events`: `Promise`\<...\>; \}\>; \}\>; `homeInstallationId?`: `string`; `pageScript?`: `string`; `pageAssets?`: () => `Promise`\<\{ `pageScript`: `string`; `publicHomeScript`: `string`; `fontStyles`: `string`; `loginFontStyles`: `string`; `shellStyles`: `string`; `grantConsentScript`: `string`; \}\>; `title?`: `string`; \}\> \| `Promise`\<`Readonly`\<\{ `approvals?`: `Readonly`\<\{ `submit`: `Promise`\< \| \{ `kind`: ...; `recordId`: ...; `description`: ...; \} \| `ApprovalApplyResult`\>; \}\>; `workflows?`: (`principal`) => `Promise`\< \| `Readonly`\<\{ `status`: ...; `cancel`: ...; \}\> \| `null`\>; `auth`: [`OysterAuth`](host.md#oysterauth); `backgroundOriginKey?`: () => `Promise`\<`CryptoKey`\>; `artifacts`: [`ArtifactStore`](host.md#artifactstore); `installations`: [`InstallationStore`](host.md#installationstore); `instances`: [`InstanceDirectory`](host.md#instancedirectory); `bootUi`: (`release`) => `Promise`\< \| \{ `kind`: `"passed"`; \} \| \{ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{ `failedPredicate`: ...; `errorName?`: ...; `finalUrlPath`: ...; `consoleErrors`: ...; `pageErrors`: ...; `failedRequests`: ...; `droppedCount`: ...; \}; \} \| \{ `kind`: `"not_checked"`; `code`: \| `"boot_runner_unavailable"` \| `"boot_browser_binding_missing"` \| `"boot_clone_unavailable"` \| `"boot_timeout"` \| `"boot_cleanup_failed"` \| `"ui_check_not_run_on_host"`; \}\>; `computerId?`: `string`; `computer?`: (`principal`) => \| `Readonly`\<\{ `getCapabilities`: (`signal`) => ...; `call`: (`capabilityId`, `input`, `context`) => ...; \}\> \| `Promise`\<`Readonly`\<...\> \| `null`\> \| `null`; `appToolPolicy?`: (`actor`) => \| \{ `level`: `"read"` \| `"write"`; `revision`: `string`; `grantedBy`: `string`; \} \| `Promise`\< \| \{ `level`: ...; `revision`: ...; `grantedBy`: ...; \} \| `null`\> \| `null`; `keys?`: `Readonly`\<\{ `live`: `Promise`\<`Readonly`\<...\> \| `null`\>; \}\>; `guestLimits?`: `Partial`\<`Readonly`\<\{ `cpuMs`: `number`; `subRequests`: `number`; \}\>\>; `mcp?`: `Readonly`\<\{ `handleRequest`: (`request`) => `Promise`\<`Response`\>; `close?`: () => `Promise`\<...\>; \}\>; `git?`: `Readonly`\<\{ `writerOf`: `Extract`\<`GitWriter`, \{ `kind`: `"actor"`; \}\>; `workflowPass?`: `Promise`\<`Readonly`\<...\> \| `null`\>; `buildPass?`: `Promise`\<`Readonly`\<...\> \| `null`\>; `git`: `Promise`\<`Readonly`\<\{ `push`: ...; `read`: ...; `binding`: ...; \}\>\>; \}\>; `ownerRoutes?`: `Hono`\<[`OysterEnv`](host.md#oysterenv), `BlankSchema`, `"/"`\>; `capabilities?`: readonly `Readonly`\<`object` & `object`\>[]; `workbench?`: `Readonly`\<\{ `directory`: `Promise`\<`Readonly`\<\{ `apps`: ...; `roles`: ...; `computer?`: ...; \}\>\>; `storage`: `Pick`\<`AppStorageWire`, ... \| ... \| ...\> & `Readonly`\<\{ `events`: ...; \}\>; \}\>; `homeInstallationId?`: `string`; `pageScript?`: `string`; `pageAssets?`: () => `Promise`\<\{ `pageScript`: `string`; `publicHomeScript`: `string`; `fontStyles`: `string`; `loginFontStyles`: `string`; `shellStyles`: `string`; `grantConsentScript`: `string`; \}\>; `title?`: `string`; \}\>\> |
53
53
 
54
54
  ###### Returns
55
55
 
@@ -90,35 +90,918 @@ The installation registry: one SQLite-backed Durable Object per Oyster.
90
90
 
91
91
  #### Extends
92
92
 
93
- - `DurableObject`\<[`OysterWorkerEnv`](#oysterworkerenv)\>
93
+ - `DurableObject`\<`Env`\>
94
+
95
+ #### Type Parameters
96
+
97
+ | Type Parameter | Default type |
98
+ | ----------------------------------------------------- | ------------------------------------- |
99
+ | `Env` _extends_ [`OysterWorkerEnv`](#oysterworkerenv) | [`OysterWorkerEnv`](#oysterworkerenv) |
94
100
 
95
101
  #### Constructors
96
102
 
97
103
  ##### Constructor
98
104
 
99
105
  ```ts
100
- new OysterRegistry(ctx, env): OysterRegistry;
106
+ new OysterRegistry<Env>(ctx, env): OysterRegistry<Env>;
101
107
  ```
102
108
 
103
109
  ###### Parameters
104
110
 
105
- | Parameter | Type |
106
- | --------- | ------------------------------------- |
107
- | `ctx` | `DurableObjectState` |
108
- | `env` | [`OysterWorkerEnv`](#oysterworkerenv) |
111
+ | Parameter | Type |
112
+ | --------- | -------------------- |
113
+ | `ctx` | `DurableObjectState` |
114
+ | `env` | `Env` |
109
115
 
110
116
  ###### Returns
111
117
 
112
- [`OysterRegistry`](#oysterregistry)
118
+ [`OysterRegistry`](#oysterregistry)\<`Env`\>
113
119
 
114
120
  ###### Overrides
115
121
 
116
122
  ```ts
117
- DurableObject<OysterWorkerEnv>.constructor
123
+ DurableObject<Env>.constructor
118
124
  ```
119
125
 
120
126
  #### Methods
121
127
 
128
+ ##### approvalSubmit()
129
+
130
+ ```ts
131
+ approvalSubmit(pin, call): Promise<
132
+ | {
133
+ kind: "pending_approval";
134
+ recordId: string;
135
+ description: {
136
+ title: string;
137
+ inputBytes: number;
138
+ inputSha256: string;
139
+ };
140
+ }
141
+ | ApprovalApplyResult>;
142
+ ```
143
+
144
+ Trusted host RPC; an operation input cannot select actor, namespace or tenant.
145
+
146
+ ###### Parameters
147
+
148
+ | Parameter | Type |
149
+ | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
150
+ | `pin` | `Readonly`\<\{ `tenantId`: `string`; `origin`: `string`; \}\> |
151
+ | `call` | \{ `actor`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `installationId`: `string`; `sessionId`: `string` \| `null`; `operation`: `string`; `access`: `"write"` \| `"external"`; `authorityFence`: `string`; `idempotencyKey`: `string`; `input`: `JSONType`; \} |
152
+ | `call.actor` | \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \} |
153
+ | `call.installationId` | `string` |
154
+ | `call.sessionId` | `string` \| `null` |
155
+ | `call.operation` | `string` |
156
+ | `call.access` | `"write"` \| `"external"` |
157
+ | `call.authorityFence` | `string` |
158
+ | `call.idempotencyKey` | `string` |
159
+ | `call.input` | `JSONType` |
160
+
161
+ ###### Returns
162
+
163
+ `Promise`\< \| \{ `kind`: `"pending_approval"`; `recordId`: `string`;
164
+ `description`: \{ `title`: `string`; `inputBytes`: `number`; `inputSha256`:
165
+ `string`; \}; \} \| `ApprovalApplyResult`\>
166
+
167
+ ##### approvalList()
168
+
169
+ ```ts
170
+ approvalList(
171
+ pin,
172
+ actor,
173
+ input
174
+ ): Promise<Readonly<{
175
+ items: readonly object[];
176
+ nextCursor: string | null;
177
+ }>>;
178
+ ```
179
+
180
+ Read a bounded page for the current member of the pinned native home.
181
+
182
+ ###### Parameters
183
+
184
+ | Parameter | Type |
185
+ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
186
+ | `pin` | `Readonly`\<\{ `tenantId`: `string`; `origin`: `string`; \}\> |
187
+ | `actor` | \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \} |
188
+ | `input` | \{ `state?`: \| `"pending"` \| `"expired"` \| `"denied"` \| `"applied"` \| `"requested"` \| `"approved"` \| `"claimed"` \| `"outcome_unknown"`; `cursor?`: `string`; `limit?`: `number`; \} |
189
+ | `input.state?` | \| `"pending"` \| `"expired"` \| `"denied"` \| `"applied"` \| `"requested"` \| `"approved"` \| `"claimed"` \| `"outcome_unknown"` |
190
+ | `input.cursor?` | `string` |
191
+ | `input.limit?` | `number` |
192
+
193
+ ###### Returns
194
+
195
+ `Promise`\<`Readonly`\<\{ `items`: readonly `object`[]; `nextCursor`: `string`
196
+ \| `null`; \}\>\>
197
+
198
+ ##### approvalGet()
199
+
200
+ ```ts
201
+ approvalGet(
202
+ pin,
203
+ actor,
204
+ input
205
+ ): Promise<
206
+ | {
207
+ record: {
208
+ recordId: string;
209
+ requester: {
210
+ principalId: string;
211
+ agentId: string | null;
212
+ sessionId: string | null;
213
+ displayName: string;
214
+ };
215
+ module: string;
216
+ operation: string;
217
+ access: "write" | "external";
218
+ description: {
219
+ title: string;
220
+ inputBytes: number;
221
+ inputSha256: string;
222
+ };
223
+ evidence?: readonly object[];
224
+ authorityFence: string;
225
+ reversibility: "reversible" | "irreversible-external";
226
+ state: | "pending"
227
+ | "expired"
228
+ | "denied"
229
+ | "applied"
230
+ | "requested"
231
+ | "approved"
232
+ | "claimed"
233
+ | "outcome_unknown";
234
+ by: | {
235
+ kind: "human";
236
+ memberId: string;
237
+ }
238
+ | {
239
+ kind: "policy";
240
+ }
241
+ | null;
242
+ reason: | "pending"
243
+ | "expired"
244
+ | "not-found"
245
+ | "not-eligible"
246
+ | "already-answered"
247
+ | "stale-revision"
248
+ | "declined"
249
+ | "fenced"
250
+ | "not-granted"
251
+ | "read-only"
252
+ | "in-flight"
253
+ | "outcome-unknown"
254
+ | "identity-conflict"
255
+ | null;
256
+ requestedAt: number;
257
+ expiresAt: number;
258
+ updatedAt: number;
259
+ revision: number;
260
+ };
261
+ canAnswer: boolean;
262
+ canSetAutoApprove: boolean;
263
+ }
264
+ | null>;
265
+ ```
266
+
267
+ Read one member-scoped view; the native home resolves membership again.
268
+
269
+ ###### Parameters
270
+
271
+ | Parameter | Type |
272
+ | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
273
+ | `pin` | `Readonly`\<\{ `tenantId`: `string`; `origin`: `string`; \}\> |
274
+ | `actor` | \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \} |
275
+ | `input` | `Readonly`\<\{ `recordId`: `string`; \}\> |
276
+
277
+ ###### Returns
278
+
279
+ `Promise`\< \| \{ `record`: \{ `recordId`: `string`; `requester`: \{
280
+ `principalId`: `string`; `agentId`: `string` \| `null`; `sessionId`: `string` \|
281
+ `null`; `displayName`: `string`; \}; `module`: `string`; `operation`: `string`;
282
+ `access`: `"write"` \| `"external"`; `description`: \{ `title`: `string`;
283
+ `inputBytes`: `number`; `inputSha256`: `string`; \}; `evidence?`: readonly
284
+ `object`[]; `authorityFence`: `string`; `reversibility`: `"reversible"` \|
285
+ `"irreversible-external"`; `state`: \| `"pending"` \| `"expired"` \| `"denied"`
286
+ \| `"applied"` \| `"requested"` \| `"approved"` \| `"claimed"` \|
287
+ `"outcome_unknown"`; `by`: \| \{ `kind`: `"human"`; `memberId`: `string`; \} \|
288
+ \{ `kind`: `"policy"`; \} \| `null`; `reason`: \| `"pending"` \| `"expired"` \|
289
+ `"not-found"` \| `"not-eligible"` \| `"already-answered"` \| `"stale-revision"`
290
+ \| `"declined"` \| `"fenced"` \| `"not-granted"` \| `"read-only"` \|
291
+ `"in-flight"` \| `"outcome-unknown"` \| `"identity-conflict"` \| `null`;
292
+ `requestedAt`: `number`; `expiresAt`: `number`; `updatedAt`: `number`;
293
+ `revision`: `number`; \}; `canAnswer`: `boolean`; `canSetAutoApprove`:
294
+ `boolean`; \} \| `null`\>
295
+
296
+ ##### approvalAnswer()
297
+
298
+ ```ts
299
+ approvalAnswer(
300
+ pin,
301
+ actor,
302
+ input
303
+ ): Promise<
304
+ | Readonly<{
305
+ kind: "answered";
306
+ view: {
307
+ record: {
308
+ recordId: string;
309
+ requester: {
310
+ principalId: string;
311
+ agentId: string | null;
312
+ sessionId: string | null;
313
+ displayName: string;
314
+ };
315
+ module: string;
316
+ operation: string;
317
+ access: "write" | "external";
318
+ description: {
319
+ title: string;
320
+ inputBytes: number;
321
+ inputSha256: string;
322
+ };
323
+ evidence?: readonly object[];
324
+ authorityFence: string;
325
+ reversibility: "reversible" | "irreversible-external";
326
+ state: | "pending"
327
+ | "expired"
328
+ | "denied"
329
+ | "applied"
330
+ | "requested"
331
+ | "approved"
332
+ | "claimed"
333
+ | "outcome_unknown";
334
+ by: | {
335
+ kind: "human";
336
+ memberId: string;
337
+ }
338
+ | {
339
+ kind: "policy";
340
+ }
341
+ | null;
342
+ reason: | "pending"
343
+ | "expired"
344
+ | "not-found"
345
+ | "not-eligible"
346
+ | "already-answered"
347
+ | "stale-revision"
348
+ | "declined"
349
+ | "fenced"
350
+ | "not-granted"
351
+ | "read-only"
352
+ | "in-flight"
353
+ | "outcome-unknown"
354
+ | "identity-conflict"
355
+ | null;
356
+ requestedAt: number;
357
+ expiresAt: number;
358
+ updatedAt: number;
359
+ revision: number;
360
+ };
361
+ canAnswer: boolean;
362
+ canSetAutoApprove: boolean;
363
+ };
364
+ }>
365
+ | Readonly<{
366
+ kind: "refused";
367
+ reason: | "pending"
368
+ | "expired"
369
+ | "not-found"
370
+ | "not-eligible"
371
+ | "already-answered"
372
+ | "stale-revision"
373
+ | "declined"
374
+ | "fenced"
375
+ | "not-granted"
376
+ | "read-only"
377
+ | "in-flight"
378
+ | "outcome-unknown"
379
+ | "identity-conflict";
380
+ }>>;
381
+ ```
382
+
383
+ Persist an eligible answer and attempt its native decision work once.
384
+
385
+ ###### Parameters
386
+
387
+ | Parameter | Type |
388
+ | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
389
+ | `pin` | `Readonly`\<\{ `tenantId`: `string`; `origin`: `string`; \}\> |
390
+ | `actor` | \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \} |
391
+ | `input` | \{ `recordId`: `string`; `decision`: `"approve"` \| `"deny"`; `expectedRevision`: `number`; \} |
392
+ | `input.recordId` | `string` |
393
+ | `input.decision` | `"approve"` \| `"deny"` |
394
+ | `input.expectedRevision` | `number` |
395
+
396
+ ###### Returns
397
+
398
+ `Promise`\< \| `Readonly`\<\{ `kind`: `"answered"`; `view`: \{ `record`: \{
399
+ `recordId`: `string`; `requester`: \{ `principalId`: `string`; `agentId`:
400
+ `string` \| `null`; `sessionId`: `string` \| `null`; `displayName`: `string`;
401
+ \}; `module`: `string`; `operation`: `string`; `access`: `"write"` \|
402
+ `"external"`; `description`: \{ `title`: `string`; `inputBytes`: `number`;
403
+ `inputSha256`: `string`; \}; `evidence?`: readonly `object`[]; `authorityFence`:
404
+ `string`; `reversibility`: `"reversible"` \| `"irreversible-external"`; `state`:
405
+ \| `"pending"` \| `"expired"` \| `"denied"` \| `"applied"` \| `"requested"` \|
406
+ `"approved"` \| `"claimed"` \| `"outcome_unknown"`; `by`: \| \{ `kind`:
407
+ `"human"`; `memberId`: `string`; \} \| \{ `kind`: `"policy"`; \} \| `null`;
408
+ `reason`: \| `"pending"` \| `"expired"` \| `"not-found"` \| `"not-eligible"` \|
409
+ `"already-answered"` \| `"stale-revision"` \| `"declined"` \| `"fenced"` \|
410
+ `"not-granted"` \| `"read-only"` \| `"in-flight"` \| `"outcome-unknown"` \|
411
+ `"identity-conflict"` \| `null`; `requestedAt`: `number`; `expiresAt`: `number`;
412
+ `updatedAt`: `number`; `revision`: `number`; \}; `canAnswer`: `boolean`;
413
+ `canSetAutoApprove`: `boolean`; \}; \}\> \| `Readonly`\<\{ `kind`: `"refused"`;
414
+ `reason`: \| `"pending"` \| `"expired"` \| `"not-found"` \| `"not-eligible"` \|
415
+ `"already-answered"` \| `"stale-revision"` \| `"declined"` \| `"fenced"` \|
416
+ `"not-granted"` \| `"read-only"` \| `"in-flight"` \| `"outcome-unknown"` \|
417
+ `"identity-conflict"`; \}\>\>
418
+
419
+ ##### approvalSetAutoApprove()
420
+
421
+ ```ts
422
+ approvalSetAutoApprove(
423
+ pin,
424
+ actor,
425
+ input
426
+ ): Promise<
427
+ | Readonly<{
428
+ kind: "refused";
429
+ reason: | "pending"
430
+ | "expired"
431
+ | "not-found"
432
+ | "not-eligible"
433
+ | "already-answered"
434
+ | "stale-revision"
435
+ | "declined"
436
+ | "fenced"
437
+ | "not-granted"
438
+ | "read-only"
439
+ | "in-flight"
440
+ | "outcome-unknown"
441
+ | "identity-conflict";
442
+ }>
443
+ | Readonly<{
444
+ kind: "updated";
445
+ rule: {
446
+ scope: {
447
+ agentId: string | null;
448
+ };
449
+ family: {
450
+ module: string | null;
451
+ access: "write" | "external";
452
+ };
453
+ enabled: boolean;
454
+ };
455
+ }>>;
456
+ ```
457
+
458
+ Policy never grants operation authority; only the live Oyster owner may change
459
+ it.
460
+
461
+ ###### Parameters
462
+
463
+ | Parameter | Type |
464
+ | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
465
+ | `pin` | `Readonly`\<\{ `tenantId`: `string`; `origin`: `string`; \}\> |
466
+ | `actor` | \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \} |
467
+ | `input` | \{ `scope`: \{ `agentId`: `string` \| `null`; \}; `family`: \{ `module`: `string` \| `null`; `access`: `"write"` \| `"external"`; \}; `enabled`: `boolean`; \} |
468
+ | `input.scope` | \{ `agentId`: `string` \| `null`; \} |
469
+ | `input.scope.agentId` | `string` \| `null` |
470
+ | `input.family` | \{ `module`: `string` \| `null`; `access`: `"write"` \| `"external"`; \} |
471
+ | `input.family.module` | `string` \| `null` |
472
+ | `input.family.access` | `"write"` \| `"external"` |
473
+ | `input.enabled` | `boolean` |
474
+
475
+ ###### Returns
476
+
477
+ `Promise`\< \| `Readonly`\<\{ `kind`: `"refused"`; `reason`: \| `"pending"` \|
478
+ `"expired"` \| `"not-found"` \| `"not-eligible"` \| `"already-answered"` \|
479
+ `"stale-revision"` \| `"declined"` \| `"fenced"` \| `"not-granted"` \|
480
+ `"read-only"` \| `"in-flight"` \| `"outcome-unknown"` \| `"identity-conflict"`;
481
+ \}\> \| `Readonly`\<\{ `kind`: `"updated"`; `rule`: \{ `scope`: \{ `agentId`:
482
+ `string` \| `null`; \}; `family`: \{ `module`: `string` \| `null`; `access`:
483
+ `"write"` \| `"external"`; \}; `enabled`: `boolean`; \}; \}\>\>
484
+
485
+ ##### installationOperation()
486
+
487
+ ```ts
488
+ installationOperation(input): Promise<
489
+ | {
490
+ kind: "refused";
491
+ code: | "unavailable"
492
+ | "stale_authority"
493
+ | "request_conflict"
494
+ | "needs_consent"
495
+ | "stored_operation_invalid";
496
+ }
497
+ | {
498
+ kind: "operation";
499
+ operation: | {
500
+ requestId: string;
501
+ requestedInstallationId: string;
502
+ installationId: string;
503
+ release: {
504
+ releaseId: ReleaseId;
505
+ appId: AppId;
506
+ artifact: {
507
+ artifactRef: ArtifactRef;
508
+ artifactDigest: Sha256Digest;
509
+ provenance: {
510
+ sourceRevision: SourceRevision;
511
+ sourceTreeDigest: Sha256Digest;
512
+ buildRecipeDigest: Sha256Digest;
513
+ };
514
+ };
515
+ };
516
+ state: "refused";
517
+ status: number;
518
+ code: string;
519
+ }
520
+ | {
521
+ requestId: string;
522
+ requestedInstallationId: string;
523
+ installationId: string;
524
+ release: {
525
+ releaseId: ReleaseId;
526
+ appId: AppId;
527
+ artifact: {
528
+ artifactRef: ArtifactRef;
529
+ artifactDigest: Sha256Digest;
530
+ provenance: {
531
+ sourceRevision: SourceRevision;
532
+ sourceTreeDigest: Sha256Digest;
533
+ buildRecipeDigest: Sha256Digest;
534
+ };
535
+ };
536
+ };
537
+ state: "unconfirmed";
538
+ outcome: "cancelled" | "outcome_unknown" | "interrupted";
539
+ }
540
+ | {
541
+ requestId: string;
542
+ requestedInstallationId: string;
543
+ installationId: string;
544
+ release: {
545
+ releaseId: ReleaseId;
546
+ appId: AppId;
547
+ artifact: {
548
+ artifactRef: ArtifactRef;
549
+ artifactDigest: Sha256Digest;
550
+ provenance: {
551
+ sourceRevision: SourceRevision;
552
+ sourceTreeDigest: Sha256Digest;
553
+ buildRecipeDigest: Sha256Digest;
554
+ };
555
+ };
556
+ };
557
+ state: "succeeded";
558
+ reference: {
559
+ generation: string;
560
+ instanceId: InstanceId;
561
+ authorityVersion: number;
562
+ status: "enabled" | "disabled" | "deleted";
563
+ };
564
+ creation: "fresh" | "replacement" | "reminted";
565
+ uiCheck: | {
566
+ kind: "passed";
567
+ }
568
+ | {
569
+ kind: "failed";
570
+ code: "ui_mount_failed";
571
+ diagnostics?: {
572
+ failedPredicate: | "unexpected_candidate_request"
573
+ | "response_status"
574
+ | "request_failed"
575
+ | "page_error"
576
+ | "candidate_not_mounted";
577
+ errorName?: | "TypeError"
578
+ | "RangeError"
579
+ | "SyntaxError"
580
+ | "AbortError"
581
+ | "TimeoutError"
582
+ | "Other"
583
+ | "Error";
584
+ finalUrlPath: string;
585
+ consoleErrors: string[];
586
+ pageErrors: string[];
587
+ failedRequests: object[];
588
+ droppedCount: number;
589
+ };
590
+ }
591
+ | {
592
+ kind: "not_checked";
593
+ code: | "boot_runner_unavailable"
594
+ | "boot_browser_binding_missing"
595
+ | "boot_clone_unavailable"
596
+ | "boot_timeout"
597
+ | "boot_cleanup_failed"
598
+ | "ui_check_not_run_on_host";
599
+ }
600
+ | null;
601
+ installation: | {
602
+ installationId: string;
603
+ instanceId: InstanceId | null;
604
+ appId: AppId;
605
+ release: {
606
+ releaseId: ReleaseId;
607
+ appId: AppId;
608
+ artifact: {
609
+ artifactRef: ArtifactRef;
610
+ artifactDigest: Sha256Digest;
611
+ provenance: {
612
+ sourceRevision: SourceRevision;
613
+ sourceTreeDigest: Sha256Digest;
614
+ buildRecipeDigest: Sha256Digest;
615
+ };
616
+ };
617
+ };
618
+ releasePin: "pinned" | "floating";
619
+ authority: {
620
+ authorityVersion: number;
621
+ declaredOperationsDigest: Sha256Digest;
622
+ approvedGrants: readonly Readonly<{
623
+ capability: ...;
624
+ capabilityApproved: ...;
625
+ operations: ...;
626
+ resources: ...;
627
+ }>[];
628
+ approval: | Readonly<{
629
+ by: ...;
630
+ at: ...;
631
+ authorityVersion: ...;
632
+ }>
633
+ | null;
634
+ };
635
+ status: "enabled" | "disabled" | "deleted";
636
+ visibility: "private" | "public";
637
+ approvedAnonymousMethods: readonly Readonly<{
638
+ name: string;
639
+ digest: Sha256Digest;
640
+ }>[];
641
+ anonymousApproval: | Readonly<{
642
+ by: ... | ... | ...;
643
+ at: number;
644
+ authorityVersion: number;
645
+ }>
646
+ | null;
647
+ }
648
+ | null;
649
+ }
650
+ | {
651
+ requestId: string;
652
+ requestedInstallationId: string;
653
+ installationId: string;
654
+ release: {
655
+ releaseId: ReleaseId;
656
+ appId: AppId;
657
+ artifact: {
658
+ artifactRef: ArtifactRef;
659
+ artifactDigest: Sha256Digest;
660
+ provenance: {
661
+ sourceRevision: SourceRevision;
662
+ sourceTreeDigest: Sha256Digest;
663
+ buildRecipeDigest: Sha256Digest;
664
+ };
665
+ };
666
+ };
667
+ state: "pending";
668
+ }
669
+ | null;
670
+ }
671
+ | {
672
+ kind: "command";
673
+ command: | {
674
+ admission: {
675
+ requestId: string;
676
+ installationId: string;
677
+ release: {
678
+ releaseId: ReleaseId;
679
+ appId: AppId;
680
+ artifact: {
681
+ artifactRef: ArtifactRef;
682
+ artifactDigest: Sha256Digest;
683
+ provenance: {
684
+ sourceRevision: SourceRevision;
685
+ sourceTreeDigest: Sha256Digest;
686
+ buildRecipeDigest: Sha256Digest;
687
+ };
688
+ };
689
+ };
690
+ actor: | {
691
+ kind: "member";
692
+ memberId: string;
693
+ }
694
+ | {
695
+ kind: "agent";
696
+ agentId: string;
697
+ }
698
+ | {
699
+ kind: "team-key";
700
+ keyId: string;
701
+ };
702
+ intent: "install-or-select" | "install-or-remint" | "create-only";
703
+ origin: "workflow" | "owner-direct";
704
+ };
705
+ scope: {
706
+ tenantId: string & Brand<"OysterTenantId">;
707
+ origin: string;
708
+ };
709
+ installationId: string;
710
+ instanceId: InstanceId;
711
+ generation: string;
712
+ baseline: | {
713
+ installationId: string;
714
+ instanceId: InstanceId | null;
715
+ appId: AppId;
716
+ release: {
717
+ releaseId: ReleaseId;
718
+ appId: AppId;
719
+ artifact: {
720
+ artifactRef: ArtifactRef;
721
+ artifactDigest: Sha256Digest;
722
+ provenance: {
723
+ sourceRevision: SourceRevision;
724
+ sourceTreeDigest: Sha256Digest;
725
+ buildRecipeDigest: Sha256Digest;
726
+ };
727
+ };
728
+ };
729
+ releasePin: "pinned" | "floating";
730
+ authority: {
731
+ authorityVersion: number;
732
+ declaredOperationsDigest: Sha256Digest;
733
+ approvedGrants: readonly Readonly<{
734
+ capability: ...;
735
+ capabilityApproved: ...;
736
+ operations: ...;
737
+ resources: ...;
738
+ }>[];
739
+ approval: | Readonly<{
740
+ by: ...;
741
+ at: ...;
742
+ authorityVersion: ...;
743
+ }>
744
+ | null;
745
+ };
746
+ status: "enabled" | "disabled" | "deleted";
747
+ visibility: "private" | "public";
748
+ approvedAnonymousMethods: readonly Readonly<{
749
+ name: string;
750
+ digest: Sha256Digest;
751
+ }>[];
752
+ anonymousApproval: | Readonly<{
753
+ by: ... | ... | ...;
754
+ at: number;
755
+ authorityVersion: number;
756
+ }>
757
+ | null;
758
+ }
759
+ | null;
760
+ acceptedAt: number;
761
+ creation: "fresh" | "replacement" | "reminted";
762
+ plan: | {
763
+ installation: {
764
+ installationId: string;
765
+ instanceId: InstanceId | null;
766
+ appId: AppId;
767
+ release: {
768
+ releaseId: ReleaseId;
769
+ appId: AppId;
770
+ artifact: {
771
+ artifactRef: ArtifactRef;
772
+ artifactDigest: Sha256Digest;
773
+ provenance: {
774
+ sourceRevision: ...;
775
+ sourceTreeDigest: ...;
776
+ buildRecipeDigest: ...;
777
+ };
778
+ };
779
+ };
780
+ releasePin: "pinned" | "floating";
781
+ authority: {
782
+ authorityVersion: number;
783
+ declaredOperationsDigest: Sha256Digest;
784
+ approvedGrants: readonly Readonly<...>[];
785
+ approval: Readonly<...> | null;
786
+ };
787
+ status: "enabled" | "disabled" | "deleted";
788
+ visibility: "private" | "public";
789
+ approvedAnonymousMethods: readonly Readonly<{
790
+ name: ...;
791
+ digest: ...;
792
+ }>[];
793
+ anonymousApproval: | Readonly<{
794
+ by: ...;
795
+ at: ...;
796
+ authorityVersion: ...;
797
+ }>
798
+ | null;
799
+ };
800
+ hasBackend: boolean;
801
+ prepared: boolean;
802
+ uiCheck?: | {
803
+ kind: "passed";
804
+ }
805
+ | {
806
+ kind: "failed";
807
+ code: "ui_mount_failed";
808
+ diagnostics?: {
809
+ failedPredicate: ...;
810
+ errorName?: ...;
811
+ finalUrlPath: ...;
812
+ consoleErrors: ...;
813
+ pageErrors: ...;
814
+ failedRequests: ...;
815
+ droppedCount: ...;
816
+ };
817
+ }
818
+ | {
819
+ kind: "not_checked";
820
+ code: | "boot_runner_unavailable"
821
+ | "boot_browser_binding_missing"
822
+ | "boot_clone_unavailable"
823
+ | "boot_timeout"
824
+ | "boot_cleanup_failed"
825
+ | "ui_check_not_run_on_host";
826
+ }
827
+ | null;
828
+ }
829
+ | null;
830
+ operation: {
831
+ requestId: string;
832
+ requestedInstallationId: string;
833
+ installationId: string;
834
+ release: {
835
+ releaseId: ReleaseId;
836
+ appId: AppId;
837
+ artifact: {
838
+ artifactRef: ArtifactRef;
839
+ artifactDigest: Sha256Digest;
840
+ provenance: {
841
+ sourceRevision: SourceRevision;
842
+ sourceTreeDigest: Sha256Digest;
843
+ buildRecipeDigest: Sha256Digest;
844
+ };
845
+ };
846
+ };
847
+ state: "pending";
848
+ };
849
+ }
850
+ | null;
851
+ }
852
+ | {
853
+ kind: "commit";
854
+ commit: | {
855
+ ok: true;
856
+ }
857
+ | {
858
+ ok: false;
859
+ code: "stale_authority";
860
+ };
861
+ }>;
862
+ ```
863
+
864
+ The installation owner's RPC: admit, read, load, plan or commit one retained
865
+ command for the caller's tenant scope.
866
+
867
+ ###### Parameters
868
+
869
+ | Parameter | Type |
870
+ | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
871
+ | `input` | \| \{ `action`: `"admit"`; `scope`: \{ `tenantId`: `string` & `Brand`\<`"OysterTenantId"`\>; `origin`: `string`; \}; `input`: \{ `requestId`: `string`; `installationId`: `string`; `release`: \{ `releaseId`: `ReleaseId`; `appId`: `AppId`; `artifact`: \{ `artifactRef`: `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`: \{ `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`; `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `actor`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `intent`: `"install-or-select"` \| `"install-or-remint"` \| `"create-only"`; `origin`: `"workflow"` \| `"owner-direct"`; \}; \} \| \{ `action`: `"read"`; `scope`: \{ `tenantId`: `string` & `Brand`\<`"OysterTenantId"`\>; `origin`: `string`; \}; `requestId`: `string`; `installationId`: `string`; \} \| \{ `action`: `"load"`; `scope`: \{ `tenantId`: `string` & `Brand`\<`"OysterTenantId"`\>; `origin`: `string`; \}; `requestId`: `string`; \} \| \{ `action`: `"plan"`; `scope`: \{ `tenantId`: `string` & `Brand`\<`"OysterTenantId"`\>; `origin`: `string`; \}; `requestId`: `string`; `installation`: \{ `installationId`: `string`; `instanceId`: [`InstanceId`](index.md#instanceid) \| `null`; `appId`: `AppId`; `release`: \{ `releaseId`: `ReleaseId`; `appId`: `AppId`; `artifact`: \{ `artifactRef`: `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`: \{ `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`; `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `releasePin`: `"pinned"` \| `"floating"`; `authority`: \{ `authorityVersion`: `number`; `declaredOperationsDigest`: `Sha256Digest`; `approvedGrants`: readonly `Readonly`\<\{ `capability`: \| `"approvals"` \| `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \| `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \| `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \| `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \| `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \| `"marketplace.purchase"` \| `"workflow.run"` \| `"workflow.publish"` \| `"workflow.arm"` \| `"world"` \| `"channels.read"` \| `"channels.personal.manage"`; `capabilityApproved`: `true`; `operations`: readonly `string`[]; `resources`: \| `"tenant-scope"` \| readonly `Readonly`\<\{ `kind`: ...; `id`: ...; \}\>[]; \}\>[]; `approval`: \| `Readonly`\<\{ `by`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`: `number`; `authorityVersion`: `number`; \}\> \| `null`; \}; `status`: `"enabled"` \| `"disabled"` \| `"deleted"`; `visibility`: `"private"` \| `"public"`; `approvedAnonymousMethods`: readonly `Readonly`\<\{ `name`: `string`; `digest`: `Sha256Digest`; \}\>[]; `anonymousApproval`: \| `Readonly`\<\{ `by`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`: `number`; `authorityVersion`: `number`; \}\> \| `null`; \}; `hasBackend`: `boolean`; \} \| \{ `action`: `"commit"`; `scope`: \{ `tenantId`: `string` & `Brand`\<`"OysterTenantId"`\>; `origin`: `string`; \}; `requestId`: `string`; `uiCheck`: \| \{ `kind`: `"passed"`; \} \| \{ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{ `failedPredicate`: \| `"unexpected_candidate_request"` \| `"response_status"` \| `"request_failed"` \| `"page_error"` \| `"candidate_not_mounted"`; `errorName?`: \| `"TypeError"` \| `"RangeError"` \| `"SyntaxError"` \| `"AbortError"` \| `"TimeoutError"` \| `"Other"` \| `"Error"`; `finalUrlPath`: `string`; `consoleErrors`: `string`[]; `pageErrors`: `string`[]; `failedRequests`: `object`[]; `droppedCount`: `number`; \}; \} \| \{ `kind`: `"not_checked"`; `code`: \| `"boot_runner_unavailable"` \| `"boot_browser_binding_missing"` \| `"boot_clone_unavailable"` \| `"boot_timeout"` \| `"boot_cleanup_failed"` \| `"ui_check_not_run_on_host"`; \} \| `null`; \} |
872
+
873
+ ###### Returns
874
+
875
+ `Promise`\< \| \{ `kind`: `"refused"`; `code`: \| `"unavailable"` \|
876
+ `"stale_authority"` \| `"request_conflict"` \| `"needs_consent"` \|
877
+ `"stored_operation_invalid"`; \} \| \{ `kind`: `"operation"`; `operation`: \| \{
878
+ `requestId`: `string`; `requestedInstallationId`: `string`; `installationId`:
879
+ `string`; `release`: \{ `releaseId`: `ReleaseId`; `appId`: `AppId`; `artifact`:
880
+ \{ `artifactRef`: `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`:
881
+ \{ `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
882
+ `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `state`: `"refused"`; `status`:
883
+ `number`; `code`: `string`; \} \| \{ `requestId`: `string`;
884
+ `requestedInstallationId`: `string`; `installationId`: `string`; `release`: \{
885
+ `releaseId`: `ReleaseId`; `appId`: `AppId`; `artifact`: \{ `artifactRef`:
886
+ `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`: \{
887
+ `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
888
+ `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `state`: `"unconfirmed"`;
889
+ `outcome`: `"cancelled"` \| `"outcome_unknown"` \| `"interrupted"`; \} \| \{
890
+ `requestId`: `string`; `requestedInstallationId`: `string`; `installationId`:
891
+ `string`; `release`: \{ `releaseId`: `ReleaseId`; `appId`: `AppId`; `artifact`:
892
+ \{ `artifactRef`: `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`:
893
+ \{ `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
894
+ `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `state`: `"succeeded"`;
895
+ `reference`: \{ `generation`: `string`; `instanceId`:
896
+ [`InstanceId`](index.md#instanceid); `authorityVersion`: `number`; `status`:
897
+ `"enabled"` \| `"disabled"` \| `"deleted"`; \}; `creation`: `"fresh"` \|
898
+ `"replacement"` \| `"reminted"`; `uiCheck`: \| \{ `kind`: `"passed"`; \} \| \{
899
+ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{
900
+ `failedPredicate`: \| `"unexpected_candidate_request"` \| `"response_status"` \|
901
+ `"request_failed"` \| `"page_error"` \| `"candidate_not_mounted"`; `errorName?`:
902
+ \| `"TypeError"` \| `"RangeError"` \| `"SyntaxError"` \| `"AbortError"` \|
903
+ `"TimeoutError"` \| `"Other"` \| `"Error"`; `finalUrlPath`: `string`;
904
+ `consoleErrors`: `string`[]; `pageErrors`: `string`[]; `failedRequests`:
905
+ `object`[]; `droppedCount`: `number`; \}; \} \| \{ `kind`: `"not_checked"`;
906
+ `code`: \| `"boot_runner_unavailable"` \| `"boot_browser_binding_missing"` \|
907
+ `"boot_clone_unavailable"` \| `"boot_timeout"` \| `"boot_cleanup_failed"` \|
908
+ `"ui_check_not_run_on_host"`; \} \| `null`; `installation`: \| \{
909
+ `installationId`: `string`; `instanceId`: [`InstanceId`](index.md#instanceid) \|
910
+ `null`; `appId`: `AppId`; `release`: \{ `releaseId`: `ReleaseId`; `appId`:
911
+ `AppId`; `artifact`: \{ `artifactRef`: `ArtifactRef`; `artifactDigest`:
912
+ `Sha256Digest`; `provenance`: \{ `sourceRevision`: `SourceRevision`;
913
+ `sourceTreeDigest`: `Sha256Digest`; `buildRecipeDigest`: `Sha256Digest`; \}; \};
914
+ \}; `releasePin`: `"pinned"` \| `"floating"`; `authority`: \{
915
+ `authorityVersion`: `number`; `declaredOperationsDigest`: `Sha256Digest`;
916
+ `approvedGrants`: readonly `Readonly`\<\{ `capability`: ...;
917
+ `capabilityApproved`: ...; `operations`: ...; `resources`: ...; \}\>[];
918
+ `approval`: \| `Readonly`\<\{ `by`: ...; `at`: ...; `authorityVersion`: ...;
919
+ \}\> \| `null`; \}; `status`: `"enabled"` \| `"disabled"` \| `"deleted"`;
920
+ `visibility`: `"private"` \| `"public"`; `approvedAnonymousMethods`: readonly
921
+ `Readonly`\<\{ `name`: `string`; `digest`: `Sha256Digest`; \}\>[];
922
+ `anonymousApproval`: \| `Readonly`\<\{ `by`: ... \| ... \| ...; `at`: `number`;
923
+ `authorityVersion`: `number`; \}\> \| `null`; \} \| `null`; \} \| \{
924
+ `requestId`: `string`; `requestedInstallationId`: `string`; `installationId`:
925
+ `string`; `release`: \{ `releaseId`: `ReleaseId`; `appId`: `AppId`; `artifact`:
926
+ \{ `artifactRef`: `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`:
927
+ \{ `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
928
+ `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `state`: `"pending"`; \} \|
929
+ `null`; \} \| \{ `kind`: `"command"`; `command`: \| \{ `admission`: \{
930
+ `requestId`: `string`; `installationId`: `string`; `release`: \{ `releaseId`:
931
+ `ReleaseId`; `appId`: `AppId`; `artifact`: \{ `artifactRef`: `ArtifactRef`;
932
+ `artifactDigest`: `Sha256Digest`; `provenance`: \{ `sourceRevision`:
933
+ `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`; `buildRecipeDigest`:
934
+ `Sha256Digest`; \}; \}; \}; `actor`: \| \{ `kind`: `"member"`; `memberId`:
935
+ `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`:
936
+ `"team-key"`; `keyId`: `string`; \}; `intent`: `"install-or-select"` \|
937
+ `"install-or-remint"` \| `"create-only"`; `origin`: `"workflow"` \|
938
+ `"owner-direct"`; \}; `scope`: \{ `tenantId`: `string` &
939
+ `Brand`\<`"OysterTenantId"`\>; `origin`: `string`; \}; `installationId`:
940
+ `string`; `instanceId`: [`InstanceId`](index.md#instanceid); `generation`:
941
+ `string`; `baseline`: \| \{ `installationId`: `string`; `instanceId`:
942
+ [`InstanceId`](index.md#instanceid) \| `null`; `appId`: `AppId`; `release`: \{
943
+ `releaseId`: `ReleaseId`; `appId`: `AppId`; `artifact`: \{ `artifactRef`:
944
+ `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`: \{
945
+ `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
946
+ `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `releasePin`: `"pinned"` \|
947
+ `"floating"`; `authority`: \{ `authorityVersion`: `number`;
948
+ `declaredOperationsDigest`: `Sha256Digest`; `approvedGrants`: readonly
949
+ `Readonly`\<\{ `capability`: ...; `capabilityApproved`: ...; `operations`: ...;
950
+ `resources`: ...; \}\>[]; `approval`: \| `Readonly`\<\{ `by`: ...; `at`: ...;
951
+ `authorityVersion`: ...; \}\> \| `null`; \}; `status`: `"enabled"` \|
952
+ `"disabled"` \| `"deleted"`; `visibility`: `"private"` \| `"public"`;
953
+ `approvedAnonymousMethods`: readonly `Readonly`\<\{ `name`: `string`; `digest`:
954
+ `Sha256Digest`; \}\>[]; `anonymousApproval`: \| `Readonly`\<\{ `by`: ... \| ...
955
+ \| ...; `at`: `number`; `authorityVersion`: `number`; \}\> \| `null`; \} \|
956
+ `null`; `acceptedAt`: `number`; `creation`: `"fresh"` \| `"replacement"` \|
957
+ `"reminted"`; `plan`: \| \{ `installation`: \{ `installationId`: `string`;
958
+ `instanceId`: [`InstanceId`](index.md#instanceid) \| `null`; `appId`: `AppId`;
959
+ `release`: \{ `releaseId`: `ReleaseId`; `appId`: `AppId`; `artifact`: \{
960
+ `artifactRef`: `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`: \{
961
+ `sourceRevision`: ...; `sourceTreeDigest`: ...; `buildRecipeDigest`: ...; \};
962
+ \}; \}; `releasePin`: `"pinned"` \| `"floating"`; `authority`: \{
963
+ `authorityVersion`: `number`; `declaredOperationsDigest`: `Sha256Digest`;
964
+ `approvedGrants`: readonly `Readonly`\<...\>[]; `approval`: `Readonly`\<...\> \|
965
+ `null`; \}; `status`: `"enabled"` \| `"disabled"` \| `"deleted"`; `visibility`:
966
+ `"private"` \| `"public"`; `approvedAnonymousMethods`: readonly `Readonly`\<\{
967
+ `name`: ...; `digest`: ...; \}\>[]; `anonymousApproval`: \| `Readonly`\<\{ `by`:
968
+ ...; `at`: ...; `authorityVersion`: ...; \}\> \| `null`; \}; `hasBackend`:
969
+ `boolean`; `prepared`: `boolean`; `uiCheck?`: \| \{ `kind`: `"passed"`; \} \| \{
970
+ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{
971
+ `failedPredicate`: ...; `errorName?`: ...; `finalUrlPath`: ...; `consoleErrors`:
972
+ ...; `pageErrors`: ...; `failedRequests`: ...; `droppedCount`: ...; \}; \} \| \{
973
+ `kind`: `"not_checked"`; `code`: \| `"boot_runner_unavailable"` \|
974
+ `"boot_browser_binding_missing"` \| `"boot_clone_unavailable"` \|
975
+ `"boot_timeout"` \| `"boot_cleanup_failed"` \| `"ui_check_not_run_on_host"`; \}
976
+ \| `null`; \} \| `null`; `operation`: \{ `requestId`: `string`;
977
+ `requestedInstallationId`: `string`; `installationId`: `string`; `release`: \{
978
+ `releaseId`: `ReleaseId`; `appId`: `AppId`; `artifact`: \{ `artifactRef`:
979
+ `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`: \{
980
+ `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
981
+ `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `state`: `"pending"`; \}; \} \|
982
+ `null`; \} \| \{ `kind`: `"commit"`; `commit`: \| \{ `ok`: `true`; \} \| \{
983
+ `ok`: `false`; `code`: `"stale_authority"`; \}; \}\>
984
+
985
+ ##### alarm()
986
+
987
+ ```ts
988
+ alarm(): Promise<void>;
989
+ ```
990
+
991
+ One Registry wake serves both owners: installation work, then the native
992
+ approval home. Each re-arms only an earlier wake, so neither postpones the
993
+ other, and one owner's failure never skips the other's quantum.
994
+
995
+ ###### Returns
996
+
997
+ `Promise`\<`void`\>
998
+
999
+ ###### Overrides
1000
+
1001
+ ```ts
1002
+ DurableObject.alarm;
1003
+ ```
1004
+
122
1005
  ##### directory()
123
1006
 
124
1007
  ```ts
@@ -150,7 +1033,7 @@ storageRead(
150
1033
  key
151
1034
  ): Promise<AppStorageResult<{
152
1035
  value: Json;
153
- source: "team" | "member" | "none";
1036
+ source: "member" | "team" | "none";
154
1037
  team: | {
155
1038
  value: Json;
156
1039
  revision: number;
@@ -177,9 +1060,9 @@ Read one key for the authenticated root owner, under fresh App admission.
177
1060
 
178
1061
  ###### Returns
179
1062
 
180
- `Promise`\<`AppStorageResult`\<\{ `value`: `Json`; `source`: `"team"` \|
181
- `"member"` \| `"none"`; `team`: \| \{ `value`: `Json`; `revision`: `number`; \}
182
- \| `null`; `member`: \| \{ `value`: `Json`; `revision`: `number`; \} \| `null`;
1063
+ `Promise`\<`AppStorageResult`\<\{ `value`: `Json`; `source`: `"member"` \|
1064
+ `"team"` \| `"none"`; `team`: \| \{ `value`: `Json`; `revision`: `number`; \} \|
1065
+ `null`; `member`: \| \{ `value`: `Json`; `revision`: `number`; \} \| `null`;
183
1066
  `canWriteTeam`: `boolean`; \}\>\>
184
1067
 
185
1068
  ##### storageWrite()
@@ -202,10 +1085,10 @@ Write one declared key for the authenticated root owner.
202
1085
  | ---------------- | ------------------------------------------------------------------------------------------------------- |
203
1086
  | `installationId` | `string` |
204
1087
  | `ownerId` | `string` |
205
- | `input` | \{ `value`: `Json`; `key`: `string`; `scope`: `"team"` \| `"member"`; `basedOn`: `number` \| `null`; \} |
1088
+ | `input` | \{ `value`: `Json`; `key`: `string`; `scope`: `"member"` \| `"team"`; `basedOn`: `number` \| `null`; \} |
206
1089
  | `input.value` | `Json` |
207
1090
  | `input.key` | `string` |
208
- | `input.scope` | `"team"` \| `"member"` |
1091
+ | `input.scope` | `"member"` \| `"team"` |
209
1092
  | `input.basedOn` | `number` \| `null` |
210
1093
 
211
1094
  ###### Returns
@@ -232,9 +1115,9 @@ Reset one declared layer for the authenticated root owner.
232
1115
  | ---------------- | -------------------------------------------------------------------------------------- |
233
1116
  | `installationId` | `string` |
234
1117
  | `ownerId` | `string` |
235
- | `input` | \{ `key`: `string`; `scope`: `"team"` \| `"member"`; `basedOn`: `number` \| `null`; \} |
1118
+ | `input` | \{ `key`: `string`; `scope`: `"member"` \| `"team"`; `basedOn`: `number` \| `null`; \} |
236
1119
  | `input.key` | `string` |
237
- | `input.scope` | `"team"` \| `"member"` |
1120
+ | `input.scope` | `"member"` \| `"team"` |
238
1121
  | `input.basedOn` | `number` \| `null` |
239
1122
 
240
1123
  ###### Returns
@@ -326,63 +1209,67 @@ list(): Readonly<{
326
1209
  };
327
1210
  };
328
1211
  releasePin: "pinned" | "floating";
329
- authorityVersion: number;
1212
+ authority: {
1213
+ authorityVersion: number;
1214
+ declaredOperationsDigest: Sha256Digest;
1215
+ approvedGrants: readonly Readonly<{
1216
+ capability: | "approvals"
1217
+ | "agent.list"
1218
+ | "agent.manage"
1219
+ | "agent.rename"
1220
+ | "agent.avatar"
1221
+ | "agent.toolPolicy"
1222
+ | "agent.read"
1223
+ | "agent.send"
1224
+ | "computer.list"
1225
+ | "computer.readFile"
1226
+ | "computer.writeFile"
1227
+ | "computer.execute"
1228
+ | "llm.generation"
1229
+ | "media.generation"
1230
+ | "games:servers"
1231
+ | "git.repository"
1232
+ | "apps.open"
1233
+ | "apps.call"
1234
+ | "app.storage"
1235
+ | "app.events.emit"
1236
+ | "team.workbenchHost"
1237
+ | "marketplace.browse"
1238
+ | "marketplace.purchase"
1239
+ | "workflow.run"
1240
+ | "workflow.publish"
1241
+ | "workflow.arm"
1242
+ | "world"
1243
+ | "channels.read"
1244
+ | "channels.personal.manage";
1245
+ capabilityApproved: true;
1246
+ operations: readonly string[];
1247
+ resources: | "tenant-scope"
1248
+ | readonly Readonly<{
1249
+ kind: ...;
1250
+ id: ...;
1251
+ }>[];
1252
+ }>[];
1253
+ approval: | Readonly<{
1254
+ by: | {
1255
+ kind: "member";
1256
+ memberId: string;
1257
+ }
1258
+ | {
1259
+ kind: "agent";
1260
+ agentId: string;
1261
+ }
1262
+ | {
1263
+ kind: "team-key";
1264
+ keyId: string;
1265
+ };
1266
+ at: number;
1267
+ authorityVersion: number;
1268
+ }>
1269
+ | null;
1270
+ };
330
1271
  status: "enabled" | "disabled" | "deleted";
331
1272
  visibility: "private" | "public";
332
- declaredOperationsDigest: Sha256Digest;
333
- approvedGrants: readonly Readonly<{
334
- capability: | "agent.list"
335
- | "agent.manage"
336
- | "agent.rename"
337
- | "agent.toolPolicy"
338
- | "agent.read"
339
- | "agent.send"
340
- | "computer.list"
341
- | "computer.readFile"
342
- | "computer.writeFile"
343
- | "computer.execute"
344
- | "llm.generation"
345
- | "media.generation"
346
- | "games:servers"
347
- | "git.repository"
348
- | "apps.open"
349
- | "apps.call"
350
- | "app.storage"
351
- | "app.events.emit"
352
- | "team.workbenchHost"
353
- | "marketplace.browse"
354
- | "marketplace.purchase"
355
- | "workflow.run"
356
- | "workflow.publish"
357
- | "workflow.arm"
358
- | "world"
359
- | "channels.read"
360
- | "channels.personal.manage";
361
- capabilityApproved: true;
362
- operations: readonly string[];
363
- resources: | "tenant-scope"
364
- | readonly Readonly<{
365
- kind: string;
366
- id: string;
367
- }>[];
368
- }>[];
369
- approval: | Readonly<{
370
- by: | {
371
- kind: "member";
372
- memberId: string;
373
- }
374
- | {
375
- kind: "agent";
376
- agentId: string;
377
- }
378
- | {
379
- kind: "team-key";
380
- keyId: string;
381
- };
382
- at: number;
383
- authorityVersion: number;
384
- }>
385
- | null;
386
1273
  approvedAnonymousMethods: readonly Readonly<{
387
1274
  name: string;
388
1275
  digest: Sha256Digest;
@@ -417,28 +1304,30 @@ Every installation record.
417
1304
  `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`: \{
418
1305
  `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
419
1306
  `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `releasePin`: `"pinned"` \|
420
- `"floating"`; `authorityVersion`: `number`; `status`: `"enabled"` \|
421
- `"disabled"` \| `"deleted"`; `visibility`: `"private"` \| `"public"`;
1307
+ `"floating"`; `authority`: \{ `authorityVersion`: `number`;
422
1308
  `declaredOperationsDigest`: `Sha256Digest`; `approvedGrants`: readonly
423
- `Readonly`\<\{ `capability`: \| `"agent.list"` \| `"agent.manage"` \|
424
- `"agent.rename"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \|
425
- `"computer.list"` \| `"computer.readFile"` \| `"computer.writeFile"` \|
426
- `"computer.execute"` \| `"llm.generation"` \| `"media.generation"` \|
427
- `"games:servers"` \| `"git.repository"` \| `"apps.open"` \| `"apps.call"` \|
428
- `"app.storage"` \| `"app.events.emit"` \| `"team.workbenchHost"` \|
429
- `"marketplace.browse"` \| `"marketplace.purchase"` \| `"workflow.run"` \|
430
- `"workflow.publish"` \| `"workflow.arm"` \| `"world"` \| `"channels.read"` \|
1309
+ `Readonly`\<\{ `capability`: \| `"approvals"` \| `"agent.list"` \|
1310
+ `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"`
1311
+ \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \|
1312
+ `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \|
1313
+ `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \|
1314
+ `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \|
1315
+ `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \|
1316
+ `"marketplace.purchase"` \| `"workflow.run"` \| `"workflow.publish"` \|
1317
+ `"workflow.arm"` \| `"world"` \| `"channels.read"` \|
431
1318
  `"channels.personal.manage"`; `capabilityApproved`: `true`; `operations`:
432
1319
  readonly `string`[]; `resources`: \| `"tenant-scope"` \| readonly `Readonly`\<\{
433
- `kind`: `string`; `id`: `string`; \}\>[]; \}\>[]; `approval`: \| `Readonly`\<\{
434
- `by`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`:
435
- `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`:
1320
+ `kind`: ...; `id`: ...; \}\>[]; \}\>[]; `approval`: \| `Readonly`\<\{ `by`: \|
1321
+ \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`;
1322
+ `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`:
1323
+ `number`; `authorityVersion`: `number`; \}\> \| `null`; \}; `status`:
1324
+ `"enabled"` \| `"disabled"` \| `"deleted"`; `visibility`: `"private"` \|
1325
+ `"public"`; `approvedAnonymousMethods`: readonly `Readonly`\<\{ `name`:
1326
+ `string`; `digest`: `Sha256Digest`; \}\>[]; `anonymousApproval`: \|
1327
+ `Readonly`\<\{ `by`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{
1328
+ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`:
436
1329
  `string`; \}; `at`: `number`; `authorityVersion`: `number`; \}\> \| `null`;
437
- `approvedAnonymousMethods`: readonly `Readonly`\<\{ `name`: `string`; `digest`:
438
- `Sha256Digest`; \}\>[]; `anonymousApproval`: \| `Readonly`\<\{ `by`: \| \{
439
- `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`:
440
- `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`: `number`;
441
- `authorityVersion`: `number`; \}\> \| `null`; \}\>[]
1330
+ \}\>[]
442
1331
 
443
1332
  ##### get()
444
1333
 
@@ -462,63 +1351,67 @@ get(installationId):
462
1351
  };
463
1352
  };
464
1353
  releasePin: "pinned" | "floating";
465
- authorityVersion: number;
1354
+ authority: {
1355
+ authorityVersion: number;
1356
+ declaredOperationsDigest: Sha256Digest;
1357
+ approvedGrants: readonly Readonly<{
1358
+ capability: | "approvals"
1359
+ | "agent.list"
1360
+ | "agent.manage"
1361
+ | "agent.rename"
1362
+ | "agent.avatar"
1363
+ | "agent.toolPolicy"
1364
+ | "agent.read"
1365
+ | "agent.send"
1366
+ | "computer.list"
1367
+ | "computer.readFile"
1368
+ | "computer.writeFile"
1369
+ | "computer.execute"
1370
+ | "llm.generation"
1371
+ | "media.generation"
1372
+ | "games:servers"
1373
+ | "git.repository"
1374
+ | "apps.open"
1375
+ | "apps.call"
1376
+ | "app.storage"
1377
+ | "app.events.emit"
1378
+ | "team.workbenchHost"
1379
+ | "marketplace.browse"
1380
+ | "marketplace.purchase"
1381
+ | "workflow.run"
1382
+ | "workflow.publish"
1383
+ | "workflow.arm"
1384
+ | "world"
1385
+ | "channels.read"
1386
+ | "channels.personal.manage";
1387
+ capabilityApproved: true;
1388
+ operations: readonly string[];
1389
+ resources: | "tenant-scope"
1390
+ | readonly Readonly<{
1391
+ kind: ...;
1392
+ id: ...;
1393
+ }>[];
1394
+ }>[];
1395
+ approval: | Readonly<{
1396
+ by: | {
1397
+ kind: "member";
1398
+ memberId: string;
1399
+ }
1400
+ | {
1401
+ kind: "agent";
1402
+ agentId: string;
1403
+ }
1404
+ | {
1405
+ kind: "team-key";
1406
+ keyId: string;
1407
+ };
1408
+ at: number;
1409
+ authorityVersion: number;
1410
+ }>
1411
+ | null;
1412
+ };
466
1413
  status: "enabled" | "disabled" | "deleted";
467
1414
  visibility: "private" | "public";
468
- declaredOperationsDigest: Sha256Digest;
469
- approvedGrants: readonly Readonly<{
470
- capability: | "agent.list"
471
- | "agent.manage"
472
- | "agent.rename"
473
- | "agent.toolPolicy"
474
- | "agent.read"
475
- | "agent.send"
476
- | "computer.list"
477
- | "computer.readFile"
478
- | "computer.writeFile"
479
- | "computer.execute"
480
- | "llm.generation"
481
- | "media.generation"
482
- | "games:servers"
483
- | "git.repository"
484
- | "apps.open"
485
- | "apps.call"
486
- | "app.storage"
487
- | "app.events.emit"
488
- | "team.workbenchHost"
489
- | "marketplace.browse"
490
- | "marketplace.purchase"
491
- | "workflow.run"
492
- | "workflow.publish"
493
- | "workflow.arm"
494
- | "world"
495
- | "channels.read"
496
- | "channels.personal.manage";
497
- capabilityApproved: true;
498
- operations: readonly string[];
499
- resources: | "tenant-scope"
500
- | readonly Readonly<{
501
- kind: string;
502
- id: string;
503
- }>[];
504
- }>[];
505
- approval: | Readonly<{
506
- by: | {
507
- kind: "member";
508
- memberId: string;
509
- }
510
- | {
511
- kind: "agent";
512
- agentId: string;
513
- }
514
- | {
515
- kind: "team-key";
516
- keyId: string;
517
- };
518
- at: number;
519
- authorityVersion: number;
520
- }>
521
- | null;
522
1415
  approvedAnonymousMethods: readonly Readonly<{
523
1416
  name: string;
524
1417
  digest: Sha256Digest;
@@ -560,47 +1453,42 @@ One installation record, or `null`.
560
1453
  `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`: \{
561
1454
  `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
562
1455
  `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `releasePin`: `"pinned"` \|
563
- `"floating"`; `authorityVersion`: `number`; `status`: `"enabled"` \|
564
- `"disabled"` \| `"deleted"`; `visibility`: `"private"` \| `"public"`;
1456
+ `"floating"`; `authority`: \{ `authorityVersion`: `number`;
565
1457
  `declaredOperationsDigest`: `Sha256Digest`; `approvedGrants`: readonly
566
- `Readonly`\<\{ `capability`: \| `"agent.list"` \| `"agent.manage"` \|
567
- `"agent.rename"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \|
568
- `"computer.list"` \| `"computer.readFile"` \| `"computer.writeFile"` \|
569
- `"computer.execute"` \| `"llm.generation"` \| `"media.generation"` \|
570
- `"games:servers"` \| `"git.repository"` \| `"apps.open"` \| `"apps.call"` \|
571
- `"app.storage"` \| `"app.events.emit"` \| `"team.workbenchHost"` \|
572
- `"marketplace.browse"` \| `"marketplace.purchase"` \| `"workflow.run"` \|
573
- `"workflow.publish"` \| `"workflow.arm"` \| `"world"` \| `"channels.read"` \|
1458
+ `Readonly`\<\{ `capability`: \| `"approvals"` \| `"agent.list"` \|
1459
+ `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"`
1460
+ \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \|
1461
+ `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \|
1462
+ `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \|
1463
+ `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \|
1464
+ `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \|
1465
+ `"marketplace.purchase"` \| `"workflow.run"` \| `"workflow.publish"` \|
1466
+ `"workflow.arm"` \| `"world"` \| `"channels.read"` \|
574
1467
  `"channels.personal.manage"`; `capabilityApproved`: `true`; `operations`:
575
1468
  readonly `string`[]; `resources`: \| `"tenant-scope"` \| readonly `Readonly`\<\{
576
- `kind`: `string`; `id`: `string`; \}\>[]; \}\>[]; `approval`: \| `Readonly`\<\{
577
- `by`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`:
578
- `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`:
579
- `string`; \}; `at`: `number`; `authorityVersion`: `number`; \}\> \| `null`;
580
- `approvedAnonymousMethods`: readonly `Readonly`\<\{ `name`: `string`; `digest`:
581
- `Sha256Digest`; \}\>[]; `anonymousApproval`: \| `Readonly`\<\{ `by`: \| \{
582
- `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`:
583
- `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`: `number`;
584
- `authorityVersion`: `number`; \}\> \| `null`; \}\> \| `null`
585
-
586
- ##### put()
1469
+ `kind`: ...; `id`: ...; \}\>[]; \}\>[]; `approval`: \| `Readonly`\<\{ `by`: \|
1470
+ \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`;
1471
+ `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`:
1472
+ `number`; `authorityVersion`: `number`; \}\> \| `null`; \}; `status`:
1473
+ `"enabled"` \| `"disabled"` \| `"deleted"`; `visibility`: `"private"` \|
1474
+ `"public"`; `approvedAnonymousMethods`: readonly `Readonly`\<\{ `name`:
1475
+ `string`; `digest`: `Sha256Digest`; \}\>[]; `anonymousApproval`: \|
1476
+ `Readonly`\<\{ `by`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{
1477
+ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`:
1478
+ `string`; \}; `at`: `number`; `authorityVersion`: `number`; \}\> \| `null`; \}\>
1479
+ \| `null`
1480
+
1481
+ ##### generation()
587
1482
 
588
1483
  ```ts
589
- put(installation, tenantId?): Promise<void>;
1484
+ generation(): string;
590
1485
  ```
591
1486
 
592
- Create or replace one installation record.
593
-
594
- ###### Parameters
595
-
596
- | Parameter | Type | Default value |
597
- | -------------- | ---------------------------------------- | --------------- |
598
- | `installation` | [`Installation`](apps.md#installation) | `undefined` |
599
- | `tenantId` | `string` & `Brand`\<`"OysterTenantId"`\> | `defaultTenant` |
1487
+ Durable store identity, regenerated only when the store itself is replaced.
600
1488
 
601
1489
  ###### Returns
602
1490
 
603
- `Promise`\<`void`\>
1491
+ `string`
604
1492
 
605
1493
  ##### compareAndPut()
606
1494
 
@@ -608,6 +1496,7 @@ Create or replace one installation record.
608
1496
  compareAndPut(
609
1497
  installation,
610
1498
  expectedAuthorityVersion,
1499
+ expectedGeneration,
611
1500
  tenantId?
612
1501
  ): Promise<InstallationCommit>;
613
1502
  ```
@@ -620,12 +1509,46 @@ Native RPC returns a closed result; callers never classify a transported Error.
620
1509
  | -------------------------- | ---------------------------------------- | --------------- |
621
1510
  | `installation` | [`Installation`](apps.md#installation) | `undefined` |
622
1511
  | `expectedAuthorityVersion` | `number` | `undefined` |
1512
+ | `expectedGeneration` | `string` | `undefined` |
623
1513
  | `tenantId` | `string` & `Brand`\<`"OysterTenantId"`\> | `defaultTenant` |
624
1514
 
625
1515
  ###### Returns
626
1516
 
627
1517
  `Promise`\<[`InstallationCommit`](host.md#installationcommit)\>
628
1518
 
1519
+ ##### bootCapability()
1520
+
1521
+ ```ts
1522
+ bootCapability(input):
1523
+ | {
1524
+ id: string;
1525
+ identity: {
1526
+ appId: string;
1527
+ releaseId: ReleaseId;
1528
+ surfaceId: "host-boot";
1529
+ };
1530
+ base: string;
1531
+ expiresAt: number;
1532
+ assets: object[];
1533
+ }
1534
+ | null
1535
+ | undefined;
1536
+ ```
1537
+
1538
+ Issue, resolve, or revoke one bounded capability without storing its token.
1539
+
1540
+ ###### Parameters
1541
+
1542
+ | Parameter | Type |
1543
+ | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1544
+ | `input` | \| `Readonly`\<\{ `kind`: `"issue"`; `grant`: \{ `lease`: \{ `id`: `string`; `identity`: \{ `appId`: `string`; `releaseId`: `ReleaseId`; `surfaceId`: `"host-boot"`; \}; `base`: `string`; `expiresAt`: `number`; `assets`: `object`[]; \}; `tokenDigest`: `string`; \}; \}\> \| `Readonly`\<\{ `kind`: `"resolve"`; `tokenDigest`: `string`; `now`: `number`; \}\> \| `Readonly`\<\{ `kind`: `"revoke"`; `id`: `string`; \}\> |
1545
+
1546
+ ###### Returns
1547
+
1548
+ \| \{ `id`: `string`; `identity`: \{ `appId`: `string`; `releaseId`:
1549
+ `ReleaseId`; `surfaceId`: `"host-boot"`; \}; `base`: `string`; `expiresAt`:
1550
+ `number`; `assets`: `object`[]; \} \| `null` \| `undefined`
1551
+
629
1552
  ---
630
1553
 
631
1554
  ### OysterBinding
@@ -634,18 +1557,23 @@ The plain Oyster Worker's guest binding entrypoint.
634
1557
 
635
1558
  #### Extends
636
1559
 
637
- - `WorkerEntrypoint`\<`Readonly`\<\{ `OYSTER_OWNER_KEY`: `string`;
1560
+ - `WorkerEntrypoint`\<`Readonly`\<\{ `BROWSER?`: `Readonly`\<\{ `fetch`:
1561
+ [`HttpFetch`](browser.md#httpfetch); \}\>; `OYSTER_OWNER_KEY`: `string`;
638
1562
  `OYSTER_OWNER_NAME?`: `string`; `AGENT_DIRECTORY?`: `Readonly`\<\{
639
1563
  `getByName`: `Readonly`\<\{ `readCreator`: `Promise`\<... \| ...\>; \}\>;
640
1564
  \}\>; `OYSTER_ORIGIN`: `string`; `MCP`:
641
1565
  `DurableObjectNamespace`\<[`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{
642
1566
  `LOADER`: `WorkerLoader`; \}\>\>\>; `RELEASES`: `R2Bucket`; `REGISTRY`:
643
- `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\>; `INSTANCES`:
1567
+ `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\<`Readonly`\<\{
1568
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
1569
+ OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined;
1570
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
1571
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `INSTANCES`:
644
1572
  `DurableObjectNamespace`\<[`OysterInstance`](#oysterinstance)\<`Readonly`\<\{
1573
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
645
1574
  OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined;
646
- AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<\{
647
- readCreator(agentId: string): Promise\<string \| null\>; \}\>; \}\> \|
648
- undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`:
1575
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
1576
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`:
649
1577
  `WorkerLoader`; \}\>, `Readonly`\<\{ `instanceId`: `string`; `binding`: \|
650
1578
  `"BACKGROUND"` \| `"GIT"` \| `"EVENTS"` \| `"APPS"` \| `"WORKFLOWS"` \|
651
1579
  `"APP_STORAGE"` \| `"MEDIA"` \| `"COMPUTER"` \| `"INBOX"` \| `"AGENTS"`;
@@ -845,6 +1773,87 @@ Installation changes end guest work; a Workflow cancel targets only its run.
845
1773
 
846
1774
  `Promise`\<`void`\>
847
1775
 
1776
+ ##### prepare()
1777
+
1778
+ ```ts
1779
+ prepare(
1780
+ state,
1781
+ release,
1782
+ limits?,
1783
+ tenant?
1784
+ ): Promise<InstanceResult<
1785
+ | {
1786
+ kind: "passed";
1787
+ }
1788
+ | {
1789
+ kind: "failed";
1790
+ code: "ui_mount_failed";
1791
+ diagnostics?: {
1792
+ failedPredicate: | "unexpected_candidate_request"
1793
+ | "response_status"
1794
+ | "request_failed"
1795
+ | "page_error"
1796
+ | "candidate_not_mounted";
1797
+ errorName?: | "TypeError"
1798
+ | "RangeError"
1799
+ | "SyntaxError"
1800
+ | "AbortError"
1801
+ | "TimeoutError"
1802
+ | "Other"
1803
+ | "Error";
1804
+ finalUrlPath: string;
1805
+ consoleErrors: string[];
1806
+ pageErrors: string[];
1807
+ failedRequests: object[];
1808
+ droppedCount: number;
1809
+ };
1810
+ }
1811
+ | {
1812
+ kind: "not_checked";
1813
+ code: | "boot_runner_unavailable"
1814
+ | "boot_browser_binding_missing"
1815
+ | "boot_clone_unavailable"
1816
+ | "boot_timeout"
1817
+ | "boot_cleanup_failed"
1818
+ | "ui_check_not_run_on_host";
1819
+ }
1820
+ | null>>;
1821
+ ```
1822
+
1823
+ Reuse lifecycle preflight without changing the active runtime or its budgets.
1824
+
1825
+ ###### Parameters
1826
+
1827
+ | Parameter | Type |
1828
+ | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1829
+ | `state` | \{ `instanceId`: [`InstanceId`](index.md#instanceid); `owner`: \{ `kind`: `"installation"` \| `"deployment"`; `id`: `string`; \}; `appId`: `AppId`; `releaseId`: `ReleaseId`; `authorityVersion`: `number`; `status`: `"enabled"` \| `"disabled"` \| `"deleted"`; \} |
1830
+ | `state.instanceId` | [`InstanceId`](index.md#instanceid) |
1831
+ | `state.owner` | \{ `kind`: `"installation"` \| `"deployment"`; `id`: `string`; \} |
1832
+ | `state.owner.kind?` | `"installation"` \| `"deployment"` |
1833
+ | `state.owner.id?` | `string` |
1834
+ | `state.appId?` | `AppId` |
1835
+ | `state.releaseId?` | `ReleaseId` |
1836
+ | `state.authorityVersion?` | `number` |
1837
+ | `state.status?` | `"enabled"` \| `"disabled"` \| `"deleted"` |
1838
+ | `release?` | `Release` |
1839
+ | `limits?` | `Readonly`\<\{ `cpuMs`: `number`; `subRequests`: `number`; \}\> |
1840
+ | `tenant?` | `Pick`\<`Readonly`\<\{ `tenantId`: `string` & `Brand`\<`"OysterTenantId"`\>; `origin`: `string`; `durableName`: `string`; `computerName`: `string`; `workspacePrefix`: `string`; `repositoryPrefix`: `string`; \}\>, `"origin"` \| `"tenantId"`\> |
1841
+
1842
+ ###### Returns
1843
+
1844
+ `Promise`\<[`InstanceResult`](host.md#instanceresult)\< \| \{ `kind`:
1845
+ `"passed"`; \} \| \{ `kind`: `"failed"`; `code`: `"ui_mount_failed"`;
1846
+ `diagnostics?`: \{ `failedPredicate`: \| `"unexpected_candidate_request"` \|
1847
+ `"response_status"` \| `"request_failed"` \| `"page_error"` \|
1848
+ `"candidate_not_mounted"`; `errorName?`: \| `"TypeError"` \| `"RangeError"` \|
1849
+ `"SyntaxError"` \| `"AbortError"` \| `"TimeoutError"` \| `"Other"` \| `"Error"`;
1850
+ `finalUrlPath`: `string`; `consoleErrors`: `string`[]; `pageErrors`: `string`[];
1851
+ `failedRequests`: `object`[]; `droppedCount`: `number`; \}; \} \| \{ `kind`:
1852
+ `"not_checked"`; `code`: \| `"boot_runner_unavailable"` \|
1853
+ `"boot_browser_binding_missing"` \| `"boot_clone_unavailable"` \|
1854
+ `"boot_timeout"` \| `"boot_cleanup_failed"` \| `"ui_check_not_run_on_host"`; \}
1855
+ \| `null`\>\>
1856
+
848
1857
  ##### apply()
849
1858
 
850
1859
  ```ts
@@ -868,7 +1877,7 @@ apply(
868
1877
  }>>;
869
1878
  ```
870
1879
 
871
- Remember `release`, then apply the owner state under the host's tenant pin.
1880
+ Activate the exact committed selection under the host's tenant pin.
872
1881
 
873
1882
  ###### Parameters
874
1883
 
@@ -1226,18 +2235,23 @@ The non-git standalone root's MCP owner.
1226
2235
 
1227
2236
  #### Extends
1228
2237
 
1229
- - [`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{ `OYSTER_OWNER_KEY`:
2238
+ - [`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{ `BROWSER?`: `Readonly`\<\{
2239
+ `fetch`: [`HttpFetch`](browser.md#httpfetch); \}\>; `OYSTER_OWNER_KEY`:
1230
2240
  `string`; `OYSTER_OWNER_NAME?`: `string`; `AGENT_DIRECTORY?`: `Readonly`\<\{
1231
2241
  `getByName`: `Readonly`\<\{ `readCreator`: `Promise`\<... \| ...\>; \}\>;
1232
2242
  \}\>; `OYSTER_ORIGIN`: `string`; `MCP`:
1233
2243
  `DurableObjectNamespace`\<[`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{
1234
2244
  `LOADER`: `WorkerLoader`; \}\>\>\>; `RELEASES`: `R2Bucket`; `REGISTRY`:
1235
- `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\>; `INSTANCES`:
2245
+ `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\<`Readonly`\<\{
2246
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
2247
+ OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined;
2248
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
2249
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `INSTANCES`:
1236
2250
  `DurableObjectNamespace`\<[`OysterInstance`](#oysterinstance)\<`Readonly`\<\{
2251
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
1237
2252
  OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined;
1238
- AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<\{
1239
- readCreator(agentId: string): Promise\<string \| null\>; \}\>; \}\> \|
1240
- undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`:
2253
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
2254
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`:
1241
2255
  `WorkerLoader`; \}\>, `this`\>
1242
2256
 
1243
2257
  #### Constructors
@@ -1288,6 +2302,269 @@ Trusted host RPC: the namespace and pin are never selected by guest headers.
1288
2302
 
1289
2303
  [`OysterMcpOwner`](#oystermcpowner).[`serve`](#serve)
1290
2304
 
2305
+ ---
2306
+
2307
+ ### OysterInstallationExecutor
2308
+
2309
+ Ordinary Worker execution; REGISTRY receives references and receipts only.
2310
+
2311
+ #### Extends
2312
+
2313
+ - `WorkerEntrypoint`\<`Readonly`\<\{ `BROWSER?`: `Readonly`\<\{ `fetch`:
2314
+ [`HttpFetch`](browser.md#httpfetch); \}\>; `OYSTER_OWNER_KEY`: `string`;
2315
+ `OYSTER_OWNER_NAME?`: `string`; `AGENT_DIRECTORY?`: `Readonly`\<\{
2316
+ `getByName`: `Readonly`\<\{ `readCreator`: `Promise`\<...\>; \}\>; \}\>;
2317
+ `OYSTER_ORIGIN`: `string`; `MCP`:
2318
+ `DurableObjectNamespace`\<[`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{
2319
+ `LOADER`: `WorkerLoader`; \}\>\>\>; `RELEASES`: `R2Bucket`; `REGISTRY`:
2320
+ `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\<`Readonly`\<\{
2321
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
2322
+ OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined;
2323
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
2324
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `INSTANCES`:
2325
+ `DurableObjectNamespace`\<[`OysterInstance`](#oysterinstance)\<`Readonly`\<\{
2326
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
2327
+ OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined;
2328
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
2329
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`:
2330
+ `WorkerLoader`; \}\>, `unknown`, `this`\> & `object`
2331
+
2332
+ #### Constructors
2333
+
2334
+ ##### Constructor
2335
+
2336
+ ```ts
2337
+ new OysterInstallationExecutor(ctx, env): OysterInstallationExecutor;
2338
+ ```
2339
+
2340
+ ###### Parameters
2341
+
2342
+ | Parameter | Type |
2343
+ | --------- | ------------------ |
2344
+ | `ctx` | `ExecutionContext` |
2345
+ | `env` | `Env` |
2346
+
2347
+ ###### Returns
2348
+
2349
+ [`OysterInstallationExecutor`](#oysterinstallationexecutor)
2350
+
2351
+ ###### Inherited from
2352
+
2353
+ ```ts
2354
+ installationWorkerEntrypoint<OysterWorkerEnv>((env, scope) =>
2355
+ ownerKeyRootHost(env, { scope }),
2356
+ ).constructor;
2357
+ ```
2358
+
2359
+ #### Methods
2360
+
2361
+ ##### run()
2362
+
2363
+ ```ts
2364
+ run(): Promise<
2365
+ | {
2366
+ state: "succeeded";
2367
+ installation: {
2368
+ installationId: string;
2369
+ instanceId: InstanceId | null;
2370
+ appId: AppId;
2371
+ release: {
2372
+ releaseId: ReleaseId;
2373
+ appId: AppId;
2374
+ artifact: {
2375
+ artifactRef: ArtifactRef;
2376
+ artifactDigest: Sha256Digest;
2377
+ provenance: {
2378
+ sourceRevision: SourceRevision;
2379
+ sourceTreeDigest: Sha256Digest;
2380
+ buildRecipeDigest: Sha256Digest;
2381
+ };
2382
+ };
2383
+ };
2384
+ releasePin: "pinned" | "floating";
2385
+ authority: {
2386
+ authorityVersion: number;
2387
+ declaredOperationsDigest: Sha256Digest;
2388
+ approvedGrants: readonly Readonly<{
2389
+ capability: | "approvals"
2390
+ | "agent.list"
2391
+ | "agent.manage"
2392
+ | "agent.rename"
2393
+ | "agent.avatar"
2394
+ | "agent.toolPolicy"
2395
+ | "agent.read"
2396
+ | "agent.send"
2397
+ | "computer.list"
2398
+ | "computer.readFile"
2399
+ | "computer.writeFile"
2400
+ | "computer.execute"
2401
+ | "llm.generation"
2402
+ | "media.generation"
2403
+ | "games:servers"
2404
+ | "git.repository"
2405
+ | "apps.open"
2406
+ | "apps.call"
2407
+ | "app.storage"
2408
+ | "app.events.emit"
2409
+ | "team.workbenchHost"
2410
+ | "marketplace.browse"
2411
+ | "marketplace.purchase"
2412
+ | "workflow.run"
2413
+ | "workflow.publish"
2414
+ | "workflow.arm"
2415
+ | "world"
2416
+ | "channels.read"
2417
+ | "channels.personal.manage";
2418
+ capabilityApproved: true;
2419
+ operations: readonly string[];
2420
+ resources: "tenant-scope" | readonly Readonly<...>[];
2421
+ }>[];
2422
+ approval: | Readonly<{
2423
+ by: | {
2424
+ kind: "member";
2425
+ memberId: string;
2426
+ }
2427
+ | {
2428
+ kind: "agent";
2429
+ agentId: string;
2430
+ }
2431
+ | {
2432
+ kind: "team-key";
2433
+ keyId: string;
2434
+ };
2435
+ at: number;
2436
+ authorityVersion: number;
2437
+ }>
2438
+ | null;
2439
+ };
2440
+ status: "enabled" | "disabled" | "deleted";
2441
+ visibility: "private" | "public";
2442
+ approvedAnonymousMethods: readonly Readonly<{
2443
+ name: string;
2444
+ digest: Sha256Digest;
2445
+ }>[];
2446
+ anonymousApproval: | Readonly<{
2447
+ by: | {
2448
+ kind: "member";
2449
+ memberId: string;
2450
+ }
2451
+ | {
2452
+ kind: "agent";
2453
+ agentId: string;
2454
+ }
2455
+ | {
2456
+ kind: "team-key";
2457
+ keyId: string;
2458
+ };
2459
+ at: number;
2460
+ authorityVersion: number;
2461
+ }>
2462
+ | null;
2463
+ };
2464
+ creation: "fresh" | "replacement" | "reminted";
2465
+ uiCheck: | {
2466
+ kind: "passed";
2467
+ }
2468
+ | {
2469
+ kind: "failed";
2470
+ code: "ui_mount_failed";
2471
+ diagnostics?: {
2472
+ failedPredicate: | "unexpected_candidate_request"
2473
+ | "response_status"
2474
+ | "request_failed"
2475
+ | "page_error"
2476
+ | "candidate_not_mounted";
2477
+ errorName?: | "TypeError"
2478
+ | "RangeError"
2479
+ | "SyntaxError"
2480
+ | "AbortError"
2481
+ | "TimeoutError"
2482
+ | "Other"
2483
+ | "Error";
2484
+ finalUrlPath: string;
2485
+ consoleErrors: string[];
2486
+ pageErrors: string[];
2487
+ failedRequests: object[];
2488
+ droppedCount: number;
2489
+ };
2490
+ }
2491
+ | {
2492
+ kind: "not_checked";
2493
+ code: | "boot_runner_unavailable"
2494
+ | "boot_browser_binding_missing"
2495
+ | "boot_clone_unavailable"
2496
+ | "boot_timeout"
2497
+ | "boot_cleanup_failed"
2498
+ | "ui_check_not_run_on_host";
2499
+ }
2500
+ | null;
2501
+ }
2502
+ | {
2503
+ state: "refused";
2504
+ status: number;
2505
+ code: string;
2506
+ }
2507
+ | {
2508
+ state: "unconfirmed";
2509
+ outcome: "cancelled" | "outcome_unknown" | "interrupted";
2510
+ }>;
2511
+ ```
2512
+
2513
+ Execute the retained command these props name, in its tenant scope.
2514
+
2515
+ ###### Returns
2516
+
2517
+ `Promise`\< \| \{ `state`: `"succeeded"`; `installation`: \{ `installationId`:
2518
+ `string`; `instanceId`: [`InstanceId`](index.md#instanceid) \| `null`; `appId`:
2519
+ `AppId`; `release`: \{ `releaseId`: `ReleaseId`; `appId`: `AppId`; `artifact`:
2520
+ \{ `artifactRef`: `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`:
2521
+ \{ `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
2522
+ `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `releasePin`: `"pinned"` \|
2523
+ `"floating"`; `authority`: \{ `authorityVersion`: `number`;
2524
+ `declaredOperationsDigest`: `Sha256Digest`; `approvedGrants`: readonly
2525
+ `Readonly`\<\{ `capability`: \| `"approvals"` \| `"agent.list"` \|
2526
+ `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"`
2527
+ \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \|
2528
+ `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \|
2529
+ `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \|
2530
+ `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \|
2531
+ `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \|
2532
+ `"marketplace.purchase"` \| `"workflow.run"` \| `"workflow.publish"` \|
2533
+ `"workflow.arm"` \| `"world"` \| `"channels.read"` \|
2534
+ `"channels.personal.manage"`; `capabilityApproved`: `true`; `operations`:
2535
+ readonly `string`[]; `resources`: `"tenant-scope"` \| readonly
2536
+ `Readonly`\<...\>[]; \}\>[]; `approval`: \| `Readonly`\<\{ `by`: \| \{ `kind`:
2537
+ `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`:
2538
+ `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`: `number`;
2539
+ `authorityVersion`: `number`; \}\> \| `null`; \}; `status`: `"enabled"` \|
2540
+ `"disabled"` \| `"deleted"`; `visibility`: `"private"` \| `"public"`;
2541
+ `approvedAnonymousMethods`: readonly `Readonly`\<\{ `name`: `string`; `digest`:
2542
+ `Sha256Digest`; \}\>[]; `anonymousApproval`: \| `Readonly`\<\{ `by`: \| \{
2543
+ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`:
2544
+ `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`: `number`;
2545
+ `authorityVersion`: `number`; \}\> \| `null`; \}; `creation`: `"fresh"` \|
2546
+ `"replacement"` \| `"reminted"`; `uiCheck`: \| \{ `kind`: `"passed"`; \} \| \{
2547
+ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{
2548
+ `failedPredicate`: \| `"unexpected_candidate_request"` \| `"response_status"` \|
2549
+ `"request_failed"` \| `"page_error"` \| `"candidate_not_mounted"`; `errorName?`:
2550
+ \| `"TypeError"` \| `"RangeError"` \| `"SyntaxError"` \| `"AbortError"` \|
2551
+ `"TimeoutError"` \| `"Other"` \| `"Error"`; `finalUrlPath`: `string`;
2552
+ `consoleErrors`: `string`[]; `pageErrors`: `string`[]; `failedRequests`:
2553
+ `object`[]; `droppedCount`: `number`; \}; \} \| \{ `kind`: `"not_checked"`;
2554
+ `code`: \| `"boot_runner_unavailable"` \| `"boot_browser_binding_missing"` \|
2555
+ `"boot_clone_unavailable"` \| `"boot_timeout"` \| `"boot_cleanup_failed"` \|
2556
+ `"ui_check_not_run_on_host"`; \} \| `null`; \} \| \{ `state`: `"refused"`;
2557
+ `status`: `number`; `code`: `string`; \} \| \{ `state`: `"unconfirmed"`;
2558
+ `outcome`: `"cancelled"` \| `"outcome_unknown"` \| `"interrupted"`; \}\>
2559
+
2560
+ ###### Inherited from
2561
+
2562
+ ```ts
2563
+ installationWorkerEntrypoint<OysterWorkerEnv>((env, scope) =>
2564
+ ownerKeyRootHost(env, { scope }),
2565
+ ).run;
2566
+ ```
2567
+
1291
2568
  ## Type Aliases
1292
2569
 
1293
2570
  ### OysterMcpOwnerEnv
@@ -1363,6 +2640,7 @@ input.
1363
2640
 
1364
2641
  ```ts
1365
2642
  type OysterWorkerEnv = Readonly<{
2643
+ BROWSER?: BrowserBinding;
1366
2644
  OYSTER_OWNER_KEY: string;
1367
2645
  OYSTER_OWNER_NAME?: string;
1368
2646
  AGENT_DIRECTORY?: OysterStorageAgentDirectory;
@@ -1387,11 +2665,27 @@ type OysterBindingContext<Env> = Readonly<{
1387
2665
  scope: TenantScope;
1388
2666
  backgroundHost: Promise<
1389
2667
  | Readonly<{
2668
+ approvals?: Readonly<{
2669
+ submit: Promise<
2670
+ | {
2671
+ kind: ...;
2672
+ recordId: ...;
2673
+ description: ...;
2674
+ }
2675
+ | ApprovalApplyResult>;
2676
+ }>;
2677
+ workflows?: (principal) => Promise<
2678
+ | {
2679
+ status: Promise<...>;
2680
+ cancel: Promise<...>;
2681
+ }
2682
+ | null>;
1390
2683
  auth: OysterAuth;
1391
2684
  backgroundOriginKey?: () => Promise<CryptoKey>;
1392
2685
  artifacts: ArtifactStore;
1393
2686
  installations: InstallationStore;
1394
2687
  instances: InstanceDirectory;
2688
+ bootUi: (release) => Promise<UiBootCheckOutcome>;
1395
2689
  computerId?: string;
1396
2690
  computer?: (principal) => KnapsackComputer | null | Promise<KnapsackComputer | null>;
1397
2691
  appToolPolicy?: (actor) =>
@@ -1418,6 +2712,14 @@ type OysterBindingContext<Env> = Readonly<{
1418
2712
  }>;
1419
2713
  homeInstallationId?: string;
1420
2714
  pageScript?: string;
2715
+ pageAssets?: () => Promise<{
2716
+ pageScript: string;
2717
+ publicHomeScript: string;
2718
+ fontStyles: string;
2719
+ loginFontStyles: string;
2720
+ shellStyles: string;
2721
+ grantConsentScript: string;
2722
+ }>;
1421
2723
  title?: string;
1422
2724
  }>
1423
2725
  | null>;
@@ -1507,83 +2809,78 @@ admission.
1507
2809
 
1508
2810
  ## Functions
1509
2811
 
1510
- ### createOysterMcpOwner()
2812
+ ### installationWorkerEntrypoint()
1511
2813
 
1512
2814
  ```ts
1513
- function createOysterMcpOwner<Env>(host): (ctx, env) => OysterMcpOwner<Env>;
2815
+ function installationWorkerEntrypoint<Env>(
2816
+ hostFor,
2817
+ ): (ctx, env) => WorkerEntrypoint<Env, unknown> & object;
1514
2818
  ```
1515
2819
 
1516
- Bind the owner to the deployment's existing host factory and options.
2820
+ A loopback export with ordinary Worker I/O, not another resource or HTTP API.
1517
2821
 
1518
2822
  #### Type Parameters
1519
2823
 
1520
- | Type Parameter |
1521
- | ------------------------------------------------------------- |
1522
- | `Env` _extends_ `Readonly`\<\{ `LOADER`: `WorkerLoader`; \}\> |
2824
+ | Type Parameter |
2825
+ | -------------- |
2826
+ | `Env` |
1523
2827
 
1524
2828
  #### Parameters
1525
2829
 
1526
- | Parameter | Type |
1527
- | --------- | ------------------------------------------------------ |
1528
- | `host` | (`env`, `scope`) => [`OysterHost`](host.md#oysterhost) |
2830
+ | Parameter | Type |
2831
+ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2832
+ | `hostFor` | (`env`, `scope`) => \| `Readonly`\<\{ `approvals?`: `Readonly`\<\{ `submit`: `Promise`\< \| \{ `kind`: `"pending_approval"`; `recordId`: `string`; `description`: \{ `title`: ...; `inputBytes`: ...; `inputSha256`: ...; \}; \} \| `ApprovalApplyResult`\>; \}\>; `workflows?`: (`principal`) => `Promise`\< \| `Readonly`\<\{ `status`: `Promise`\<...\>; `cancel`: `Promise`\<...\>; \}\> \| `null`\>; `auth`: [`OysterAuth`](host.md#oysterauth); `backgroundOriginKey?`: () => `Promise`\<`CryptoKey`\>; `artifacts`: [`ArtifactStore`](host.md#artifactstore); `installations`: [`InstallationStore`](host.md#installationstore); `instances`: [`InstanceDirectory`](host.md#instancedirectory); `bootUi`: (`release`) => `Promise`\< \| \{ `kind`: `"passed"`; \} \| \{ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{ `failedPredicate`: ... \| ... \| ... \| ... \| ...; `errorName?`: ... \| ... \| ... \| ... \| ... \| ... \| ... \| ...; `finalUrlPath`: `string`; `consoleErrors`: ...[]; `pageErrors`: ...[]; `failedRequests`: ...[]; `droppedCount`: `number`; \}; \} \| \{ `kind`: `"not_checked"`; `code`: \| `"boot_runner_unavailable"` \| `"boot_browser_binding_missing"` \| `"boot_clone_unavailable"` \| `"boot_timeout"` \| `"boot_cleanup_failed"` \| `"ui_check_not_run_on_host"`; \}\>; `computerId?`: `string`; `computer?`: (`principal`) => \| `Readonly`\<\{ `getCapabilities`: (`signal`) => `Promise`\<...\>; `call`: (`capabilityId`, `input`, `context`) => `Promise`\<...\>; \}\> \| `Promise`\< \| `Readonly`\<\{ `getCapabilities`: ...; `call`: ...; \}\> \| `null`\> \| `null`; `appToolPolicy?`: (`actor`) => \| \{ `level`: `"read"` \| `"write"`; `revision`: `string`; `grantedBy`: `string`; \} \| `Promise`\< \| \{ `level`: ... \| ...; `revision`: `string`; `grantedBy`: `string`; \} \| `null`\> \| `null`; `keys?`: `Readonly`\<\{ `live`: `Promise`\< \| `Readonly`\<\{ `keyId`: ...; `owner`: ...; `grantVersion`: ...; `grants`: ...; \}\> \| `null`\>; \}\>; `guestLimits?`: `Partial`\<`Readonly`\<\{ `cpuMs`: `number`; `subRequests`: `number`; \}\>\>; `mcp?`: `Readonly`\<\{ `handleRequest`: (`request`) => `Promise`\<`Response`\>; `close?`: () => `Promise`\<`void`\>; \}\>; `git?`: `Readonly`\<\{ `writerOf`: `Extract`\<`GitWriter`, \{ `kind`: `"actor"`; \}\>; `workflowPass?`: `Promise`\< \| `Readonly`\<\{ `kind`: ...; `actor`: ...; `role?`: ...; `workflow?`: ...; \}\> \| `null`\>; `buildPass?`: `Promise`\< \| `Readonly`\<\{ `kind`: ...; `actor`: ...; `role?`: ...; `workflow?`: ...; \}\> \| `null`\>; `git`: `Promise`\<`Readonly`\<\{ `push`: `Promise`\<...\>; `read`: `Promise`\<...\>; `binding`: `GitBinding`; \}\>\>; \}\>; `ownerRoutes?`: `Hono`\<[`OysterEnv`](host.md#oysterenv), `BlankSchema`, `"/"`\>; `capabilities?`: readonly `Readonly`\<`object` & `object`\>[]; `workbench?`: `Readonly`\<\{ `directory`: `Promise`\<`Readonly`\<\{ `apps`: readonly ...[]; `roles`: [`OysterRootRoles`](root-data.md#oysterrootroles); `computer?`: ... \| ...; \}\>\>; `storage`: `Pick`\<`AppStorageWire`, `"read"` \| `"write"` \| `"reset"`\> & `Readonly`\<\{ `events`: `Promise`\<...\>; \}\>; \}\>; `homeInstallationId?`: `string`; `pageScript?`: `string`; `pageAssets?`: () => `Promise`\<\{ `pageScript`: `string`; `publicHomeScript`: `string`; `fontStyles`: `string`; `loginFontStyles`: `string`; `shellStyles`: `string`; `grantConsentScript`: `string`; \}\>; `title?`: `string`; \}\> \| `Promise`\<`Readonly`\<\{ `approvals?`: `Readonly`\<\{ `submit`: `Promise`\< \| \{ `kind`: ...; `recordId`: ...; `description`: ...; \} \| `ApprovalApplyResult`\>; \}\>; `workflows?`: (`principal`) => `Promise`\< \| `Readonly`\<\{ `status`: ...; `cancel`: ...; \}\> \| `null`\>; `auth`: [`OysterAuth`](host.md#oysterauth); `backgroundOriginKey?`: () => `Promise`\<`CryptoKey`\>; `artifacts`: [`ArtifactStore`](host.md#artifactstore); `installations`: [`InstallationStore`](host.md#installationstore); `instances`: [`InstanceDirectory`](host.md#instancedirectory); `bootUi`: (`release`) => `Promise`\< \| \{ `kind`: `"passed"`; \} \| \{ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{ `failedPredicate`: ...; `errorName?`: ...; `finalUrlPath`: ...; `consoleErrors`: ...; `pageErrors`: ...; `failedRequests`: ...; `droppedCount`: ...; \}; \} \| \{ `kind`: `"not_checked"`; `code`: \| `"boot_runner_unavailable"` \| `"boot_browser_binding_missing"` \| `"boot_clone_unavailable"` \| `"boot_timeout"` \| `"boot_cleanup_failed"` \| `"ui_check_not_run_on_host"`; \}\>; `computerId?`: `string`; `computer?`: (`principal`) => \| `Readonly`\<\{ `getCapabilities`: (`signal`) => ...; `call`: (`capabilityId`, `input`, `context`) => ...; \}\> \| `Promise`\<`Readonly`\<...\> \| `null`\> \| `null`; `appToolPolicy?`: (`actor`) => \| \{ `level`: `"read"` \| `"write"`; `revision`: `string`; `grantedBy`: `string`; \} \| `Promise`\< \| \{ `level`: ...; `revision`: ...; `grantedBy`: ...; \} \| `null`\> \| `null`; `keys?`: `Readonly`\<\{ `live`: `Promise`\<`Readonly`\<...\> \| `null`\>; \}\>; `guestLimits?`: `Partial`\<`Readonly`\<\{ `cpuMs`: `number`; `subRequests`: `number`; \}\>\>; `mcp?`: `Readonly`\<\{ `handleRequest`: (`request`) => `Promise`\<`Response`\>; `close?`: () => `Promise`\<...\>; \}\>; `git?`: `Readonly`\<\{ `writerOf`: `Extract`\<`GitWriter`, \{ `kind`: `"actor"`; \}\>; `workflowPass?`: `Promise`\<`Readonly`\<...\> \| `null`\>; `buildPass?`: `Promise`\<`Readonly`\<...\> \| `null`\>; `git`: `Promise`\<`Readonly`\<\{ `push`: ...; `read`: ...; `binding`: ...; \}\>\>; \}\>; `ownerRoutes?`: `Hono`\<[`OysterEnv`](host.md#oysterenv), `BlankSchema`, `"/"`\>; `capabilities?`: readonly `Readonly`\<`object` & `object`\>[]; `workbench?`: `Readonly`\<\{ `directory`: `Promise`\<`Readonly`\<\{ `apps`: ...; `roles`: ...; `computer?`: ...; \}\>\>; `storage`: `Pick`\<`AppStorageWire`, ... \| ... \| ...\> & `Readonly`\<\{ `events`: ...; \}\>; \}\>; `homeInstallationId?`: `string`; `pageScript?`: `string`; `pageAssets?`: () => `Promise`\<\{ `pageScript`: `string`; `publicHomeScript`: `string`; `fontStyles`: `string`; `loginFontStyles`: `string`; `shellStyles`: `string`; `grantConsentScript`: `string`; \}\>; `title?`: `string`; \}\>\> |
1529
2833
 
1530
2834
  #### Returns
1531
2835
 
1532
- (`ctx`, `env`) => [`OysterMcpOwner`](#oystermcpowner)\<`Env`\>
2836
+ (`ctx`, `env`) => `WorkerEntrypoint`\<`Env`, `unknown`\> & `object`
1533
2837
 
1534
2838
  ---
1535
2839
 
1536
- ### r2FileSource()
2840
+ ### createOysterMcpOwner()
1537
2841
 
1538
2842
  ```ts
1539
- function r2FileSource(bucket, prefix): FileSource;
2843
+ function createOysterMcpOwner<Env>(host): (ctx, env) => OysterMcpOwner<Env>;
1540
2844
  ```
1541
2845
 
1542
- Files in an R2 bucket under `prefix` (one workspace per prefix).
2846
+ Bind the owner to the deployment's existing host factory and options.
2847
+
2848
+ #### Type Parameters
2849
+
2850
+ | Type Parameter |
2851
+ | ------------------------------------------------------------- |
2852
+ | `Env` _extends_ `Readonly`\<\{ `LOADER`: `WorkerLoader`; \}\> |
1543
2853
 
1544
2854
  #### Parameters
1545
2855
 
1546
- | Parameter | Type |
1547
- | --------- | ---------- |
1548
- | `bucket` | `R2Bucket` |
1549
- | `prefix` | `string` |
2856
+ | Parameter | Type |
2857
+ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2858
+ | `host` | (`env`, `scope`) => \| `Readonly`\<\{ `approvals?`: `Readonly`\<\{ `submit`: `Promise`\< \| \{ `kind`: `"pending_approval"`; `recordId`: `string`; `description`: \{ `title`: ...; `inputBytes`: ...; `inputSha256`: ...; \}; \} \| `ApprovalApplyResult`\>; \}\>; `workflows?`: (`principal`) => `Promise`\< \| `Readonly`\<\{ `status`: `Promise`\<...\>; `cancel`: `Promise`\<...\>; \}\> \| `null`\>; `auth`: [`OysterAuth`](host.md#oysterauth); `backgroundOriginKey?`: () => `Promise`\<`CryptoKey`\>; `artifacts`: [`ArtifactStore`](host.md#artifactstore); `installations`: [`InstallationStore`](host.md#installationstore); `instances`: [`InstanceDirectory`](host.md#instancedirectory); `bootUi`: (`release`) => `Promise`\< \| \{ `kind`: `"passed"`; \} \| \{ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{ `failedPredicate`: ... \| ... \| ... \| ... \| ...; `errorName?`: ... \| ... \| ... \| ... \| ... \| ... \| ... \| ...; `finalUrlPath`: `string`; `consoleErrors`: ...[]; `pageErrors`: ...[]; `failedRequests`: ...[]; `droppedCount`: `number`; \}; \} \| \{ `kind`: `"not_checked"`; `code`: \| `"boot_runner_unavailable"` \| `"boot_browser_binding_missing"` \| `"boot_clone_unavailable"` \| `"boot_timeout"` \| `"boot_cleanup_failed"` \| `"ui_check_not_run_on_host"`; \}\>; `computerId?`: `string`; `computer?`: (`principal`) => \| `Readonly`\<\{ `getCapabilities`: (`signal`) => `Promise`\<...\>; `call`: (`capabilityId`, `input`, `context`) => `Promise`\<...\>; \}\> \| `Promise`\< \| `Readonly`\<\{ `getCapabilities`: ...; `call`: ...; \}\> \| `null`\> \| `null`; `appToolPolicy?`: (`actor`) => \| \{ `level`: `"read"` \| `"write"`; `revision`: `string`; `grantedBy`: `string`; \} \| `Promise`\< \| \{ `level`: ... \| ...; `revision`: `string`; `grantedBy`: `string`; \} \| `null`\> \| `null`; `keys?`: `Readonly`\<\{ `live`: `Promise`\< \| `Readonly`\<\{ `keyId`: ...; `owner`: ...; `grantVersion`: ...; `grants`: ...; \}\> \| `null`\>; \}\>; `guestLimits?`: `Partial`\<`Readonly`\<\{ `cpuMs`: `number`; `subRequests`: `number`; \}\>\>; `mcp?`: `Readonly`\<\{ `handleRequest`: (`request`) => `Promise`\<`Response`\>; `close?`: () => `Promise`\<`void`\>; \}\>; `git?`: `Readonly`\<\{ `writerOf`: `Extract`\<`GitWriter`, \{ `kind`: `"actor"`; \}\>; `workflowPass?`: `Promise`\< \| `Readonly`\<\{ `kind`: ...; `actor`: ...; `role?`: ...; `workflow?`: ...; \}\> \| `null`\>; `buildPass?`: `Promise`\< \| `Readonly`\<\{ `kind`: ...; `actor`: ...; `role?`: ...; `workflow?`: ...; \}\> \| `null`\>; `git`: `Promise`\<`Readonly`\<\{ `push`: `Promise`\<...\>; `read`: `Promise`\<...\>; `binding`: `GitBinding`; \}\>\>; \}\>; `ownerRoutes?`: `Hono`\<[`OysterEnv`](host.md#oysterenv), `BlankSchema`, `"/"`\>; `capabilities?`: readonly `Readonly`\<`object` & `object`\>[]; `workbench?`: `Readonly`\<\{ `directory`: `Promise`\<`Readonly`\<\{ `apps`: readonly ...[]; `roles`: [`OysterRootRoles`](root-data.md#oysterrootroles); `computer?`: ... \| ...; \}\>\>; `storage`: `Pick`\<`AppStorageWire`, `"read"` \| `"write"` \| `"reset"`\> & `Readonly`\<\{ `events`: `Promise`\<...\>; \}\>; \}\>; `homeInstallationId?`: `string`; `pageScript?`: `string`; `pageAssets?`: () => `Promise`\<\{ `pageScript`: `string`; `publicHomeScript`: `string`; `fontStyles`: `string`; `loginFontStyles`: `string`; `shellStyles`: `string`; `grantConsentScript`: `string`; \}\>; `title?`: `string`; \}\> \| `Promise`\<`Readonly`\<\{ `approvals?`: `Readonly`\<\{ `submit`: `Promise`\< \| \{ `kind`: ...; `recordId`: ...; `description`: ...; \} \| `ApprovalApplyResult`\>; \}\>; `workflows?`: (`principal`) => `Promise`\< \| `Readonly`\<\{ `status`: ...; `cancel`: ...; \}\> \| `null`\>; `auth`: [`OysterAuth`](host.md#oysterauth); `backgroundOriginKey?`: () => `Promise`\<`CryptoKey`\>; `artifacts`: [`ArtifactStore`](host.md#artifactstore); `installations`: [`InstallationStore`](host.md#installationstore); `instances`: [`InstanceDirectory`](host.md#instancedirectory); `bootUi`: (`release`) => `Promise`\< \| \{ `kind`: `"passed"`; \} \| \{ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{ `failedPredicate`: ...; `errorName?`: ...; `finalUrlPath`: ...; `consoleErrors`: ...; `pageErrors`: ...; `failedRequests`: ...; `droppedCount`: ...; \}; \} \| \{ `kind`: `"not_checked"`; `code`: \| `"boot_runner_unavailable"` \| `"boot_browser_binding_missing"` \| `"boot_clone_unavailable"` \| `"boot_timeout"` \| `"boot_cleanup_failed"` \| `"ui_check_not_run_on_host"`; \}\>; `computerId?`: `string`; `computer?`: (`principal`) => \| `Readonly`\<\{ `getCapabilities`: (`signal`) => ...; `call`: (`capabilityId`, `input`, `context`) => ...; \}\> \| `Promise`\<`Readonly`\<...\> \| `null`\> \| `null`; `appToolPolicy?`: (`actor`) => \| \{ `level`: `"read"` \| `"write"`; `revision`: `string`; `grantedBy`: `string`; \} \| `Promise`\< \| \{ `level`: ...; `revision`: ...; `grantedBy`: ...; \} \| `null`\> \| `null`; `keys?`: `Readonly`\<\{ `live`: `Promise`\<`Readonly`\<...\> \| `null`\>; \}\>; `guestLimits?`: `Partial`\<`Readonly`\<\{ `cpuMs`: `number`; `subRequests`: `number`; \}\>\>; `mcp?`: `Readonly`\<\{ `handleRequest`: (`request`) => `Promise`\<`Response`\>; `close?`: () => `Promise`\<...\>; \}\>; `git?`: `Readonly`\<\{ `writerOf`: `Extract`\<`GitWriter`, \{ `kind`: `"actor"`; \}\>; `workflowPass?`: `Promise`\<`Readonly`\<...\> \| `null`\>; `buildPass?`: `Promise`\<`Readonly`\<...\> \| `null`\>; `git`: `Promise`\<`Readonly`\<\{ `push`: ...; `read`: ...; `binding`: ...; \}\>\>; \}\>; `ownerRoutes?`: `Hono`\<[`OysterEnv`](host.md#oysterenv), `BlankSchema`, `"/"`\>; `capabilities?`: readonly `Readonly`\<`object` & `object`\>[]; `workbench?`: `Readonly`\<\{ `directory`: `Promise`\<`Readonly`\<\{ `apps`: ...; `roles`: ...; `computer?`: ...; \}\>\>; `storage`: `Pick`\<`AppStorageWire`, ... \| ... \| ...\> & `Readonly`\<\{ `events`: ...; \}\>; \}\>; `homeInstallationId?`: `string`; `pageScript?`: `string`; `pageAssets?`: () => `Promise`\<\{ `pageScript`: `string`; `publicHomeScript`: `string`; `fontStyles`: `string`; `loginFontStyles`: `string`; `shellStyles`: `string`; `grantConsentScript`: `string`; \}\>; `title?`: `string`; \}\>\> |
1550
2859
 
1551
2860
  #### Returns
1552
2861
 
1553
- [`FileSource`](files.md#filesource)
2862
+ (`ctx`, `env`) => [`OysterMcpOwner`](#oystermcpowner)\<`Env`\>
1554
2863
 
1555
2864
  ---
1556
2865
 
1557
- ### r2ArtifactStore()
2866
+ ### r2FileSource()
1558
2867
 
1559
2868
  ```ts
1560
- function r2ArtifactStore(bucket): Readonly<{
1561
- get: (artifactRef) => Promise<Uint8Array<ArrayBufferLike> | null>;
1562
- put: (artifactRef, bytes) => Promise<void>;
1563
- }> &
1564
- Readonly<{
1565
- head: (artifactRef) => Promise<Readonly<{
1566
- byteLength: number;
1567
- digest: Sha256Digest | null;
1568
- }> | null>;
1569
- }>;
2869
+ function r2FileSource(bucket, prefix): FileSource;
1570
2870
  ```
1571
2871
 
1572
- Store Release artifacts in an R2 bucket.
2872
+ Files in an R2 bucket under `prefix` (one workspace per prefix).
1573
2873
 
1574
2874
  #### Parameters
1575
2875
 
1576
2876
  | Parameter | Type |
1577
2877
  | --------- | ---------- |
1578
2878
  | `bucket` | `R2Bucket` |
2879
+ | `prefix` | `string` |
1579
2880
 
1580
2881
  #### Returns
1581
2882
 
1582
- `Readonly`\<\{ `get`: (`artifactRef`) =>
1583
- `Promise`\<`Uint8Array`\<`ArrayBufferLike`\> \| `null`\>; `put`: (`artifactRef`,
1584
- `bytes`) => `Promise`\<`void`\>; \}\> & `Readonly`\<\{ `head`: (`artifactRef`)
1585
- => `Promise`\< \| `Readonly`\<\{ `byteLength`: `number`; `digest`:
1586
- `Sha256Digest` \| `null`; \}\> \| `null`\>; \}\>
2883
+ [`FileSource`](files.md#filesource)
1587
2884
 
1588
2885
  ---
1589
2886
 
@@ -1599,9 +2896,9 @@ which serves it from the same table.
1599
2896
 
1600
2897
  #### Type Parameters
1601
2898
 
1602
- | Type Parameter |
1603
- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1604
- | `Env` _extends_ `Readonly`\<\{ `OYSTER_OWNER_KEY`: `string`; `OYSTER_OWNER_NAME?`: `string`; `AGENT_DIRECTORY?`: `Readonly`\<\{ `getByName`: `Readonly`\<\{ `readCreator`: `Promise`\<`string` \| `null`\>; \}\>; \}\>; `OYSTER_ORIGIN`: `string`; `MCP`: `DurableObjectNamespace`\<[`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{ `LOADER`: `WorkerLoader`; \}\>\>\>; `RELEASES`: `R2Bucket`; `REGISTRY`: `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\>; `INSTANCES`: `DurableObjectNamespace`\<[`OysterInstance`](#oysterinstance)\<`Readonly`\<\{ OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined; AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<\{ readCreator(agentId: string): Promise\<string \| null\>; \}\>; \}\> \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`: `WorkerLoader`; \}\> |
2899
+ | Type Parameter |
2900
+ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2901
+ | `Env` _extends_ `Readonly`\<\{ `BROWSER?`: `Readonly`\<\{ `fetch`: [`HttpFetch`](browser.md#httpfetch); \}\>; `OYSTER_OWNER_KEY`: `string`; `OYSTER_OWNER_NAME?`: `string`; `AGENT_DIRECTORY?`: `Readonly`\<\{ `getByName`: `Readonly`\<\{ `readCreator`: `Promise`\<`string` \| `null`\>; \}\>; \}\>; `OYSTER_ORIGIN`: `string`; `MCP`: `DurableObjectNamespace`\<[`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{ `LOADER`: `WorkerLoader`; \}\>\>\>; `RELEASES`: `R2Bucket`; `REGISTRY`: `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\<`Readonly`\<\{ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined; OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined; AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\> \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `INSTANCES`: `DurableObjectNamespace`\<[`OysterInstance`](#oysterinstance)\<`Readonly`\<\{ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined; OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined; AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\> \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`: `WorkerLoader`; \}\> |
1605
2902
 
1606
2903
  #### Parameters
1607
2904
 
@@ -1615,21 +2912,48 @@ _typeof_ `WorkerEntrypoint`
1615
2912
 
1616
2913
  ---
1617
2914
 
2915
+ ### serveOysterBootCapability()
2916
+
2917
+ ```ts
2918
+ function serveOysterBootCapability(
2919
+ request,
2920
+ env,
2921
+ scope,
2922
+ ): Promise<Response | null>;
2923
+ ```
2924
+
2925
+ Resolve a scoped boot URL through the registry-backed HTTPS asset route.
2926
+
2927
+ #### Parameters
2928
+
2929
+ | Parameter | Type |
2930
+ | --------- | -------------------------------------- |
2931
+ | `request` | `Request` |
2932
+ | `env` | [`OysterWorkerEnv`](#oysterworkerenv) |
2933
+ | `scope` | [`TenantScope`](tenant.md#tenantscope) |
2934
+
2935
+ #### Returns
2936
+
2937
+ `Promise`\<`Response` \| `null`\>
2938
+
2939
+ ---
2940
+
1618
2941
  ### oysterWorkerHost()
1619
2942
 
1620
2943
  ```ts
1621
2944
  function oysterWorkerHost(env, auth, options?): OysterHost;
1622
2945
  ```
1623
2946
 
1624
- Host adapters for a standalone Oyster Worker over its own bindings.
2947
+ Create an Oyster host backed by this Worker environment's registry, artifacts,
2948
+ Instances, and boot-check service.
1625
2949
 
1626
2950
  #### Parameters
1627
2951
 
1628
- | Parameter | Type |
1629
- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1630
- | `env` | [`OysterWorkerEnv`](#oysterworkerenv) |
1631
- | `auth` | [`OysterAuth`](host.md#oysterauth) |
1632
- | `options` | `Pick`\<`Readonly`\<\{ `auth`: [`OysterAuth`](host.md#oysterauth); `backgroundOriginKey?`: () => `Promise`\<`CryptoKey`\>; `artifacts`: [`ArtifactStore`](host.md#artifactstore); `installations`: [`InstallationStore`](host.md#installationstore); `instances`: [`InstanceDirectory`](host.md#instancedirectory); `computerId?`: `string`; `computer?`: (`principal`) => \| `Readonly`\<\{ `getCapabilities`: (`signal`) => `Promise`\<...\>; `call`: (`capabilityId`, `input`, `context`) => `Promise`\<...\>; \}\> \| `Promise`\< \| `Readonly`\<\{ `getCapabilities`: ...; `call`: ...; \}\> \| `null`\> \| `null`; `appToolPolicy?`: (`actor`) => \| \{ `level`: `"read"` \| `"write"`; `revision`: `string`; `grantedBy`: `string`; \} \| `Promise`\< \| \{ `level`: ... \| ...; `revision`: `string`; `grantedBy`: `string`; \} \| `null`\> \| `null`; `keys?`: `Readonly`\<\{ `live`: `Promise`\< \| `Readonly`\<\{ `keyId`: ...; `owner`: ...; `grantVersion`: ...; `grants`: ...; \}\> \| `null`\>; \}\>; `guestLimits?`: `Partial`\<`Readonly`\<\{ `cpuMs`: `number`; `subRequests`: `number`; \}\>\>; `mcp?`: `Readonly`\<\{ `handleRequest`: (`request`) => `Promise`\<`Response`\>; `close?`: () => `Promise`\<`void`\>; \}\>; `git?`: `Readonly`\<\{ `writerOf`: `Extract`\<`GitWriter`, \{ `kind`: `"actor"`; \}\>; `workflowPass?`: `Promise`\< \| `Readonly`\<\{ `kind`: ...; `actor`: ...; `role?`: ...; `workflow?`: ...; \}\> \| `null`\>; `buildPass?`: `Promise`\< \| `Readonly`\<\{ `kind`: ...; `actor`: ...; `role?`: ...; `workflow?`: ...; \}\> \| `null`\>; `git`: `Promise`\<`Readonly`\<\{ `push`: `Promise`\<...\>; `read`: `Promise`\<...\>; `binding`: `GitBinding`; \}\>\>; \}\>; `ownerRoutes?`: `Hono`\<[`OysterEnv`](host.md#oysterenv), `BlankSchema`, `"/"`\>; `capabilities?`: readonly `Readonly`\<`object` & `object`\>[]; `workbench?`: `Readonly`\<\{ `directory`: `Promise`\<`Readonly`\<\{ `apps`: readonly ...[]; `roles`: [`OysterRootRoles`](root-data.md#oysterrootroles); `computer?`: ... \| ...; \}\>\>; `storage`: `Pick`\<`AppStorageWire`, `"read"` \| `"write"` \| `"reset"`\> & `Readonly`\<\{ `events`: `Promise`\<...\>; \}\>; \}\>; `homeInstallationId?`: `string`; `pageScript?`: `string`; `title?`: `string`; \}\>, `"appToolPolicy"` \| `"guestLimits"`\> & `Readonly`\<\{ `workspace?`: `Readonly`\<\{ `computerId`: `string`; `files`: [`FileSource`](files.md#filesource); `computer?`: (`principal`) => \| `Readonly`\<\{ `getCapabilities`: ...; `call`: ...; \}\> \| `Promise`\<... \| ...\> \| `null`; \}\>; `scope?`: `Readonly`\<\{ `tenantId`: `string` & `Brand`\<`"OysterTenantId"`\>; `origin`: `string`; `durableName`: `string`; `computerName`: `string`; `workspacePrefix`: `string`; `repositoryPrefix`: `string`; \}\>; \}\> |
2952
+ | Parameter | Type |
2953
+ | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2954
+ | `env` | [`OysterWorkerEnv`](#oysterworkerenv) |
2955
+ | `auth` | [`OysterAuth`](host.md#oysterauth) |
2956
+ | `options` | `Pick`\<`Readonly`\<\{ `approvals?`: `Readonly`\<\{ `submit`: `Promise`\< \| \{ `kind`: `"pending_approval"`; `recordId`: `string`; `description`: \{ `title`: ...; `inputBytes`: ...; `inputSha256`: ...; \}; \} \| `ApprovalApplyResult`\>; \}\>; `workflows?`: (`principal`) => `Promise`\< \| `Readonly`\<\{ `status`: `Promise`\<...\>; `cancel`: `Promise`\<...\>; \}\> \| `null`\>; `auth`: [`OysterAuth`](host.md#oysterauth); `backgroundOriginKey?`: () => `Promise`\<`CryptoKey`\>; `artifacts`: [`ArtifactStore`](host.md#artifactstore); `installations`: [`InstallationStore`](host.md#installationstore); `instances`: [`InstanceDirectory`](host.md#instancedirectory); `bootUi`: (`release`) => `Promise`\< \| \{ `kind`: `"passed"`; \} \| \{ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{ `failedPredicate`: ... \| ... \| ... \| ... \| ...; `errorName?`: ... \| ... \| ... \| ... \| ... \| ... \| ... \| ...; `finalUrlPath`: `string`; `consoleErrors`: ...[]; `pageErrors`: ...[]; `failedRequests`: ...[]; `droppedCount`: `number`; \}; \} \| \{ `kind`: `"not_checked"`; `code`: \| `"boot_runner_unavailable"` \| `"boot_browser_binding_missing"` \| `"boot_clone_unavailable"` \| `"boot_timeout"` \| `"boot_cleanup_failed"` \| `"ui_check_not_run_on_host"`; \}\>; `computerId?`: `string`; `computer?`: (`principal`) => \| `Readonly`\<\{ `getCapabilities`: (`signal`) => `Promise`\<...\>; `call`: (`capabilityId`, `input`, `context`) => `Promise`\<...\>; \}\> \| `Promise`\< \| `Readonly`\<\{ `getCapabilities`: ...; `call`: ...; \}\> \| `null`\> \| `null`; `appToolPolicy?`: (`actor`) => \| \{ `level`: `"read"` \| `"write"`; `revision`: `string`; `grantedBy`: `string`; \} \| `Promise`\< \| \{ `level`: ... \| ...; `revision`: `string`; `grantedBy`: `string`; \} \| `null`\> \| `null`; `keys?`: `Readonly`\<\{ `live`: `Promise`\< \| `Readonly`\<\{ `keyId`: ...; `owner`: ...; `grantVersion`: ...; `grants`: ...; \}\> \| `null`\>; \}\>; `guestLimits?`: `Partial`\<`Readonly`\<\{ `cpuMs`: `number`; `subRequests`: `number`; \}\>\>; `mcp?`: `Readonly`\<\{ `handleRequest`: (`request`) => `Promise`\<`Response`\>; `close?`: () => `Promise`\<`void`\>; \}\>; `git?`: `Readonly`\<\{ `writerOf`: `Extract`\<`GitWriter`, \{ `kind`: `"actor"`; \}\>; `workflowPass?`: `Promise`\< \| `Readonly`\<\{ `kind`: ...; `actor`: ...; `role?`: ...; `workflow?`: ...; \}\> \| `null`\>; `buildPass?`: `Promise`\< \| `Readonly`\<\{ `kind`: ...; `actor`: ...; `role?`: ...; `workflow?`: ...; \}\> \| `null`\>; `git`: `Promise`\<`Readonly`\<\{ `push`: `Promise`\<...\>; `read`: `Promise`\<...\>; `binding`: `GitBinding`; \}\>\>; \}\>; `ownerRoutes?`: `Hono`\<[`OysterEnv`](host.md#oysterenv), `BlankSchema`, `"/"`\>; `capabilities?`: readonly `Readonly`\<`object` & `object`\>[]; `workbench?`: `Readonly`\<\{ `directory`: `Promise`\<`Readonly`\<\{ `apps`: readonly ...[]; `roles`: [`OysterRootRoles`](root-data.md#oysterrootroles); `computer?`: ... \| ...; \}\>\>; `storage`: `Pick`\<`AppStorageWire`, `"read"` \| `"write"` \| `"reset"`\> & `Readonly`\<\{ `events`: `Promise`\<...\>; \}\>; \}\>; `homeInstallationId?`: `string`; `pageScript?`: `string`; `pageAssets?`: () => `Promise`\<\{ `pageScript`: `string`; `publicHomeScript`: `string`; `fontStyles`: `string`; `loginFontStyles`: `string`; `shellStyles`: `string`; `grantConsentScript`: `string`; \}\>; `title?`: `string`; \}\>, `"appToolPolicy"` \| `"guestLimits"`\> & `Readonly`\<\{ `workspace?`: `Readonly`\<\{ `computerId`: `string`; `files`: [`FileSource`](files.md#filesource); `computer?`: (`principal`) => \| `Readonly`\<\{ `getCapabilities`: ...; `call`: ...; \}\> \| `Promise`\<... \| ...\> \| `null`; \}\>; `scope?`: `Readonly`\<\{ `tenantId`: `string` & `Brand`\<`"OysterTenantId"`\>; `origin`: `string`; `durableName`: `string`; `computerName`: `string`; `workspacePrefix`: `string`; `repositoryPrefix`: `string`; \}\>; \}\> |
1633
2957
 
1634
2958
  #### Returns
1635
2959
 
@@ -1641,6 +2965,9 @@ Host adapters for a standalone Oyster Worker over its own bindings.
1641
2965
 
1642
2966
  ```ts
1643
2967
  function createOysterWorker(options?): ExportedHandler<Readonly<{
2968
+ BROWSER?: Readonly<{
2969
+ fetch: HttpFetch;
2970
+ }>;
1644
2971
  OYSTER_OWNER_KEY: string;
1645
2972
  OYSTER_OWNER_NAME?: string;
1646
2973
  AGENT_DIRECTORY?: Readonly<{
@@ -1653,8 +2980,8 @@ function createOysterWorker(options?): ExportedHandler<Readonly<{
1653
2980
  LOADER: WorkerLoader;
1654
2981
  }>>>;
1655
2982
  RELEASES: R2Bucket;
1656
- REGISTRY: DurableObjectNamespace<OysterRegistry>;
1657
- INSTANCES: DurableObjectNamespace<OysterInstance<Readonly<{ OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<{ readCreator(agentId: string): Promise<string | null>; }>; }> | undefined; ... 5 more ...; LOADER: WorkerLoader; }>>>;
2983
+ REGISTRY: DurableObjectNamespace<OysterRegistry<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<...>; }> | undefined; ... 5 more ...; LOADER: WorkerLoader; }>>>;
2984
+ INSTANCES: DurableObjectNamespace<OysterInstance<Readonly<{ BROWSER?: Readonly<{ fetch: HttpFetch; }> | undefined; OYSTER_OWNER_KEY: string; OYSTER_OWNER_NAME?: string | undefined; AGENT_DIRECTORY?: Readonly<{ getByName(name: string): Readonly<...>; }> | undefined; ... 5 more ...; LOADER: WorkerLoader; }>>>;
1658
2985
  LOADER: WorkerLoader;
1659
2986
  }>>;
1660
2987
  ```
@@ -1670,22 +2997,32 @@ transports belong to the tenant Durable Object, independent of that cache.
1670
2997
 
1671
2998
  #### Returns
1672
2999
 
1673
- `ExportedHandler`\<`Readonly`\<\{ `OYSTER_OWNER_KEY`: `string`;
3000
+ `ExportedHandler`\<`Readonly`\<\{ `BROWSER?`: `Readonly`\<\{ `fetch`:
3001
+ [`HttpFetch`](browser.md#httpfetch); \}\>; `OYSTER_OWNER_KEY`: `string`;
1674
3002
  `OYSTER_OWNER_NAME?`: `string`; `AGENT_DIRECTORY?`: `Readonly`\<\{ `getByName`:
1675
3003
  `Readonly`\<\{ `readCreator`: `Promise`\<`string` \| `null`\>; \}\>; \}\>;
1676
3004
  `OYSTER_ORIGIN`: `string`; `MCP`:
1677
3005
  `DurableObjectNamespace`\<[`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{
1678
3006
  `LOADER`: `WorkerLoader`; \}\>\>\>; `RELEASES`: `R2Bucket`; `REGISTRY`:
1679
- `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\>; `INSTANCES`:
3007
+ `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\<`Readonly`\<\{
3008
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined; OYSTER\_OWNER\_KEY:
3009
+ string; OYSTER\_OWNER\_NAME?: string \| undefined; AGENT\_DIRECTORY?:
3010
+ Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\> \| undefined; ... 5
3011
+ more ...; LOADER: WorkerLoader; \}\>\>\>; `INSTANCES`:
1680
3012
  `DurableObjectNamespace`\<[`OysterInstance`](#oysterinstance)\<`Readonly`\<\{
1681
- OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined;
1682
- AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<\{
1683
- readCreator(agentId: string): Promise\<string \| null\>; \}\>; \}\> \|
1684
- undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`:
1685
- `WorkerLoader`; \}\>\>
3013
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined; OYSTER\_OWNER\_KEY:
3014
+ string; OYSTER\_OWNER\_NAME?: string \| undefined; AGENT\_DIRECTORY?:
3015
+ Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\> \| undefined; ... 5
3016
+ more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`: `WorkerLoader`; \}\>\>
1686
3017
 
1687
3018
  ## References
1688
3019
 
3020
+ ### r2ArtifactStore
3021
+
3022
+ Re-exports [r2ArtifactStore](cloudflare.md#r2artifactstore)
3023
+
3024
+ ---
3025
+
1689
3026
  ### ownerKeyAuth
1690
3027
 
1691
3028
  Re-exports [ownerKeyAuth](auth.md#ownerkeyauth)