@fungi.computer/oyster 0.4.0 → 0.5.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 (63) hide show
  1. package/dist/agents.d.ts +2 -1
  2. package/dist/agents.js +63 -8
  3. package/dist/app-builds.d.ts +1 -1
  4. package/dist/app-builds.js +16 -6
  5. package/dist/apps/gate.d.ts +4 -0
  6. package/dist/apps/gate.js +3 -0
  7. package/dist/boot-capability.d.ts +2 -1
  8. package/dist/boot-capability.js +7 -5
  9. package/dist/boot-host-script.js +1 -1
  10. package/dist/build/build-jobs.d.ts +3 -3
  11. package/dist/build/build-jobs.js +10 -5
  12. package/dist/build/candidate-cli.js +5 -3
  13. package/dist/build/candidate-cli.mjs +238 -5
  14. package/dist/build/candidate-diagnostic.d.ts +2 -0
  15. package/dist/build/candidate-diagnostic.js +16 -0
  16. package/dist/channels/binding.d.ts +63 -0
  17. package/dist/channels/binding.js +85 -0
  18. package/dist/channels/conversations.d.ts +235 -0
  19. package/dist/channels/conversations.js +705 -0
  20. package/dist/channels/ids.d.ts +8 -0
  21. package/dist/channels/ids.js +15 -0
  22. package/dist/host.d.ts +1 -1
  23. package/dist/host.js +21 -4
  24. package/dist/keys.d.ts +4 -1
  25. package/dist/keys.js +15 -4
  26. package/dist/machine-link/authority.d.ts +7 -0
  27. package/dist/machine-link/delivery.d.ts +12 -0
  28. package/dist/machine-link/delivery.js +22 -1
  29. package/dist/machine-link/disposition.d.ts +16 -0
  30. package/dist/machine-link/disposition.js +65 -0
  31. package/dist/machine-link/host.d.ts +11 -2
  32. package/dist/machine-link/host.js +125 -5
  33. package/dist/machine-link/link.d.ts +4 -0
  34. package/dist/machine-link/link.js +47 -1
  35. package/dist/page-script.js +4 -4
  36. package/dist/standalone/agent-mail.js +4 -1
  37. package/dist/standalone/agent-model-choice.d.ts +4 -1
  38. package/dist/standalone/agents.d.ts +8 -0
  39. package/dist/standalone/agents.js +21 -2
  40. package/dist/standalone/app-set.d.ts +8 -1
  41. package/dist/standalone/app-set.js +46 -31
  42. package/dist/standalone/channel-session-door.d.ts +4 -0
  43. package/dist/standalone/channel-session-door.js +42 -0
  44. package/dist/standalone/install-apps-bin.d.ts +2 -0
  45. package/dist/standalone/install-apps-bin.js +3 -0
  46. package/dist/standalone/install-apps-cli.d.ts +3 -1
  47. package/dist/standalone/install-apps-cli.js +27 -17
  48. package/dist/standalone/machine-link.d.ts +2 -0
  49. package/dist/standalone/machine-link.js +34 -1
  50. package/dist/standalone/registry.d.ts +1 -1
  51. package/dist/testing/capabilities.d.ts +2 -0
  52. package/dist/testing/capabilities.js +3 -1
  53. package/dist/workers-git.js +1 -1
  54. package/dist/workers.d.ts +3 -0
  55. package/dist/workers.js +9 -1
  56. package/docs/api/agents.md +8 -4
  57. package/docs/api/apps.md +8 -4
  58. package/docs/api/browser.md +40 -16
  59. package/docs/api/keys.md +25 -3
  60. package/docs/api/workers.md +21 -14
  61. package/docs/site/agent-quickstart.mdx +23 -0
  62. package/examples/standalone/wrangler.jsonc +3 -4
  63. package/package.json +29 -17
package/docs/api/apps.md CHANGED
@@ -852,6 +852,10 @@ const gateRequestSchema: ZodLazy<ZodDiscriminatedUnion<[ZodObject<{
852
852
  | "channels.read"
853
853
  | "channels.personal.manage", unknown>>;
854
854
  operation: ZodString;
855
+ effect: ZodEnum<{
856
+ read: "read";
857
+ write: "write";
858
+ }>;
855
859
  }, $strict>], "kind">>;
