@fungi.computer/oyster 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/README.md +396 -72
  2. package/dist/agents.d.ts +3 -2
  3. package/dist/agents.js +4 -2
  4. package/dist/app-builds.d.ts +81 -8
  5. package/dist/app-builds.js +213 -60
  6. package/dist/app-storage.d.ts +3 -3
  7. package/dist/approval-capability.d.ts +5 -0
  8. package/dist/approval-capability.js +46 -0
  9. package/dist/approval-home.d.ts +51 -0
  10. package/dist/approval-home.js +226 -0
  11. package/dist/apps/catalog.d.ts +335 -0
  12. package/dist/apps/catalog.js +46 -0
  13. package/dist/apps/gate.d.ts +20 -6
  14. package/dist/apps/gate.js +42 -16
  15. package/dist/apps/index.d.ts +3 -1
  16. package/dist/apps/index.js +3 -1
  17. package/dist/apps/installation.d.ts +132 -51
  18. package/dist/apps/installation.js +176 -70
  19. package/dist/apps/permissions.d.ts +247 -0
  20. package/dist/apps/permissions.js +255 -0
  21. package/dist/boot-capability-route.d.ts +15 -0
  22. package/dist/boot-capability-route.js +196 -0
  23. package/dist/boot-capability.d.ts +103 -0
  24. package/dist/boot-capability.js +141 -0
  25. package/dist/boot-construction.d.ts +12 -0
  26. package/dist/boot-construction.js +175 -0
  27. package/dist/boot-gate.d.ts +267 -0
  28. package/dist/boot-gate.js +236 -0
  29. package/dist/boot-host-script.d.ts +2 -0
  30. package/dist/boot-host-script.js +1 -0
  31. package/dist/boot-mount.d.ts +21 -0
  32. package/dist/boot-mount.js +65 -0
  33. package/dist/browser/boot.d.ts +73 -0
  34. package/dist/browser/boot.js +502 -0
  35. package/dist/browser/browser.d.ts +104 -0
  36. package/dist/browser/browser.js +374 -0
  37. package/dist/browser/capability-source.d.ts +76 -0
  38. package/dist/browser/capability-source.js +338 -0
  39. package/dist/browser/cdp-client.d.ts +56 -0
  40. package/dist/browser/cdp-client.js +184 -0
  41. package/dist/browser/errors.d.ts +79 -0
  42. package/dist/browser/errors.js +32 -0
  43. package/dist/browser/index.d.ts +16 -0
  44. package/dist/browser/index.js +14 -0
  45. package/dist/browser/lease-registry.d.ts +61 -0
  46. package/dist/browser/lease-registry.js +101 -0
  47. package/dist/browser/operations.d.ts +225 -0
  48. package/dist/browser/operations.js +137 -0
  49. package/dist/browser/page.d.ts +25 -0
  50. package/dist/browser/page.js +172 -0
  51. package/dist/browser/quick-reads.d.ts +29 -0
  52. package/dist/browser/quick-reads.js +160 -0
  53. package/dist/browser/sessions.d.ts +52 -0
  54. package/dist/browser/sessions.js +118 -0
  55. package/dist/browser/url-policy.d.ts +18 -0
  56. package/dist/browser/url-policy.js +58 -0
  57. package/dist/build/app-imports.d.ts +12 -0
  58. package/dist/build/app-imports.js +105 -0
  59. package/dist/build/build-policy.d.ts +5 -3
  60. package/dist/build/build-policy.js +5 -3
  61. package/dist/build/candidate-builder.d.ts +1 -1
  62. package/dist/build/candidate-cli.mjs +8375 -334
  63. package/dist/build/local-build.d.ts +2 -0
  64. package/dist/build/local-build.js +28 -6
  65. package/dist/build/snapshot-package-store.d.ts +1 -1
  66. package/dist/build/snapshot-package-store.js +7 -2
  67. package/dist/build/workspace-build.d.ts +92 -5
  68. package/dist/build/workspace-build.js +93 -19
  69. package/dist/build.d.ts +1 -1
  70. package/dist/build.js +1 -1
  71. package/dist/catalog-frame.js +1 -1
  72. package/dist/cloudflare.d.ts +13 -3
  73. package/dist/cloudflare.js +102 -4
  74. package/dist/frame-binding-wire-script.js +1 -1
  75. package/dist/frame-binding-wire.js +4 -2
  76. package/dist/git-auth.d.ts +0 -2
  77. package/dist/git-auth.js +0 -2
  78. package/dist/git.d.ts +0 -1
  79. package/dist/git.js +0 -2
  80. package/dist/host.d.ts +39 -13
  81. package/dist/host.js +268 -142
  82. package/dist/index.d.ts +25 -15
  83. package/dist/index.js +39 -16
  84. package/dist/install-release-cli.d.ts +2 -0
  85. package/dist/install-release-cli.js +46 -0
  86. package/dist/installation-client.d.ts +43 -0
  87. package/dist/installation-client.js +178 -0
  88. package/dist/installation-execution.d.ts +11 -0
  89. package/dist/installation-execution.js +184 -0
  90. package/dist/installation-operations.d.ts +1437 -0
  91. package/dist/installation-operations.js +664 -0
  92. package/dist/installation-store-generation.d.ts +3 -0
  93. package/dist/installation-store-generation.js +16 -0
  94. package/dist/instance-id.d.ts +10 -0
  95. package/dist/instance-id.js +10 -0
  96. package/dist/instance-refusal.d.ts +11 -0
  97. package/dist/instance-refusal.js +21 -0
  98. package/dist/internal/delivery.js +4 -2
  99. package/dist/internal/host-gate.js +7 -1
  100. package/dist/internal/registry-installations.js +4 -4
  101. package/dist/keys.d.ts +5 -1
  102. package/dist/keys.js +10 -2
  103. package/dist/machine-link/authority.d.ts +89 -0
  104. package/dist/machine-link/authority.js +37 -0
  105. package/dist/machine-link/client.d.ts +66 -0
  106. package/dist/machine-link/client.js +94 -0
  107. package/dist/machine-link/delivery.d.ts +18 -0
  108. package/dist/machine-link/delivery.js +55 -0
  109. package/dist/machine-link/enrollment.d.ts +111 -0
  110. package/dist/machine-link/enrollment.js +286 -0
  111. package/dist/machine-link/fences.d.ts +37 -0
  112. package/dist/machine-link/fences.js +166 -0
  113. package/dist/machine-link/home.d.ts +20 -0
  114. package/dist/machine-link/home.js +24 -0
  115. package/dist/machine-link/host.d.ts +43 -0
  116. package/dist/machine-link/host.js +189 -0
  117. package/dist/machine-link/index.d.ts +15 -0
  118. package/dist/machine-link/index.js +15 -0
  119. package/dist/machine-link/link.d.ts +48 -0
  120. package/dist/machine-link/link.js +223 -0
  121. package/dist/machine-link/presence.d.ts +10 -0
  122. package/dist/machine-link/presence.js +25 -0
  123. package/dist/machine-link/workers.d.ts +6 -0
  124. package/dist/machine-link/workers.js +6 -0
  125. package/dist/mcp-owner.d.ts +2 -2
  126. package/dist/mcp-owner.js +41 -33
  127. package/dist/mcp.d.ts +15 -3
  128. package/dist/mcp.js +146 -25
  129. package/dist/older-oyster-store-refusal.d.ts +4 -0
  130. package/dist/older-oyster-store-refusal.js +18 -0
  131. package/dist/older-oyster-store.d.ts +21 -0
  132. package/dist/older-oyster-store.js +43 -0
  133. package/dist/pack.d.ts +14 -3
  134. package/dist/pack.js +44 -19
  135. package/dist/page/app-access.d.ts +7 -0
  136. package/dist/page/app-access.js +75 -0
  137. package/dist/page/boot-host.js +57 -0
  138. package/dist/page/capabilities.d.ts +3 -3
  139. package/dist/page/capabilities.js +16 -12
  140. package/dist/page/computer-handles.d.ts +3 -3
  141. package/dist/page/computer-target.d.ts +3 -0
  142. package/dist/page/computer-target.js +9 -0
  143. package/dist/page/mount.d.ts +23 -3
  144. package/dist/page/mount.js +152 -16
  145. package/dist/page-assets.d.ts +22 -0
  146. package/dist/page-assets.js +28 -0
  147. package/dist/page-script.d.ts +3 -0
  148. package/dist/page-script.js +5 -4
  149. package/dist/release.d.ts +13 -6
  150. package/dist/release.js +10 -7
  151. package/dist/root-data.d.ts +16 -6
  152. package/dist/root-data.js +2 -2
  153. package/dist/source/index.d.ts +1 -1
  154. package/dist/source/team-source.d.ts +20 -8
  155. package/dist/source/team-source.js +39 -10
  156. package/dist/source/template-seed.d.ts +2 -2
  157. package/dist/standalone/agent-mail.d.ts +24 -0
  158. package/dist/standalone/agent-mail.js +62 -0
  159. package/dist/standalone/agent-store.d.ts +9 -0
  160. package/dist/standalone/agent-store.js +30 -0
  161. package/dist/standalone/agents.d.ts +68 -9
  162. package/dist/standalone/agents.js +428 -56
  163. package/dist/standalone/app-builds-binding.d.ts +20 -2
  164. package/dist/standalone/app-builds-binding.js +147 -23
  165. package/dist/standalone/app-set.d.ts +5 -2
  166. package/dist/standalone/app-set.js +186 -144
  167. package/dist/standalone/browser.d.ts +11 -0
  168. package/dist/standalone/browser.js +72 -0
  169. package/dist/standalone/builds.d.ts +13 -4
  170. package/dist/standalone/builds.js +28 -44
  171. package/dist/standalone/computer-egress.d.ts +2 -0
  172. package/dist/standalone/computer-egress.js +13 -4
  173. package/dist/standalone/computer-fleet.d.ts +43 -0
  174. package/dist/standalone/computer-fleet.js +200 -0
  175. package/dist/standalone/computer.d.ts +44 -9
  176. package/dist/standalone/computer.js +129 -22
  177. package/dist/standalone/install-apps-cli.js +43 -6
  178. package/dist/standalone/instance.d.ts +2 -2
  179. package/dist/standalone/instance.js +8 -11
  180. package/dist/standalone/machine-link.d.ts +354 -0
  181. package/dist/standalone/machine-link.js +368 -0
  182. package/dist/standalone/media.d.ts +2 -2
  183. package/dist/standalone/media.js +19 -16
  184. package/dist/standalone/preview.d.ts +2 -2
  185. package/dist/standalone/preview.js +37 -10
  186. package/dist/standalone/registry.d.ts +151 -9
  187. package/dist/standalone/registry.js +305 -8
  188. package/dist/standalone/worker.d.ts +19 -5
  189. package/dist/standalone/worker.js +90 -54
  190. package/dist/standalone/workflow-binding.d.ts +18 -22
  191. package/dist/standalone/workflow-binding.js +18 -18
  192. package/dist/standalone/workflow-control.d.ts +4 -0
  193. package/dist/standalone/workflow-control.js +40 -0
  194. package/dist/standalone/workflow-events.d.ts +2 -2
  195. package/dist/standalone/workflow-events.js +9 -10
  196. package/dist/standalone/workflow-git-capture.js +4 -3
  197. package/dist/standalone/workflow-host.d.ts +162 -161
  198. package/dist/standalone/workflow-host.js +101 -21
  199. package/dist/standalone/workflow-node-capture.js +11 -4
  200. package/dist/standalone/workflow-schedules.d.ts +5 -2
  201. package/dist/standalone/workflow-schedules.js +9 -10
  202. package/dist/standalone/workflow-trigger-host.d.ts +65 -5
  203. package/dist/standalone/workflow-trigger-host.js +2 -2
  204. package/dist/standalone/workflow-webhooks.d.ts +22 -0
  205. package/dist/standalone/workflow-webhooks.js +39 -0
  206. package/dist/standalone/workflows.d.ts +140 -43
  207. package/dist/standalone/workflows.js +198 -39
  208. package/dist/storage-frame.d.ts +6 -6
  209. package/dist/testing/capabilities.js +14 -3
  210. package/dist/testing/installation.js +26 -2
  211. package/dist/testing/worker.js +1 -1
  212. package/dist/testing/workers-runtime.d.ts +8 -2
  213. package/dist/testing/workers-runtime.js +20 -2
  214. package/dist/webhook-abuse.d.ts +25 -0
  215. package/dist/webhook-abuse.js +54 -0
  216. package/dist/webhook-custody.d.ts +144 -0
  217. package/dist/webhook-custody.js +222 -0
  218. package/dist/webhook-ingress.d.ts +36 -0
  219. package/dist/webhook-ingress.js +146 -0
  220. package/dist/webhooks.d.ts +111 -0
  221. package/dist/webhooks.js +189 -0
  222. package/dist/workers-git.d.ts +12 -17
  223. package/dist/workers-git.js +64 -52
  224. package/dist/workers.d.ts +226 -13
  225. package/dist/workers.js +363 -51
  226. package/dist/workflow-agent-authority.d.ts +8 -0
  227. package/dist/workflow-agent-authority.js +42 -0
  228. package/dist/workflows.d.ts +66 -0
  229. package/dist/workflows.js +97 -0
  230. package/docs/api/README.md +63 -37
  231. package/docs/api/agents.md +17 -0
  232. package/docs/api/app-storage.md +1 -1
  233. package/docs/api/apps.md +1394 -543
  234. package/docs/api/browser/boot.md +132 -0
  235. package/docs/api/browser.md +1440 -0
  236. package/docs/api/build-contract.md +38 -25
  237. package/docs/api/build.md +263 -84
  238. package/docs/api/cloudflare.md +93 -7
  239. package/docs/api/git.md +3 -13
  240. package/docs/api/host.md +944 -118
  241. package/docs/api/index.md +320 -18
  242. package/docs/api/keys.md +24 -1
  243. package/docs/api/mcp.md +59 -12
  244. package/docs/api/modules.md +33 -40
  245. package/docs/api/pack.md +57 -8
  246. package/docs/api/page/mount.md +92 -4
  247. package/docs/api/workers-git.md +103 -24
  248. package/docs/api/workers.md +1594 -244
  249. package/docs/site/agent-quickstart.mdx +28 -14
  250. package/examples/standalone/worker.ts +3 -1
  251. package/examples/standalone/wrangler.jsonc +2 -0
  252. package/package.json +73 -71
  253. package/dist/installation-consent.d.ts +0 -81
  254. package/dist/installation-consent.js +0 -84
  255. package/dist/shell/app-directory.d.ts +0 -542
  256. package/dist/shell/app-directory.js +0 -196
  257. package/dist/shell/browser-actions.d.ts +0 -7
  258. package/dist/shell/browser-actions.js +0 -56
  259. package/dist/shell/command-host.d.ts +0 -112
  260. package/dist/shell/command-host.js +0 -502
  261. package/dist/shell/commands.d.ts +0 -25
  262. package/dist/shell/commands.js +0 -78
  263. package/dist/shell/index.d.ts +0 -8
  264. package/dist/shell/index.js +0 -8
  265. package/dist/shell/keys.d.ts +0 -41
  266. package/dist/shell/keys.js +0 -134
  267. package/dist/shell/shell-module.d.ts +0 -55
  268. package/dist/shell/shell-module.js +0 -86
  269. package/dist/shell/window-manager.d.ts +0 -128
  270. package/dist/shell/window-manager.js +0 -730
  271. package/dist/shell/workbench-contract.d.ts +0 -68
  272. package/dist/shell/workbench-directory.d.ts +0 -332
  273. package/dist/shell/workbench-directory.js +0 -35
  274. package/dist/shell/workbench-host-types.d.ts +0 -96
  275. package/dist/shell/workbench-host-types.js +0 -1
  276. package/dist/shell/workbench-host.d.ts +0 -34
  277. package/dist/shell/workbench-host.js +0 -352
  278. package/dist/shell/workbench-model.d.ts +0 -194
  279. package/dist/shell/workbench-model.js +0 -53
  280. package/dist/shell/workbench.d.ts +0 -4
  281. package/dist/shell/workbench.js +0 -2
  282. package/docs/api/shell/app-directory.md +0 -599
  283. package/docs/api/shell/command-host.md +0 -224
  284. package/docs/api/shell/commands.md +0 -197
  285. package/docs/api/shell/keys.md +0 -183
  286. package/docs/api/shell/shell-module.md +0 -204
  287. package/docs/api/shell/window-manager.md +0 -267
  288. package/docs/api/shell/workbench-directory.md +0 -119
  289. package/docs/api/shell/workbench.md +0 -205
  290. package/docs/api/shell.md +0 -1915
  291. /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
