@fungi.computer/oyster 0.2.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 (287) hide show
  1. package/README.md +376 -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 +210 -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/pack.d.ts +14 -3
  130. package/dist/pack.js +44 -19
  131. package/dist/page/app-access.d.ts +7 -0
  132. package/dist/page/app-access.js +75 -0
  133. package/dist/page/boot-host.js +57 -0
  134. package/dist/page/capabilities.d.ts +3 -3
  135. package/dist/page/capabilities.js +16 -12
  136. package/dist/page/computer-handles.d.ts +3 -3
  137. package/dist/page/computer-target.d.ts +3 -0
  138. package/dist/page/computer-target.js +9 -0
  139. package/dist/page/mount.d.ts +23 -3
  140. package/dist/page/mount.js +152 -16
  141. package/dist/page-assets.d.ts +22 -0
  142. package/dist/page-assets.js +28 -0
  143. package/dist/page-script.d.ts +3 -0
  144. package/dist/page-script.js +5 -4
  145. package/dist/release.d.ts +13 -6
  146. package/dist/release.js +10 -7
  147. package/dist/root-data.d.ts +16 -6
  148. package/dist/root-data.js +2 -2
  149. package/dist/source/index.d.ts +1 -1
  150. package/dist/source/team-source.d.ts +20 -8
  151. package/dist/source/team-source.js +39 -10
  152. package/dist/source/template-seed.d.ts +2 -2
  153. package/dist/standalone/agent-mail.d.ts +24 -0
  154. package/dist/standalone/agent-mail.js +62 -0
  155. package/dist/standalone/agent-store.d.ts +9 -0
  156. package/dist/standalone/agent-store.js +30 -0
  157. package/dist/standalone/agents.d.ts +68 -9
  158. package/dist/standalone/agents.js +428 -56
  159. package/dist/standalone/app-builds-binding.d.ts +20 -2
  160. package/dist/standalone/app-builds-binding.js +147 -23
  161. package/dist/standalone/app-set.d.ts +5 -2
  162. package/dist/standalone/app-set.js +174 -143
  163. package/dist/standalone/browser.d.ts +11 -0
  164. package/dist/standalone/browser.js +72 -0
  165. package/dist/standalone/builds.d.ts +13 -4
  166. package/dist/standalone/builds.js +28 -44
  167. package/dist/standalone/computer-egress.d.ts +2 -0
  168. package/dist/standalone/computer-egress.js +13 -4
  169. package/dist/standalone/computer-fleet.d.ts +43 -0
  170. package/dist/standalone/computer-fleet.js +200 -0
  171. package/dist/standalone/computer.d.ts +44 -9
  172. package/dist/standalone/computer.js +129 -22
  173. package/dist/standalone/install-apps-cli.js +43 -6
  174. package/dist/standalone/instance.d.ts +2 -2
  175. package/dist/standalone/instance.js +8 -11
  176. package/dist/standalone/machine-link.d.ts +354 -0
  177. package/dist/standalone/machine-link.js +368 -0
  178. package/dist/standalone/media.d.ts +2 -2
  179. package/dist/standalone/media.js +19 -16
  180. package/dist/standalone/preview.d.ts +2 -2
  181. package/dist/standalone/preview.js +37 -10
  182. package/dist/standalone/registry.d.ts +149 -9
  183. package/dist/standalone/registry.js +299 -8
  184. package/dist/standalone/worker.d.ts +19 -5
  185. package/dist/standalone/worker.js +90 -54
  186. package/dist/standalone/workflow-binding.d.ts +18 -22
  187. package/dist/standalone/workflow-binding.js +18 -18
  188. package/dist/standalone/workflow-control.d.ts +4 -0
  189. package/dist/standalone/workflow-control.js +40 -0
  190. package/dist/standalone/workflow-events.d.ts +2 -2
  191. package/dist/standalone/workflow-events.js +9 -10
  192. package/dist/standalone/workflow-git-capture.js +4 -3
  193. package/dist/standalone/workflow-host.d.ts +162 -161
  194. package/dist/standalone/workflow-host.js +101 -21
  195. package/dist/standalone/workflow-node-capture.js +11 -4
  196. package/dist/standalone/workflow-schedules.d.ts +5 -2
  197. package/dist/standalone/workflow-schedules.js +9 -10
  198. package/dist/standalone/workflow-trigger-host.d.ts +65 -5
  199. package/dist/standalone/workflow-trigger-host.js +2 -2
  200. package/dist/standalone/workflow-webhooks.d.ts +22 -0
  201. package/dist/standalone/workflow-webhooks.js +39 -0
  202. package/dist/standalone/workflows.d.ts +140 -43
  203. package/dist/standalone/workflows.js +198 -39
  204. package/dist/storage-frame.d.ts +6 -6
  205. package/dist/testing/capabilities.js +14 -3
  206. package/dist/testing/installation.js +26 -2
  207. package/dist/testing/worker.js +1 -1
  208. package/dist/testing/workers-runtime.d.ts +8 -2
  209. package/dist/testing/workers-runtime.js +20 -2
  210. package/dist/webhook-abuse.d.ts +25 -0
  211. package/dist/webhook-abuse.js +54 -0
  212. package/dist/webhook-custody.d.ts +144 -0
  213. package/dist/webhook-custody.js +222 -0
  214. package/dist/webhook-ingress.d.ts +36 -0
  215. package/dist/webhook-ingress.js +146 -0
  216. package/dist/webhooks.d.ts +111 -0
  217. package/dist/webhooks.js +189 -0
  218. package/dist/workers-git.d.ts +12 -17
  219. package/dist/workers-git.js +60 -52
  220. package/dist/workers.d.ts +224 -13
  221. package/dist/workers.js +351 -51
  222. package/dist/workflow-agent-authority.d.ts +8 -0
  223. package/dist/workflow-agent-authority.js +42 -0
  224. package/dist/workflows.d.ts +66 -0
  225. package/dist/workflows.js +97 -0
  226. package/docs/api/README.md +63 -37
  227. package/docs/api/agents.md +17 -0
  228. package/docs/api/app-storage.md +1 -1
  229. package/docs/api/apps.md +1394 -543
  230. package/docs/api/browser/boot.md +132 -0
  231. package/docs/api/browser.md +1440 -0
  232. package/docs/api/build-contract.md +38 -25
  233. package/docs/api/build.md +263 -84
  234. package/docs/api/cloudflare.md +93 -7
  235. package/docs/api/git.md +3 -13
  236. package/docs/api/host.md +944 -118
  237. package/docs/api/index.md +320 -18
  238. package/docs/api/keys.md +24 -1
  239. package/docs/api/mcp.md +59 -12
  240. package/docs/api/modules.md +33 -40
  241. package/docs/api/pack.md +57 -8
  242. package/docs/api/page/mount.md +92 -4
  243. package/docs/api/workers-git.md +103 -24
  244. package/docs/api/workers.md +1581 -244
  245. package/docs/site/agent-quickstart.mdx +28 -14
  246. package/examples/standalone/worker.ts +3 -1
  247. package/examples/standalone/wrangler.jsonc +2 -0
  248. package/package.json +73 -71
  249. package/dist/installation-consent.d.ts +0 -81
  250. package/dist/installation-consent.js +0 -84
  251. package/dist/shell/app-directory.d.ts +0 -542
  252. package/dist/shell/app-directory.js +0 -196
  253. package/dist/shell/browser-actions.d.ts +0 -7
  254. package/dist/shell/browser-actions.js +0 -56
  255. package/dist/shell/command-host.d.ts +0 -112
  256. package/dist/shell/command-host.js +0 -502
  257. package/dist/shell/commands.d.ts +0 -25
  258. package/dist/shell/commands.js +0 -78
  259. package/dist/shell/index.d.ts +0 -8
  260. package/dist/shell/index.js +0 -8
  261. package/dist/shell/keys.d.ts +0 -41
  262. package/dist/shell/keys.js +0 -134
  263. package/dist/shell/shell-module.d.ts +0 -55
  264. package/dist/shell/shell-module.js +0 -86
  265. package/dist/shell/window-manager.d.ts +0 -128
  266. package/dist/shell/window-manager.js +0 -730
  267. package/dist/shell/workbench-contract.d.ts +0 -68
  268. package/dist/shell/workbench-directory.d.ts +0 -332
  269. package/dist/shell/workbench-directory.js +0 -35
  270. package/dist/shell/workbench-host-types.d.ts +0 -96
  271. package/dist/shell/workbench-host-types.js +0 -1
  272. package/dist/shell/workbench-host.d.ts +0 -34
  273. package/dist/shell/workbench-host.js +0 -352
  274. package/dist/shell/workbench-model.d.ts +0 -194
  275. package/dist/shell/workbench-model.js +0 -53
  276. package/dist/shell/workbench.d.ts +0 -4
  277. package/dist/shell/workbench.js +0 -2
  278. package/docs/api/shell/app-directory.md +0 -599
  279. package/docs/api/shell/command-host.md +0 -224
  280. package/docs/api/shell/commands.md +0 -197
  281. package/docs/api/shell/keys.md +0 -183
  282. package/docs/api/shell/shell-module.md +0 -204
  283. package/docs/api/shell/window-manager.md +0 -267
  284. package/docs/api/shell/workbench-directory.md +0 -119
  285. package/docs/api/shell/workbench.md +0 -205
  286. package/docs/api/shell.md +0 -1915
  287. /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
+ }