@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,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;