@fungi.computer/oyster 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/README.md +396 -72
  2. package/dist/agents.d.ts +3 -2
  3. package/dist/agents.js +4 -2
  4. package/dist/app-builds.d.ts +81 -8
  5. package/dist/app-builds.js +213 -60
  6. package/dist/app-storage.d.ts +3 -3
  7. package/dist/approval-capability.d.ts +5 -0
  8. package/dist/approval-capability.js +46 -0
  9. package/dist/approval-home.d.ts +51 -0
  10. package/dist/approval-home.js +226 -0
  11. package/dist/apps/catalog.d.ts +335 -0
  12. package/dist/apps/catalog.js +46 -0
  13. package/dist/apps/gate.d.ts +20 -6
  14. package/dist/apps/gate.js +42 -16
  15. package/dist/apps/index.d.ts +3 -1
  16. package/dist/apps/index.js +3 -1
  17. package/dist/apps/installation.d.ts +132 -51
  18. package/dist/apps/installation.js +176 -70
  19. package/dist/apps/permissions.d.ts +247 -0
  20. package/dist/apps/permissions.js +255 -0
  21. package/dist/boot-capability-route.d.ts +15 -0
  22. package/dist/boot-capability-route.js +196 -0
  23. package/dist/boot-capability.d.ts +103 -0
  24. package/dist/boot-capability.js +141 -0
  25. package/dist/boot-construction.d.ts +12 -0
  26. package/dist/boot-construction.js +175 -0
  27. package/dist/boot-gate.d.ts +267 -0
  28. package/dist/boot-gate.js +236 -0
  29. package/dist/boot-host-script.d.ts +2 -0
  30. package/dist/boot-host-script.js +1 -0
  31. package/dist/boot-mount.d.ts +21 -0
  32. package/dist/boot-mount.js +65 -0
  33. package/dist/browser/boot.d.ts +73 -0
  34. package/dist/browser/boot.js +502 -0
  35. package/dist/browser/browser.d.ts +104 -0
  36. package/dist/browser/browser.js +374 -0
  37. package/dist/browser/capability-source.d.ts +76 -0
  38. package/dist/browser/capability-source.js +338 -0
  39. package/dist/browser/cdp-client.d.ts +56 -0
  40. package/dist/browser/cdp-client.js +184 -0
  41. package/dist/browser/errors.d.ts +79 -0
  42. package/dist/browser/errors.js +32 -0
  43. package/dist/browser/index.d.ts +16 -0
  44. package/dist/browser/index.js +14 -0
  45. package/dist/browser/lease-registry.d.ts +61 -0
  46. package/dist/browser/lease-registry.js +101 -0
  47. package/dist/browser/operations.d.ts +225 -0
  48. package/dist/browser/operations.js +137 -0
  49. package/dist/browser/page.d.ts +25 -0
  50. package/dist/browser/page.js +172 -0
  51. package/dist/browser/quick-reads.d.ts +29 -0
  52. package/dist/browser/quick-reads.js +160 -0
  53. package/dist/browser/sessions.d.ts +52 -0
  54. package/dist/browser/sessions.js +118 -0
  55. package/dist/browser/url-policy.d.ts +18 -0
  56. package/dist/browser/url-policy.js +58 -0
  57. package/dist/build/app-imports.d.ts +12 -0
  58. package/dist/build/app-imports.js +105 -0
  59. package/dist/build/build-policy.d.ts +5 -3
  60. package/dist/build/build-policy.js +5 -3
  61. package/dist/build/candidate-builder.d.ts +1 -1
  62. package/dist/build/candidate-cli.mjs +8375 -334
  63. package/dist/build/local-build.d.ts +2 -0
  64. package/dist/build/local-build.js +28 -6
  65. package/dist/build/snapshot-package-store.d.ts +1 -1
  66. package/dist/build/snapshot-package-store.js +7 -2
  67. package/dist/build/workspace-build.d.ts +92 -5
  68. package/dist/build/workspace-build.js +93 -19
  69. package/dist/build.d.ts +1 -1
  70. package/dist/build.js +1 -1
  71. package/dist/catalog-frame.js +1 -1
  72. package/dist/cloudflare.d.ts +13 -3
  73. package/dist/cloudflare.js +102 -4
  74. package/dist/frame-binding-wire-script.js +1 -1
  75. package/dist/frame-binding-wire.js +4 -2
  76. package/dist/git-auth.d.ts +0 -2
  77. package/dist/git-auth.js +0 -2
  78. package/dist/git.d.ts +0 -1
  79. package/dist/git.js +0 -2
  80. package/dist/host.d.ts +39 -13
  81. package/dist/host.js +268 -142
  82. package/dist/index.d.ts +25 -15
  83. package/dist/index.js +39 -16
  84. package/dist/install-release-cli.d.ts +2 -0
  85. package/dist/install-release-cli.js +46 -0
  86. package/dist/installation-client.d.ts +43 -0
  87. package/dist/installation-client.js +178 -0
  88. package/dist/installation-execution.d.ts +11 -0
  89. package/dist/installation-execution.js +184 -0
  90. package/dist/installation-operations.d.ts +1437 -0
  91. package/dist/installation-operations.js +664 -0
  92. package/dist/installation-store-generation.d.ts +3 -0
  93. package/dist/installation-store-generation.js +16 -0
  94. package/dist/instance-id.d.ts +10 -0
  95. package/dist/instance-id.js +10 -0
  96. package/dist/instance-refusal.d.ts +11 -0
  97. package/dist/instance-refusal.js +21 -0
  98. package/dist/internal/delivery.js +4 -2
  99. package/dist/internal/host-gate.js +7 -1
  100. package/dist/internal/registry-installations.js +4 -4
  101. package/dist/keys.d.ts +5 -1
  102. package/dist/keys.js +10 -2
  103. package/dist/machine-link/authority.d.ts +89 -0
  104. package/dist/machine-link/authority.js +37 -0
  105. package/dist/machine-link/client.d.ts +66 -0
  106. package/dist/machine-link/client.js +94 -0
  107. package/dist/machine-link/delivery.d.ts +18 -0
  108. package/dist/machine-link/delivery.js +55 -0
  109. package/dist/machine-link/enrollment.d.ts +111 -0
  110. package/dist/machine-link/enrollment.js +286 -0
  111. package/dist/machine-link/fences.d.ts +37 -0
  112. package/dist/machine-link/fences.js +166 -0
  113. package/dist/machine-link/home.d.ts +20 -0
  114. package/dist/machine-link/home.js +24 -0
  115. package/dist/machine-link/host.d.ts +43 -0
  116. package/dist/machine-link/host.js +189 -0
  117. package/dist/machine-link/index.d.ts +15 -0
  118. package/dist/machine-link/index.js +15 -0
  119. package/dist/machine-link/link.d.ts +48 -0
  120. package/dist/machine-link/link.js +223 -0
  121. package/dist/machine-link/presence.d.ts +10 -0
  122. package/dist/machine-link/presence.js +25 -0
  123. package/dist/machine-link/workers.d.ts +6 -0
  124. package/dist/machine-link/workers.js +6 -0
  125. package/dist/mcp-owner.d.ts +2 -2
  126. package/dist/mcp-owner.js +41 -33
  127. package/dist/mcp.d.ts +15 -3
  128. package/dist/mcp.js +146 -25
  129. package/dist/older-oyster-store-refusal.d.ts +4 -0
  130. package/dist/older-oyster-store-refusal.js +18 -0
  131. package/dist/older-oyster-store.d.ts +21 -0
  132. package/dist/older-oyster-store.js +43 -0
  133. package/dist/pack.d.ts +14 -3
  134. package/dist/pack.js +44 -19
  135. package/dist/page/app-access.d.ts +7 -0
  136. package/dist/page/app-access.js +75 -0
  137. package/dist/page/boot-host.js +57 -0
  138. package/dist/page/capabilities.d.ts +3 -3
  139. package/dist/page/capabilities.js +16 -12
  140. package/dist/page/computer-handles.d.ts +3 -3
  141. package/dist/page/computer-target.d.ts +3 -0
  142. package/dist/page/computer-target.js +9 -0
  143. package/dist/page/mount.d.ts +23 -3
  144. package/dist/page/mount.js +152 -16
  145. package/dist/page-assets.d.ts +22 -0
  146. package/dist/page-assets.js +28 -0
  147. package/dist/page-script.d.ts +3 -0
  148. package/dist/page-script.js +5 -4
  149. package/dist/release.d.ts +13 -6
  150. package/dist/release.js +10 -7
  151. package/dist/root-data.d.ts +16 -6
  152. package/dist/root-data.js +2 -2
  153. package/dist/source/index.d.ts +1 -1
  154. package/dist/source/team-source.d.ts +20 -8
  155. package/dist/source/team-source.js +39 -10
  156. package/dist/source/template-seed.d.ts +2 -2
  157. package/dist/standalone/agent-mail.d.ts +24 -0
  158. package/dist/standalone/agent-mail.js +62 -0
  159. package/dist/standalone/agent-store.d.ts +9 -0
  160. package/dist/standalone/agent-store.js +30 -0
  161. package/dist/standalone/agents.d.ts +68 -9
  162. package/dist/standalone/agents.js +428 -56
  163. package/dist/standalone/app-builds-binding.d.ts +20 -2
  164. package/dist/standalone/app-builds-binding.js +147 -23
  165. package/dist/standalone/app-set.d.ts +5 -2
  166. package/dist/standalone/app-set.js +186 -144
  167. package/dist/standalone/browser.d.ts +11 -0
  168. package/dist/standalone/browser.js +72 -0
  169. package/dist/standalone/builds.d.ts +13 -4
  170. package/dist/standalone/builds.js +28 -44
  171. package/dist/standalone/computer-egress.d.ts +2 -0
  172. package/dist/standalone/computer-egress.js +13 -4
  173. package/dist/standalone/computer-fleet.d.ts +43 -0
  174. package/dist/standalone/computer-fleet.js +200 -0
  175. package/dist/standalone/computer.d.ts +44 -9
  176. package/dist/standalone/computer.js +129 -22
  177. package/dist/standalone/install-apps-cli.js +43 -6
  178. package/dist/standalone/instance.d.ts +2 -2
  179. package/dist/standalone/instance.js +8 -11
  180. package/dist/standalone/machine-link.d.ts +354 -0
  181. package/dist/standalone/machine-link.js +368 -0
  182. package/dist/standalone/media.d.ts +2 -2
  183. package/dist/standalone/media.js +19 -16
  184. package/dist/standalone/preview.d.ts +2 -2
  185. package/dist/standalone/preview.js +37 -10
  186. package/dist/standalone/registry.d.ts +151 -9
  187. package/dist/standalone/registry.js +305 -8
  188. package/dist/standalone/worker.d.ts +19 -5
  189. package/dist/standalone/worker.js +90 -54
  190. package/dist/standalone/workflow-binding.d.ts +18 -22
  191. package/dist/standalone/workflow-binding.js +18 -18
  192. package/dist/standalone/workflow-control.d.ts +4 -0
  193. package/dist/standalone/workflow-control.js +40 -0
  194. package/dist/standalone/workflow-events.d.ts +2 -2
  195. package/dist/standalone/workflow-events.js +9 -10
  196. package/dist/standalone/workflow-git-capture.js +4 -3
  197. package/dist/standalone/workflow-host.d.ts +162 -161
  198. package/dist/standalone/workflow-host.js +101 -21
  199. package/dist/standalone/workflow-node-capture.js +11 -4
  200. package/dist/standalone/workflow-schedules.d.ts +5 -2
  201. package/dist/standalone/workflow-schedules.js +9 -10
  202. package/dist/standalone/workflow-trigger-host.d.ts +65 -5
  203. package/dist/standalone/workflow-trigger-host.js +2 -2
  204. package/dist/standalone/workflow-webhooks.d.ts +22 -0
  205. package/dist/standalone/workflow-webhooks.js +39 -0
  206. package/dist/standalone/workflows.d.ts +140 -43
  207. package/dist/standalone/workflows.js +198 -39
  208. package/dist/storage-frame.d.ts +6 -6
  209. package/dist/testing/capabilities.js +14 -3
  210. package/dist/testing/installation.js +26 -2
  211. package/dist/testing/worker.js +1 -1
  212. package/dist/testing/workers-runtime.d.ts +8 -2
  213. package/dist/testing/workers-runtime.js +20 -2
  214. package/dist/webhook-abuse.d.ts +25 -0
  215. package/dist/webhook-abuse.js +54 -0
  216. package/dist/webhook-custody.d.ts +144 -0
  217. package/dist/webhook-custody.js +222 -0
  218. package/dist/webhook-ingress.d.ts +36 -0
  219. package/dist/webhook-ingress.js +146 -0
  220. package/dist/webhooks.d.ts +111 -0
  221. package/dist/webhooks.js +189 -0
  222. package/dist/workers-git.d.ts +12 -17
  223. package/dist/workers-git.js +64 -52
  224. package/dist/workers.d.ts +226 -13
  225. package/dist/workers.js +363 -51
  226. package/dist/workflow-agent-authority.d.ts +8 -0
  227. package/dist/workflow-agent-authority.js +42 -0
  228. package/dist/workflows.d.ts +66 -0
  229. package/dist/workflows.js +97 -0
  230. package/docs/api/README.md +63 -37
  231. package/docs/api/agents.md +17 -0
  232. package/docs/api/app-storage.md +1 -1
  233. package/docs/api/apps.md +1394 -543
  234. package/docs/api/browser/boot.md +132 -0
  235. package/docs/api/browser.md +1440 -0
  236. package/docs/api/build-contract.md +38 -25
  237. package/docs/api/build.md +263 -84
  238. package/docs/api/cloudflare.md +93 -7
  239. package/docs/api/git.md +3 -13
  240. package/docs/api/host.md +944 -118
  241. package/docs/api/index.md +320 -18
  242. package/docs/api/keys.md +24 -1
  243. package/docs/api/mcp.md +59 -12
  244. package/docs/api/modules.md +33 -40
  245. package/docs/api/pack.md +57 -8
  246. package/docs/api/page/mount.md +92 -4
  247. package/docs/api/workers-git.md +103 -24
  248. package/docs/api/workers.md +1594 -244
  249. package/docs/site/agent-quickstart.mdx +28 -14
  250. package/examples/standalone/worker.ts +3 -1
  251. package/examples/standalone/wrangler.jsonc +2 -0
  252. package/package.json +73 -71
  253. package/dist/installation-consent.d.ts +0 -81
  254. package/dist/installation-consent.js +0 -84
  255. package/dist/shell/app-directory.d.ts +0 -542
  256. package/dist/shell/app-directory.js +0 -196
  257. package/dist/shell/browser-actions.d.ts +0 -7
  258. package/dist/shell/browser-actions.js +0 -56
  259. package/dist/shell/command-host.d.ts +0 -112
  260. package/dist/shell/command-host.js +0 -502
  261. package/dist/shell/commands.d.ts +0 -25
  262. package/dist/shell/commands.js +0 -78
  263. package/dist/shell/index.d.ts +0 -8
  264. package/dist/shell/index.js +0 -8
  265. package/dist/shell/keys.d.ts +0 -41
  266. package/dist/shell/keys.js +0 -134
  267. package/dist/shell/shell-module.d.ts +0 -55
  268. package/dist/shell/shell-module.js +0 -86
  269. package/dist/shell/window-manager.d.ts +0 -128
  270. package/dist/shell/window-manager.js +0 -730
  271. package/dist/shell/workbench-contract.d.ts +0 -68
  272. package/dist/shell/workbench-directory.d.ts +0 -332
  273. package/dist/shell/workbench-directory.js +0 -35
  274. package/dist/shell/workbench-host-types.d.ts +0 -96
  275. package/dist/shell/workbench-host-types.js +0 -1
  276. package/dist/shell/workbench-host.d.ts +0 -34
  277. package/dist/shell/workbench-host.js +0 -352
  278. package/dist/shell/workbench-model.d.ts +0 -194
  279. package/dist/shell/workbench-model.js +0 -53
  280. package/dist/shell/workbench.d.ts +0 -4
  281. package/dist/shell/workbench.js +0 -2
  282. package/docs/api/shell/app-directory.md +0 -599
  283. package/docs/api/shell/command-host.md +0 -224
  284. package/docs/api/shell/commands.md +0 -197
  285. package/docs/api/shell/keys.md +0 -183
  286. package/docs/api/shell/shell-module.md +0 -204
  287. package/docs/api/shell/window-manager.md +0 -267
  288. package/docs/api/shell/workbench-directory.md +0 -119
  289. package/docs/api/shell/workbench.md +0 -205
  290. package/docs/api/shell.md +0 -1915
  291. /package/dist/{shell/workbench-contract.js → page/boot-host.d.ts} +0 -0