@@ -305,6 +1188,19 @@ Open the existing App-storage invalidation stream under fresh owner admission.
305
1188
 
306
1189
  `Promise`\<`Response`\>
307
1190
 
1191
+ ##### storeFromOlderOyster()
1192
+
1193
+ ```ts
1194
+ storeFromOlderOyster(): boolean;
1195
+ ```
1196
+
1197
+ Whether this registry's data was written by Oyster 0.2 or earlier; hosts refuse
1198
+ it.
1199
+
1200
+ ###### Returns
1201
+
1202
+ `boolean`
1203
+
308
1204
  ##### list()
309
1205
 
310
1206
  ```ts
@@ -326,63 +1222,67 @@ list(): Readonly<{
326
1222
  };
327
1223
  };
328
1224
  releasePin: "pinned" | "floating";
329
- authorityVersion: number;
1225
+ authority: {
1226
+ authorityVersion: number;
1227
+ declaredOperationsDigest: Sha256Digest;
1228
+ approvedGrants: readonly Readonly<{
1229
+ capability: | "approvals"
1230
+ | "agent.list"
1231
+ | "agent.manage"
1232
+ | "agent.rename"
1233
+ | "agent.avatar"
1234
+ | "agent.toolPolicy"
1235
+ | "agent.read"
1236
+ | "agent.send"
1237
+ | "computer.list"
1238
+ | "computer.readFile"
1239
+ | "computer.writeFile"
1240
+ | "computer.execute"
1241
+ | "llm.generation"
1242
+ | "media.generation"
1243
+ | "games:servers"
1244
+ | "git.repository"
1245
+ | "apps.open"
1246
+ | "apps.call"
1247
+ | "app.storage"
1248
+ | "app.events.emit"
1249
+ | "team.workbenchHost"
1250
+ | "marketplace.browse"
1251
+ | "marketplace.purchase"
1252
+ | "workflow.run"
1253
+ | "workflow.publish"
1254
+ | "workflow.arm"
1255
+ | "world"
1256
+ | "channels.read"
1257
+ | "channels.personal.manage";
1258
+ capabilityApproved: true;
1259
+ operations: readonly string[];
1260
+ resources: | "tenant-scope"
1261
+ | readonly Readonly<{
1262
+ kind: ...;
1263
+ id: ...;
1264
+ }>[];
1265
+ }>[];
1266
+ approval: | Readonly<{
1267
+ by: | {
1268
+ kind: "member";
1269
+ memberId: string;
1270
+ }
1271
+ | {
1272
+ kind: "agent";
1273
+ agentId: string;
1274
+ }
1275
+ | {
1276
+ kind: "team-key";
1277
+ keyId: string;
1278
+ };
1279
+ at: number;
1280
+ authorityVersion: number;
1281
+ }>
1282
+ | null;
1283
+ };
330
1284
  status: "enabled" | "disabled" | "deleted";
331
1285
  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
1286
  approvedAnonymousMethods: readonly Readonly<{
387
1287
  name: string;
388
1288
  digest: Sha256Digest;
@@ -417,28 +1317,30 @@ Every installation record.
417
1317
  `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`: \{
418
1318
  `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