856
860
  ```
857
861
 
@@ -1676,10 +1680,10 @@ stay outside this pure gate.
1676
1680
 
1677
1681
  #### Parameters
1678
1682
 
1679
- | Parameter | Type |
1680
- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1681
- | `facts` | [`GateFacts`](#gatefacts) |
1682
- | `rawRequest` | \| \{ `kind`: `"method"`; `name`: `string`; `input`: `unknown`; `via`: `"ui"` \| `"agent"` \| `"mcp"` \| `"workflow"`; `resource?`: `Readonly`\<\{ `kind`: `string`; `id`: `string`; \}\>; \} \| \{ `kind`: `"capability"`; `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"`; `operation?`: `string`; `resource`: \| `"any"` \| `Readonly`\<\{ `kind`: `string`; `id`: `string`; \}\>; \} \| \{ `kind`: `"capability-route"`; `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"`; `operation`: `string`; \} \| \{ `kind`: `"binding"`; `binding`: \| `"BACKGROUND"` \| `"GIT"` \| `"EVENTS"` \| `"APPS"` \| `"WORKFLOWS"` \| `"APP_STORAGE"` \| `"MEDIA"` \| `"COMPUTER"` \| `"INBOX"` \| `"AGENTS"`; `operation`: `string`; \} \| \{ `kind`: `"list-tools"`; \} \| \{ `kind`: `"backend"`; \} |
1683
+ | Parameter | Type |
1684
+ | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1685
+ | `facts` | [`GateFacts`](#gatefacts) |
1686
+ | `rawRequest` | \| \{ `kind`: `"method"`; `name`: `string`; `input`: `unknown`; `via`: `"ui"` \| `"agent"` \| `"mcp"` \| `"workflow"`; `resource?`: `Readonly`\<\{ `kind`: `string`; `id`: `string`; \}\>; \} \| \{ `kind`: `"capability"`; `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"`; `operation?`: `string`; `resource`: \| `"any"` \| `Readonly`\<\{ `kind`: `string`; `id`: `string`; \}\>; \} \| \{ `kind`: `"capability-route"`; `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"`; `operation`: `string`; `effect`: `"read"` \| `"write"`; \} \| \{ `kind`: `"binding"`; `binding`: \| `"BACKGROUND"` \| `"GIT"` \| `"EVENTS"` \| `"APPS"` \| `"WORKFLOWS"` \| `"APP_STORAGE"` \| `"MEDIA"` \| `"COMPUTER"` \| `"INBOX"` \| `"AGENTS"`; `operation`: `string`; \} \| \{ `kind`: `"list-tools"`; \} \| \{ `kind`: `"backend"`; \} |
1683
1687
 
1684
1688
  #### Returns
1685
1689
 
@@ -91,7 +91,7 @@ Data.TaggedError("CloudBrowserUrlDenied").message;
91
91
 
92
92
  ### CloudBrowserUpstreamError
93
93
 
94
- The provider (Cloudflare Browser Run) answered with a failure.
94
+ The configured provider answered with a failure or is unreachable.
95
95
 
96
96
  #### Extends
97
97
 
@@ -593,10 +593,11 @@ type BrowserLimits = Readonly<{
593
593
 
594
594
  `@fungi.computer/oyster/browser`: the one agent browser for the Hub and a
595
595
  standalone Oyster. A host builds the port from a provider (`browserRunSessions`
596
- or `bindingSessions`, plus Browser Run Quick Reads when it has them), its
597
- required metering owner and an event sink; `createBrowser` owns lease ownership,
598
- egress policy and billing order; `browserCapabilitySource` is the agent's
599
- `cloudBrowser` tool. Raw CDP stays internal to this directory.
596
+ or `bindingSessions` or `onboxBrowserSessions` on staging, plus Browser Run
597
+ Quick Reads when it has them), its required metering owner and an event sink;
598
+ `createBrowser` owns lease ownership, egress policy and billing order;
599
+ `browserCapabilitySource` is the agent's `cloudBrowser` tool. Raw CDP stays
600
+ internal to this directory.
600
601
 
601
602
  ---
602
603
 
@@ -643,10 +644,11 @@ type Browser = Readonly<{
643
644
 
644
645
  `@fungi.computer/oyster/browser`: the one agent browser for the Hub and a
645
646
  standalone Oyster. A host builds the port from a provider (`browserRunSessions`
646
- or `bindingSessions`, plus Browser Run Quick Reads when it has them), its
647
- required metering owner and an event sink; `createBrowser` owns lease ownership,
648
- egress policy and billing order; `browserCapabilitySource` is the agent's
649
- `cloudBrowser` tool. Raw CDP stays internal to this directory.
647
+ or `bindingSessions` or `onboxBrowserSessions` on staging, plus Browser Run
648
+ Quick Reads when it has them), its required metering owner and an event sink;
649
+ `createBrowser` owns lease ownership, egress policy and billing order;
650
+ `browserCapabilitySource` is the agent's `cloudBrowser` tool. Raw CDP stays
651
+ internal to this directory.
650
652
 
651
653
  ---
652
654
 
@@ -1058,9 +1060,9 @@ caller (`browser.ts`) owns the deadline through `signal`.
1058
1060
  type BrowserSessions = Readonly<{}>;
1059
1061
  ```
