@fungi.computer/oyster 0.3.1 → 0.4.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 (75) hide show
  1. package/README.md +2 -1
  2. package/dist/agent-computer-source.d.ts +42 -0
  3. package/dist/agent-computer-source.js +88 -0
  4. package/dist/agent-computers.d.ts +104 -0
  5. package/dist/agent-computers.js +227 -0
  6. package/dist/agents.d.ts +10 -0
  7. package/dist/agents.js +33 -0
  8. package/dist/boot-capability.d.ts +1 -1
  9. package/dist/boot-capability.js +1 -1
  10. package/dist/browser/boot.d.ts +2 -2
  11. package/dist/browser/boot.js +10 -3
  12. package/dist/browser/browser.d.ts +1 -1
  13. package/dist/browser/browser.js +2 -1
  14. package/dist/browser/cdp-client.d.ts +2 -0
  15. package/dist/browser/errors.d.ts +2 -2
  16. package/dist/browser/errors.js +2 -2
  17. package/dist/browser/index.d.ts +3 -2
  18. package/dist/browser/index.js +3 -2
  19. package/dist/browser/page.js +11 -4
  20. package/dist/browser/sessions.d.ts +7 -4
  21. package/dist/browser/sessions.js +159 -0
  22. package/dist/browser/url-policy.d.ts +4 -2
  23. package/dist/browser/url-policy.js +4 -2
  24. package/dist/computer-control-port.d.ts +26 -0
  25. package/dist/computer-control-port.js +1 -0
  26. package/dist/host.d.ts +3 -0
  27. package/dist/machine-link/delivery.d.ts +1 -1
  28. package/dist/machine-link/delivery.js +2 -3
  29. package/dist/machine-link/host.d.ts +37 -6
  30. package/dist/machine-link/host.js +209 -14
  31. package/dist/machine-link/link.d.ts +13 -1
  32. package/dist/machine-link/link.js +20 -7
  33. package/dist/mcp.d.ts +152 -11
  34. package/dist/mcp.js +131 -13
  35. package/dist/page/computer-handles.d.ts +3 -3
  36. package/dist/page-script.js +1 -1
  37. package/dist/standalone/agent-computers.d.ts +29 -0
  38. package/dist/standalone/agent-computers.js +101 -0
  39. package/dist/standalone/agent-mail.d.ts +41 -18
  40. package/dist/standalone/agent-model-choice.d.ts +26 -0
  41. package/dist/standalone/agent-model-choice.js +72 -0
  42. package/dist/standalone/agents.d.ts +50 -5
  43. package/dist/standalone/agents.js +505 -53
  44. package/dist/standalone/app-builds-binding.js +1 -1
  45. package/dist/standalone/computer-control.d.ts +4 -0
  46. package/dist/standalone/computer-control.js +62 -0
  47. package/dist/standalone/computer-fleet.d.ts +1 -0
  48. package/dist/standalone/computer-fleet.js +1 -1
  49. package/dist/standalone/computer.d.ts +21 -2
  50. package/dist/standalone/computer.js +12 -0
  51. package/dist/standalone/machine-link.d.ts +10 -0
  52. package/dist/standalone/machine-link.js +6 -0
  53. package/dist/standalone/registry.d.ts +12 -0
  54. package/dist/standalone/registry.js +18 -0
  55. package/dist/standalone/tenancy.d.ts +14 -1
  56. package/dist/standalone/tenancy.js +37 -3
  57. package/dist/standalone/worker.js +36 -9
  58. package/dist/standalone/workflow-binding.d.ts +2 -2
  59. package/dist/standalone/workflow-host.d.ts +11 -11
  60. package/dist/standalone/workflows.d.ts +22 -22
  61. package/dist/storage-frame.d.ts +3 -3
  62. package/dist/workers-git.d.ts +2 -0
  63. package/dist/workers-git.js +11 -1
  64. package/dist/workers.d.ts +8 -8
  65. package/docs/api/agents.md +66 -0
  66. package/docs/api/apps.md +104 -104
  67. package/docs/api/build-contract.md +35 -35
  68. package/docs/api/build.md +12 -12
  69. package/docs/api/host.md +61 -61
  70. package/docs/api/mcp.md +141 -13
  71. package/docs/api/root-data.md +1 -1
  72. package/docs/api/tenancy.md +1 -1
  73. package/docs/api/workers-git.md +3 -2
  74. package/docs/api/workers.md +81 -83
  75. package/package.json +25 -17
package/docs/api/host.md CHANGED
@@ -469,6 +469,7 @@ type OysterHost = Readonly<{
469
469
  }>;
470
470
  }
471
471
  | null>;
472
+ computerControl?: (principal) => ComputerControlPort | null;
472
473
  auth: OysterAuth;
473
474
  backgroundOriginKey?: () => Promise<CryptoKey>;
474
475
  artifacts: ArtifactStore;
@@ -1605,6 +1606,10 @@ function verifyRelease(
1605
1606
  }>;
