@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,236 @@
1
+ import { z } from "zod";
2
+ import stripAnsi from "strip-ansi";
3
+ import { parseArtifactRef, parseReleaseId, parseSha256Digest, } from "@fungi.computer/puffball";
4
+ import { defaultAssetPolicy, verifyRelease, } from "./release.js";
5
+ /** Only the host can produce these outcomes; they are not an App build input. */
6
+ export const bootFailureSchema = z.enum([
7
+ "backend_load_failed",
8
+ "backend_construction_failed",
9
+ "ui_mount_failed",
10
+ "boot_runner_unavailable",
11
+ "boot_browser_binding_missing",
12
+ "boot_clone_unavailable",
13
+ "boot_timeout",
14
+ "boot_cleanup_failed",
15
+ ]);
16
+ export const BOOT_MOUNT_DIAGNOSTIC_LIMITS = Object.freeze({
17
+ maxEntriesPerKind: 20,
18
+ maxEntriesTotal: 48,
19
+ maxTextChars: 300,
20
+ maxPathChars: 2048,
21
+ maxDroppedCount: 1024,
22
+ });
23
+ const bootMountDiagnosticTextSchema = z
24
+ .string()
25
+ .transform((value) => {
26
+ const withoutTerminalControls = stripAnsi(value.slice(0, 4096)).replace(/[\p{Cc}\p{Cf}]/gu, "");
27
+ return withoutTerminalControls
28
+ .replace(/\b(?:authorization|cookie)\s*:\s*[^\r\n]*/giu, "[redacted]")
29
+ .replace(/\b(?:access[_-]?token|token|password|secret)\b\s*[:=]\s*["']?[^,\s;"']+/giu, "[redacted]")
30
+ .replace(/\bBearer\s+\S+/giu, "[redacted]")
31
+ .replace(/\S*(?:[a-z][a-z\d+.-]*:\/\/|\?)[^\s]*/giu, "[redacted]")
32
+ .trim()
33
+ .slice(0, BOOT_MOUNT_DIAGNOSTIC_LIMITS.maxTextChars);
34
+ })
35
+ .pipe(z.string().max(BOOT_MOUNT_DIAGNOSTIC_LIMITS.maxTextChars));
36
+ const bootMountDiagnosticPathSchema = z
37
+ .string()
38
+ .min(1)
39
+ .max(BOOT_MOUNT_DIAGNOSTIC_LIMITS.maxPathChars)
40
+ .refine((path) => path === "out-of-scope" ||
41
+ (path.startsWith("/") && !path.includes("?") && !path.includes("#")));
42
+ export const bootMountFailurePredicateSchema = z.enum([
43
+ "unexpected_candidate_request",
44
+ "response_status",
45
+ "request_failed",
46
+ "page_error",
47
+ "candidate_not_mounted",
48
+ ]);
49
+ /** Closed, safe names for exceptions used in host-side mount diagnostics. */
50
+ export const bootMountDiagnosticErrorNameSchema = z.enum([
51
+ "Error",
52
+ "TypeError",
53
+ "RangeError",
54
+ "SyntaxError",
55
+ "AbortError",
56
+ "TimeoutError",
57
+ "Other",
58
+ ]);
59
+ const bootMountRequestFailureKindSchema = z.enum([
60
+ "unexpected_candidate_request",
61
+ "response_status",
62
+ "request_failed",
63
+ ]);
64
+ const bootMountFailedRequestSchema = z
65
+ .strictObject({
66
+ path: bootMountDiagnosticPathSchema,
67
+ status: z.number().int().min(100).max(599).optional(),
68
+ failureKind: bootMountRequestFailureKindSchema.optional(),
69
+ })
70
+ .refine((request) => request.status !== undefined || request.failureKind !== undefined);
71
+ /** Bounded, URL-redacted observations from one failed candidate mount. */
72
+ export const bootMountDiagnosticsSchema = z
73
+ .strictObject({
74
+ failedPredicate: bootMountFailurePredicateSchema,
75
+ errorName: bootMountDiagnosticErrorNameSchema.optional(),
76
+ finalUrlPath: bootMountDiagnosticPathSchema,
77
+ consoleErrors: z
78
+ .array(bootMountDiagnosticTextSchema)
79
+ .max(BOOT_MOUNT_DIAGNOSTIC_LIMITS.maxEntriesPerKind),
80
+ pageErrors: z
81
+ .array(bootMountDiagnosticTextSchema)
82
+ .max(BOOT_MOUNT_DIAGNOSTIC_LIMITS.maxEntriesPerKind),
83
+ failedRequests: z
84
+ .array(bootMountFailedRequestSchema)
85
+ .max(BOOT_MOUNT_DIAGNOSTIC_LIMITS.maxEntriesPerKind),
86
+ droppedCount: z
87
+ .number()
88
+ .int()
89
+ .min(0)
90
+ .max(BOOT_MOUNT_DIAGNOSTIC_LIMITS.maxDroppedCount),
91
+ })
92
+ .superRefine((diagnostics, context) => {
93
+ if (diagnostics.consoleErrors.length +
94
+ diagnostics.pageErrors.length +
95
+ diagnostics.failedRequests.length >
96
+ BOOT_MOUNT_DIAGNOSTIC_LIMITS.maxEntriesTotal)
97
+ context.addIssue({
98
+ code: "custom",
99
+ message: "Mount observations exceed the total bound",
100
+ });
101
+ });
102
+ const reasons = {
103
+ backend_load_failed: "Candidate backend module could not load",
104
+ backend_construction_failed: "Candidate backend could not construct on App storage",
105
+ ui_mount_failed: "Candidate UI entry did not mount",
106
+ boot_runner_unavailable: "Host boot runner is unavailable; the old version remains selected",
107
+ boot_browser_binding_missing: "Cloudflare Browser Rendering binding BROWSER is missing; configure the browser binding before installing an App with a UI",
108
+ boot_clone_unavailable: "Host facet clone is unavailable; copy-seeded construction refused",
109
+ boot_timeout: "Candidate boot exceeded the host time limit",
110
+ boot_cleanup_failed: "Host could not confirm candidate cleanup; activation refused",
111
+ };
112
+ /** Safe host-authored reason; never reflects guest logs, exceptions or credentials. */
113
+ export class BootGateError extends Error {
114
+ code;
115
+ name = "BootGateError";
116
+ diagnostics;
117
+ constructor(code, options) {
118
+ super(reasons[code], options);
119
+ this.code = code;
120
+ if (options?.diagnostics !== undefined) {
121
+ if (code !== "ui_mount_failed")
122
+ throw new TypeError("Mount diagnostics require ui_mount_failed");
123
+ this.diagnostics = bootMountDiagnosticsSchema.parse(options.diagnostics);
124
+ }
125
+ }
126
+ }
127
+ /** A finite host policy, not a candidate-configurable health check. */
128
+ export const BOOT_DEADLINE_MS = 10_000;
129
+ /** The original outer-request allowance, reserved for transport and cleanup. */
130
+ export const BOOT_TRANSPORT_GRACE_MS = 2_000;
131
+ /** Immutable artifact references only; bytes use the private native data plane. */
132
+ export const bootUiSchema = z.strictObject({
133
+ identity: z.strictObject({
134
+ appId: z.string().min(1).max(256),
135
+ releaseId: z.string().transform(parseReleaseId),
136
+ surfaceId: z.literal("host-boot"),
137
+ }),
138
+ base: z.string().min(1).max(2048),
139
+ assets: z
140
+ .array(z.strictObject({
141
+ path: z.string().min(1).max(4096),
142
+ contentType: z.string().min(1).max(256),
143
+ artifactRef: z.string().transform(parseArtifactRef),
144
+ digest: z.string().transform(parseSha256Digest),
145
+ }))
146
+ .max(defaultAssetPolicy.maxObjects),
147
+ });
148
+ /** Captures the same no-grant UI representation as a private candidate preview. */
149
+ export async function readBootUi(store, release) {
150
+ const verified = await verifyRelease(store, release, defaultAssetPolicy, false);
151
+ if (verified.ui === null)
152
+ return null;
153
+ const identity = {
154
+ appId: release.appId,
155
+ releaseId: release.releaseId,
156
+ surfaceId: "host-boot",
157
+ };
158
+ if (verified.ui.kind === "html") {
159
+ return {
160
+ identity,
161
+ base: "./",
162
+ assets: [
163
+ {
164
+ path: "/index.html",
165
+ contentType: "text/html; charset=utf-8",
166
+ artifactRef: verified.ui.artifactRef,
167
+ digest: verified.ui.digest,
168
+ },
169
+ ],
170
+ };
171
+ }
172
+ const assets = [];
173
+ for (const asset of verified.ui.build.assets)
174
+ assets.push({
175
+ path: asset.path,
176
+ contentType: asset.contentType,
177
+ artifactRef: asset.artifactRef,
178
+ digest: asset.digest,
179
+ });
180
+ return {
181
+ identity,
182
+ // Preserve the build producer's relative base. A relative Vite base keeps
183
+ // every asset beneath the host-selected boot URL without rewriting HTML.
184
+ base: verified.ui.build.base,
185
+ assets,
186
+ };
187
+ }
188
+ export const bootCheckResultSchema = z.discriminatedUnion("kind", [
189
+ z.strictObject({ kind: z.literal("passed") }),
190
+ z.strictObject({
191
+ kind: z.literal("not_checked"),
192
+ code: z.enum([
193
+ "boot_runner_unavailable",
194
+ "boot_browser_binding_missing",
195
+ "boot_timeout",
196
+ "boot_clone_unavailable",
197
+ "boot_cleanup_failed",
198
+ ]),
199
+ }),
200
+ z
201
+ .strictObject({
202
+ kind: z.literal("refused"),
203
+ code: bootFailureSchema,
204
+ diagnostics: bootMountDiagnosticsSchema.optional(),
205
+ })
206
+ .refine((result) => result.diagnostics === undefined || result.code === "ui_mount_failed"),
207
+ ]);
208
+ /** A UI check recorded on an installation operation, never installation authority. */
209
+ export const uiBootCheckOutcomeSchema = z.discriminatedUnion("kind", [
210
+ z.strictObject({ kind: z.literal("passed") }),
211
+ z.strictObject({
212
+ kind: z.literal("failed"),
213
+ code: z.literal("ui_mount_failed"),
214
+ diagnostics: bootMountDiagnosticsSchema.optional(),
215
+ }),
216
+ z.strictObject({
217
+ kind: z.literal("not_checked"),
218
+ code: z.enum([
219
+ // Team hosts deliberately skip this check in their own isolate.
220
+ "ui_check_not_run_on_host",
221
+ "boot_runner_unavailable",
222
+ "boot_browser_binding_missing",
223
+ "boot_timeout",
224
+ "boot_clone_unavailable",
225
+ "boot_cleanup_failed",
226
+ ]),
227
+ }),
228
+ ]);
229
+ /** Owner-facing 422 body; diagnostics are never copied into other failures. */
230
+ export const bootRefusalSchema = z
231
+ .strictObject({
232
+ error: bootFailureSchema,
233
+ message: z.string().min(1).max(256),
234
+ diagnostics: bootMountDiagnosticsSchema.optional(),
235
+ })
236
+ .refine((refusal) => refusal.diagnostics === undefined || refusal.error === "ui_mount_failed");
@@ -0,0 +1,2 @@
1
+ /** Trusted, bundled zero-grant parent; emitted by the ordinary page build. */
2
+ export const bootHostScript: string;