1060
1062
 
1061
- The provider half of the host port. Built only by the two functions below. Each
1062
- step is separate so `createBrowser` owns a provider session id from the moment
1063
- it exists, including when its CDP connect then fails.
1063
+ The provider half of the host port. Each step is separate so `createBrowser`
1064
+ owns a provider session id from the moment it exists, including when its CDP
1065
+ connect then fails.
1064
1066
 
1065
1067
  ---
1066
1068
 
@@ -1338,10 +1340,11 @@ function createBrowser(host, limits): Browser;
1338
1340
 
1339
1341
  `@fungi.computer/oyster/browser`: the one agent browser for the Hub and a
1340
1342
  standalone Oyster. A host builds the port from a provider (`browserRunSessions`
1341
- or `bindingSessions`, plus Browser Run Quick Reads when it has them), its
1342
- required metering owner and an event sink; `createBrowser` owns lease ownership,
1343
- egress policy and billing order; `browserCapabilitySource` is the agent's
1344
- `cloudBrowser` tool. Raw CDP stays internal to this directory.
1343
+ or `bindingSessions` or `onboxBrowserSessions` on staging, plus Browser Run
1344
+ Quick Reads when it has them), its required metering owner and an event sink;
1345
+ `createBrowser` owns lease ownership, egress policy and billing order;
1346
+ `browserCapabilitySource` is the agent's `cloudBrowser` tool. Raw CDP stays
1347
+ internal to this directory.
1345
1348
 
1346
1349
  #### Parameters
1347
1350
 
@@ -1438,3 +1441,24 @@ A standalone Oyster's own Workers BROWSER binding.
1438
1441
  #### Returns
1439
1442
 
