@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.
- package/dist/agents.d.ts +2 -1
- package/dist/agents.js +63 -8
- package/dist/app-builds.d.ts +1 -1
- package/dist/app-builds.js +16 -6
- package/dist/apps/gate.d.ts +4 -0
- package/dist/apps/gate.js +3 -0
- package/dist/boot-capability.d.ts +2 -1
- package/dist/boot-capability.js +7 -5
- package/dist/boot-host-script.js +1 -1
- package/dist/build/build-jobs.d.ts +3 -3
- package/dist/build/build-jobs.js +10 -5
- package/dist/build/candidate-cli.js +5 -3
- package/dist/build/candidate-cli.mjs +238 -5
- package/dist/build/candidate-diagnostic.d.ts +2 -0
- package/dist/build/candidate-diagnostic.js +16 -0
- package/dist/channels/binding.d.ts +63 -0
- package/dist/channels/binding.js +85 -0
- package/dist/channels/conversations.d.ts +235 -0
- package/dist/channels/conversations.js +705 -0
- package/dist/channels/ids.d.ts +8 -0
- package/dist/channels/ids.js +15 -0
- package/dist/host.d.ts +1 -1
- package/dist/host.js +21 -4
- package/dist/keys.d.ts +4 -1
- package/dist/keys.js +15 -4
- package/dist/machine-link/authority.d.ts +7 -0
- package/dist/machine-link/delivery.d.ts +12 -0
- package/dist/machine-link/delivery.js +22 -1
- package/dist/machine-link/disposition.d.ts +16 -0
- package/dist/machine-link/disposition.js +65 -0
- package/dist/machine-link/host.d.ts +11 -2
- package/dist/machine-link/host.js +125 -5
- package/dist/machine-link/link.d.ts +4 -0
- package/dist/machine-link/link.js +47 -1
- package/dist/page-script.js +4 -4
- package/dist/standalone/agent-mail.js +4 -1
- package/dist/standalone/agent-model-choice.d.ts +4 -1
- package/dist/standalone/agents.d.ts +8 -0
- package/dist/standalone/agents.js +21 -2
- package/dist/standalone/app-set.d.ts +8 -1
- package/dist/standalone/app-set.js +46 -31
- package/dist/standalone/channel-session-door.d.ts +4 -0
- package/dist/standalone/channel-session-door.js +42 -0
- package/dist/standalone/install-apps-bin.d.ts +2 -0
- package/dist/standalone/install-apps-bin.js +3 -0
- package/dist/standalone/install-apps-cli.d.ts +3 -1
- package/dist/standalone/install-apps-cli.js +27 -17
- package/dist/standalone/machine-link.d.ts +2 -0
- package/dist/standalone/machine-link.js +34 -1
- package/dist/standalone/registry.d.ts +1 -1
- package/dist/testing/capabilities.d.ts +2 -0
- package/dist/testing/capabilities.js +3 -1
- package/dist/workers-git.js +1 -1
- package/dist/workers.d.ts +3 -0
- package/dist/workers.js +9 -1
- package/docs/api/agents.md +8 -4
- package/docs/api/apps.md +8 -4
- package/docs/api/browser.md +40 -16
- package/docs/api/keys.md +25 -3
- package/docs/api/workers.md +21 -14
- package/docs/site/agent-quickstart.mdx +23 -0
- package/examples/standalone/wrangler.jsonc +3 -4
- 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
|
|
package/docs/api/browser.md
CHANGED
|
@@ -91,7 +91,7 @@ Data.TaggedError("CloudBrowserUrlDenied").message;
|
|
|
91
91
|
|
|
92
92
|
### CloudBrowserUpstreamError
|
|
93
93
|
|
|
94
|
-
The provider
|
|
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
|
|
597
|
-
required metering owner and an event sink;
|
|
598
|
-
egress policy and billing order;
|
|
599
|
-
`cloudBrowser` tool. Raw CDP stays
|
|
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
|
|
647
|
-
required metering owner and an event sink;
|
|
648
|
-
egress policy and billing order;
|
|
649
|
-
`cloudBrowser` tool. Raw CDP stays
|
|
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.
|
|
1062
|
-
|
|
1063
|
-
|
|
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
|
|
1342
|
-
required metering owner and an event sink;
|
|
1343
|
-
egress policy and billing order;
|
|
1344
|
-
`cloudBrowser` tool. Raw CDP stays
|
|
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
|
-
`
|
|
92
|
-
|
|
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
|
package/docs/api/workers.md
CHANGED
|
@@ -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
|
-
`
|
|
293
|
-
`revision`: `number`; \}; `canAnswer`: `boolean`;
|
|
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`; `
|
|
412
|
-
`
|
|
413
|
-
`canSetAutoApprove`: `boolean`; \}; \}\> \|
|
|
414
|
-
`
|
|
415
|
-
`"
|
|
416
|
-
`"
|
|
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`: \{
|
|
482
|
-
`string` \| `null`; \}; `family`: \{ `module`: `string`
|
|
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
|
-
//
|
|
44
|
-
//
|
|
45
|
-
|
|
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.
|
|
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-
|
|
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.
|
|
256
|
-
"@fungi.computer/bird-dog": "0.2.
|
|
257
|
-
"@fungi.computer/braid": "0.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.
|
|
273
|
+
"@fungi.computer/caps": "0.3.1",
|
|
262
274
|
"@fungi.computer/carrier": "0.2.0",
|
|
263
|
-
"@fungi.computer/computer": "0.3.
|
|
264
|
-
"@fungi.computer/computer-contract": "0.0.
|
|
265
|
-
"@fungi.computer/darkroom": "0.
|
|
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.
|
|
281
|
+
"@fungi.computer/knapsack": "0.3.1",
|
|
270
282
|
"@fungi.computer/mycelium": "0.2.2",
|
|
271
|
-
"@fungi.computer/nacre": "0.0.
|
|
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.
|
|
275
|
-
"@fungi.computer/shiitake-extensions": "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.
|
|
291
|
+
"@fungi.computer/veil": "0.2.1",
|
|
280
292
|
"@fungi.computer/watchdog": "0.1.0",
|
|
281
|
-
"@fungi.computer/whistle": "0.
|
|
282
|
-
"@fungi.computer/workflows-wire": "0.2.
|
|
283
|
-
"@fungi.computer/zookeeper": "0.0.
|
|
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",
|