@fungi.computer/oyster 0.1.0 → 0.3.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 (292) hide show
  1. package/README.md +376 -72
  2. package/dist/agent-avatars.d.ts +103 -0
  3. package/dist/agent-avatars.js +66 -0
  4. package/dist/agents.d.ts +15 -4
  5. package/dist/agents.js +43 -4
  6. package/dist/app-builds.d.ts +81 -8
  7. package/dist/app-builds.js +210 -60
  8. package/dist/app-storage.d.ts +3 -3
  9. package/dist/approval-capability.d.ts +5 -0
  10. package/dist/approval-capability.js +46 -0
  11. package/dist/approval-home.d.ts +51 -0
  12. package/dist/approval-home.js +226 -0
  13. package/dist/apps/catalog.d.ts +335 -0
  14. package/dist/apps/catalog.js +46 -0
  15. package/dist/apps/gate.d.ts +26 -12
  16. package/dist/apps/gate.js +48 -22
  17. package/dist/apps/index.d.ts +3 -1
  18. package/dist/apps/index.js +3 -1
  19. package/dist/apps/installation.d.ts +147 -66
  20. package/dist/apps/installation.js +193 -86
  21. package/dist/apps/permissions.d.ts +247 -0
  22. package/dist/apps/permissions.js +255 -0
  23. package/dist/boot-capability-route.d.ts +15 -0
  24. package/dist/boot-capability-route.js +196 -0
  25. package/dist/boot-capability.d.ts +103 -0
  26. package/dist/boot-capability.js +141 -0
  27. package/dist/boot-construction.d.ts +12 -0
  28. package/dist/boot-construction.js +175 -0
  29. package/dist/boot-gate.d.ts +267 -0
  30. package/dist/boot-gate.js +236 -0
  31. package/dist/boot-host-script.d.ts +2 -0
  32. package/dist/boot-host-script.js +1 -0
  33. package/dist/boot-mount.d.ts +21 -0
  34. package/dist/boot-mount.js +65 -0
  35. package/dist/browser/boot.d.ts +73 -0
  36. package/dist/browser/boot.js +502 -0
  37. package/dist/browser/browser.d.ts +104 -0
  38. package/dist/browser/browser.js +374 -0
  39. package/dist/browser/capability-source.d.ts +76 -0
  40. package/dist/browser/capability-source.js +338 -0
  41. package/dist/browser/cdp-client.d.ts +56 -0
  42. package/dist/browser/cdp-client.js +184 -0
  43. package/dist/browser/errors.d.ts +79 -0
  44. package/dist/browser/errors.js +32 -0
  45. package/dist/browser/index.d.ts +16 -0
  46. package/dist/browser/index.js +14 -0
  47. package/dist/browser/lease-registry.d.ts +61 -0
  48. package/dist/browser/lease-registry.js +101 -0
  49. package/dist/browser/operations.d.ts +225 -0
  50. package/dist/browser/operations.js +137 -0
  51. package/dist/browser/page.d.ts +25 -0
  52. package/dist/browser/page.js +172 -0
  53. package/dist/browser/quick-reads.d.ts +29 -0
  54. package/dist/browser/quick-reads.js +160 -0
  55. package/dist/browser/sessions.d.ts +52 -0
  56. package/dist/browser/sessions.js +118 -0
  57. package/dist/browser/url-policy.d.ts +18 -0
  58. package/dist/browser/url-policy.js +58 -0
  59. package/dist/build/app-imports.d.ts +12 -0
  60. package/dist/build/app-imports.js +105 -0
  61. package/dist/build/build-policy.d.ts +5 -3
  62. package/dist/build/build-policy.js +5 -3
  63. package/dist/build/candidate-builder.d.ts +1 -1
  64. package/dist/build/candidate-cli.mjs +8428 -337
  65. package/dist/build/local-build.d.ts +2 -0
  66. package/dist/build/local-build.js +28 -6
  67. package/dist/build/snapshot-package-store.d.ts +1 -1
  68. package/dist/build/snapshot-package-store.js +7 -2
  69. package/dist/build/workspace-build.d.ts +92 -5
  70. package/dist/build/workspace-build.js +93 -19
  71. package/dist/build-egress.js +4 -4
  72. package/dist/build.d.ts +1 -1
  73. package/dist/build.js +1 -1
  74. package/dist/catalog-frame.js +1 -1
  75. package/dist/cloudflare.d.ts +13 -3
  76. package/dist/cloudflare.js +106 -8
  77. package/dist/frame-binding-wire-script.js +1 -1
  78. package/dist/frame-binding-wire.d.ts +1 -1
  79. package/dist/frame-binding-wire.js +5 -3
  80. package/dist/git-auth.d.ts +0 -2
  81. package/dist/git-auth.js +0 -2
  82. package/dist/git-journal.js +4 -4
  83. package/dist/git.d.ts +0 -1
  84. package/dist/git.js +0 -2
  85. package/dist/host.d.ts +39 -13
  86. package/dist/host.js +268 -142
  87. package/dist/index.d.ts +26 -15
  88. package/dist/index.js +40 -16
  89. package/dist/install-release-cli.d.ts +2 -0
  90. package/dist/install-release-cli.js +46 -0
  91. package/dist/installation-client.d.ts +43 -0
  92. package/dist/installation-client.js +178 -0
  93. package/dist/installation-execution.d.ts +11 -0
  94. package/dist/installation-execution.js +184 -0
  95. package/dist/installation-operations.d.ts +1437 -0
  96. package/dist/installation-operations.js +664 -0
  97. package/dist/installation-store-generation.d.ts +3 -0
  98. package/dist/installation-store-generation.js +16 -0
  99. package/dist/instance-id.d.ts +10 -0
  100. package/dist/instance-id.js +10 -0
  101. package/dist/instance-refusal.d.ts +11 -0
  102. package/dist/instance-refusal.js +21 -0
  103. package/dist/internal/delivery.js +4 -2
  104. package/dist/internal/host-gate.js +7 -1
  105. package/dist/internal/registry-installations.js +4 -4
  106. package/dist/keys.d.ts +5 -1
  107. package/dist/keys.js +10 -2
  108. package/dist/machine-link/authority.d.ts +89 -0
  109. package/dist/machine-link/authority.js +37 -0
  110. package/dist/machine-link/client.d.ts +66 -0
  111. package/dist/machine-link/client.js +94 -0
  112. package/dist/machine-link/delivery.d.ts +18 -0
  113. package/dist/machine-link/delivery.js +55 -0
  114. package/dist/machine-link/enrollment.d.ts +111 -0
  115. package/dist/machine-link/enrollment.js +286 -0
  116. package/dist/machine-link/fences.d.ts +37 -0
  117. package/dist/machine-link/fences.js +166 -0
  118. package/dist/machine-link/home.d.ts +20 -0
  119. package/dist/machine-link/home.js +24 -0
  120. package/dist/machine-link/host.d.ts +43 -0
  121. package/dist/machine-link/host.js +189 -0
  122. package/dist/machine-link/index.d.ts +15 -0
  123. package/dist/machine-link/index.js +15 -0
  124. package/dist/machine-link/link.d.ts +48 -0
  125. package/dist/machine-link/link.js +223 -0
  126. package/dist/machine-link/presence.d.ts +10 -0
  127. package/dist/machine-link/presence.js +25 -0
  128. package/dist/machine-link/workers.d.ts +6 -0
  129. package/dist/machine-link/workers.js +6 -0
  130. package/dist/mcp-owner.d.ts +2 -2
  131. package/dist/mcp-owner.js +41 -33
  132. package/dist/mcp.d.ts +15 -3
  133. package/dist/mcp.js +146 -25
  134. package/dist/pack.d.ts +14 -3
  135. package/dist/pack.js +44 -19
  136. package/dist/page/app-access.d.ts +7 -0
  137. package/dist/page/app-access.js +75 -0
  138. package/dist/page/boot-host.js +57 -0
  139. package/dist/page/capabilities.d.ts +3 -3
  140. package/dist/page/capabilities.js +16 -12
  141. package/dist/page/computer-handles.d.ts +3 -3
  142. package/dist/page/computer-target.d.ts +3 -0
  143. package/dist/page/computer-target.js +9 -0
  144. package/dist/page/mount.d.ts +23 -7
  145. package/dist/page/mount.js +152 -16
  146. package/dist/page-assets.d.ts +22 -0
  147. package/dist/page-assets.js +28 -0
  148. package/dist/page-script.d.ts +3 -0
  149. package/dist/page-script.js +5 -4
  150. package/dist/release.d.ts +13 -6
  151. package/dist/release.js +10 -7
  152. package/dist/root-data.d.ts +16 -6
  153. package/dist/root-data.js +2 -2
  154. package/dist/source/index.d.ts +1 -1
  155. package/dist/source/team-source.d.ts +20 -8
  156. package/dist/source/team-source.js +39 -10
  157. package/dist/source/template-seed.d.ts +2 -2
  158. package/dist/standalone/agent-mail.d.ts +24 -0
  159. package/dist/standalone/agent-mail.js +62 -0
  160. package/dist/standalone/agent-store.d.ts +9 -0
  161. package/dist/standalone/agent-store.js +30 -0
  162. package/dist/standalone/agents.d.ts +78 -12
  163. package/dist/standalone/agents.js +470 -59
  164. package/dist/standalone/app-builds-binding.d.ts +20 -2
  165. package/dist/standalone/app-builds-binding.js +151 -27
  166. package/dist/standalone/app-set.d.ts +5 -2
  167. package/dist/standalone/app-set.js +174 -143
  168. package/dist/standalone/browser.d.ts +11 -0
  169. package/dist/standalone/browser.js +72 -0
  170. package/dist/standalone/builds.d.ts +13 -4
  171. package/dist/standalone/builds.js +28 -44
  172. package/dist/standalone/computer-egress.d.ts +2 -0
  173. package/dist/standalone/computer-egress.js +13 -4
  174. package/dist/standalone/computer-fleet.d.ts +43 -0
  175. package/dist/standalone/computer-fleet.js +200 -0
  176. package/dist/standalone/computer.d.ts +44 -9
  177. package/dist/standalone/computer.js +132 -25
  178. package/dist/standalone/install-apps-cli.js +43 -6
  179. package/dist/standalone/instance.d.ts +2 -2
  180. package/dist/standalone/instance.js +8 -11
  181. package/dist/standalone/machine-link.d.ts +354 -0
  182. package/dist/standalone/machine-link.js +368 -0
  183. package/dist/standalone/media.d.ts +2 -2
  184. package/dist/standalone/media.js +19 -16
  185. package/dist/standalone/preview.d.ts +2 -2
  186. package/dist/standalone/preview.js +39 -12
  187. package/dist/standalone/registry.d.ts +149 -9
  188. package/dist/standalone/registry.js +299 -8
  189. package/dist/standalone/worker.d.ts +19 -5
  190. package/dist/standalone/worker.js +90 -54
  191. package/dist/standalone/workflow-binding.d.ts +28 -32
  192. package/dist/standalone/workflow-binding.js +20 -20
  193. package/dist/standalone/workflow-control.d.ts +4 -0
  194. package/dist/standalone/workflow-control.js +40 -0
  195. package/dist/standalone/workflow-events.d.ts +2 -2
  196. package/dist/standalone/workflow-events.js +9 -10
  197. package/dist/standalone/workflow-git-capture.js +4 -3
  198. package/dist/standalone/workflow-host.d.ts +177 -152
  199. package/dist/standalone/workflow-host.js +137 -30
  200. package/dist/standalone/workflow-node-capture.js +11 -4
  201. package/dist/standalone/workflow-schedules.d.ts +5 -2
  202. package/dist/standalone/workflow-schedules.js +9 -10
  203. package/dist/standalone/workflow-trigger-host.d.ts +88 -6
  204. package/dist/standalone/workflow-trigger-host.js +2 -2
  205. package/dist/standalone/workflow-webhooks.d.ts +22 -0
  206. package/dist/standalone/workflow-webhooks.js +39 -0
  207. package/dist/standalone/workflows.d.ts +203 -50
  208. package/dist/standalone/workflows.js +198 -39
  209. package/dist/storage-frame.d.ts +6 -6
  210. package/dist/testing/capabilities.js +14 -3
  211. package/dist/testing/installation.js +26 -2
  212. package/dist/testing/worker.js +1 -1
  213. package/dist/testing/workers-runtime.d.ts +8 -2
  214. package/dist/testing/workers-runtime.js +20 -2
  215. package/dist/webhook-abuse.d.ts +25 -0
  216. package/dist/webhook-abuse.js +54 -0
  217. package/dist/webhook-custody.d.ts +144 -0
  218. package/dist/webhook-custody.js +222 -0
  219. package/dist/webhook-ingress.d.ts +36 -0
  220. package/dist/webhook-ingress.js +146 -0
  221. package/dist/webhooks.d.ts +111 -0
  222. package/dist/webhooks.js +189 -0
  223. package/dist/workers-git.d.ts +12 -17
  224. package/dist/workers-git.js +60 -55
  225. package/dist/workers.d.ts +224 -13
  226. package/dist/workers.js +351 -51
  227. package/dist/workflow-agent-authority.d.ts +8 -0
  228. package/dist/workflow-agent-authority.js +42 -0
  229. package/dist/workflows.d.ts +66 -0
  230. package/dist/workflows.js +97 -0
  231. package/docs/api/README.md +63 -37
  232. package/docs/api/agents.md +17 -0
  233. package/docs/api/app-storage.md +1 -1
  234. package/docs/api/apps.md +1394 -543
  235. package/docs/api/browser/boot.md +132 -0
  236. package/docs/api/browser.md +1440 -0
  237. package/docs/api/build-contract.md +38 -25
  238. package/docs/api/build.md +263 -84
  239. package/docs/api/cloudflare.md +93 -7
  240. package/docs/api/git.md +3 -13
  241. package/docs/api/host.md +944 -118
  242. package/docs/api/index.md +320 -18
  243. package/docs/api/keys.md +24 -1
  244. package/docs/api/mcp.md +59 -12
  245. package/docs/api/modules.md +33 -40
  246. package/docs/api/pack.md +57 -8
  247. package/docs/api/page/mount.md +92 -4
  248. package/docs/api/workers-git.md +103 -24
  249. package/docs/api/workers.md +1581 -244
  250. package/docs/site/agent-quickstart.mdx +28 -14
  251. package/examples/standalone/worker.ts +3 -1
  252. package/examples/standalone/wrangler.jsonc +2 -0
  253. package/package.json +73 -69
  254. package/dist/installation-consent.d.ts +0 -79
  255. package/dist/installation-consent.js +0 -82
  256. package/dist/shell/app-directory.d.ts +0 -542
  257. package/dist/shell/app-directory.js +0 -199
  258. package/dist/shell/browser-actions.d.ts +0 -7
  259. package/dist/shell/browser-actions.js +0 -56
  260. package/dist/shell/command-host.d.ts +0 -112
  261. package/dist/shell/command-host.js +0 -502
  262. package/dist/shell/commands.d.ts +0 -25
  263. package/dist/shell/commands.js +0 -78
  264. package/dist/shell/index.d.ts +0 -8
  265. package/dist/shell/index.js +0 -8
  266. package/dist/shell/keys.d.ts +0 -41
  267. package/dist/shell/keys.js +0 -134
  268. package/dist/shell/shell-module.d.ts +0 -55
  269. package/dist/shell/shell-module.js +0 -86
  270. package/dist/shell/window-manager.d.ts +0 -124
  271. package/dist/shell/window-manager.js +0 -711
  272. package/dist/shell/workbench-contract.d.ts +0 -68
  273. package/dist/shell/workbench-directory.d.ts +0 -332
  274. package/dist/shell/workbench-directory.js +0 -35
  275. package/dist/shell/workbench-host-types.d.ts +0 -96
  276. package/dist/shell/workbench-host-types.js +0 -1
  277. package/dist/shell/workbench-host.d.ts +0 -34
  278. package/dist/shell/workbench-host.js +0 -347
  279. package/dist/shell/workbench-model.d.ts +0 -192
  280. package/dist/shell/workbench-model.js +0 -53
  281. package/dist/shell/workbench.d.ts +0 -4
  282. package/dist/shell/workbench.js +0 -2
  283. package/docs/api/shell/app-directory.md +0 -599
  284. package/docs/api/shell/command-host.md +0 -224
  285. package/docs/api/shell/commands.md +0 -197
  286. package/docs/api/shell/keys.md +0 -183
  287. package/docs/api/shell/shell-module.md +0 -204
  288. package/docs/api/shell/window-manager.md +0 -267
  289. package/docs/api/shell/workbench-directory.md +0 -119
  290. package/docs/api/shell/workbench.md +0 -205
  291. package/docs/api/shell.md +0 -1915
  292. /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
+ }