1440
1443
  [`BrowserSessions`](#browsersessions)
1444
+
1445
+ ---
1446
+
1447
+ ### onboxBrowserSessions()
1448
+
1449
+ ```ts
1450
+ function onboxBrowserSessions(origin, fetcher?): BrowserSessions;
1451
+ ```
1452
+
1453
+ Staging uses Chromium's native CDP browser contexts; no session store.
1454
+
1455
+ #### Parameters
1456
+
1457
+ | Parameter | Type |
1458
+ | --------- | ------------------------- |
1459
+ | `origin` | `string` |
1460
+ | `fetcher` | [`HttpFetch`](#httpfetch) |
1461
+
1462
+ #### Returns
1463
+
1464
+ [`BrowserSessions`](#browsersessions)
package/docs/api/keys.md CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  ```ts
16
16
  type OysterKeyCapability =
17
- "apps.read" | "apps.use" | "computer.use" | "machine.enroll";
17
+ "apps.read" | "apps.use" | "agents.use" | "computer.use" | "machine.enroll";
18
18
  ```
19
19
 
20
20
  Every capability an Oyster key may carry.
@@ -88,8 +88,9 @@ const oysterKeyVocabulary: GrantVocabulary<OysterKeyCapability>;
88
88
  `apps.use` also reaches `apps.read` (one level, per `defineGrants`'s own
89
89
  `implies`): a key that may change an App's data may also read it. `computer.use`
90
90
  has no narrower capability under it; the Computer is on or off, host-wide.
91
- `machine.enroll` admits enrollment only; it implies no App or Computer access.
92
- The enrollment owner, not this vocabulary, owns one-use consumption.
91
+ `agents.use` selects Agent ids independently of App grants. `machine.enroll`
92
+ admits enrollment only; it implies no App or Computer access. The enrollment
93
+ owner, not this vocabulary, owns one-use consumption.
93
94
 
94
95
  ---
95
96
 
@@ -159,6 +160,27 @@ name for MCP) to reach the full `AppToolAccess`.
159
160
 
160
161
  ---
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
+
162
184
  ### keyAllowsComputerUse()
163
185
 
164
186
  ```ts
@@ -253,6 +253,7 @@ approvalGet(
253
253
  | "outcome-unknown"
254
254
  | "identity-conflict"
255
255
  | null;
256
+ denialNote?: string;
256
257
  requestedAt: number;
257
258
  expiresAt: number;
258
259
  updatedAt: number;
@@ -289,9 +290,9 @@ Read one member-scoped view; the native home resolves membership again.
289
290
  `"not-found"` \| `"not-eligible"` \| `"already-answered"` \| `"stale-revision"`
290
291
  \| `"declined"` \| `"fenced"` \| `"not-granted"` \| `"read-only"` \|
291
292
  `"in-flight"` \| `"outcome-unknown"` \| `"identity-conflict"` \| `null`;
292
- `requestedAt`: `number`; `expiresAt`: `number`; `updatedAt`: `number`;
293
- `revision`: `number`; \}; `canAnswer`: `boolean`; `canSetAutoApprove`:
294
- `boolean`; \} \| `null`\>
293
+ `denialNote?`: `string`; `requestedAt`: `number`; `expiresAt`: `number`;
294
+ `updatedAt`: `number`; `revision`: `number`; \}; `canAnswer`: `boolean`;
295
+ `canSetAutoApprove`: `boolean`; \} \| `null`\>
295
296
 
296
297
  ##### approvalAnswer()
297
298
 
@@ -353,6 +354,7 @@ approvalAnswer(
353
354
  | "outcome-unknown"
354
355
  | "identity-conflict"
355
356
  | null;
357
+ denialNote?: string;
356
358
  requestedAt: number;
357
359
  expiresAt: number;
358
360
  updatedAt: number;
@@ -377,6 +379,7 @@ approvalAnswer(
377
379
  | "in-flight"
378
380
  | "outcome-unknown"
379
381
  | "identity-conflict";
382
+ denialNote?: string;
380
383
  }>>;
381
384
  ```
382
385
 
@@ -388,10 +391,11 @@ Persist an eligible answer and attempt its native decision work once.
388
391
  | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
389
392
  | `pin` | `Readonly`\<\{ `tenantId`: `string`; `origin`: `string`; \}\> |
390
393
  | `actor` | \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \} |
391
- | `input` | \{ `recordId`: `string`; `decision`: `"approve"` \| `"deny"`; `expectedRevision`: `number`; \} |
394
+ | `input` | \{ `recordId`: `string`; `decision`: `"approve"` \| `"deny"`; `expectedRevision`: `number`; `denialNote?`: `string`; \} |
392
395
  | `input.recordId` | `string` |
393
396
  | `input.decision` | `"approve"` \| `"deny"` |
394
397
  | `input.expectedRevision` | `number` |
398
+ | `input.denialNote?` | `string` |
395
399
 
396
400
  ###### Returns
397
401
 
@@ -408,13 +412,14 @@ Persist an eligible answer and attempt its native decision work once.
408
412
  `reason`: \| `"pending"` \| `"expired"` \| `"not-found"` \| `"not-eligible"` \|
409
413
  `"already-answered"` \| `"stale-revision"` \| `"declined"` \| `"fenced"` \|
410
414
  `"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"`; \}\>\>
415
+ `"identity-conflict"` \| `null`; `denialNote?`: `string`; `requestedAt`:
416
+ `number`; `expiresAt`: `number`; `updatedAt`: `number`; `revision`: `number`;
417
+ \}; `canAnswer`: `boolean`; `canSetAutoApprove`: `boolean`; \}; \}\> \|
418
+ `Readonly`\<\{ `kind`: `"refused"`; `reason`: \| `"pending"` \| `"expired"` \|
419
+ `"not-found"` \| `"not-eligible"` \| `"already-answered"` \| `"stale-revision"`
420
+ \| `"declined"` \| `"fenced"` \| `"not-granted"` \| `"read-only"` \|
421
+ `"in-flight"` \| `"outcome-unknown"` \| `"identity-conflict"`; `denialNote?`:
422
+ `string`; \}\>\>
418
423
 
