@fungi.computer/oyster 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +133 -78
  2. package/dist/agent-archive-projection.d.ts +8 -0
  3. package/dist/agent-archive-projection.js +49 -0
  4. package/dist/agent-schedules.d.ts +61 -0
  5. package/dist/agent-schedules.js +19 -0
  6. package/dist/agents.d.ts +35 -14
  7. package/dist/agents.js +93 -144
  8. package/dist/app-builds.d.ts +7 -2
  9. package/dist/app-builds.js +19 -2
  10. package/dist/approval-capability.d.ts +1 -1
  11. package/dist/approval-capability.js +11 -16
  12. package/dist/approval-home.d.ts +2 -1
  13. package/dist/approval-home.js +5 -3
  14. package/dist/apps/catalog.js +1 -1
  15. package/dist/apps/gate.d.ts +4 -7
  16. package/dist/apps/gate.js +14 -29
  17. package/dist/apps/index.d.ts +1 -1
  18. package/dist/apps/installation.d.ts +4 -42
  19. package/dist/apps/installation.js +7 -75
  20. package/dist/apps/operations.js +0 -10
  21. package/dist/apps/permissions.d.ts +18 -8
  22. package/dist/apps/permissions.js +7 -1
  23. package/dist/auth.d.ts +1 -24
  24. package/dist/auth.js +9 -39
  25. package/dist/authorization.d.ts +307 -0
  26. package/dist/authorization.js +542 -0
  27. package/dist/boot-host-script.js +1 -1
  28. package/dist/build/build-jobs.d.ts +2 -2
  29. package/dist/build/candidate-builder.d.ts +2 -0
  30. package/dist/build/candidate-builder.js +5 -1
  31. package/dist/build/candidate-cli.js +3 -0
  32. package/dist/build/candidate-cli.mjs +70 -22
  33. package/dist/build/job-log.d.ts +23 -0
  34. package/dist/build/job-log.js +88 -0
  35. package/dist/build/local-build.d.ts +9 -1
  36. package/dist/build/local-build.js +11 -9
  37. package/dist/cloudflare.d.ts +4 -1
  38. package/dist/cloudflare.js +1 -1
  39. package/dist/files.js +9 -8
  40. package/dist/git-admission.d.ts +3 -3
  41. package/dist/git-admission.js +4 -6
  42. package/dist/git-door.d.ts +8 -7
  43. package/dist/git-door.js +18 -17
  44. package/dist/git.d.ts +1 -1
  45. package/dist/host.d.ts +33 -40
  46. package/dist/host.js +156 -275
  47. package/dist/installation-execution.js +14 -5
  48. package/dist/installation-operations.d.ts +4 -180
  49. package/dist/installation-operations.js +1 -5
  50. package/dist/installation-store-generation.d.ts +4 -1
  51. package/dist/installation-store-generation.js +59 -6
  52. package/dist/internal/delivery.js +0 -1
  53. package/dist/internal/host-gate.d.ts +3 -2
  54. package/dist/internal/host-gate.js +5 -18
  55. package/dist/internal/invocation-timing.d.ts +16 -0
  56. package/dist/internal/invocation-timing.js +23 -0
  57. package/dist/internal/registry-installations.js +1 -0
  58. package/dist/invocation.d.ts +15 -14
  59. package/dist/invocation.js +58 -26
  60. package/dist/keys.d.ts +2 -19
  61. package/dist/keys.js +1 -37
  62. package/dist/mcp.d.ts +15 -27
  63. package/dist/mcp.js +105 -155
  64. package/dist/page/agent-browser.d.ts +15 -0
  65. package/dist/page/agent-browser.js +162 -0
  66. package/dist/page/app-permissions-port.d.ts +3 -0
  67. package/dist/page/app-permissions-port.js +43 -0
  68. package/dist/page/app-permissions.d.ts +11 -0
  69. package/dist/page/app-permissions.js +296 -0
  70. package/dist/page/isolated-page-theme.d.ts +2 -0
  71. package/dist/page/isolated-page-theme.js +11 -0
  72. package/dist/page/mount.d.ts +2 -13
  73. package/dist/page/mount.js +7 -93
  74. package/dist/page-script.d.ts +0 -3
  75. package/dist/page-script.js +3 -4
  76. package/dist/standalone/agent-archive-owner.d.ts +42 -0
  77. package/dist/standalone/agent-archive-owner.js +116 -0
  78. package/dist/standalone/agent-archive-schedules.d.ts +6 -0
  79. package/dist/standalone/agent-archive-schedules.js +76 -0
  80. package/dist/standalone/agent-archive.d.ts +31 -0
  81. package/dist/standalone/agent-archive.js +67 -0
  82. package/dist/standalone/agent-computers.d.ts +7 -6
  83. package/dist/standalone/agent-computers.js +4 -7
  84. package/dist/standalone/agent-mail.d.ts +2 -2
  85. package/dist/standalone/agents.d.ts +186 -20
  86. package/dist/standalone/agents.js +251 -30
  87. package/dist/standalone/app-builds-binding.js +1 -1
  88. package/dist/standalone/app-set.js +2 -54
  89. package/dist/standalone/app-source.d.ts +3 -4
  90. package/dist/standalone/app-source.js +12 -9
  91. package/dist/standalone/builds.d.ts +2 -14
  92. package/dist/standalone/builds.js +15 -13
  93. package/dist/standalone/computer-fleet.d.ts +4 -4
  94. package/dist/standalone/computer-fleet.js +13 -42
  95. package/dist/standalone/computer.d.ts +4 -3
  96. package/dist/standalone/computer.js +52 -53
  97. package/dist/standalone/dashboard-approval.d.ts +10 -0
  98. package/dist/standalone/dashboard-approval.js +66 -0
  99. package/dist/standalone/machine-link.d.ts +4 -221
  100. package/dist/standalone/machine-link.js +21 -15
  101. package/dist/standalone/media.d.ts +1 -0
  102. package/dist/standalone/media.js +20 -14
  103. package/dist/standalone/owner-routes.d.ts +16 -0
  104. package/dist/standalone/owner-routes.js +21 -0
  105. package/dist/standalone/permission-resources.d.ts +5 -0
  106. package/dist/standalone/permission-resources.js +31 -0
  107. package/dist/standalone/registry.d.ts +7 -0
  108. package/dist/standalone/registry.js +3 -0
  109. package/dist/standalone/tenancy.d.ts +0 -3
  110. package/dist/standalone/tenancy.js +2 -5
  111. package/dist/standalone/worker-routes.d.ts +19 -0
  112. package/dist/standalone/worker-routes.js +9 -0
  113. package/dist/standalone/worker.d.ts +1 -1
  114. package/dist/standalone/worker.js +27 -35
  115. package/dist/standalone/workflow-binding.d.ts +10 -3
  116. package/dist/standalone/workflow-binding.js +22 -5
  117. package/dist/standalone/workflow-git-capture.js +2 -1
  118. package/dist/standalone/workflow-host.d.ts +8 -103
  119. package/dist/standalone/workflow-host.js +1 -1
  120. package/dist/standalone/workflow-node-capture.js +2 -2
  121. package/dist/standalone/workflow-root-authority.d.ts +1 -1
  122. package/dist/standalone/workflow-root-authority.js +1 -1
  123. package/dist/standalone/workflow-schedules.d.ts +31 -4
  124. package/dist/standalone/workflow-schedules.js +18 -5
  125. package/dist/standalone/workflow-webhooks.d.ts +4 -18
  126. package/dist/standalone/workflow-webhooks.js +5 -5
  127. package/dist/standalone/workflows.d.ts +53 -27
  128. package/dist/standalone/workflows.js +9 -3
  129. package/dist/storage-frame.d.ts +6 -6
  130. package/dist/testing/capabilities.d.ts +7 -6
  131. package/dist/testing/capabilities.js +3 -6
  132. package/dist/testing/installation.d.ts +0 -1
  133. package/dist/testing/installation.js +2 -5
  134. package/dist/workers-git.d.ts +12 -4
  135. package/dist/workers-git.js +38 -35
  136. package/dist/workers.d.ts +9 -1
  137. package/dist/workers.js +44 -8
  138. package/dist/workflows.d.ts +4 -0
  139. package/dist/workflows.js +2 -0
  140. package/docs/api/README.md +7 -0
  141. package/docs/api/agent-schedules.md +176 -0
  142. package/docs/api/agents.md +34 -13
  143. package/docs/api/app-storage.md +1 -1
  144. package/docs/api/apps.md +323 -225
  145. package/docs/api/auth.md +0 -55
  146. package/docs/api/authorization.md +1300 -0
  147. package/docs/api/build.md +42 -38
  148. package/docs/api/cloudflare.md +3 -3
  149. package/docs/api/git.md +20 -11
  150. package/docs/api/host.md +64 -192
  151. package/docs/api/index.md +1 -1
  152. package/docs/api/invocation.md +14 -14
  153. package/docs/api/keys.md +1 -98
  154. package/docs/api/mcp.md +43 -40
  155. package/docs/api/modules.md +2 -0
  156. package/docs/api/page/mount.md +16 -19
  157. package/docs/api/workers-git.md +46 -12
  158. package/docs/api/workers.md +111 -222
  159. package/package.json +41 -22
  160. package/dist/page/computer-target.d.ts +0 -3
  161. package/dist/page/computer-target.js +0 -9
  162. package/dist/standalone/channel-session-door.d.ts +0 -4
  163. package/dist/standalone/channel-session-door.js +0 -72