1606
1607
  displayName?: string;
1607
1608
  capabilities: readonly (
1609
+ | "computer.list"
1610
+ | "computer.readFile"
1611
+ | "computer.writeFile"
1612
+ | "computer.execute"
1608
1613
  | "approvals"
1609
1614
  | "agent.list"
1610
1615
  | "agent.manage"
@@ -1613,10 +1618,6 @@ function verifyRelease(
1613
1618
  | "agent.toolPolicy"
1614
1619
  | "agent.read"
1615
1620
  | "agent.send"
1616
- | "computer.list"
1617
- | "computer.readFile"
1618
- | "computer.writeFile"
1619
- | "computer.execute"
1620
1621
  | "llm.generation"
1621
1622
  | "media.generation"
1622
1623
  | "games:servers"
@@ -1639,7 +1640,7 @@ function verifyRelease(
1639
1640
  handlers: readonly "file.open"[];
1640
1641
  receives?: readonly "git.push"[];
1641
1642
  icon?: string;
1642
- roles: readonly ("dashboard" | "inbox" | "files" | "media" | "sessions" | "terminal")[];
1643
+ roles: readonly ("files" | "dashboard" | "inbox" | "media" | "sessions" | "terminal")[];
1643
1644
  storage?: readonly Readonly<...>[];
1644
1645
  commands?: readonly Readonly<...>[];
1645
1646
  gills?: readonly Readonly<...>[];
@@ -1673,6 +1674,10 @@ function verifyRelease(
1673
1674
  }>;
1674
1675
  displayName?: string;
1675
1676
  capabilities: readonly (
1677
+ | "computer.list"
1678
+ | "computer.readFile"
1679
+ | "computer.writeFile"
1680
+ | "computer.execute"
1676
1681
  | "approvals"
1677
1682
  | "agent.list"
1678
1683
  | "agent.manage"
@@ -1681,10 +1686,6 @@ function verifyRelease(
1681
1686
  | "agent.toolPolicy"
1682
1687
  | "agent.read"
1683
1688
  | "agent.send"
1684
- | "computer.list"
1685
- | "computer.readFile"
1686
- | "computer.writeFile"
1687
- | "computer.execute"
1688
1689
  | "llm.generation"
1689
1690
  | "media.generation"
1690
1691
  | "games:servers"
@@ -1707,7 +1708,7 @@ function verifyRelease(
1707
1708
  handlers: readonly "file.open"[];
1708
1709
  receives?: readonly "git.push"[];
1709
1710
  icon?: string;
1710
- roles: readonly ("dashboard" | "inbox" | "files" | "media" | "sessions" | "terminal")[];
1711
+ roles: readonly ("files" | "dashboard" | "inbox" | "media" | "sessions" | "terminal")[];
1711
1712
  storage?: readonly Readonly<...>[];
1712
1713
  commands?: readonly Readonly<...>[];
1713
1714
  gills?: readonly Readonly<...>[];
@@ -1734,6 +1735,10 @@ function verifyRelease(
1734
1735
  }>;
1735
1736
  displayName?: string;
1736
1737
  capabilities: readonly (
1738
+ | "computer.list"
1739
+ | "computer.readFile"
1740
+ | "computer.writeFile"
1741
+ | "computer.execute"
1737
1742
  | "approvals"
1738
1743
  | "agent.list"
1739
1744
  | "agent.manage"
@@ -1742,10 +1747,6 @@ function verifyRelease(
1742
1747
  | "agent.toolPolicy"
1743
1748
  | "agent.read"
1744
1749
  | "agent.send"
1745
- | "computer.list"
1746
- | "computer.readFile"
1747
- | "computer.writeFile"
1748
- | "computer.execute"
1749
1750
  | "llm.generation"
1750
1751
  | "media.generation"
1751
1752
  | "games:servers"
@@ -1768,7 +1769,7 @@ function verifyRelease(
1768
1769
  handlers: readonly "file.open"[];
1769
1770
  receives?: readonly "git.push"[];
1770
1771
  icon?: string;
1771
- roles: readonly ("dashboard" | "inbox" | "files" | "media" | "sessions" | "terminal")[];
1772
+ roles: readonly ("files" | "dashboard" | "inbox" | "media" | "sessions" | "terminal")[];
1772
1773
  storage?: readonly Readonly<...>[];
1773
1774
  commands?: readonly Readonly<...>[];
1774
1775
  gills?: readonly Readonly<...>[];
@@ -1817,6 +1818,10 @@ function verifyRelease(
1817
1818
  }>;
1818
1819
  displayName?: string;
1819
1820
  capabilities: readonly (
1821
+ | "computer.list"
1822
+ | "computer.readFile"
1823
+ | "computer.writeFile"
1824
+ | "computer.execute"
1820
1825
  | "approvals"
1821
1826
  | "agent.list"
1822
1827
  | "agent.manage"
@@ -1825,10 +1830,6 @@ function verifyRelease(
1825
1830
  | "agent.toolPolicy"
1826
1831
  | "agent.read"
1827
1832
  | "agent.send"
1828
- | "computer.list"
1829
- | "computer.readFile"
1830
- | "computer.writeFile"
1831
- | "computer.execute"
1832
1833
  | "llm.generation"
1833
1834
  | "media.generation"
1834
1835
  | "games:servers"
@@ -1854,7 +1855,7 @@ function verifyRelease(
1854
1855
  handlers: readonly "file.open"[];
1855
1856
  receives?: readonly "git.push"[];
1856
1857
  icon?: string;
1857
- roles: readonly ("dashboard" | "inbox" | "files" | "media" | "sessions" | "terminal")[];
1858
+ roles: readonly ("files" | "dashboard" | "inbox" | "media" | "sessions" | "terminal")[];
1858
1859
  storage?: readonly Readonly<{
1859
1860
  key: string;
1860
1861
  scopes: readonly ...[];
@@ -1927,18 +1928,18 @@ standalone HTML.
1927
1928
  `Promise`\<`Readonly`\<\{ `release`: `Release`; `build`: \| \{ `declaration?`:
1928
1929
  `Readonly`\<\{ `api?`: `Readonly`\<\{ `methods`: ...; `toolFamily?`: ...;
1929
1930
  `events?`: ...; \}\>; `displayName?`: `string`; `capabilities`: readonly ( \|
1930
- `"approvals"` \| `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \|
1931
- `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \|
1932
1931
  `"computer.list"` \| `"computer.readFile"` \| `"computer.writeFile"` \|
1933
- `"computer.execute"` \| `"llm.generation"` \| `"media.generation"` \|
1932
+ `"computer.execute"` \| `"approvals"` \| `"agent.list"` \| `"agent.manage"` \|
1933
+ `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"`
1934
+ \| `"agent.send"` \| `"llm.generation"` \| `"media.generation"` \|
1934
1935
  `"games:servers"` \| `"git.repository"` \| `"apps.open"` \| `"apps.call"` \|
1935
1936
  `"app.storage"` \| `"app.events.emit"` \| `"team.workbenchHost"` \|
1936
1937
  `"marketplace.browse"` \| `"marketplace.purchase"` \| `"workflow.run"` \|
1937
1938
  `"workflow.publish"` \| `"workflow.arm"` \| `"world"` \| `"channels.read"` \|
1938
1939
  `"channels.personal.manage"`)[]; `calls?`: readonly `Readonly`\<...\>[];
1939
1940
  `guidance?`: `string`; `handlers`: readonly `"file.open"`[]; `receives?`:
1940
- readonly `"git.push"`[]; `icon?`: `string`; `roles`: readonly (`"dashboard"` \|
1941
- `"inbox"` \| `"files"` \| `"media"` \| `"sessions"` \| `"terminal"`)[];
1941
+ readonly `"git.push"`[]; `icon?`: `string`; `roles`: readonly (`"files"` \|
1942
+ `"dashboard"` \| `"inbox"` \| `"media"` \| `"sessions"` \| `"terminal"`)[];
1942
1943
  `storage?`: readonly `Readonly`\<...\>[]; `commands?`: readonly
1943
1944
  `Readonly`\<...\>[]; `gills?`: readonly `Readonly`\<...\>[]; `backend?`:
1944
1945
  `Readonly`\<\{ `bindings`: ...; `sync?`: ...; \}\>; \}\>; `format`:
@@ -1949,10 +1950,10 @@ readonly `"git.push"`[]; `icon?`: `string`; `roles`: readonly (`"dashboard"` \|
1949
1950
  `artifactRef`: `ArtifactRef`; `digest`: `Sha256Digest`; `version`: `string`;
1950
1951
  `byteLength`: `number`; \}; \} \| \{ `declaration?`: `Readonly`\<\{ `api?`:
1951
1952
  `Readonly`\<\{ `methods`: ...; `toolFamily?`: ...; `events?`: ...; \}\>;
1952
- `displayName?`: `string`; `capabilities`: readonly ( \| `"approvals"` \|
1953
- `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \|
1954
- `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \|
1953
+ `displayName?`: `string`; `capabilities`: readonly ( \| `"computer.list"` \|
1955
1954
  `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \|
1955
+ `"approvals"` \| `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \|
1956
+ `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \|
1956
1957
  `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \|
1957
1958
  `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \|
1958
1959
  `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \|
@@ -1960,8 +1961,8 @@ readonly `"git.push"`[]; `icon?`: `string`; `roles`: readonly (`"dashboard"` \|
1960
1961
  `"workflow.arm"` \| `"world"` \| `"channels.read"` \|
1961
1962
  `"channels.personal.manage"`)[]; `calls?`: readonly `Readonly`\<...\>[];
1962
1963
  `guidance?`: `string`; `handlers`: readonly `"file.open"`[]; `receives?`:
1963
- readonly `"git.push"`[]; `icon?`: `string`; `roles`: readonly (`"dashboard"` \|
1964
- `"inbox"` \| `"files"` \| `"media"` \| `"sessions"` \| `"terminal"`)[];
1964
+ readonly `"git.push"`[]; `icon?`: `string`; `roles`: readonly (`"files"` \|
1965
+ `"dashboard"` \| `"inbox"` \| `"media"` \| `"sessions"` \| `"terminal"`)[];
1965
1966
  `storage?`: readonly `Readonly`\<...\>[]; `commands?`: readonly
1966
1967
  `Readonly`\<...\>[]; `gills?`: readonly `Readonly`\<...\>[]; `backend?`:
1967
1968
  `Readonly`\<\{ `bindings`: ...; `sync?`: ...; \}\>; \}\>; `format`:
@@ -1970,23 +1971,22 @@ readonly `"git.push"`[]; `icon?`: `string`; `roles`: readonly (`"dashboard"` \|
1970
1971
  `digest`: `Sha256Digest`; `version`: `string`; `byteLength`: `number`; \}; \} \|
1971
1972
  \{ `declaration?`: `Readonly`\<\{ `api?`: `Readonly`\<\{ `methods`: ...;
1972
1973
  `toolFamily?`: ...; `events?`: ...; \}\>; `displayName?`: `string`;
1973
- `capabilities`: readonly ( \| `"approvals"` \| `"agent.list"` \|
1974
- `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"`
1975
- \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \|
1976
- `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \|
1977
- `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \|
1978
- `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \|
1979
- `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \|
1980
- `"marketplace.purchase"` \| `"workflow.run"` \| `"workflow.publish"` \|
1981
- `"workflow.arm"` \| `"world"` \| `"channels.read"` \|
1982
- `"channels.personal.manage"`)[]; `calls?`: readonly `Readonly`\<...\>[];
1983
- `guidance?`: `string`; `handlers`: readonly `"file.open"`[]; `receives?`:
1984
- readonly `"git.push"`[]; `icon?`: `string`; `roles`: readonly (`"dashboard"` \|
1985
- `"inbox"` \| `"files"` \| `"media"` \| `"sessions"` \| `"terminal"`)[];
1986
- `storage?`: readonly `Readonly`\<...\>[]; `commands?`: readonly
1987
- `Readonly`\<...\>[]; `gills?`: readonly `Readonly`\<...\>[]; `backend?`:
1988
- `Readonly`\<\{ `bindings`: ...; `sync?`: ...; \}\>; \}\>; `format`:
1989
- `"fungi-app-v1"`; `backend`: \{ `mediaType`:
1974
+ `capabilities`: readonly ( \| `"computer.list"` \| `"computer.readFile"` \|
1975
+ `"computer.writeFile"` \| `"computer.execute"` \| `"approvals"` \|
1976
+ `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \|
1977
+ `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \| `"llm.generation"`
1978
+ \| `"media.generation"` \| `"games:servers"` \| `"git.repository"` \|
1979
+ `"apps.open"` \| `"apps.call"` \| `"app.storage"` \| `"app.events.emit"` \|
1980
+ `"team.workbenchHost"` \| `"marketplace.browse"` \| `"marketplace.purchase"` \|
1981
+ `"workflow.run"` \| `"workflow.publish"` \| `"workflow.arm"` \| `"world"` \|
1982
+ `"channels.read"` \| `"channels.personal.manage"`)[]; `calls?`: readonly
1983
+ `Readonly`\<...\>[]; `guidance?`: `string`; `handlers`: readonly
1984
+ `"file.open"`[]; `receives?`: readonly `"git.push"`[]; `icon?`: `string`;
1985
+ `roles`: readonly (`"files"` \| `"dashboard"` \| `"inbox"` \| `"media"` \|
1986
+ `"sessions"` \| `"terminal"`)[]; `storage?`: readonly `Readonly`\<...\>[];
1987
+ `commands?`: readonly `Readonly`\<...\>[]; `gills?`: readonly
1988
+ `Readonly`\<...\>[]; `backend?`: `Readonly`\<\{ `bindings`: ...; `sync?`: ...;
1989
+ \}\>; \}\>; `format`: `"fungi-app-v1"`; `backend`: \{ `mediaType`:
1990
1990
  `"application/vnd.fungi.app-backend+json"`; `artifactRef`: `ArtifactRef`;
1991
1991
  `digest`: `Sha256Digest`; `version`: `string`; `byteLength`: `number`; \}; \};
1992
1992
  `api`: \| `Readonly`\<\{ `methods`: `Readonly`\<`Record`\<`string`,
@@ -1999,10 +1999,10 @@ readonly `"git.push"`[]; `icon?`: `string`; `roles`: readonly (`"dashboard"` \|
1999
1999
  `declaration`: \| `Readonly`\<\{ `api?`: `Readonly`\<\{ `methods`:
2000
2000
  `Readonly`\<`Record`\<..., ...\>\>; `toolFamily?`: `Readonly`\<...\>; `events?`:
2001
2001
  `Readonly`\<...\>; \}\>; `displayName?`: `string`; `capabilities`: readonly ( \|
2002
- `"approvals"` \| `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \|
2003
- `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \|
2004
2002
  `"computer.list"` \| `"computer.readFile"` \| `"computer.writeFile"` \|
2005
- `"computer.execute"` \| `"llm.generation"` \| `"media.generation"` \|
2003
+ `"computer.execute"` \| `"approvals"` \| `"agent.list"` \| `"agent.manage"` \|
2004
+ `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"`
2005
+ \| `"agent.send"` \| `"llm.generation"` \| `"media.generation"` \|
2006
2006
  `"games:servers"` \| `"git.repository"` \| `"apps.open"` \| `"apps.call"` \|
2007
2007
  `"app.storage"` \| `"app.events.emit"` \| `"team.workbenchHost"` \|
2008
2008
  `"marketplace.browse"` \| `"marketplace.purchase"` \| `"workflow.run"` \|
@@ -2010,7 +2010,7 @@ readonly `"git.push"`[]; `icon?`: `string`; `roles`: readonly (`"dashboard"` \|
2010
2010
  `"channels.personal.manage"`)[]; `calls?`: readonly `Readonly`\<\{ `appId`:
2011
2011
  `string`; `methods`: readonly ...[]; \}\>[]; `guidance?`: `string`; `handlers`:
2012
2012
  readonly `"file.open"`[]; `receives?`: readonly `"git.push"`[]; `icon?`:
2013
- `string`; `roles`: readonly (`"dashboard"` \| `"inbox"` \| `"files"` \|
2013
+ `string`; `roles`: readonly (`"files"` \| `"dashboard"` \| `"inbox"` \|
2014
2014
  `"media"` \| `"sessions"` \| `"terminal"`)[]; `storage?`: readonly
2015
2015
  `Readonly`\<\{ `key`: `string`; `scopes`: readonly ...[]; `maxBytes`: `number`;
2016
2016
  \}\>[]; `commands?`: readonly `Readonly`\<\{ `id`: `string`; `title`: `string`;
@@ -2042,6 +2042,10 @@ function resolveBackend(store, release): Promise<
2042
2042
  }>;
2043
2043
  displayName?: string;
2044
2044
  capabilities: readonly (
2045
+ | "computer.list"
2046
+ | "computer.readFile"
2047
+ | "computer.writeFile"
2048
+ | "computer.execute"
2045
2049
  | "approvals"
2046
2050
  | "agent.list"
2047
2051
  | "agent.manage"
@@ -2050,10 +2054,6 @@ function resolveBackend(store, release): Promise<
2050
2054
  | "agent.toolPolicy"
2051
2055
  | "agent.read"
2052
2056
  | "agent.send"
2053
- | "computer.list"
2054
- | "computer.readFile"
2055
- | "computer.writeFile"
2056
- | "computer.execute"
2057
2057
  | "llm.generation"
2058
2058
  | "media.generation"
2059
2059
  | "games:servers"
@@ -2079,7 +2079,7 @@ function resolveBackend(store, release): Promise<
2079
2079
  handlers: readonly "file.open"[];
2080
2080
  receives?: readonly "git.push"[];
2081
2081
  icon?: string;
2082
- roles: readonly ("dashboard" | "inbox" | "files" | "media" | "sessions" | "terminal")[];
2082
+ roles: readonly ("files" | "dashboard" | "inbox" | "media" | "sessions" | "terminal")[];
2083
2083
  storage?: readonly Readonly<{
2084
2084
  key: ...;
2085
2085
  scopes: ...;
@@ -2126,10 +2126,10 @@ root artifact, then the backend descriptor it names.
2126
2126
  `Promise`\< \| `Readonly`\<\{ `digest`: `Sha256Digest`; `backend`:
2127
2127
  `DurableBackend`; `declaration`: \| `Readonly`\<\{ `api?`: `Readonly`\<\{
2128
2128
  `methods`: `Readonly`\<...\>; `toolFamily?`: ... \| ...; `events?`: ... \| ...;
2129
- \}\>; `displayName?`: `string`; `capabilities`: readonly ( \| `"approvals"` \|
2130
- `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \|
2131
- `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \|
2132
- `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \|
2129
+ \}\>; `displayName?`: `string`; `capabilities`: readonly ( \| `"computer.list"`
2130
+ \| `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \|
2131
+ `"approvals"` \| `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \|
2132
+ `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \|
2133
2133
  `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \|
2134
2134
  `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \|
2135
2135
  `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \|
@@ -2138,7 +2138,7 @@ root artifact, then the backend descriptor it names.
2138
2138
  `"channels.personal.manage"`)[]; `calls?`: readonly `Readonly`\<\{ `appId`: ...;
2139
2139
  `methods`: ...; \}\>[]; `guidance?`: `string`; `handlers`: readonly
2140
2140
  `"file.open"`[]; `receives?`: readonly `"git.push"`[]; `icon?`: `string`;
2141
- `roles`: readonly (`"dashboard"` \| `"inbox"` \| `"files"` \| `"media"` \|
2141
+ `roles`: readonly (`"files"` \| `"dashboard"` \| `"inbox"` \| `"media"` \|
2142
2142
  `"sessions"` \| `"terminal"`)[]; `storage?`: readonly `Readonly`\<\{ `key`: ...;
2143
2143
  `scopes`: ...; `maxBytes`: ...; \}\>[]; `commands?`: readonly `Readonly`\<\{
2144
2144
  `id`: ...; `title`: ...; `category`: ...; `description?`: ...; `sigil?`: ...;
package/docs/api/mcp.md CHANGED
@@ -67,6 +67,85 @@ readonly code: string;
67
67
 
68
68
  ## Type Aliases
69
69
 
70
+ ### ComputerControlPort
71
+
72
+ ```ts
73
+ type ComputerControlPort = Readonly<{
74
+ list: Promise<{
75
+ computers: z.ZodArray<
76
+ z.ZodObject<
77
+ {
78
+ computerId: z.ZodString;
79
+ name: z.ZodString;
80
+ createdAt: z.ZodNumber;
81
+ updatedAt: z.ZodNumber;
82
+ },
83
+ z.core.$strict
84
+ >
85
+ >;
86
+ nextOffset: z.ZodNullable<z.ZodNumber>;
87
+ }>;
88
+ state: Promise<
89
+ | {
90
+ state: z.ZodEnum<{
91
+ running: "running";
92
+ sleeping: "sleeping";
93
+ starting: "starting";
94
+ }>;
95
+ }
96
+ | {
97
+ state: z.ZodLiteral<"queued">;
98
+ position: z.ZodNumber;
99
+ }
100
+ >;
101
+ start: Promise<
102
+ | {
103
+ state: z.ZodEnum<{
104
+ running: "running";
105
+ sleeping: "sleeping";
106
+ starting: "starting";
107
+ }>;
108
+ }
109
+ | {
110
+ state: z.ZodLiteral<"queued">;
111
+ position: z.ZodNumber;
112
+ }
113
+ >;
114
+ create: Promise<
115
+ | {
116
+ kind: "created";
117
+ computer: {
118
+ computerId: string;
119
+ name: string;
120
+ };
121
+ }
122
+ | {
123
+ kind: "uncertain" | "denied" | "conflict" | "invalid";
124
+ }
125
+ >;
126
+ }>;
127
+ ```
128
+
129
+ Host policy stays outside this family: Hub admits funded slots, standalone
130
+ admits its current owner. Both call their durable fleet through this port. Keep
131
+ the host contract independent of the Worker-only fleet lifecycle.
132
+
133
+ ---
134
+
135
+ ### OysterMcpCatalogSnapshot
136
+
137
+ ```ts
138
+ type OysterMcpCatalogSnapshot = Readonly<{
139
+ instructions: string;
140
+ sources: readonly CapabilitySource[];
141
+ grants: Grants;
142
+ }>;
143
+ ```
144
+
145
+ Captured capabilities and grants offered to one admitted MCP caller.
146
+
147
+ ---
148
+
70
149
  ### OysterCallerAccess
71
150
 
72
151
  ```ts
@@ -135,6 +214,55 @@ failed build is not cached.
135
214
 
136
215
  ## Functions
137
216
 
217
+ ### computerControlSpecs()
218
+
219
+ ```ts
220
+ function computerControlSpecs(port): object;
221
+ ```
222
+
223
+ One set of schemas and operations for MCP and direct broker invocation.
224
+
225
+ #### Parameters
226
+
227
+ | Parameter | Type |
228
+ | --------- | --------------------------------------------- |
229
+ | `port` | [`ComputerControlPort`](#computercontrolport) |
230
+
231
+ #### Returns
232
+
233
+ `object`
234
+
235
+ | Name | Type | Default value | Description |
236
+ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------- |
237
+ | `list` | `object` | - | - |
238
+ | `list.replay` | `"safe"` | - | - |
239
+ | `list.access` | `"read"` | - | - |
240
+ | `list.description` | `string` | `"List a page of permitted Computers. Follow nextOffset for another page."` | - |
241
+ | `list.input` | `ZodObject`\<\{ `limit`: `ZodDefault`\<`ZodNumber`\>; `offset`: `ZodDefault`\<`ZodNumber`\>; \}, `$strict`\> | `computerPageSchema` | - |
242
+ | `list.output` | `ZodObject`\<\{ `computers`: `ZodArray`\<`ZodObject`\<\{ `computerId`: `ZodString`; `name`: `ZodString`; `createdAt`: `ZodNumber`; `updatedAt`: `ZodNumber`; \}, `$strict`\>\>; `nextOffset`: `ZodNullable`\<`ZodNumber`\>; \}, `$strict`\> | `teamComputerDirectorySchema` | - |
243
+ | `list.execute()` | (`input`, `context`) => `Promise`\<\{ `computers`: `object`[]; `nextOffset`: `number` \| `null`; \}\> | - | Return an admitted inventory page to MCP or the retained broker. |
244
+ | `state` | `object` | - | - |
245
+ | `state.replay` | `"safe"` | - | - |
246
+ | `state.access` | `"read"` | - | - |
247
+ | `state.description` | `string` | `"Read runtime state without waking a Computer, including its live admission queue position."` | - |
248
+ | `state.input` | `ZodObject`\<\{ `computerId`: `ZodString`; \}, `$strict`\> | `fleetComputerId` | - |
249
+ | `state.output` | `ZodDiscriminatedUnion`\<\[`ZodObject`\<\{ `state`: `ZodEnum`\<\{ `running`: `"running"`; `sleeping`: `"sleeping"`; `starting`: `"starting"`; \}\>; \}, `$strict`\>, `ZodObject`\<\{ `state`: `ZodLiteral`\<`"queued"`\>; `position`: `ZodNumber`; \}, `$strict`\>\], `"state"`\> | `computerStateSchema` | - |
250
+ | `state.execute()` | (`input`, `context`) => `Promise`\< \| \{ `state`: `"running"` \| `"sleeping"` \| `"starting"`; \} \| \{ `state`: `"queued"`; `position`: `number`; \}\> | - | Return liveness without waking the runtime. |
251
+ | `start` | `object` | - | - |
252
+ | `start.replay` | `"unsafe"` | - | - |
253
+ | `start.description` | `string` | `"Start a hosted Computer through ordinary admission. Waits until connected; poll computers.state while queued. Safe to retry."` | - |
254
+ | `start.input` | `ZodObject`\<\{ `computerId`: `ZodString`; \}, `$strict`\> | `fleetComputerId` | - |
255
+ | `start.output` | `ZodDiscriminatedUnion`\<\[`ZodObject`\<\{ `state`: `ZodEnum`\<\{ `running`: `"running"`; `sleeping`: `"sleeping"`; `starting`: `"starting"`; \}\>; \}, `$strict`\>, `ZodObject`\<\{ `state`: `ZodLiteral`\<`"queued"`\>; `position`: `ZodNumber`; \}, `$strict`\>\], `"state"`\> | `computerStateSchema` | - |
256
+ | `start.execute()` | (`input`, `context`) => `Promise`\< \| \{ `state`: `"running"` \| `"sleeping"` \| `"starting"`; \} \| \{ `state`: `"queued"`; `position`: `number`; \}\> | - | Admit and start this Computer. |
257
+ | `create` | `object` | - | - |
258
+ | `create.replay` | `"unsafe"` | - | - |
259
+ | `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
+ | `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. |
263
+
264
+ ---
265
+
138
266
  ### appBindingName()
139
267
 
140
268
  ```ts
@@ -208,7 +336,7 @@ Derive the current principal's admitted App modules and grants.
208
336
  | `host` | `Pick`\<[`OysterHost`](host.md#oysterhost), \| `"installations"` \| `"instances"` \| `"artifacts"` \| `"guestLimits"` \| `"backgroundOriginKey"` \| `"computerId"` \| `"capabilities"` \| `"appToolPolicy"` \| `"keys"`\> | - |
209
337
  | `surfaces` | [`AppSurfaceCache`](#appsurfacecache) | - |
210
338
  | `principal` | [`OysterPrincipal`](host.md#oysterprincipal) | - |
211
- | `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`: \| `"approvals"` \| `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \| `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \| `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \| `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \| `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \| `"marketplace.purchase"` \| `"workflow.run"` \| `"workflow.publish"` \| `"workflow.arm"` \| `"world"` \| `"channels.read"` \| `"channels.personal.manage"`; `capabilityApproved`: `true`; `operations`: readonly `string`[]; `resources`: \| `"tenant-scope"` \| readonly `Readonly`\<\{ `kind`: ...; `id`: ...; \}\>[]; \}\>[]; `approval`: \| `Readonly`\<\{ `by`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`: `number`; `authorityVersion`: `number`; \}\> \| `null`; \}; `status`: `"enabled"` \| `"disabled"` \| `"deleted"`; `visibility`: `"private"` \| `"public"`; `approvedAnonymousMethods`: readonly `Readonly`\<\{ `name`: `string`; `digest`: `Sha256Digest`; \}\>[]; `anonymousApproval`: \| `Readonly`\<\{ `by`: \| \{ `kind`: `"member"`; `memberId`: `string`; \} \| \{ `kind`: `"agent"`; `agentId`: `string`; \} \| \{ `kind`: `"team-key"`; `keyId`: `string`; \}; `at`: `number`; `authorityVersion`: `number`; \}\> \| `null`; \}\>[] | - |
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`; \}\>[] | - |
212
340
  | `access` | [`OysterCallerAccess`](#oystercalleraccess) | - |
213
341
  | `sessionId?` | `string` | - |
214
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. |
@@ -264,7 +392,7 @@ Releases, installation authority or the caller's own grants.
264
392
  | `principal` | [`OysterPrincipal`](host.md#oysterprincipal) |
265
393
  | `access` | [`OysterCallerAccess`](#oystercalleraccess) |
266
394
  | `surfaces` | [`AppSurfaceCache`](#appsurfacecache) |
267
- | `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`: \| `"approvals"` \| `"agent.list"` \| `"agent.manage"` \| `"agent.rename"` \| `"agent.avatar"` \| `"agent.toolPolicy"` \| `"agent.read"` \| `"agent.send"` \| `"computer.list"` \| `"computer.readFile"` \| `"computer.writeFile"` \| `"computer.execute"` \| `"llm.generation"` \| `"media.generation"` \| `"games:servers"` \| `"git.repository"` \| `"apps.open"` \| `"apps.call"` \| `"app.storage"` \| `"app.events.emit"` \| `"team.workbenchHost"` \| `"marketplace.browse"` \| `"marketplace.purchase"` \| `"workflow.run"` \| `"workflow.publish"` \| `"workflow.arm"` \| `"world"` \| `"channels.read"` \| `"channels.personal.manage"`; `capabilityApproved`: `true`; `operations`: readonly `string`[]; `resources`: `"tenant-scope"` \| readonly `Readonly`\<...\>[]; \}\>[]; `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`; \}\>[] |
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`; \}\>[] |
268
396
 
269
397
  #### Returns
270
398
 
@@ -289,9 +417,9 @@ function oysterComputerTools(host, principal): Promise<
289
417
  ```
290
418
 
291
419
  Capture the host's fixed Computer for one caller as a Knapsack source. The host
292
- decides whether the caller holds Computer access; the Computer owner accepts
293
- every call. Null when the host has no Computer or the caller has no access.
294
- Grants name exactly the one captured module.
420
+ decides whether the caller holds Computer access; the ComputerDO still checks
421
+ its host-issued grant on every call. Null when the host has no Computer or the
422
+ caller has no access. Grants name the captured module.
295
423
 
296
424
  #### Parameters
297
425
 
@@ -328,17 +456,17 @@ Load the current catalog for an authenticated owner or key: installed App
328
456
  methods, plus the host's Computer when the caller holds Computer access. A key
329
457
  sees exactly the installations and levels its own grants admit, and the Computer
330
458
  only with its own `computer.use` grant; each App retains its own caller checks
331
- regardless. The owner's stored write approval of an Agent's App tools is that
332
- principal's confirmation for App writes, so a headless client can write; the
333
- shared MCP server asks the client to approve every other write (an owner's own
334
- calls, the Computer). Each call still re-admits the key, rechecks that same
335
- stored approval, and passes the App's gate.
459
+ regardless. App writes use the host's approval record; stored approval of an
460
+ Agent's App tools can permit headless App writes. The shared MCP server elicits
461
+ consent for explicitly confirmed operations, including every advertised
462
+ Workspace Computer call, even reads. Each call still re-admits the key, checks
463
+ current App approval and passes the App's gate.
336
464
 
337
465
  #### Parameters
338
466
 
339
- | Parameter | Type |
340
- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
341
- | `host` | `Pick`\<[`OysterHost`](host.md#oysterhost), \| `"installations"` \| `"instances"` \| `"artifacts"` \| `"guestLimits"` \| `"backgroundOriginKey"` \| `"computerId"` \| `"computer"` \| `"capabilities"` \| `"appToolPolicy"` \| `"keys"` \| `"workflows"`\> |
467
+ | Parameter | Type |
468
+ | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
469
+ | `host` | `Pick`\<[`OysterHost`](host.md#oysterhost), \| `"installations"` \| `"instances"` \| `"artifacts"` \| `"guestLimits"` \| `"backgroundOriginKey"` \| `"computerId"` \| `"computer"` \| `"computerControl"` \| `"capabilities"` \| `"appToolPolicy"` \| `"keys"` \| `"workflows"`\> |
342
470
 
343
471
  #### Returns
344
472
 
@@ -74,7 +74,7 @@ type OysterRootDataOptions = Parameters<typeof createAppStorage>[0] &
74
74
  digest: Sha256Digest;
75
75
  }> | null;
76
76
  }>,
77
- "declaration" | "ui"
77
+ "ui" | "declaration"
78
78
  >
79
79
  >;
80
80
  }>;
@@ -83,7 +83,7 @@ type ReadonlyTenantRegistry = Readonly<{
83
83
  owners: readonly string[];
84
84
  domains: readonly string[];
85
85
  }> | null>;
86
- status: Promise<"active" | "deleting" | "suspended" | null>;
86
+ status: Promise<"active" | "suspended" | "deleting" | null>;
87
87
  membershipOf: Promise<Readonly<{
88
88
  memberId: string;
89
89
  role: "owner" | "member";