419
1319
  `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `releasePin`: `"pinned"` \|
420
- `"floating"`; `authorityVersion`: `number`; `status`: `"enabled"` \|
421
- `"disabled"` \| `"deleted"`; `visibility`: `"private"` \| `"public"`;
1320
+ `"floating"`; `authority`: \{ `authorityVersion`: `number`;
422
1321
  `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"` \|
1322
+ `Readonly`\<\{ `capability`: \| `"approvals"` \| `"agent.list"` \|
1323
+ `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"`
1324
+ \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \|
1325
+ `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \|
1326
+ `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \|
1327
+ `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \|
1328
+ `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \|
1329
+ `"marketplace.purchase"` \| `"workflow.run"` \| `"workflow.publish"` \|
1330
+ `"workflow.arm"` \| `"world"` \| `"channels.read"` \|
431
1331
  `"channels.personal.manage"`; `capabilityApproved`: `true`; `operations`:
432
1332
  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`:
1333
+ `kind`: ...; `id`: ...; \}\>[]; \}\>[]; `approval`: \| `Readonly`\<\{ `by`: \|
1334
+ \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`;
1335
+ `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`:
1336
+ `number`; `authorityVersion`: `number`; \}\> \| `null`; \}; `status`:
1337
+ `"enabled"` \| `"disabled"` \| `"deleted"`; `visibility`: `"private"` \|
1338
+ `"public"`; `approvedAnonymousMethods`: readonly `Readonly`\<\{ `name`:
1339
+ `string`; `digest`: `Sha256Digest`; \}\>[]; `anonymousApproval`: \|
1340
+ `Readonly`\<\{ `by`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{
1341
+ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`:
436
1342
  `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`; \}\>[]
1343
+ \}\>[]
442
1344
 
443
1345
  ##### get()
444
1346
 
@@ -462,63 +1364,67 @@ get(installationId):
462
1364
  };
463
1365
  };
464
1366
  releasePin: "pinned" | "floating";
465
- authorityVersion: number;
1367
+ authority: {
1368
+ authorityVersion: number;
1369
+ declaredOperationsDigest: Sha256Digest;
1370
+ approvedGrants: readonly Readonly<{
1371
+ capability: | "approvals"
1372
+ | "agent.list"
1373
+ | "agent.manage"
1374
+ | "agent.rename"
1375
+ | "agent.avatar"
1376
+ | "agent.toolPolicy"
1377
+ | "agent.read"
1378
+ | "agent.send"
1379
+ | "computer.list"
1380
+ | "computer.readFile"
1381
+ | "computer.writeFile"
1382
+ | "computer.execute"
1383
+ | "llm.generation"
1384
+ | "media.generation"
1385
+ | "games:servers"
1386
+ | "git.repository"
1387
+ | "apps.open"
1388
+ | "apps.call"
1389
+ | "app.storage"
1390
+ | "app.events.emit"
1391
+ | "team.workbenchHost"
1392
+ | "marketplace.browse"
1393
+ | "marketplace.purchase"
1394
+ | "workflow.run"
1395
+ | "workflow.publish"
1396
+ | "workflow.arm"
1397
+ | "world"
1398
+ | "channels.read"
1399
+ | "channels.personal.manage";
1400
+ capabilityApproved: true;
1401
+ operations: readonly string[];
1402
+ resources: | "tenant-scope"
1403
+ | readonly Readonly<{
1404
+ kind: ...;
1405
+ id: ...;
1406
+ }>[];
1407
+ }>[];
1408
+ approval: | Readonly<{
1409
+ by: | {
1410
+ kind: "member";
1411
+ memberId: string;
1412
+ }
1413
+ | {
1414
+ kind: "agent";
1415
+ agentId: string;
1416
+ }
1417
+ | {
1418
+ kind: "team-key";
1419
+ keyId: string;
1420
+ };
1421
+ at: number;
1422
+ authorityVersion: number;
1423
+ }>
1424
+ | null;
1425
+ };
466
1426
  status: "enabled" | "disabled" | "deleted";
467
1427
  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
1428
  approvedAnonymousMethods: readonly Readonly<{
523
1429
  name: string;
524
1430
  digest: Sha256Digest;
@@ -560,47 +1466,42 @@ One installation record, or `null`.
560
1466
  `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`: \{
561
1467
  `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
562
1468
  `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `releasePin`: `"pinned"` \|
563
- `"floating"`; `authorityVersion`: `number`; `status`: `"enabled"` \|
564
- `"disabled"` \| `"deleted"`; `visibility`: `"private"` \| `"public"`;
1469
+ `"floating"`; `authority`: \{ `authorityVersion`: `number`;
565
1470
  `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"` \|
1471
+ `Readonly`\<\{ `capability`: \| `"approvals"` \| `"agent.list"` \|
1472
+ `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"`
1473
+ \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \|
1474
+ `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \|
1475
+ `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \|
1476
+ `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \|
1477
+ `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \|
1478
+ `"marketplace.purchase"` \| `"workflow.run"` \| `"workflow.publish"` \|
1479
+ `"workflow.arm"` \| `"world"` \| `"channels.read"` \|
574
1480
  `"channels.personal.manage"`; `capabilityApproved`: `true`; `operations`:
575
1481
  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()
1482
+ `kind`: ...; `id`: ...; \}\>[]; \}\>[]; `approval`: \| `Readonly`\<\{ `by`: \|
1483
+ \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`;
1484
+ `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`:
1485
+ `number`; `authorityVersion`: `number`; \}\> \| `null`; \}; `status`:
1486
+ `"enabled"` \| `"disabled"` \| `"deleted"`; `visibility`: `"private"` \|
1487
+ `"public"`; `approvedAnonymousMethods`: readonly `Readonly`\<\{ `name`:
1488
+ `string`; `digest`: `Sha256Digest`; \}\>[]; `anonymousApproval`: \|
1489
+ `Readonly`\<\{ `by`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{
1490
+ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`:
1491
+ `string`; \}; `at`: `number`; `authorityVersion`: `number`; \}\> \| `null`; \}\>
1492
+ \| `null`
1493
+
1494
+ ##### generation()
587
1495
 