package/docs/api/keys.md CHANGED
@@ -74,8 +74,7 @@ type LiveOysterKey = Readonly<{
74
74
 
75
75
  The minimal live facts `OysterHost`'s `keys.live` port returns: enough to gate
76
76
  one call, never the key's name or timestamps. `null` for an unknown, revoked,
77
- expired or suspended key -- the same closed set `keyAppAccess` and
78
- `keyAllowsComputerUse` already treat as no authority.
77
+ expired or suspended key, which `authorization.ts` treats as no authority.
79
78
 
80
79
  ## Variables
81
80
 
@@ -122,99 +121,3 @@ A grant reaching every current and future installation for `capability`.
122
121
  #### Returns
123
122
 
124
123
  `Grant`\<[`OysterKeyCapability`](#oysterkeycapability)\>
125
-
126
- ---
127
-
128
- ### keyAppAccess()
129
-
130
- ```ts
131
- function keyAppAccess(
132
- key,
133
- installationId,
134
- ): {
135
- level: "read" | "write";
136
- revision: string;
137
- grantedBy: string;
138
- } | null;
139
- ```
140
-
141
- One live key's access to one installation: `write` when its grants admit
142
- `apps.use` there, `read` when they admit `apps.read`, otherwise `null` --
143
- including for an installation added after the key was issued, unless the key
144
- holds "All Apps" (`targets: {kind: "all"}`). The same shape as an Agent's stored
145
- [AppToolPolicy](apps.md#apptoolpolicy); its caller adds `bindingName` (which
146
- varies by caller: the plain installation id for the gate, the uppercased binding
147
- name for MCP) to reach the full `AppToolAccess`.
148
-
149
- #### Parameters
150
-
151
- | Parameter | Type |
152
- | ---------------- | --------------------------------- |
153
- | `key` | [`LiveOysterKey`](#liveoysterkey) |
154
- | `installationId` | `string` |
155
-
156
- #### Returns
157
-
158
- \| \{ `level`: `"read"` \| `"write"`; `revision`: `string`; `grantedBy`:
159
- `string`; \} \| `null`
160
-
161
- ---
162
-
163
- ### keyAgentAccess()
164
-
165
- ```ts
166
- function keyAgentAccess(key, agentId): boolean;
167
- ```
168
-
169
- Agent access is scoped to the granted Agent ids, never inferred from App grants.
170
-
171
- #### Parameters
172
-
173
- | Parameter | Type |
174
- | --------- | --------------------------------- |
175
- | `key` | [`LiveOysterKey`](#liveoysterkey) |
176
- | `agentId` | `string` |
177
-
178
- #### Returns
179
-
180
- `boolean`
181
-
182
- ---
183
-
184
- ### keyAllowsComputerUse()
185
-
186
- ```ts
187
- function keyAllowsComputerUse(key): boolean;
188
- ```
189
-
190
- Whether a live key's own grants turn its Computer access on. Off by default.
191
-
192
- #### Parameters
193
-
194
- | Parameter | Type |
195
- | --------- | --------------------------------- |
196
- | `key` | [`LiveOysterKey`](#liveoysterkey) |
197
-
198
- #### Returns
199
-
200
- `boolean`
201
-
202
- ---
203
-
204
- ### keyAllowsMachineEnroll()
205
-
206
- ```ts
207
- function keyAllowsMachineEnroll(key): boolean;
208
- ```
209
-
210
- Whether a live key's grants permit a one-use device enrollment.
211
-
212
- #### Parameters
213
-
214
- | Parameter | Type |
215
- | --------- | --------------------------------- |
216
- | `key` | [`LiveOysterKey`](#liveoysterkey) |
217
-
218
- #### Returns
219
-
220
- `boolean`
package/docs/api/mcp.md CHANGED
@@ -165,7 +165,7 @@ type OysterCallerAccess =
165
165
  The App-tool access one caller's catalog capture used, re-checked at call time
166
166
  against a fresh read. An Agent's policy is one blanket level for every
167
167
  installation (`host.appToolPolicy`); a key's is its own grants, resolved per
168
- installation (`keyAppAccess`) -- an installation the key has no grant for is
168
+ installation (`appToolAccess`) -- an installation the key has no grant for is
169
169
  captured as absent, never merely refused, so it is never listed at all.
170
170
 
171
171
  ---
@@ -177,12 +177,11 @@ type ReleaseSurface = Readonly<{
177
177
  release: VerifiedRelease;
178
178
  api: NonNullable<VerifiedRelease["api"]>;
179
179
  declaredOperations: DeclaredOperations;
180
- toolSchemas: ReturnType<typeof appToolSchemas>;
180
+ methods: NonNullable<VerifiedRelease["api"]>["methods"];
181
181
  }>;
182
182
  ```
183
183
 
184
- What one Release contributes to every MCP catalog: its verified build, its
185
- declared operations and its compiled tool schemas.
184
+ Immutable Release data shared by captures; no validator graphs live here.
186
185
 
187
186
  ---
188
187
 
@@ -192,15 +191,9 @@ declared operations and its compiled tool schemas.
192
191
  type AppSurfaceCache = (release) => Promise<ReleaseSurface | null>;
193
192
  ```
194
193
 
195
- Per-host memo of each installed Release's catalog surface. A Release's artifacts
196
- are immutable and content-addressed, so verifying the build, deriving its
197
- operations and compiling its tool schemas happens once per Release ID and
198
- artifact digest, not on every catalog capture: an MCP call captures the catalog
199
- several times (refresh, session acquire, the pre-call authority check), and
200
- redoing this for every installed App on each one exhausted a Durable Object's
201
- CPU and memory. Only Release-derived facts are cached; installation authority,
202
- caller access and tool-family listings are still read fresh on every capture. A
203
- failed build is not cached.
194
+ Per-host verified data, keyed by immutable Release ID and artifact digest.
195
+ Authority, caller access and tool-family listings stay fresh per capture. Failed
196
+ verification is not cached.
204
197
 
205
198
  #### Parameters
206
199
 
@@ -212,6 +205,16 @@ failed build is not cached.
212
205
 
213
206
  `Promise`\<[`ReleaseSurface`](#releasesurface) \| `null`\>
214
207
 
208
+ ## Variables
209
+
210
+ ### appApprovalInstructions
211
+
212
+ ```ts
213
+ const appApprovalInstructions: string;
214
+ ```
215
+
216
+ Shared host result guidance for Agent and MCP instructions, not per method.
217
+
215
218
  ## Functions
216
219
 
217
220
  ### computerControlSpecs()
@@ -258,8 +261,8 @@ One set of schemas and operations for MCP and direct broker invocation.
258
261
  | `create.replay` | `"unsafe"` | - | - |
259
262
  | `create.description` | `string` | `"Create a Computer with an optional friendly name. Request identity is generated automatically. If the outcome is uncertain, retry with its returned requestId and the original name input; do not start a second creation."` | - |
260
263
  | `create.input` | `ZodObject`\<\{ `name`: `ZodDefault`\<`ZodNullable`\<`ZodString`\>\>; `requestId`: `ZodDefault`\<`ZodNullable`\<`ZodString`\>\>; \}, `$strict`\> | `fleetCreate` | - |
261
- | `create.output` | `ZodDiscriminatedUnion`\<\[`ZodObject`\<\{ `kind`: `ZodLiteral`\<`"created"`\>; `requestId`: `ZodString`; `computer`: `ZodObject`\<\{ `computerId`: `ZodString`; `name`: `ZodString`; \}, `$strict`\>; \}, `$strict`\>, `ZodObject`\<\{ `kind`: `ZodEnum`\<\{ `denied`: `"denied"`; `uncertain`: `"uncertain"`; `conflict`: `"conflict"`; `invalid`: `"invalid"`; \}\>; `requestId`: `ZodString`; \}, `$strict`\>\], `"kind"`\> | `fleetCreation` | - |
262
- | `create.execute()` | (`input`, `context`) => `Promise`\< \| \{ `kind`: `"created"`; `requestId`: `string`; `computer`: \{ `computerId`: `string`; `name`: `string`; \}; \} \| \{ `kind`: `"denied"` \| `"uncertain"` \| `"conflict"` \| `"invalid"`; `requestId`: `string`; \}\> | - | Mint one identity or preserve the requestId for an uncertain retry. |
264
+ | `create.output` | `ZodDiscriminatedUnion`\<\[`ZodObject`\<\{ `kind`: `ZodLiteral`\<`"created"`\>; `requestId`: `ZodString`; `computer`: `ZodObject`\<\{ `computerId`: `ZodString`; `name`: `ZodString`; \}, `$strict`\>; \}, `$strict`\>, `ZodObject`\<\{ `kind`: `ZodEnum`\<\{ `invalid`: `"invalid"`; `conflict`: `"conflict"`; `denied`: `"denied"`; `uncertain`: `"uncertain"`; \}\>; `requestId`: `ZodString`; \}, `$strict`\>\], `"kind"`\> | `fleetCreation` | - |
265
+ | `create.execute()` | (`input`, `context`) => `Promise`\< \| \{ `kind`: `"created"`; `requestId`: `string`; `computer`: \{ `computerId`: `string`; `name`: `string`; \}; \} \| \{ `kind`: `"invalid"` \| `"conflict"` \| `"denied"` \| `"uncertain"`; `requestId`: `string`; \}\> | - | Mint one identity or preserve the requestId for an uncertain retry. |
263
266
 
264
267
  ---
265
268
 
@@ -313,8 +316,8 @@ function oysterAppSnapshot(
313
316
  principal,
314
317
  installations,
315
318
  access,
316
- sessionId?,
317
- familyListingCache?,
319
+ sessionId,
320
+ mode,
318
321
  ): Promise<
319
322
  Readonly<{
320
323
  modules: Readonly<Record<string, ModuleRegistration>>;
@@ -331,15 +334,15 @@ Derive the current principal's admitted App modules and grants.
331
334
 
332
335
  #### Parameters
333
336
 
334
- | Parameter | Type | Description |
335
- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
336
- | `host` | `Pick`\<[`OysterHost`](host.md#oysterhost), \| `"installations"` \| `"instances"` \| `"artifacts"` \| `"guestLimits"` \| `"backgroundOriginKey"` \| `"computerId"` \| `"capabilities"` \| `"appToolPolicy"` \| `"keys"`\> | - |
337
- | `surfaces` | [`AppSurfaceCache`](#appsurfacecache) | - |
338
- | `principal` | [`OysterPrincipal`](host.md#oysterprincipal) | - |
339
- | `installations` | readonly `Readonly`\<\{ `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`: \| `"computer.list"` \| `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \| `"approvals"` \| `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \| `"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`; \}\>[] | - |
340
- | `access` | [`OysterCallerAccess`](#oystercalleraccess) | - |
341
- | `sessionId?` | `string` | - |
342
- | `familyListingCache?` | `Map`\<`string`, `unknown`\> | Shares one tool-family listing per Instance across the two `appModules` passes one `oysterAppMethods` call can make (the eager grants/version pass, and a session-scoped re-derivation); never shared across separate calls, so it never serves another request's listing. |
337
+ | Parameter | Type |
338
+ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
339
+ | `host` | `Pick`\<[`OysterHost`](host.md#oysterhost), \| `"installations"` \| `"instances"` \| `"artifacts"` \| `"guestLimits"` \| `"backgroundOriginKey"` \| `"computerId"` \| `"capabilities"` \| `"appToolPolicy"` \| `"keys"` \| `"approvals"`\> |
340
+ | `surfaces` | [`AppSurfaceCache`](#appsurfacecache) |
341
+ | `principal` | [`TenantPrincipal`](tenant.md#tenantprincipal) |
342
+ | `installations` | readonly `Readonly`\<\{ `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`: \| `"computer.list"` \| `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \| `"approvals"` \| `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \| `"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"`; \}\>[] |
343
+ | `access` | [`OysterCallerAccess`](#oystercalleraccess) |
344
+ | `sessionId` | `string` \| `null` |
345
+ | `mode` | `"approval"` \| `"direct"` |
343
346
 
344
347
  #### Returns
345
348
 
@@ -377,22 +380,22 @@ function oysterAppMethods(
377
380
 
378
381
  Capture installed App methods for MCP or agents as one principal-scoped source.
379
382
  Enabled installations become `env.<APP>` modules using the Instance call path; a
380
- dotted method such as `repos.list` is `env.<APP>.repos.list()`. Visitors see
381
- only public read methods; owners see every discoverable method. A key sees only
382
- the installations its own grants admit, each at the level (`read`/`write`) those
383
- grants give it; Mycelium itself refuses a write call up front when the module's
384
- own grant is `read` (`mycelium/src/access.ts`). Call again to capture changes to
385
- Releases, installation authority or the caller's own grants.
383
+ dotted method such as `repos.list` is `env.<APP>.repos.list()`. Owners see every
384
+ discoverable method. A key sees only the installations its own grants admit,
385
+ each at the level (`read`/`write`) those grants give it; Mycelium itself refuses
386
+ a write call up front when the module's own grant is `read`
387
+ (`mycelium/src/access.ts`). Call again to capture changes to Releases,
388
+ installation authority or the caller's own grants.
386
389
 
387
390
  #### Parameters
388
391
 
389
- | Parameter | Type |
390
- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
391
- | `host` | `Pick`\<[`OysterHost`](host.md#oysterhost), \| `"installations"` \| `"instances"` \| `"artifacts"` \| `"guestLimits"` \| `"backgroundOriginKey"` \| `"computerId"` \| `"capabilities"` \| `"appToolPolicy"` \| `"keys"` \| `"approvals"`\> |
392
- | `principal` | [`OysterPrincipal`](host.md#oysterprincipal) |
393
- | `access` | [`OysterCallerAccess`](#oystercalleraccess) |
394
- | `surfaces` | [`AppSurfaceCache`](#appsurfacecache) |
395
- | `preloadedInstallations?` | readonly `Readonly`\<\{ `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`: \| `"computer.list"` \| `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \| `"approvals"` \| `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \| `"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`\<...\>[]; \}\>[]; `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`; \}\>[] |
392
+ | Parameter | Type |
393
+ | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
394
+ | `host` | `Pick`\<[`OysterHost`](host.md#oysterhost), \| `"installations"` \| `"instances"` \| `"artifacts"` \| `"guestLimits"` \| `"backgroundOriginKey"` \| `"computerId"` \| `"capabilities"` \| `"appToolPolicy"` \| `"keys"` \| `"approvals"`\> |
395
+ | `principal` | [`TenantPrincipal`](tenant.md#tenantprincipal) |
396
+ | `access` | [`OysterCallerAccess`](#oystercalleraccess) |
397
+ | `surfaces` | [`AppSurfaceCache`](#appsurfacecache) |
398
+ | `preloadedInstallations?` | readonly `Readonly`\<\{ `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`: \| `"computer.list"` \| `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \| `"approvals"` \| `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \| `"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`\<...\>[]; \}\>[]; `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"`; \}\>[] |
396
399
 
397
400
  #### Returns
398
401
 
@@ -426,7 +429,7 @@ caller has no access. Grants name the captured module.
426
429
  | Parameter | Type |
427
430
  | ----------- | ---------------------------------------------------------------------------- |
428
431
  | `host` | `Pick`\<[`OysterHost`](host.md#oysterhost), `"computerId"` \| `"computer"`\> |
429
- | `principal` | [`OysterPrincipal`](host.md#oysterprincipal) |
432
+ | `principal` | [`TenantPrincipal`](tenant.md#tenantprincipal) |
430
433
 
431
434
  #### Returns
432
435
 
@@ -10,10 +10,12 @@
10
10
 
11
11
  | Module | Description |
12
12
  | --------------------------------------------------- | ----------- |
13
+ | [agent-schedules](agent-schedules.md) | - |
13
14
  | [agents](agents.md) | - |
14
15
  | [app-storage](app-storage.md) | - |
15
16
  | [apps](apps.md) | - |
16
17
  | [auth](auth.md) | - |
18
+ | [authorization](authorization.md) | - |
17
19
  | [browser/boot](browser/boot.md) | - |
18
20
  | [browser](browser.md) | - |
19
21
  | [build-contract](build-contract.md) | - |
@@ -8,33 +8,33 @@
8
8
 
9
9
  # page/mount
10
10
 
11
- ## Classes
11
+ ## Interfaces
12
12
 
13
13
  ### OysterAgentBrowserHost
14
14
 
15
- One page-wide selected Session, using only its reporting App's admitted view.
15
+ One admitted page's live windows and selected Agent Session, never a global
16
+ catalog.
16
17
 
17
- #### Constructors
18
+ #### Methods
18
19
 
19
- ##### Constructor
20
+ ##### mount()
20
21
 
21
22
  ```ts
22
- new OysterAgentBrowserHost(signal): OysterAgentBrowserHost;
23
+ mount(frame, commands): () => void;
23
24
  ```
24
25
 
25
- End the selected connection with the page's own lifetime.
26
+ Borrow a Release-validated window view only for this exact frame lifetime.
26
27
 
27
28
  ###### Parameters
28
29
 
29
- | Parameter | Type |
30
- | --------- | ------------- |
31
- | `signal` | `AbortSignal` |
30
+ | Parameter | Type |
31
+ | ---------- | ------------------------------------------------------- |
32
+ | `frame` | `HTMLIFrameElement` |
33
+ | `commands` | `Pick`\<`WhistleRuntime`, `"snapshot"` \| `"execute"`\> |
32
34
 
33
35
  ###### Returns
34
36
 
35
- [`OysterAgentBrowserHost`](#oysteragentbrowserhost)
36
-
37
- #### Methods
37
+ () => `void`
38
38
 
39
39
  ##### release()
40
40
 
@@ -42,7 +42,7 @@ End the selected connection with the page's own lifetime.
42
42
  release(frame): void;
43
43
  ```
44
44
 
45
- A departing or deselecting mount cannot close a different active mount.
45
+ A departing or deselecting window cannot close a different selection.
46
46
 
47
47
  ###### Parameters
48
48
 
@@ -60,7 +60,7 @@ A departing or deselecting mount cannot close a different active mount.
60
60
  dispose(): void;
61
61
  ```
62
62
 
63
- Release the page's current selection; later reports cannot reconnect it.
63
+ Release this page's window registrations and selected Agent connection.
64
64
 
65
65
  ###### Returns
66
66
 
@@ -72,13 +72,11 @@ Release the page's current selection; later reports cannot reconnect it.
72
72
  report(
73
73
  frame,
74
74
  selection,
75
- capabilities,
76
- whistle
75
+ capabilities
77
76
  ): Promise<void>;
78
77
  ```
79
78
 
80
- Bind the reporting mount's current command view to its explicitly selected
81
- Session.
79
+ Admit the selected Agent through the reporting App's existing write door.
82
80
 
83
81
  ###### Parameters
84
82
 
@@ -87,7 +85,6 @@ Session.
87
85
  | `frame` | `HTMLIFrameElement` |
88
86
  | `selection` | \| `Readonly`\<\{ `agentId`: `string`; `sessionId`: `string`; \}\> \| `null` |
89
87
  | `capabilities` | `CapabilityDirectory` |
90
- | `whistle` | `Pick`\<`WhistleRuntime`, `"snapshot"` \| `"execute"`\> |
91
88
 
92
89
  ###### Returns
93
90