@@ -0,0 +1,184 @@
1
+ import { WorkerEntrypoint } from "cloudflare:workers";
2
+ import * as Result from "effect/Result";
3
+ import * as Schema from "effect/Schema";
4
+ import { z } from "zod";
5
+ import { emptyAppDeclaration } from "@fungi.computer/puffball/app";
6
+ import { applyInstallationCommand, isCommittedInstallation, } from "./apps/installation.js";
7
+ import { deriveDeclaredOperations } from "./apps/operations.js";
8
+ import { pendingCapabilities } from "./apps/permissions.js";
9
+ import { BootGateError } from "./boot-gate.js";
10
+ import { guestLimits } from "./guest-policy.js";
11
+ import { instanceSchema, selectionOf } from "./index.js";
12
+ import { ReleaseError, verifyRelease } from "./release.js";
13
+ import { tenantScope } from "./tenant.js";
14
+ import { retainedInstallationCommandSchema, installationRequestIdSchema, InstallationOperationError, } from "./installation-operations.js";
15
+ import { instanceRefusalStatus } from "./instance-refusal.js";
16
+ const refused = (status, code) => ({
17
+ state: "refused",
18
+ status,
19
+ code,
20
+ });
21
+ const unconfirmed = {
22
+ state: "unconfirmed",
23
+ outcome: "outcome_unknown",
24
+ };
25
+ /** Ordinary Worker-side verification and lifecycle I/O for one retained intent. */
26
+ export async function executeInstallation(host, input) {
27
+ let command = retainedInstallationCommandSchema.parse(input);
28
+ const operations = host.installations.operations;
29
+ if (operations === undefined)
30
+ return unconfirmed;
31
+ const principal = await host.auth.resolve(command.admission.actor);
32
+ if (principal === null ||
33
+ !("role" in principal) ||
34
+ principal.role !== "owner")
35
+ return refused(403, "install_authority_unavailable");
36
+ if ((await host.installations.generation()) !== command.generation)
37
+ return refused(409, "stale_authority");
38
+ let verified;
39
+ try {
40
+ // Default verification reads UI/artifact bytes HERE, never inside REGISTRY.
41
+ verified = await verifyRelease(host.artifacts, command.admission.release);
42
+ }
43
+ catch (cause) {
44
+ return cause instanceof ReleaseError
45
+ ? refused(422, cause.code)
46
+ : unconfirmed;
47
+ }
48
+ if (command.plan === null) {
49
+ const declaration = verified.declaration ?? emptyAppDeclaration;
50
+ const baseline = command.baseline;
51
+ const declaredOperations = await deriveDeclaredOperations(verified.release, declaration, host.capabilities ?? []);
52
+ // A Workflow reuses the owner's approval; any capability or anonymous
53
+ // method its baseline has not approved waits for the owner.
54
+ if (command.admission.origin === "workflow" &&
55
+ (pendingCapabilities(baseline?.authority ?? { approvedGrants: [] }, declaration, declaredOperations).length > 0 ||
56
+ declaredOperations.anonymousMethods.some((method) => !(baseline?.approvedAnonymousMethods ?? []).some((approved) => approved.name === method.name &&
57
+ approved.digest === method.digest))))
58
+ return refused(409, "needs_consent");
59
+ const reduced = applyInstallationCommand(baseline, baseline === null
60
+ ? {
61
+ kind: "install",
62
+ release: command.admission.release,
63
+ releasePin: "pinned",
64
+ }
65
+ : {
66
+ kind: "select-release",
67
+ release: command.admission.release,
68
+ releasePin: "pinned",
69
+ }, {
70
+ by: principal.actor,
71
+ role: principal.role,
72
+ expectedVersion: baseline?.authority.authorityVersion ?? null,
73
+ declaration,
74
+ declaredOperations,
75
+ now: command.acceptedAt,
76
+ identity: {
77
+ installationId: command.installationId,
78
+ instanceId: command.instanceId,
79
+ },
80
+ });
81
+ if (Result.isFailure(reduced))
82
+ return refused(409, reduced.failure.code);
83
+ try {
84
+ command = await operations.plan(command.admission.requestId, reduced.success.next, verified.backend !== null);
85
+ }
86
+ catch (cause) {
87
+ // The owner's own approval rule is a definitive domain refusal.
88
+ if (cause instanceof InstallationOperationError &&
89
+ cause.code === "needs_consent")
90
+ return refused(409, "needs_consent");
91
+ throw cause;
92
+ }
93
+ }
94
+ const plan = command.plan;
95
+ if (plan === null)
96
+ return unconfirmed;
97
+ const next = plan.installation;
98
+ const state = { ...selectionOf(next), status: next.status };
99
+ const current = await host.installations.get(command.installationId);
100
+ const alreadyCommitted = isCommittedInstallation(current, state, next.release);
101
+ if (!alreadyCommitted &&
102
+ JSON.stringify(current) !== JSON.stringify(command.baseline))
103
+ return refused(409, "stale_authority");
104
+ // A matching row cannot substitute for retained preparation evidence.
105
+ if (alreadyCommitted && !plan.prepared)
106
+ return unconfirmed;
107
+ const instance = verified.backend === null
108
+ ? null
109
+ : host.instances.get(state.instanceId, guestLimits(host.guestLimits));
110
+ let uiCheck = plan.uiCheck;
111
+ if (!alreadyCommitted && !plan.prepared) {
112
+ if (instance === null) {
113
+ try {
114
+ uiCheck = await host.bootUi(verified.release);
115
+ }
116
+ catch (cause) {
117
+ return cause instanceof BootGateError
118
+ ? refused(422, cause.code)
119
+ : unconfirmed;
120
+ }
121
+ }
122
+ else {
123
+ const prepared = await instance.prepare(state, next.release);
124
+ if (!prepared.ok)
125
+ return prepared.code === "failed"
126
+ ? unconfirmed
127
+ : refused(instanceRefusalStatus(prepared.code), prepared.code);
128
+ uiCheck = prepared.value;
129
+ }
130
+ }
131
+ if (uiCheck === undefined || (next.status === "enabled" && uiCheck === null))
132
+ return unconfirmed;
133
+ const commit = await operations.commit(command.admission.requestId, uiCheck);
134
+ if (!commit.ok)
135
+ return refused(409, commit.code);
136
+ if (instance !== null) {
137
+ // Replay the pinned fact; NEVER derive version N+1 from a current row here.
138
+ const applied = await instance.apply(state, next.release);
139
+ if (!applied.ok)
140
+ // Native apply can return stale_authority from its POST-application
141
+ // owner check. That code does not establish that application never ran.
142
+ return applied.code === "failed" || applied.code === "stale_authority"
143
+ ? unconfirmed
144
+ : refused(instanceRefusalStatus(applied.code), applied.code);
145
+ const receipt = Schema.decodeUnknownSync(instanceSchema)(applied.value);
146
+ if (receipt.instanceId !== state.instanceId ||
147
+ receipt.owner.kind !== "installation" ||
148
+ receipt.owner.id !== state.owner.id ||
149
+ receipt.appId !== state.appId ||
150
+ receipt.releaseId !== state.releaseId ||
151
+ receipt.authorityVersion !== state.authorityVersion ||
152
+ receipt.status !== (next.status === "enabled" ? "active" : next.status))
153
+ return unconfirmed;
154
+ }
155
+ if ((await host.installations.generation()) !== command.generation ||
156
+ !isCommittedInstallation(await host.installations.get(command.installationId), state, next.release))
157
+ return unconfirmed;
158
+ return {
159
+ state: "succeeded",
160
+ installation: next,
161
+ creation: command.creation,
162
+ uiCheck,
163
+ };
164
+ }
165
+ const executionProps = z.strictObject({
166
+ requestId: installationRequestIdSchema,
167
+ scope: retainedInstallationCommandSchema.shape.scope,
168
+ });
169
+ /** A loopback export with ordinary Worker I/O, not another resource or HTTP API. */
170
+ export function installationWorkerEntrypoint(hostFor) {
171
+ return class extends WorkerEntrypoint {
172
+ /** Execute the retained command these props name, in its tenant scope. */
173
+ async run() {
174
+ const props = executionProps.parse(this.ctx.props);
175
+ const scope = tenantScope(props.scope.tenantId, props.scope.origin);
176
+ const host = await hostFor(this.env, scope);
177
+ const command = await host.installations.operations?.load(props.requestId);
178
+ if (command?.scope.tenantId !== scope.tenantId ||
179
+ command.scope.origin !== scope.origin)
180
+ return unconfirmed;
181
+ return executeInstallation(host, command);
182
+ }
183
+ };
184
+ }