588
1496
  ```ts
589
- put(installation, tenantId?): Promise<void>;
1497
+ generation(): string;
590
1498
  ```
591
1499
 
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` |
1500
+ Durable store identity, regenerated only when the store itself is replaced.
600
1501
 
601
1502
  ###### Returns
602
1503
 
603
- `Promise`\<`void`\>
1504
+ `string`
604
1505
 
605
1506
  ##### compareAndPut()
606
1507
 
@@ -608,6 +1509,7 @@ Create or replace one installation record.
608
1509
  compareAndPut(
609
1510
  installation,
610
1511
  expectedAuthorityVersion,
1512
+ expectedGeneration,
611
1513
  tenantId?
612
1514
  ): Promise<InstallationCommit>;
613
1515
  ```
@@ -620,12 +1522,46 @@ Native RPC returns a closed result; callers never classify a transported Error.
620
1522
  | -------------------------- | ---------------------------------------- | --------------- |
621
1523
  | `installation` | [`Installation`](apps.md#installation) | `undefined` |
622
1524
  | `expectedAuthorityVersion` | `number` | `undefined` |
1525
+ | `expectedGeneration` | `string` | `undefined` |
623
1526
  | `tenantId` | `string` & `Brand`\<`"OysterTenantId"`\> | `defaultTenant` |
624
1527
 
625
1528
  ###### Returns
626
1529
 
627
1530
  `Promise`\<[`InstallationCommit`](host.md#installationcommit)\>
628
1531
 
1532
+ ##### bootCapability()
1533
+
1534
+ ```ts
1535
+ bootCapability(input):
1536
+ | {
1537
+ id: string;
1538
+ identity: {
1539
+ appId: string;
1540
+ releaseId: ReleaseId;
1541
+ surfaceId: "host-boot";
1542
+ };
1543
+ base: string;
1544
+ expiresAt: number;
1545
+ assets: object[];
1546
+ }
1547
+ | null
1548
+ | undefined;
1549
+ ```
1550
+
1551
+ Issue, resolve, or revoke one bounded capability without storing its token.
1552
+
1553
+ ###### Parameters
1554
+
1555
+ | Parameter | Type |
1556
+ | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1557
+ | `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`; \}\> |
1558
+
1559
+ ###### Returns
1560
+
1561
+ \| \{ `id`: `string`; `identity`: \{ `appId`: `string`; `releaseId`:
1562
+ `ReleaseId`; `surfaceId`: `"host-boot"`; \}; `base`: `string`; `expiresAt`:
1563
+ `number`; `assets`: `object`[]; \} \| `null` \| `undefined`
1564
+
629
1565
  ---
630
1566
 
631
1567
  ### OysterBinding
@@ -634,18 +1570,23 @@ The plain Oyster Worker's guest binding entrypoint.
634
1570
 
635
1571
  #### Extends
636
1572
 
637
- - `WorkerEntrypoint`\<`Readonly`\<\{ `OYSTER_OWNER_KEY`: `string`;
1573
+ - `WorkerEntrypoint`\<`Readonly`\<\{ `BROWSER?`: `Readonly`\<\{ `fetch`:
1574
+ [`HttpFetch`](browser.md#httpfetch); \}\>; `OYSTER_OWNER_KEY`: `string`;
638
1575
  `OYSTER_OWNER_NAME?`: `string`; `AGENT_DIRECTORY?`: `Readonly`\<\{
639
1576
  `getByName`: `Readonly`\<\{ `readCreator`: `Promise`\<... \| ...\>; \}\>;
640
1577
  \}\>; `OYSTER_ORIGIN`: `string`; `MCP`:
641
1578
  `DurableObjectNamespace`\<[`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{
642
1579
  `LOADER`: `WorkerLoader`; \}\>\>\>; `RELEASES`: `R2Bucket`; `REGISTRY`:
643
- `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\>; `INSTANCES`:
1580
+ `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\<`Readonly`\<\{
1581
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
1582
+ OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined;
1583
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
1584
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `INSTANCES`:
644
1585
  `DurableObjectNamespace`\<[`OysterInstance`](#oysterinstance)\<`Readonly`\<\{
1586
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
645
1587
  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`:
1588
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
1589
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`:
649
1590
  `WorkerLoader`; \}\>, `Readonly`\<\{ `instanceId`: `string`; `binding`: \|
650
1591
  `"BACKGROUND"` \| `"GIT"` \| `"EVENTS"` \| `"APPS"` \| `"WORKFLOWS"` \|
651
1592
  `"APP_STORAGE"` \| `"MEDIA"` \| `"COMPUTER"` \| `"INBOX"` \| `"AGENTS"`;
@@ -845,6 +1786,87 @@ Installation changes end guest work; a Workflow cancel targets only its run.
845
1786
 
846
1787
  `Promise`\<`void`\>
847
1788
 
1789
+ ##### prepare()
1790
+
1791
+ ```ts
1792
+ prepare(
1793
+ state,
1794
+ release,
1795
+ limits?,
1796
+ tenant?
1797
+ ): Promise<InstanceResult<
1798
+ | {
1799
+ kind: "passed";
1800
+ }
1801
+ | {
1802
+ kind: "failed";
1803
+ code: "ui_mount_failed";
1804
+ diagnostics?: {
1805
+ failedPredicate: | "unexpected_candidate_request"
1806
+ | "response_status"
1807
+ | "request_failed"
1808
+ | "page_error"
1809
+ | "candidate_not_mounted";
1810
+ errorName?: | "TypeError"
1811
+ | "RangeError"
1812
+ | "SyntaxError"
1813
+ | "AbortError"
1814
+ | "TimeoutError"
1815
+ | "Other"
1816
+ | "Error";
1817
+ finalUrlPath: string;
1818
+ consoleErrors: string[];
1819
+ pageErrors: string[];
1820
+ failedRequests: object[];
1821
+ droppedCount: number;
1822
+ };
1823
+ }
1824
+ | {
1825
+ kind: "not_checked";
1826
+ code: | "boot_runner_unavailable"
1827
+ | "boot_browser_binding_missing"
1828
+ | "boot_clone_unavailable"
1829
+ | "boot_timeout"
1830
+ | "boot_cleanup_failed"
1831
+ | "ui_check_not_run_on_host";
1832
+ }
1833
+ | null>>;
1834
+ ```
1835
+
1836
+ Reuse lifecycle preflight without changing the active runtime or its budgets.
1837
+
1838
+ ###### Parameters
1839
+
1840
+ | Parameter | Type |
1841
+ | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1842
+ | `state` | \{ `instanceId`: [`InstanceId`](index.md#instanceid); `owner`: \{ `kind`: `"installation"` \| `"deployment"`; `id`: `string`; \}; `appId`: `AppId`; `releaseId`: `ReleaseId`; `authorityVersion`: `number`; `status`: `"enabled"` \| `"disabled"` \| `"deleted"`; \} |
1843
+ | `state.instanceId` | [`InstanceId`](index.md#instanceid) |
1844
+ | `state.owner` | \{ `kind`: `"installation"` \| `"deployment"`; `id`: `string`; \} |
1845
+ | `state.owner.kind?` | `"installation"` \| `"deployment"` |
1846
+ | `state.owner.id?` | `string` |
1847
+ | `state.appId?` | `AppId` |
1848
+ | `state.releaseId?` | `ReleaseId` |
1849
+ | `state.authorityVersion?` | `number` |
1850
+ | `state.status?` | `"enabled"` \| `"disabled"` \| `"deleted"` |
1851
+ | `release?` | `Release` |
1852
+ | `limits?` | `Readonly`\<\{ `cpuMs`: `number`; `subRequests`: `number`; \}\> |
1853
+ | `tenant?` | `Pick`\<`Readonly`\<\{ `tenantId`: `string` & `Brand`\<`"OysterTenantId"`\>; `origin`: `string`; `durableName`: `string`; `computerName`: `string`; `workspacePrefix`: `string`; `repositoryPrefix`: `string`; \}\>, `"origin"` \| `"tenantId"`\> |
1854
+
1855
+ ###### Returns
1856
+
1857
+ `Promise`\<[`InstanceResult`](host.md#instanceresult)\< \| \{ `kind`:
1858
+ `"passed"`; \} \| \{ `kind`: `"failed"`; `code`: `"ui_mount_failed"`;
1859
+ `diagnostics?`: \{ `failedPredicate`: \| `"unexpected_candidate_request"` \|
1860
+ `"response_status"` \| `"request_failed"` \| `"page_error"` \|
1861
+ `"candidate_not_mounted"`; `errorName?`: \| `"TypeError"` \| `"RangeError"` \|
1862
+ `"SyntaxError"` \| `"AbortError"` \| `"TimeoutError"` \| `"Other"` \| `"Error"`;
1863
+ `finalUrlPath`: `string`; `consoleErrors`: `string`[]; `pageErrors`: `string`[];
1864
+ `failedRequests`: `object`[]; `droppedCount`: `number`; \}; \} \| \{ `kind`:
1865
+ `"not_checked"`; `code`: \| `"boot_runner_unavailable"` \|
1866
+ `"boot_browser_binding_missing"` \| `"boot_clone_unavailable"` \|
1867
+ `"boot_timeout"` \| `"boot_cleanup_failed"` \| `"ui_check_not_run_on_host"`; \}
1868
+ \| `null`\>\>
1869
+
848
1870
  ##### apply()
849
1871
 
850
1872
  ```ts
@@ -868,7 +1890,7 @@ apply(
868
1890
  }>>;
869
1891
  ```
870
1892
 
871
- Remember `release`, then apply the owner state under the host's tenant pin.
1893
+ Activate the exact committed selection under the host's tenant pin.
872
1894
 
873
1895
  ###### Parameters
874
1896
 
@@ -1226,18 +2248,23 @@ The non-git standalone root's MCP owner.
1226
2248
 
1227
2249
  #### Extends
1228
2250
 
1229
- - [`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{ `OYSTER_OWNER_KEY`:
2251
+ - [`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{ `BROWSER?`: `Readonly`\<\{
2252
+ `fetch`: [`HttpFetch`](browser.md#httpfetch); \}\>; `OYSTER_OWNER_KEY`:
1230
2253
  `string`; `OYSTER_OWNER_NAME?`: `string`; `AGENT_DIRECTORY?`: `Readonly`\<\{
1231
2254
  `getByName`: `Readonly`\<\{ `readCreator`: `Promise`\<... \| ...\>; \}\>;
1232
2255
  \}\>; `OYSTER_ORIGIN`: `string`; `MCP`:
1233
2256
  `DurableObjectNamespace`\<[`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{
1234
2257
  `LOADER`: `WorkerLoader`; \}\>\>\>; `RELEASES`: `R2Bucket`; `REGISTRY`:
1235
- `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\>; `INSTANCES`:
2258
+ `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\<`Readonly`\<\{
2259
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
2260
+ OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined;
2261
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
2262
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `INSTANCES`:
1236
2263
  `DurableObjectNamespace`\<[`OysterInstance`](#oysterinstance)\<`Readonly`\<\{
2264
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
1237
2265
  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`:
2266
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
2267
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`:
1241
2268
  `WorkerLoader`; \}\>, `this`\>
1242
2269
 
1243
2270
  #### Constructors
@@ -1288,6 +2315,269 @@ Trusted host RPC: the namespace and pin are never selected by guest headers.
1288
2315
 
1289
2316
  [`OysterMcpOwner`](#oystermcpowner).[`serve`](#serve)
1290
2317
 
2318
+ ---
2319
+
2320
+ ### OysterInstallationExecutor
2321
+
2322
+ Ordinary Worker execution; REGISTRY receives references and receipts only.
2323
+
2324
+ #### Extends
2325
+
2326
+ - `WorkerEntrypoint`\<`Readonly`\<\{ `BROWSER?`: `Readonly`\<\{ `fetch`:
2327
+ [`HttpFetch`](browser.md#httpfetch); \}\>; `OYSTER_OWNER_KEY`: `string`;
2328
+ `OYSTER_OWNER_NAME?`: `string`; `AGENT_DIRECTORY?`: `Readonly`\<\{
2329
+ `getByName`: `Readonly`\<\{ `readCreator`: `Promise`\<...\>; \}\>; \}\>;
2330
+ `OYSTER_ORIGIN`: `string`; `MCP`:
2331
+ `DurableObjectNamespace`\<[`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{
2332
+ `LOADER`: `WorkerLoader`; \}\>\>\>; `RELEASES`: `R2Bucket`; `REGISTRY`:
2333
+ `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\<`Readonly`\<\{
2334
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
2335
+ OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined;
2336
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
2337
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `INSTANCES`:
2338
+ `DurableObjectNamespace`\<[`OysterInstance`](#oysterinstance)\<`Readonly`\<\{
2339
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined;
2340
+ OYSTER\_OWNER\_KEY: string; OYSTER\_OWNER\_NAME?: string \| undefined;
2341
+ AGENT\_DIRECTORY?: Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\>
2342
+ \| undefined; ... 5 more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`:
2343
+ `WorkerLoader`; \}\>, `unknown`, `this`\> & `object`
2344
+
2345
+ #### Constructors
2346
+
2347
+ ##### Constructor
2348
+
2349
+ ```ts
2350
+ new OysterInstallationExecutor(ctx, env): OysterInstallationExecutor;
2351
+ ```
2352
+
2353
+ ###### Parameters
2354
+
2355
+ | Parameter | Type |
2356
+ | --------- | ------------------ |
2357
+ | `ctx` | `ExecutionContext` |
2358
+ | `env` | `Env` |
2359
+
2360
+ ###### Returns
2361
+
2362
+ [`OysterInstallationExecutor`](#oysterinstallationexecutor)
2363
+
2364
+ ###### Inherited from
2365
+
2366
+ ```ts
2367
+ installationWorkerEntrypoint<OysterWorkerEnv>((env, scope) =>
2368
+ ownerKeyRootHost(env, { scope }),
2369
+ ).constructor;
2370
+ ```
2371
+
2372
+ #### Methods
2373
+
2374
+ ##### run()
2375
+
2376
+ ```ts
2377
+ run(): Promise<
2378
+ | {
2379
+ state: "succeeded";
2380
+ installation: {
2381
+ installationId: string;
2382
+ instanceId: InstanceId | null;
2383
+ appId: AppId;
2384
+ release: {
2385
+ releaseId: ReleaseId;
2386
+ appId: AppId;
2387
+ artifact: {
2388
+ artifactRef: ArtifactRef;
2389
+ artifactDigest: Sha256Digest;
2390
+ provenance: {
2391
+ sourceRevision: SourceRevision;
2392
+ sourceTreeDigest: Sha256Digest;
2393
+ buildRecipeDigest: Sha256Digest;
2394
+ };
2395
+ };
2396
+ };
2397
+ releasePin: "pinned" | "floating";
2398
+ authority: {
2399
+ authorityVersion: number;
2400
+ declaredOperationsDigest: Sha256Digest;
2401
+ approvedGrants: readonly Readonly<{
2402
+ capability: | "approvals"
2403
+ | "agent.list"
2404
+ | "agent.manage"
2405
+ | "agent.rename"
2406
+ | "agent.avatar"
2407
+ | "agent.toolPolicy"
2408
+ | "agent.read"
2409
+ | "agent.send"
2410
+ | "computer.list"
2411
+ | "computer.readFile"
2412
+ | "computer.writeFile"
2413
+ | "computer.execute"
2414
+ | "llm.generation"
2415
+ | "media.generation"
2416
+ | "games:servers"
2417
+ | "git.repository"
2418
+ | "apps.open"
2419
+ | "apps.call"
2420
+ | "app.storage"
2421
+ | "app.events.emit"
2422
+ | "team.workbenchHost"
2423
+ | "marketplace.browse"
2424
+ | "marketplace.purchase"
2425
+ | "workflow.run"
2426
+ | "workflow.publish"
2427
+ | "workflow.arm"
2428
+ | "world"
2429
+ | "channels.read"
2430
+ | "channels.personal.manage";
2431
+ capabilityApproved: true;
2432
+ operations: readonly string[];
2433
+ resources: "tenant-scope" | readonly Readonly<...>[];
2434
+ }>[];
2435
+ approval: | Readonly<{
2436
+ by: | {
2437
+ kind: "member";
2438
+ memberId: string;
2439
+ }
2440
+ | {
2441
+ kind: "agent";
2442
+ agentId: string;
2443
+ }
2444
+ | {
2445
+ kind: "team-key";
2446
+ keyId: string;
2447
+ };
2448
+ at: number;
2449
+ authorityVersion: number;
2450
+ }>
2451
+ | null;
2452
+ };
2453
+ status: "enabled" | "disabled" | "deleted";
2454
+ visibility: "private" | "public";
2455
+ approvedAnonymousMethods: readonly Readonly<{
2456
+ name: string;
2457
+ digest: Sha256Digest;
2458
+ }>[];
2459
+ anonymousApproval: | Readonly<{
2460
+ by: | {
2461
+ kind: "member";
2462
+ memberId: string;
2463
+ }
2464
+ | {
2465
+ kind: "agent";
2466
+ agentId: string;
2467
+ }
2468
+ | {
2469
+ kind: "team-key";
2470
+ keyId: string;
2471
+ };
2472
+ at: number;
2473
+ authorityVersion: number;
2474
+ }>
2475
+ | null;
2476
+ };
2477
+ creation: "fresh" | "replacement" | "reminted";
2478
+ uiCheck: | {
2479
+ kind: "passed";
2480
+ }
2481
+ | {
2482
+ kind: "failed";
2483
+ code: "ui_mount_failed";
2484
+ diagnostics?: {
2485
+ failedPredicate: | "unexpected_candidate_request"
2486
+ | "response_status"
2487
+ | "request_failed"
2488
+ | "page_error"
2489
+ | "candidate_not_mounted";
2490
+ errorName?: | "TypeError"
2491
+ | "RangeError"
2492
+ | "SyntaxError"
2493
+ | "AbortError"
2494
+ | "TimeoutError"
2495
+ | "Other"
2496
+ | "Error";
2497
+ finalUrlPath: string;
2498
+ consoleErrors: string[];
2499
+ pageErrors: string[];
2500
+ failedRequests: object[];
2501
+ droppedCount: number;
2502
+ };
2503
+ }
2504
+ | {
2505
+ kind: "not_checked";
2506
+ code: | "boot_runner_unavailable"
2507
+ | "boot_browser_binding_missing"
2508
+ | "boot_clone_unavailable"
2509
+ | "boot_timeout"
2510
+ | "boot_cleanup_failed"
2511
+ | "ui_check_not_run_on_host";
2512
+ }
2513
+ | null;
2514
+ }
2515
+ | {
2516
+ state: "refused";
2517
+ status: number;
2518
+ code: string;
2519
+ }
2520
+ | {
2521
+ state: "unconfirmed";
2522
+ outcome: "cancelled" | "outcome_unknown" | "interrupted";
2523
+ }>;
2524
+ ```
2525
+
2526
+ Execute the retained command these props name, in its tenant scope.
2527
+
2528
+ ###### Returns
2529
+
2530
+ `Promise`\< \| \{ `state`: `"succeeded"`; `installation`: \{ `installationId`:
2531
+ `string`; `instanceId`: [`InstanceId`](index.md#instanceid) \| `null`; `appId`:
2532
+ `AppId`; `release`: \{ `releaseId`: `ReleaseId`; `appId`: `AppId`; `artifact`:
2533
+ \{ `artifactRef`: `ArtifactRef`; `artifactDigest`: `Sha256Digest`; `provenance`:
2534
+ \{ `sourceRevision`: `SourceRevision`; `sourceTreeDigest`: `Sha256Digest`;
2535
+ `buildRecipeDigest`: `Sha256Digest`; \}; \}; \}; `releasePin`: `"pinned"` \|
2536
+ `"floating"`; `authority`: \{ `authorityVersion`: `number`;
2537
+ `declaredOperationsDigest`: `Sha256Digest`; `approvedGrants`: readonly
2538
+ `Readonly`\<\{ `capability`: \| `"approvals"` \| `"agent.list"` \|
2539
+ `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"`
2540
+ \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \|
2541
+ `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \|
2542
+ `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \|
2543
+ `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \|
2544
+ `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \|
2545
+ `"marketplace.purchase"` \| `"workflow.run"` \| `"workflow.publish"` \|
2546
+ `"workflow.arm"` \| `"world"` \| `"channels.read"` \|
2547
+ `"channels.personal.manage"`; `capabilityApproved`: `true`; `operations`:
2548
+ readonly `string`[]; `resources`: `"tenant-scope"` \| readonly
2549
+ `Readonly`\<...\>[]; \}\>[]; `approval`: \| `Readonly`\<\{ `by`: \| \{ `kind`:
2550
+ `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`:
2551
+ `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`: `number`;
2552
+ `authorityVersion`: `number`; \}\> \| `null`; \}; `status`: `"enabled"` \|
2553
+ `"disabled"` \| `"deleted"`; `visibility`: `"private"` \| `"public"`;
2554
+ `approvedAnonymousMethods`: readonly `Readonly`\<\{ `name`: `string`; `digest`:
2555
+ `Sha256Digest`; \}\>[]; `anonymousApproval`: \| `Readonly`\<\{ `by`: \| \{
2556
+ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`:
2557
+ `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`: `number`;
2558
+ `authorityVersion`: `number`; \}\> \| `null`; \}; `creation`: `"fresh"` \|
2559
+ `"replacement"` \| `"reminted"`; `uiCheck`: \| \{ `kind`: `"passed"`; \} \| \{
2560
+ `kind`: `"failed"`; `code`: `"ui_mount_failed"`; `diagnostics?`: \{
2561
+ `failedPredicate`: \| `"unexpected_candidate_request"` \| `"response_status"` \|
2562
+ `"request_failed"` \| `"page_error"` \| `"candidate_not_mounted"`; `errorName?`:
2563
+ \| `"TypeError"` \| `"RangeError"` \| `"SyntaxError"` \| `"AbortError"` \|
2564
+ `"TimeoutError"` \| `"Other"` \| `"Error"`; `finalUrlPath`: `string`;
2565
+ `consoleErrors`: `string`[]; `pageErrors`: `string`[]; `failedRequests`:
2566
+ `object`[]; `droppedCount`: `number`; \}; \} \| \{ `kind`: `"not_checked"`;
2567
+ `code`: \| `"boot_runner_unavailable"` \| `"boot_browser_binding_missing"` \|
2568
+ `"boot_clone_unavailable"` \| `"boot_timeout"` \| `"boot_cleanup_failed"` \|
2569
+ `"ui_check_not_run_on_host"`; \} \| `null`; \} \| \{ `state`: `"refused"`;
2570
+ `status`: `number`; `code`: `string`; \} \| \{ `state`: `"unconfirmed"`;
2571
+ `outcome`: `"cancelled"` \| `"outcome_unknown"` \| `"interrupted"`; \}\>
2572
+
2573
+ ###### Inherited from
2574
+
2575
+ ```ts
2576
+ installationWorkerEntrypoint<OysterWorkerEnv>((env, scope) =>
2577
+ ownerKeyRootHost(env, { scope }),
2578
+ ).run;
2579
+ ```
2580
+
1291
2581
  ## Type Aliases
1292
2582
 
1293
2583
  ### OysterMcpOwnerEnv
@@ -1363,6 +2653,7 @@ input.
1363
2653
 
1364
2654
  ```ts
1365
2655
  type OysterWorkerEnv = Readonly<{
2656
+ BROWSER?: BrowserBinding;
1366
2657
  OYSTER_OWNER_KEY: string;
1367
2658
  OYSTER_OWNER_NAME?: string;
1368
2659
  AGENT_DIRECTORY?: OysterStorageAgentDirectory;
@@ -1387,11 +2678,27 @@ type OysterBindingContext<Env> = Readonly<{
1387
2678
  scope: TenantScope;
1388
2679
  backgroundHost: Promise<
1389
2680
  | Readonly<{
2681
+ approvals?: Readonly<{
2682
+ submit: Promise<
2683
+ | {
2684
+ kind: ...;
2685
+ recordId: ...;
2686
+ description: ...;
2687
+ }
2688
+ | ApprovalApplyResult>;
2689
+ }>;
2690
+ workflows?: (principal) => Promise<
2691
+ | {
2692
+ status: Promise<...>;
2693
+ cancel: Promise<...>;
2694
+ }
2695
+ | null>;
1390
2696
  auth: OysterAuth;
1391
2697
  backgroundOriginKey?: () => Promise<CryptoKey>;
1392
2698
  artifacts: ArtifactStore;
1393
2699
  installations: InstallationStore;
1394
2700
  instances: InstanceDirectory;
2701
+ bootUi: (release) => Promise<UiBootCheckOutcome>;
1395
2702
  computerId?: string;
1396
2703
  computer?: (principal) => KnapsackComputer | null | Promise<KnapsackComputer | null>;
1397
2704
  appToolPolicy?: (actor) =>
@@ -1418,6 +2725,14 @@ type OysterBindingContext<Env> = Readonly<{
1418
2725
  }>;
1419
2726
  homeInstallationId?: string;
1420
2727
  pageScript?: string;
2728
+ pageAssets?: () => Promise<{
2729
+ pageScript: string;
2730
+ publicHomeScript: string;
2731
+ fontStyles: string;
2732
+ loginFontStyles: string;
2733
+ shellStyles: string;
2734
+ grantConsentScript: string;
2735
+ }>;
1421
2736
  title?: string;
1422
2737
  }>
1423
2738
  | null>;
@@ -1507,83 +2822,78 @@ admission.
1507
2822
 
1508
2823
  ## Functions
1509
2824
 
1510
- ### createOysterMcpOwner()
2825
+ ### installationWorkerEntrypoint()
1511
2826
 
1512
2827
  ```ts
1513
- function createOysterMcpOwner<Env>(host): (ctx, env) => OysterMcpOwner<Env>;
2828
+ function installationWorkerEntrypoint<Env>(
2829
+ hostFor,
2830
+ ): (ctx, env) => WorkerEntrypoint<Env, unknown> & object;
1514
2831
  ```
1515
2832
 
1516
- Bind the owner to the deployment's existing host factory and options.
2833
+ A loopback export with ordinary Worker I/O, not another resource or HTTP API.
1517
2834
 
1518
2835
  #### Type Parameters
1519
2836
 
1520
- | Type Parameter |
1521
- | ------------------------------------------------------------- |
1522
- | `Env` _extends_ `Readonly`\<\{ `LOADER`: `WorkerLoader`; \}\> |
2837
+ | Type Parameter |
2838
+ | -------------- |
2839
+ | `Env` |
1523
2840
 
1524
2841
  #### Parameters
1525
2842
 
1526
- | Parameter | Type |
1527
- | --------- | ------------------------------------------------------ |
1528
- | `host` | (`env`, `scope`) => [`OysterHost`](host.md#oysterhost) |
2843
+ | Parameter | Type |
2844
+ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2845
+ | `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
2846
 
1530
2847
  #### Returns
1531
2848
 
1532
- (`ctx`, `env`) => [`OysterMcpOwner`](#oystermcpowner)\<`Env`\>
2849
+ (`ctx`, `env`) => `WorkerEntrypoint`\<`Env`, `unknown`\> & `object`
1533
2850
 
1534
2851
  ---
1535
2852
 
1536
- ### r2FileSource()
2853
+ ### createOysterMcpOwner()
1537
2854
 
1538
2855
  ```ts
1539
- function r2FileSource(bucket, prefix): FileSource;
2856
+ function createOysterMcpOwner<Env>(host): (ctx, env) => OysterMcpOwner<Env>;
1540
2857
  ```
1541
2858
 
1542
- Files in an R2 bucket under `prefix` (one workspace per prefix).
2859
+ Bind the owner to the deployment's existing host factory and options.
2860
+
2861
+ #### Type Parameters
2862
+
2863
+ | Type Parameter |
2864
+ | ------------------------------------------------------------- |
2865
+ | `Env` _extends_ `Readonly`\<\{ `LOADER`: `WorkerLoader`; \}\> |
1543
2866
 
1544
2867
  #### Parameters
1545
2868
 
1546
- | Parameter | Type |
1547
- | --------- | ---------- |
1548
- | `bucket` | `R2Bucket` |
1549
- | `prefix` | `string` |
2869
+ | Parameter | Type |
2870
+ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2871
+ | `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
2872
 
1551
2873
  #### Returns
1552
2874
 
1553
- [`FileSource`](files.md#filesource)
2875
+ (`ctx`, `env`) => [`OysterMcpOwner`](#oystermcpowner)\<`Env`\>
1554
2876
 
1555
2877
  ---
1556
2878
 
1557
- ### r2ArtifactStore()
2879
+ ### r2FileSource()
1558
2880
 
1559
2881
  ```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
- }>;
2882
+ function r2FileSource(bucket, prefix): FileSource;
1570
2883
  ```
1571
2884
 
1572
- Store Release artifacts in an R2 bucket.
2885
+ Files in an R2 bucket under `prefix` (one workspace per prefix).
1573
2886
 
1574
2887
  #### Parameters
1575
2888
 
1576
2889
  | Parameter | Type |
1577
2890
  | --------- | ---------- |
1578
2891
  | `bucket` | `R2Bucket` |
2892
+ | `prefix` | `string` |
1579
2893
 
1580
2894
  #### Returns
1581
2895
 
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`\>; \}\>
2896
+ [`FileSource`](files.md#filesource)
1587
2897
 
1588
2898
  ---
1589
2899
 
@@ -1599,9 +2909,9 @@ which serves it from the same table.
1599
2909
 
1600
2910
  #### Type Parameters
1601
2911
 
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`; \}\> |
2912
+ | Type Parameter |
2913
+ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2914
+ | `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
2915
 
1606
2916
  #### Parameters
1607
2917
 
@@ -1615,21 +2925,48 @@ _typeof_ `WorkerEntrypoint`
1615
2925
 
1616
2926
  ---
1617
2927
 
2928
+ ### serveOysterBootCapability()
2929
+
2930
+ ```ts
2931
+ function serveOysterBootCapability(
2932
+ request,
2933
+ env,
2934
+ scope,
2935
+ ): Promise<Response | null>;
2936
+ ```
2937
+
2938
+ Resolve a scoped boot URL through the registry-backed HTTPS asset route.
2939
+
2940
+ #### Parameters
2941
+
2942
+ | Parameter | Type |
2943
+ | --------- | -------------------------------------- |
2944
+ | `request` | `Request` |
2945
+ | `env` | [`OysterWorkerEnv`](#oysterworkerenv) |
2946
+ | `scope` | [`TenantScope`](tenant.md#tenantscope) |
2947
+
2948
+ #### Returns
2949
+
2950
+ `Promise`\<`Response` \| `null`\>
2951
+
2952
+ ---
2953
+
1618
2954
  ### oysterWorkerHost()
1619
2955
 
1620
2956
  ```ts
1621
2957
  function oysterWorkerHost(env, auth, options?): OysterHost;
1622
2958
  ```
1623
2959
 
1624
- Host adapters for a standalone Oyster Worker over its own bindings.
2960
+ Create an Oyster host backed by this Worker environment's registry, artifacts,
2961
+ Instances, and boot-check service.
1625
2962
 
1626
2963
  #### Parameters
1627
2964
 
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`; \}\>; \}\> |
2965
+ | Parameter | Type |
2966
+ | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2967
+ | `env` | [`OysterWorkerEnv`](#oysterworkerenv) |
2968
+ | `auth` | [`OysterAuth`](host.md#oysterauth) |
2969
+ | `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
2970
 
1634
2971
  #### Returns
1635
2972
 
@@ -1641,6 +2978,9 @@ Host adapters for a standalone Oyster Worker over its own bindings.
1641
2978
 
1642
2979
  ```ts
1643
2980
  function createOysterWorker(options?): ExportedHandler<Readonly<{
2981
+ BROWSER?: Readonly<{
2982
+ fetch: HttpFetch;
2983
+ }>;
1644
2984
  OYSTER_OWNER_KEY: string;
1645
2985
  OYSTER_OWNER_NAME?: string;
1646
2986
  AGENT_DIRECTORY?: Readonly<{
@@ -1653,8 +2993,8 @@ function createOysterWorker(options?): ExportedHandler<Readonly<{
1653
2993
  LOADER: WorkerLoader;
1654
2994
  }>>>;
1655
2995
  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; }>>>;
2996
+ 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; }>>>;
2997
+ 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
2998
  LOADER: WorkerLoader;
1659
2999
  }>>;
1660
3000
  ```
@@ -1670,22 +3010,32 @@ transports belong to the tenant Durable Object, independent of that cache.
1670
3010
 
1671
3011
  #### Returns
1672
3012
 
1673
- `ExportedHandler`\<`Readonly`\<\{ `OYSTER_OWNER_KEY`: `string`;
3013
+ `ExportedHandler`\<`Readonly`\<\{ `BROWSER?`: `Readonly`\<\{ `fetch`:
3014
+ [`HttpFetch`](browser.md#httpfetch); \}\>; `OYSTER_OWNER_KEY`: `string`;
1674
3015
  `OYSTER_OWNER_NAME?`: `string`; `AGENT_DIRECTORY?`: `Readonly`\<\{ `getByName`:
1675
3016
  `Readonly`\<\{ `readCreator`: `Promise`\<`string` \| `null`\>; \}\>; \}\>;
1676
3017
  `OYSTER_ORIGIN`: `string`; `MCP`:
1677
3018
  `DurableObjectNamespace`\<[`OysterMcpOwner`](#oystermcpowner)\<`Readonly`\<\{
1678
3019
  `LOADER`: `WorkerLoader`; \}\>\>\>; `RELEASES`: `R2Bucket`; `REGISTRY`:
1679
- `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\>; `INSTANCES`:
3020
+ `DurableObjectNamespace`\<[`OysterRegistry`](#oysterregistry)\<`Readonly`\<\{
3021
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined; OYSTER\_OWNER\_KEY:
3022
+ string; OYSTER\_OWNER\_NAME?: string \| undefined; AGENT\_DIRECTORY?:
3023
+ Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\> \| undefined; ... 5
3024
+ more ...; LOADER: WorkerLoader; \}\>\>\>; `INSTANCES`:
1680
3025
  `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`; \}\>\>
3026
+ BROWSER?: Readonly\<\{ fetch: HttpFetch; \}\> \| undefined; OYSTER\_OWNER\_KEY:
3027
+ string; OYSTER\_OWNER\_NAME?: string \| undefined; AGENT\_DIRECTORY?:
3028
+ Readonly\<\{ getByName(name: string): Readonly\<...\>; \}\> \| undefined; ... 5
3029
+ more ...; LOADER: WorkerLoader; \}\>\>\>; `LOADER`: `WorkerLoader`; \}\>\>
1686
3030
 
1687
3031
  ## References
1688
3032
 
3033
+ ### r2ArtifactStore
3034
+
3035
+ Re-exports [r2ArtifactStore](cloudflare.md#r2artifactstore)
3036
+
3037
+ ---
3038
+
1689
3039
  ### ownerKeyAuth
1690
3040
 
1691
3041
  Re-exports [ownerKeyAuth](auth.md#ownerkeyauth)