419
424
  ##### approvalSetAutoApprove()
420
425
 
@@ -439,6 +444,7 @@ approvalSetAutoApprove(
439
444
  | "in-flight"
440
445
  | "outcome-unknown"
441
446
  | "identity-conflict";
447
+ denialNote?: string;
442
448
  }>
443
449
  | Readonly<{
444
450
  kind: "updated";
@@ -478,9 +484,10 @@ it.
478
484
  `"expired"` \| `"not-found"` \| `"not-eligible"` \| `"already-answered"` \|
479
485
  `"stale-revision"` \| `"declined"` \| `"fenced"` \| `"not-granted"` \|
480
486
  `"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`; \}; \}\>\>
487
+ `denialNote?`: `string`; \}\> \| `Readonly`\<\{ `kind`: `"updated"`; `rule`: \{
488
+ `scope`: \{ `agentId`: `string` \| `null`; \}; `family`: \{ `module`: `string`
489
+ \| `null`; `access`: `"write"` \| `"external"`; \}; `enabled`: `boolean`; \};
490
+ \}\>\>
484
491
 
485
492
  ##### installationOperation()
486
493
 
@@ -10,6 +10,29 @@ Run every command exactly as written, from the directory each step names.
10
10
  Compare its output with the expected output before you go on. When a step fails,
11
11
  read the "If it fails" notes under it before trying anything else.
12
12
 
13
+ ## Before you start
14
+
15
+ - **Cloudflare plan:** SQLite-backed Durable Objects are available on Workers
16
+ Free; they do not by themselves require Paid. Cloudflare's SQLite-backed
17
+ Durable Objects limits list 30 seconds of CPU per request by default,
18
+ configurable to 5 minutes. See Cloudflare's
19
+ [Durable Objects limits](https://developers.cloudflare.com/durable-objects/platform/limits/)
20
+ and
21
+ [Durable Objects pricing](https://developers.cloudflare.com/durable-objects/platform/pricing/).
22
+ - **Agent chat and AI Gateway:** By default, Agent chat uses the Workers AI
23
+ binding; it needs no separate provider key or Gateway setup. Prints uses your
24
+ account's default AI Gateway (created automatically); set `AI_GATEWAY_ID` to
25
+ use another. The routed models include `openai/gpt-image-2` and video IDs
26
+ `bytedance/seedance-2.0`, `bytedance/seedance-2.0-fast`,
27
+ `bytedance/seedance-2.0-mini`, `google/veo-3.1`, `google/veo-3.1-fast` and
28
+ `minimax/h3-max`.
29
+
30
+ - **Deployment plan:** Step 7 needs Workers Paid because this deployment uses
31
+ Containers for the Computer image; Cloudflare lists Containers as available on
32
+ the
33
+ [Workers Paid plan](https://developers.cloudflare.com/containers/platform/).
34
+ SQLite-backed Durable Objects alone do not require Paid.
35
+
13
36
  ## What Oyster is
14
37
 
15
38
  - Oyster hosts Apps on one Cloudflare Worker, or on celld, a Workers-compatible
@@ -40,10 +40,9 @@
40
40
  "OYSTER_HOME_INSTALLATION": "tourtois",
41
41
  "OYSTER_ORIGIN": "https://oyster.example",
42
42
  "OYSTER_OWNER_NAME": "owner",
43
- // Names the AI Gateway that Prints' third-party models (GPT Image 2,
44
- // Seedance, Veo) and the background media retry owner route through.
45
- // Not a secret: Cloudflare creates the gateway by this id on first use.
46
- "AI_GATEWAY_ID": "oyster",
43
+ // Cloudflare creates the account's default AI Gateway on first use.
44
+ // Set another ID here to route Prints through a Gateway you configured.
45
+ "AI_GATEWAY_ID": "default",
47
46
  },
48
47
  "durable_objects": {
49
48
  "bindings": [
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@fungi.computer/oyster",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "author": "Levi <levi@technomancy.dev>",
5
5
  "description": "Run your own Apps on Cloudflare Workers or celld: installable App Releases, each with its own Durable Object, SQLite database and declared bindings",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
9
9
  "bin": {
10
- "oyster": "./dist/standalone/install-apps-cli.js"
10
+ "oyster": "./dist/standalone/install-apps-bin.js"
11
11
  },
12
12
  "files": [
13
13
  "dist",
@@ -104,6 +104,18 @@
104
104
  "types": "./dist/event-recipients.d.ts",
105
105
  "import": "./dist/event-recipients.js"
106
106
  },
107
+ "./channels/ids": {
108
+ "types": "./dist/channels/ids.d.ts",
109
+ "import": "./dist/channels/ids.js"
110
+ },
111
+ "./channels/binding": {
112
+ "types": "./dist/channels/binding.d.ts",
113
+ "import": "./dist/channels/binding.js"
114
+ },
115
+ "./channels/conversations": {
116
+ "types": "./dist/channels/conversations.d.ts",
117
+ "import": "./dist/channels/conversations.js"
118
+ },
107
119
  "./app-storage": {
108
120
  "types": "./dist/app-storage.d.ts",
109
121
  "import": "./dist/app-storage.js"
@@ -252,35 +264,35 @@
252
264
  "dependencies": {
253
265
  "@cfworker/json-schema": "4.1.1",
254
266
  "@earendil-works/pi-ai": "1.3.0",
255
- "@fungi.computer/agar": "0.3.1",
256
- "@fungi.computer/bird-dog": "0.2.0",
257
- "@fungi.computer/braid": "0.2.2",
267
+ "@fungi.computer/agar": "0.4.0",
268
+ "@fungi.computer/bird-dog": "0.2.1",
269
+ "@fungi.computer/braid": "0.2.3",
258
270
  "@fungi.computer/burrow": "0.1.0",
259
271
  "@fungi.computer/cairn": "0.1.0",
260
272
  "@fungi.computer/capnweb": "0.12.0",
261
- "@fungi.computer/caps": "0.3.0",
273
+ "@fungi.computer/caps": "0.3.1",
262
274
  "@fungi.computer/carrier": "0.2.0",
263
- "@fungi.computer/computer": "0.3.0",
264
- "@fungi.computer/computer-contract": "0.0.3",
265
- "@fungi.computer/darkroom": "0.2.1",
275
+ "@fungi.computer/computer": "0.3.1",
276
+ "@fungi.computer/computer-contract": "0.0.4",
277
+ "@fungi.computer/darkroom": "0.3.0",
266
278
  "@fungi.computer/ear-tag": "0.1.0",
267
279
  "@fungi.computer/forage": "0.2.0",
268
280
  "@fungi.computer/gills": "0.2.0",
269
- "@fungi.computer/knapsack": "0.3.0",
281
+ "@fungi.computer/knapsack": "0.3.1",
270
282
  "@fungi.computer/mycelium": "0.2.2",
271
- "@fungi.computer/nacre": "0.0.2",
283
+ "@fungi.computer/nacre": "0.0.3",
272
284
  "@fungi.computer/puffball": "0.2.0",
273
285
  "@fungi.computer/seam": "0.2.0",
274
- "@fungi.computer/shiitake": "0.4.0",
275
- "@fungi.computer/shiitake-extensions": "0.2.0",
286
+ "@fungi.computer/shiitake": "0.5.0",
287
+ "@fungi.computer/shiitake-extensions": "0.3.0",
276
288
  "@fungi.computer/sigils": "0.2.0",
277
289
  "@fungi.computer/sprite": "0.2.0",
278
290
  "@fungi.computer/sprite-zdog": "0.2.0",
279
- "@fungi.computer/veil": "0.2.0",
291
+ "@fungi.computer/veil": "0.2.1",
280
292
  "@fungi.computer/watchdog": "0.1.0",
281
- "@fungi.computer/whistle": "0.1.0",
282
- "@fungi.computer/workflows-wire": "0.2.2",
283
- "@fungi.computer/zookeeper": "0.0.3",
293
+ "@fungi.computer/whistle": "0.2.0",
294
+ "@fungi.computer/workflows-wire": "0.2.3",
295
+ "@fungi.computer/zookeeper": "0.0.4",
284
296
  "@modelcontextprotocol/server": "2.0.0",
285
297
  "@pnpm/lockfile.fs": "1100.2.13",
286
298
  "@pnpm/lockfile.pruner": "1100.0.27",