@spacefast/common 0.0.26 → 0.2.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 (302) hide show
  1. package/dist/agents/connect-targets.d.ts +6 -146
  2. package/dist/agents/connect-targets.js +63 -295
  3. package/dist/agents/private-key-oauth.d.ts +31 -1
  4. package/dist/agents/private-key-oauth.js +124 -33
  5. package/dist/agents/registry/core.d.ts +292 -0
  6. package/dist/agents/registry/core.js +1388 -0
  7. package/dist/agents/registry/deeplink-probes.d.ts +23 -0
  8. package/dist/agents/registry/deeplink-probes.js +18 -0
  9. package/dist/agents/registry/node.d.ts +56 -0
  10. package/dist/agents/registry/node.js +339 -0
  11. package/dist/brand-assets-build.js +1 -2
  12. package/dist/brand-assets.js +4 -7
  13. package/dist/brand.d.ts +17 -0
  14. package/dist/brand.js +24 -4
  15. package/dist/config/domains.d.ts +55 -28
  16. package/dist/config/domains.js +85 -41
  17. package/dist/config/index.js +1 -2
  18. package/dist/contracts/abuse.js +9 -24
  19. package/dist/contracts/access-profiles.d.ts +86 -0
  20. package/dist/contracts/access-profiles.js +89 -0
  21. package/dist/contracts/access.d.ts +21 -27
  22. package/dist/contracts/access.js +33 -64
  23. package/dist/contracts/activity.d.ts +18 -1
  24. package/dist/contracts/activity.js +70 -26
  25. package/dist/contracts/analytics.js +8 -10
  26. package/dist/contracts/api-keys.d.ts +77 -52
  27. package/dist/contracts/api-keys.js +44 -24
  28. package/dist/contracts/application-journal.d.ts +216 -0
  29. package/dist/contracts/application-journal.js +167 -0
  30. package/dist/contracts/auth.d.ts +90 -17
  31. package/dist/contracts/auth.js +86 -17
  32. package/dist/contracts/beta.d.ts +9 -4
  33. package/dist/contracts/beta.js +20 -16
  34. package/dist/contracts/billing.js +7 -11
  35. package/dist/contracts/bootstrap.d.ts +791 -0
  36. package/dist/contracts/bootstrap.js +51 -0
  37. package/dist/contracts/builds.d.ts +186 -7
  38. package/dist/contracts/builds.js +75 -21
  39. package/dist/contracts/channels.d.ts +43 -0
  40. package/dist/contracts/channels.js +25 -9
  41. package/dist/contracts/cli.d.ts +7 -0
  42. package/dist/contracts/cli.js +6 -0
  43. package/dist/contracts/collab-public.d.ts +1 -1
  44. package/dist/contracts/collab-public.js +5 -8
  45. package/dist/contracts/comments.d.ts +45 -35
  46. package/dist/contracts/comments.js +107 -77
  47. package/dist/contracts/commerce.d.ts +165 -0
  48. package/dist/contracts/commerce.js +146 -0
  49. package/dist/contracts/common.d.ts +3 -3
  50. package/dist/contracts/common.js +18 -29
  51. package/dist/contracts/content-contract-verification.d.ts +521 -0
  52. package/dist/contracts/content-contract-verification.js +320 -0
  53. package/dist/contracts/content-platform-fixture.d.ts +1278 -0
  54. package/dist/contracts/content-platform-fixture.js +44 -0
  55. package/dist/contracts/content-program.d.ts +994 -0
  56. package/dist/contracts/content-program.js +658 -0
  57. package/dist/contracts/content-sync.d.ts +290 -0
  58. package/dist/contracts/content-sync.js +167 -0
  59. package/dist/contracts/content.d.ts +432 -0
  60. package/dist/contracts/content.js +303 -0
  61. package/dist/contracts/continuation.d.ts +17 -1
  62. package/dist/contracts/continuation.js +23 -23
  63. package/dist/contracts/countries.js +3 -4
  64. package/dist/contracts/crons.d.ts +17 -0
  65. package/dist/contracts/crons.js +33 -15
  66. package/dist/contracts/dashboard-prefs.d.ts +56 -0
  67. package/dist/contracts/dashboard-prefs.js +51 -0
  68. package/dist/contracts/device-auth.d.ts +234 -37
  69. package/dist/contracts/device-auth.js +267 -53
  70. package/dist/contracts/docs.d.ts +6 -10
  71. package/dist/contracts/docs.js +5 -13
  72. package/dist/contracts/domains.d.ts +499 -102
  73. package/dist/contracts/domains.js +169 -58
  74. package/dist/contracts/email-preferences.d.ts +3 -3
  75. package/dist/contracts/email-preferences.js +6 -7
  76. package/dist/contracts/enums.d.ts +26 -26
  77. package/dist/contracts/enums.js +61 -54
  78. package/dist/contracts/error-code-meta.d.ts +269 -7
  79. package/dist/contracts/error-code-meta.js +80 -5
  80. package/dist/contracts/error-codes.d.ts +5 -5
  81. package/dist/contracts/error-codes.js +78 -16
  82. package/dist/contracts/events.d.ts +100 -20
  83. package/dist/contracts/events.js +107 -20
  84. package/dist/contracts/execution.d.ts +47 -66
  85. package/dist/contracts/execution.js +51 -64
  86. package/dist/contracts/feature-lifecycle.d.ts +70 -14
  87. package/dist/contracts/feature-lifecycle.js +86 -15
  88. package/dist/contracts/features.d.ts +100 -37
  89. package/dist/contracts/features.js +21 -27
  90. package/dist/contracts/fixtures/content-platform-v1.json +1108 -0
  91. package/dist/contracts/frame-session.d.ts +192 -0
  92. package/dist/contracts/frame-session.js +164 -0
  93. package/dist/contracts/functions.d.ts +218 -211
  94. package/dist/contracts/functions.js +273 -260
  95. package/dist/contracts/grant-copy.d.ts +43 -0
  96. package/dist/contracts/grant-copy.js +44 -0
  97. package/dist/contracts/grants.d.ts +64 -56
  98. package/dist/contracts/grants.js +124 -23
  99. package/dist/contracts/ids.d.ts +4 -1
  100. package/dist/contracts/ids.js +4 -1
  101. package/dist/contracts/internal.d.ts +5 -4
  102. package/dist/contracts/internal.js +12 -3
  103. package/dist/contracts/mcp.d.ts +17 -0
  104. package/dist/contracts/mcp.js +23 -0
  105. package/dist/contracts/me.d.ts +6 -1
  106. package/dist/contracts/me.js +12 -6
  107. package/dist/contracts/notifications.d.ts +27 -29
  108. package/dist/contracts/notifications.js +9 -4
  109. package/dist/contracts/oauth-resources.d.ts +112 -10
  110. package/dist/contracts/oauth-resources.js +116 -11
  111. package/dist/contracts/oauth-scope-actions.d.ts +90 -0
  112. package/dist/contracts/oauth-scope-actions.js +126 -0
  113. package/dist/contracts/operations.d.ts +27 -4
  114. package/dist/contracts/operations.js +11 -5
  115. package/dist/contracts/pages.d.ts +29 -5
  116. package/dist/contracts/pages.js +22 -5
  117. package/dist/contracts/partner-notifications.d.ts +3 -0
  118. package/dist/contracts/partner-notifications.js +65 -0
  119. package/dist/contracts/{platform.d.ts → partner.d.ts} +29 -42
  120. package/dist/contracts/{platform.js → partner.js} +27 -40
  121. package/dist/contracts/plan-policy.d.ts +1 -1
  122. package/dist/contracts/principal-assertion.d.ts +43 -0
  123. package/dist/contracts/principal-assertion.js +67 -0
  124. package/dist/contracts/principals.d.ts +73 -0
  125. package/dist/contracts/principals.js +59 -0
  126. package/dist/contracts/privacy.d.ts +11 -0
  127. package/dist/contracts/privacy.js +17 -0
  128. package/dist/contracts/problem-document.js +3 -4
  129. package/dist/contracts/publish-archive.d.ts +116 -18
  130. package/dist/contracts/publish-archive.js +6 -3
  131. package/dist/contracts/push-new.d.ts +4 -4
  132. package/dist/contracts/quotas.js +3 -3
  133. package/dist/contracts/realtime.d.ts +52 -0
  134. package/dist/contracts/realtime.js +54 -0
  135. package/dist/contracts/repository-connections.d.ts +1 -1
  136. package/dist/contracts/repository-connections.js +6 -2
  137. package/dist/contracts/resources.d.ts +105 -14
  138. package/dist/contracts/resources.js +145 -21
  139. package/dist/contracts/route-inventory.d.ts +358 -0
  140. package/dist/contracts/route-inventory.js +141 -0
  141. package/dist/contracts/runtime-api.d.ts +112 -35
  142. package/dist/contracts/runtime-api.js +86 -66
  143. package/dist/contracts/runtime-app.d.ts +11 -21
  144. package/dist/contracts/runtime-app.js +39 -24
  145. package/dist/contracts/runtime-components.d.ts +143 -0
  146. package/dist/contracts/runtime-components.js +199 -0
  147. package/dist/contracts/runtime-db.d.ts +45 -19
  148. package/dist/contracts/runtime-db.js +85 -20
  149. package/dist/contracts/runtime-purge.js +3 -5
  150. package/dist/contracts/runtime-services.d.ts +43 -75
  151. package/dist/contracts/runtime-services.js +29 -49
  152. package/dist/contracts/runtime-storage.d.ts +14 -14
  153. package/dist/contracts/runtime-storage.js +28 -13
  154. package/dist/contracts/sf-config-v1.d.ts +14 -18
  155. package/dist/contracts/slugs.js +13 -4
  156. package/dist/contracts/space-config.d.ts +235 -28
  157. package/dist/contracts/space-config.js +246 -91
  158. package/dist/contracts/spaces.d.ts +360 -255
  159. package/dist/contracts/spaces.js +190 -122
  160. package/dist/contracts/superadmin-activity.d.ts +3 -43
  161. package/dist/contracts/superadmin-activity.js +6 -30
  162. package/dist/contracts/superadmin-emails.d.ts +1 -0
  163. package/dist/contracts/superadmin-emails.js +17 -1
  164. package/dist/contracts/superadmin-runtime.d.ts +199 -0
  165. package/dist/contracts/superadmin-runtime.js +141 -0
  166. package/dist/contracts/superadmin-search.d.ts +22 -2
  167. package/dist/contracts/superadmin-search.js +14 -6
  168. package/dist/contracts/superadmin-spaces.d.ts +435 -186
  169. package/dist/contracts/superadmin-spaces.js +131 -25
  170. package/dist/contracts/superadmin-teams.d.ts +3 -0
  171. package/dist/contracts/superadmin-teams.js +1 -2
  172. package/dist/contracts/superadmin-tenants.d.ts +627 -6
  173. package/dist/contracts/superadmin-tenants.js +32 -7
  174. package/dist/contracts/superadmin.d.ts +98 -16
  175. package/dist/contracts/superadmin.js +63 -10
  176. package/dist/contracts/tags.d.ts +85 -58
  177. package/dist/contracts/tags.js +44 -34
  178. package/dist/contracts/teams.d.ts +72 -9
  179. package/dist/contracts/teams.js +84 -25
  180. package/dist/contracts/tenants.d.ts +135 -0
  181. package/dist/contracts/tenants.js +120 -0
  182. package/dist/contracts/test-triggers.d.ts +70 -0
  183. package/dist/contracts/test-triggers.js +116 -0
  184. package/dist/contracts/theme-json.js +3 -8
  185. package/dist/contracts/transfers.d.ts +1 -0
  186. package/dist/contracts/transfers.js +1 -0
  187. package/dist/contracts/usage.d.ts +209 -0
  188. package/dist/contracts/usage.js +124 -12
  189. package/dist/contracts/variables.d.ts +2 -2
  190. package/dist/contracts/variables.js +9 -13
  191. package/dist/contracts/webhooks.d.ts +13 -5
  192. package/dist/contracts/webhooks.js +3 -1
  193. package/dist/contracts/zero.d.ts +57 -64
  194. package/dist/contracts/zero.js +68 -66
  195. package/dist/dashboard-paths/index.d.ts +24 -21
  196. package/dist/dashboard-paths/index.js +35 -47
  197. package/dist/dashboard-paths/route-reservations.generated.d.ts +2 -0
  198. package/dist/dashboard-paths/route-reservations.generated.js +36 -0
  199. package/dist/docs/agent-arrival.d.ts +92 -0
  200. package/dist/docs/agent-arrival.js +227 -0
  201. package/dist/docs/agent-output-policy.d.ts +6 -0
  202. package/dist/docs/agent-output-policy.js +22 -0
  203. package/dist/docs/agent-prose.d.ts +11 -17
  204. package/dist/docs/agent-prose.js +62 -37
  205. package/dist/docs/agent-setup.d.ts +72 -41
  206. package/dist/docs/agent-setup.js +336 -436
  207. package/dist/docs/catalog.d.ts +147 -89
  208. package/dist/docs/catalog.js +157 -42
  209. package/dist/docs/error-docs.d.ts +2098 -1
  210. package/dist/docs/error-docs.js +281 -16
  211. package/dist/docs/index-build.d.ts +0 -1
  212. package/dist/docs/index-build.js +2 -3
  213. package/dist/docs/page-context-prompt.d.ts +77 -0
  214. package/dist/docs/page-context-prompt.js +131 -0
  215. package/dist/docs/reference-urls.d.ts +46 -0
  216. package/dist/docs/reference-urls.js +79 -0
  217. package/dist/docs/search.d.ts +6 -8
  218. package/dist/docs/search.js +10 -13
  219. package/dist/docs/skill-distribution.d.ts +4 -1
  220. package/dist/docs/skill-distribution.js +10 -5
  221. package/dist/docs/skills.d.ts +117 -117
  222. package/dist/docs/skills.js +120 -72
  223. package/dist/docs/start-prompts.d.ts +45 -0
  224. package/dist/docs/start-prompts.js +62 -0
  225. package/dist/domain-exploration.js +9 -13
  226. package/dist/og-template.d.ts +56 -0
  227. package/dist/og-template.js +56 -0
  228. package/dist/slug-policy/index.js +5 -11
  229. package/dist/utils/browser-credential.d.ts +13 -6
  230. package/dist/utils/browser-credential.js +14 -7
  231. package/dist/utils/build-settings.d.ts +16 -0
  232. package/dist/utils/build-settings.js +63 -17
  233. package/dist/utils/canonical-json.d.ts +3 -5
  234. package/dist/utils/canonical-json.js +3 -5
  235. package/dist/utils/cast-transport.d.ts +5 -17
  236. package/dist/utils/cast-transport.js +6 -19
  237. package/dist/utils/claim-token.js +1 -2
  238. package/dist/utils/comment-avatars.js +4 -6
  239. package/dist/utils/concurrency.js +2 -3
  240. package/dist/utils/content-type.d.ts +7 -6
  241. package/dist/utils/content-type.js +73 -51
  242. package/dist/utils/credential-policy.d.ts +50 -6
  243. package/dist/utils/credential-policy.js +123 -57
  244. package/dist/utils/egress-policy.fixtures.json +1 -1
  245. package/dist/utils/generate-space-name.d.ts +3 -8
  246. package/dist/utils/generate-space-name.js +3 -8
  247. package/dist/utils/grants.d.ts +0 -1
  248. package/dist/utils/grants.js +4 -7
  249. package/dist/utils/gravatar.d.ts +2 -4
  250. package/dist/utils/gravatar.js +6 -12
  251. package/dist/utils/id-hints.js +14 -23
  252. package/dist/utils/idempotency.d.ts +3 -3
  253. package/dist/utils/idempotency.js +6 -7
  254. package/dist/utils/local-space-state.d.ts +15 -15
  255. package/dist/utils/local-space-state.js +34 -23
  256. package/dist/utils/oauth-signed-query.d.ts +3 -5
  257. package/dist/utils/oauth-signed-query.js +6 -9
  258. package/dist/utils/one-shot-replay.d.ts +3 -5
  259. package/dist/utils/one-shot-replay.js +3 -5
  260. package/dist/utils/page-colors.d.ts +4 -10
  261. package/dist/utils/page-colors.js +11 -35
  262. package/dist/utils/page-fonts.js +6 -11
  263. package/dist/utils/page-preview.d.ts +0 -1
  264. package/dist/utils/page-preview.js +0 -1
  265. package/dist/utils/pages.d.ts +22 -11
  266. package/dist/utils/pages.js +70 -30
  267. package/dist/utils/privacy-regions.d.ts +19 -0
  268. package/dist/utils/privacy-regions.js +91 -0
  269. package/dist/utils/publish-form-data.d.ts +4 -5
  270. package/dist/utils/publish-form-data.js +2 -3
  271. package/dist/utils/publish-policy.d.ts +10 -23
  272. package/dist/utils/publish-policy.js +63 -116
  273. package/dist/utils/query-client.d.ts +2 -0
  274. package/dist/utils/query-client.js +10 -1
  275. package/dist/utils/runtime-paths.d.ts +4 -4
  276. package/dist/utils/runtime-paths.js +6 -8
  277. package/dist/utils/runtime-upload.d.ts +4 -0
  278. package/dist/utils/runtime-upload.js +5 -0
  279. package/dist/utils/secure-local-file.d.ts +3 -3
  280. package/dist/utils/secure-local-file.js +18 -24
  281. package/dist/utils/space-config.d.ts +11 -14
  282. package/dist/utils/space-config.js +10 -16
  283. package/dist/utils/static-runtime-policy.d.ts +5 -8
  284. package/dist/utils/static-runtime-policy.generated.d.ts +16 -0
  285. package/dist/utils/static-runtime-policy.generated.js +70 -0
  286. package/dist/utils/static-runtime-policy.js +17 -84
  287. package/dist/utils/storage-policy.js +1 -2
  288. package/dist/utils/upload-session.js +8 -14
  289. package/dist/utils/version-path.js +11 -19
  290. package/dist/utils/wpcom-auth-redirects.d.ts +5 -14
  291. package/dist/utils/wpcom-auth-redirects.js +1 -4
  292. package/dist/vocabulary.d.ts +7 -7
  293. package/dist/vocabulary.js +30 -16
  294. package/package.json +14 -2
  295. package/dist/agents/client-registry.d.ts +0 -22
  296. package/dist/agents/client-registry.js +0 -41
  297. package/dist/docs/agent-handoff-document.d.ts +0 -15
  298. package/dist/docs/agent-handoff-document.js +0 -180
  299. package/dist/docs/agent-solutions.d.ts +0 -110
  300. package/dist/docs/agent-solutions.js +0 -183
  301. package/dist/utils/query-keys.d.ts +0 -84
  302. package/dist/utils/query-keys.js +0 -108
@@ -34,22 +34,16 @@ export function escapePageHtml(value) {
34
34
  .replaceAll("'", "'");
35
35
  }
36
36
  /**
37
- * The custom properties a theme paints with. Pushed colors are intent; the
38
- * readability engine (page-colors.ts) derives what the templates actually use.
39
- * A custom background pins a complete scheme for both OS modes — emitting
40
- * `--sf-bg` alone used to leave dark-mode visitors with the dark foreground on
41
- * the user's light background.
42
- *
43
- * Exported because the dashboard's live preview paints the same tokens from an
44
- * unsaved draft: it passes the colors it has already derived, and gets exactly
45
- * what the published page would carry.
37
+ * The custom properties a theme paints with. A custom background pins a
38
+ * complete scheme for both OS modes; `--sf-bg` alone would leave dark-mode
39
+ * visitors with the dark foreground on a light background. Exported so the
40
+ * dashboard preview paints the same tokens from an unsaved draft.
46
41
  */
47
42
  export function pageThemeCss(theme, derived = derivePageColors(theme)) {
48
43
  const root = [];
49
44
  const dark = [];
50
45
  if (theme.accent || theme.background) {
51
- // `derived.accent` is the parse-validated input (or the default), never
52
- // an arbitrary string straight from the theme.
46
+ // `derived.accent` is parse-validated, never a raw string from the theme.
53
47
  if (theme.accent)
54
48
  root.push(`--sf-accent:${derived.accent}`);
55
49
  root.push(`--sf-on-accent:${derived.onAccent}`, `--sf-link:${derived.link}`);
@@ -82,8 +76,8 @@ function renderFiles(files) {
82
76
  function renderFile(file) {
83
77
  if (!file)
84
78
  return '<p class="sf-empty">File unavailable.</p>';
85
- // This page is itself the `?spacefast_view=1` representation, so the embed,
86
- // the download and the raw link all point straight at the canonical path.
79
+ // This page is itself the `?spacefast_view=1` representation, so every link
80
+ // points straight at the canonical path.
87
81
  const href = escapePageHtml(file.href);
88
82
  const name = escapePageHtml(file.name);
89
83
  const media = file.mime?.startsWith("image/")
@@ -91,11 +85,13 @@ function renderFile(file) {
91
85
  : `<iframe class="sf-preview" src="${href}" title="Preview of ${name}" loading="lazy" sandbox></iframe>`;
92
86
  return `<div class="sf-preview-wrap">${media}</div><dl class="sf-file-meta"><div><dt>Name</dt><dd>${name}</dd></div>${file.size ? `<div><dt>Size</dt><dd>${escapePageHtml(file.size)}</dd></div>` : ""}${file.mime ? `<div><dt>Type</dt><dd>${escapePageHtml(file.mime)}</dd></div>` : ""}</dl><div class="sf-actions"><a class="sf-button" href="${href}" download>Download</a><a class="sf-ghost" href="${href}">View raw</a></div>`;
93
87
  }
94
- function renderSpacefastBranding(hidden) {
88
+ function renderSpacefastBranding(hidden, supportUrl, partnerBranding) {
95
89
  const wordmark = hidden
96
90
  ? ""
97
91
  : `<span class="sf-powered" tabindex="0"><svg class="sf-wordmark" viewBox="0 0 152 28.9062" role="img" aria-label="Spacefast"><path fill="currentColor" d="${SPACEFAST_WORDMARK_PATH}"></path></svg><span class="sf-powered-line"><a href="https://spacefast.com">Best way to share what your agent made</a></span></span>`;
98
- return `<footer class="sf-colophon"><div class="sf-colophon-row">${wordmark}<a class="sf-help" href="https://spacefast.com/help">Need help?</a></div></footer>`;
92
+ const helpUrl = supportUrl ?? (partnerBranding ? null : "https://spacefast.com/help");
93
+ const help = helpUrl ? `<a class="sf-help" href="${escapePageHtml(helpUrl)}">Need help?</a>` : "";
94
+ return `<footer class="sf-colophon"><div class="sf-colophon-row">${wordmark}${help}</div></footer>`;
99
95
  }
100
96
  function renderElement(element, context) {
101
97
  switch (element) {
@@ -120,7 +116,7 @@ function renderElement(element, context) {
120
116
  return escapePageHtml(visible < count ? `${label} · showing first ${visible}` : label);
121
117
  }
122
118
  case "sf-spacefast-branding":
123
- return renderSpacefastBranding(context.hideSpacefastBranding);
119
+ return renderSpacefastBranding(context.hideSpacefastBranding, context.supportUrl, context.partnerBranding);
124
120
  case "sf-files":
125
121
  return renderFiles(context.files ?? []);
126
122
  case "sf-file":
@@ -142,12 +138,17 @@ export function expandPageHtml(source, context) {
142
138
  return name && knownElements.has(name) ? renderElement(name, context) : _match;
143
139
  });
144
140
  if (output.includes("/*sf-default-fonts*/")) {
145
- output = output.replaceAll("/*sf-default-fonts*/", PAGE_FONT_FACES);
146
- // The faces point at shared font origins; preloading ahead of the inline
147
- // stylesheet starts the cross-origin fetches with the parse.
148
- output = /<\s*style\b/i.test(output)
149
- ? output.replace(/<\s*style\b/i, (tag) => `${PAGE_FONT_PRELOAD_HTML}${tag}`)
150
- : `${PAGE_FONT_PRELOAD_HTML}${output}`;
141
+ output = output.replaceAll("/*sf-default-fonts*/", context.useSystemDisplayFont ? "" : PAGE_FONT_FACES);
142
+ if (context.useSystemDisplayFont) {
143
+ output = output.replaceAll('--sf-display-font:"Recoleta",Georgia,serif', "--sf-display-font:var(--sf-font)");
144
+ }
145
+ // Preloading ahead of the inline stylesheet starts the cross-origin
146
+ // fetches with the parse.
147
+ output = context.useSystemDisplayFont
148
+ ? output
149
+ : /<\s*style\b/i.test(output)
150
+ ? output.replace(/<\s*style\b/i, (tag) => `${PAGE_FONT_PRELOAD_HTML}${tag}`)
151
+ : `${PAGE_FONT_PRELOAD_HTML}${output}`;
151
152
  }
152
153
  const tokens = themeStyle(context.theme ?? {});
153
154
  if (tokens) {
@@ -198,8 +199,7 @@ export function validatePageSources(input) {
198
199
  const path = sourcePath.includes("_pages/") ? sourcePath : `_pages/${sourcePath}`;
199
200
  const filename = path.slice(path.lastIndexOf("_pages/") + 7);
200
201
  const id = filename.replace(/\.html$/i, "");
201
- // A collab layout is Space-level — one review room, one URL so unlike the
202
- // gate and listing pages it has no per-directory form.
202
+ // One review room per Space, so collab has no per-directory form.
203
203
  if (!customPageIds.has(id) ||
204
204
  filename !== `${id}.html` ||
205
205
  (id === "collab" && path !== COLLAB_PAGE_SOURCE)) {
@@ -227,8 +227,7 @@ export function validatePageSources(input) {
227
227
  path,
228
228
  });
229
229
  for (const element of foundElements(source)) {
230
- // Collab elements are the browser SDK's, not the compiler's: legal in the
231
- // review room, meaningless anywhere the SDK is not the point.
230
+ // Collab elements belong to the browser SDK, legal only in the review room.
232
231
  if (id === "collab" && collabElements.has(element))
233
232
  continue;
234
233
  if (!knownElements.has(element))
@@ -266,8 +265,8 @@ export function validatePageSources(input) {
266
265
  message: "The index page does not render <sf-files>.",
267
266
  path,
268
267
  });
269
- // Without the lane slot the runtime has nowhere to inject the working
270
- // sign-in/password/request blocks and the template ships a dead gate.
268
+ // Without the lane slot the runtime cannot inject the sign-in, password
269
+ // and request blocks, and the gate ships dead.
271
270
  if (id === "access" && !/<\s*sf-access-lanes\b/i.test(source))
272
271
  diagnostics.push({
273
272
  severity: "error",
@@ -385,8 +384,7 @@ export function defaultPageBody(id) {
385
384
  const source = DEFAULT_PAGE_TEMPLATES[id];
386
385
  return source.match(/<body[^>]*>([\s\S]*?)<\/body>/i)?.[1] ?? source;
387
386
  }
388
- // The built-in palette runs through the same readability engine as pushed
389
- // themes, so buttons and links remain readable for every accepted accent.
387
+ // The built-in palette runs through the same readability engine as pushed themes.
390
388
  const defaultPageColors = derivePageColors({});
391
389
  const sharedCss = `/*sf-default-fonts*/:root{color-scheme:light dark;--sf-accent:${PAGE_COLOR_DEFAULTS.accent};--sf-bg:${PAGE_COLOR_DEFAULTS.bg};--sf-fg:${PAGE_COLOR_DEFAULTS.fg};--sf-muted:${PAGE_COLOR_DEFAULTS.muted};--sf-card:${PAGE_COLOR_DEFAULTS.card};--sf-border:${PAGE_COLOR_DEFAULTS.border};--sf-link:${defaultPageColors.link};--sf-on-accent:${defaultPageColors.onAccent};--sf-error:#a82d1a;--sf-font:-apple-system,BlinkMacSystemFont,"SF Pro Text","SF Pro Display","Segoe UI",system-ui,Roboto,"Helvetica Neue",Arial,sans-serif;--sf-display-font:"Recoleta",Georgia,serif;--sf-mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace}*{box-sizing:border-box}html{min-width:320px;background:var(--sf-bg);-webkit-font-smoothing:antialiased}body{margin:0;min-height:100vh;background:var(--sf-bg);color:var(--sf-fg);font:14px/1.65 var(--sf-font)}a{color:inherit}.sf-page{min-height:100vh;display:flex;flex-direction:column;padding:clamp(22px,4vw,44px)}.sf-header{display:flex;align-items:center;min-height:32px}.sf-page-center .sf-header{justify-content:center}.sf-brand{display:inline-flex;min-width:0;align-items:center;gap:10px;color:var(--sf-fg);text-decoration:none}.sf-brand-mark{width:7px;height:7px;flex:none;background:var(--sf-accent)}.sf-logo{width:28px;height:28px;flex:none;object-fit:contain}.sf-brand strong{min-width:0;overflow-wrap:anywhere;font-size:13px;font-weight:600}.sf-main{flex:1;width:100%;padding:clamp(34px,9vh,84px) 0}.sf-page-plain .sf-main{max-width:680px}.sf-page-center .sf-main{max-width:620px;margin:auto;display:flex;flex-direction:column;align-items:center;text-align:center}.sf-eyebrow{margin:0 0 14px;color:var(--sf-muted);font:500 11px/1.5 var(--sf-mono);letter-spacing:.12em;text-transform:uppercase;overflow-wrap:anywhere}.sf-page-center .sf-eyebrow{margin-bottom:16px}h1{max-width:20ch;margin:0 0 12px;color:var(--sf-fg);font:400 clamp(1.9rem,5vw,2.8rem)/1.22 var(--sf-display-font);letter-spacing:-.012em;text-wrap:balance}.sf-copy,.sf-sub{max-width:52ch;margin:0;color:var(--sf-muted);text-wrap:pretty}.sf-inline-path{font-family:var(--sf-mono);font-size:.9em;color:var(--sf-fg);overflow-wrap:anywhere}.sf-actions{display:flex;flex-wrap:wrap;align-items:center;gap:14px;margin-top:22px}.sf-page-center .sf-actions{justify-content:center}.sf-button{display:inline-flex;min-height:44px;align-items:center;justify-content:center;border:0;background:var(--sf-accent);color:var(--sf-on-accent);padding:10px 16px;font:600 13px/1.4 var(--sf-font);text-decoration:none;cursor:pointer}.sf-ghost{color:var(--sf-muted);text-underline-offset:3px}.sf-button:hover{filter:brightness(1.06)}a:focus-visible,button:focus-visible{outline:2px solid var(--sf-link);outline-offset:2px}.sf-copy+.sf-copy{margin-top:12px}.sf-files{width:100%;margin:24px 0 0;padding:0;list-style:none}.sf-files li{display:flex;min-width:0;align-items:baseline;gap:18px;border-bottom:1px solid var(--sf-border)}.sf-files a{min-width:0;flex:1;padding:10px 2px;color:var(--sf-fg);font-weight:500;text-decoration:none}.sf-files a:hover{color:var(--sf-link)}.sf-file-name{overflow-wrap:anywhere}.sf-file-size{flex:none;padding:10px 2px;color:var(--sf-muted);font:12px/1.5 var(--sf-mono);white-space:nowrap}.sf-empty{max-width:420px;margin:24px 0 0;border:1px dashed var(--sf-border);padding:18px 20px;color:var(--sf-muted)}.sf-preview-wrap{width:min(100%,560px);aspect-ratio:16/9;margin:10px 0 18px;overflow:hidden;background:#fff;outline:1px solid color-mix(in srgb,var(--sf-fg) 10%,transparent);outline-offset:-1px}.sf-preview{display:block;width:100%;height:100%;border:0;object-fit:contain}.sf-file-meta{width:min(100%,560px);margin:0}.sf-file-meta div{display:flex;min-width:0;justify-content:space-between;gap:20px;border-bottom:1px solid var(--sf-border);padding:9px 2px}.sf-file-meta dt{color:var(--sf-fg);font-weight:600}.sf-file-meta dd{min-width:0;margin:0;color:var(--sf-muted);font-family:var(--sf-mono);overflow-wrap:anywhere;text-align:right}.sf-colophon{display:flex;flex-direction:column;align-items:center;gap:10px;padding:44px 0 26px;margin-top:auto;color:var(--sf-muted)}.sf-page-plain .sf-colophon{align-items:flex-start}.sf-colophon-row{display:flex;align-items:center;gap:20px;flex-wrap:wrap}.sf-powered{display:inline-flex;align-items:center;gap:10px;cursor:pointer;outline:none}.sf-powered-line{display:none;font-size:12px;color:var(--sf-muted)}.sf-powered:hover .sf-powered-line,.sf-powered:focus .sf-powered-line,.sf-powered:focus-within .sf-powered-line{display:inline}.sf-powered-line a{color:var(--sf-link);text-decoration:underline;text-underline-offset:3px}.sf-help{font-size:12px;color:var(--sf-muted);text-decoration:underline;text-underline-offset:3px}.sf-help:hover{color:var(--sf-fg)}.sf-wordmark{display:block;flex:none;width:auto;height:14px;color:var(--sf-fg)}@media(max-width:520px){.sf-page{padding:20px}.sf-button{min-height:48px}.sf-file-meta div{flex-direction:column;gap:2px}.sf-file-meta dd{text-align:left}.sf-colophon{padding-top:32px}}@media(prefers-color-scheme:dark){:root{--sf-bg:${PAGE_COLOR_DEFAULTS.darkBg};--sf-fg:${PAGE_COLOR_DEFAULTS.darkFg};--sf-muted:${PAGE_COLOR_DEFAULTS.darkMuted};--sf-card:${PAGE_COLOR_DEFAULTS.darkCard};--sf-border:${PAGE_COLOR_DEFAULTS.darkBorder};--sf-link:${defaultPageColors.linkDark};--sf-error:#ff8a7a}.sf-preview-wrap{outline-color:#ffffff1a}}@media(forced-colors:active){.sf-brand-mark{background:CanvasText}.sf-button{border:1px solid ButtonText}.sf-powered:focus{outline:1px solid CanvasText;outline-offset:3px}}`;
392
390
  const accessCss = `.sf-page.access .sf-main{max-width:26rem;padding:clamp(42px,8vh,72px) 0}.sf-page.access h1{max-width:18ch;margin-bottom:14px;font:600 clamp(2rem,7vw,2.65rem)/1.12 var(--sf-font);letter-spacing:-.035em}.sf-page.access .sf-copy{font-size:15px;line-height:1.6}.sf-access-default{display:flex;width:100%;flex-direction:column;align-items:center}.sf-access-status{padding:10px 12px;border:1px solid color-mix(in srgb,var(--sf-fg) 10%,transparent);border-radius:8px;background:color-mix(in srgb,var(--sf-fg) 4%,transparent);color:var(--sf-fg)}.sf-access-lanes{display:flex;flex-direction:column;gap:16px;width:min(23rem,100%);margin-top:30px;text-align:left}.sf-access-lanes form{display:flex;flex-direction:column;gap:14px;margin:0}.sf-input{box-sizing:border-box;width:100%;min-height:46px;padding:11px 12px;border:1px solid color-mix(in srgb,var(--sf-fg) 18%,transparent);border-radius:8px;outline:2px solid transparent;outline-offset:-1px;background:color-mix(in srgb,var(--sf-bg) 92%,var(--sf-fg));color:var(--sf-fg);font:500 15px/1.45 var(--sf-font);appearance:none}.sf-input::placeholder{color:color-mix(in srgb,var(--sf-muted) 82%,transparent);font:inherit}.sf-input:hover{border-color:color-mix(in srgb,var(--sf-fg) 34%,transparent)}.sf-input:focus-visible{border-color:var(--sf-accent);outline-color:var(--sf-accent)}textarea.sf-input{min-height:92px;resize:vertical}.sf-label{color:var(--sf-fg);font:600 13px/1.4 var(--sf-font)}.sf-access-lanes .sf-button{width:100%;min-height:46px;border-radius:8px}.sf-access-or{display:flex;align-items:center;gap:12px;color:var(--sf-muted);font-size:13px}.sf-access-or:before,.sf-access-or:after{content:"";flex:1;border-top:1px solid color-mix(in srgb,var(--sf-fg) 12%,transparent)}.sf-error{margin:0;color:var(--sf-error);font-size:14px}.sf-access-password-row{display:flex;gap:8px}.sf-access-password-row .sf-input{min-width:0;flex:1}.sf-access-password-row .sf-button{width:auto;flex:none}.sf-access-request{padding-top:2px}.sf-access-request summary{padding:4px 0;cursor:pointer;color:var(--sf-muted);font:550 14px/1.5 var(--sf-font)}.sf-access-request summary:hover{color:var(--sf-fg)}.sf-access-request[open] summary{color:var(--sf-fg)}.sf-access-request form{margin-top:16px}@media(max-width:520px){.sf-page.access .sf-main{padding:38px 0}.sf-page.access h1{font-size:2rem}.sf-page.access .sf-copy{font-size:16px}.sf-input{min-height:48px;font-size:16px}.sf-access-lanes .sf-button{min-height:48px}.sf-access-password-row{flex-direction:column}.sf-access-password-row .sf-button{width:100%}}@media(prefers-color-scheme:dark){.sf-access-status{background:color-mix(in srgb,var(--sf-fg) 5%,transparent)}}`;
@@ -405,6 +403,48 @@ export const DEFAULT_PAGE_TEMPLATES = {
405
403
  index: document("index", "<sf-page-title></sf-page-title>", '<p class="sf-eyebrow"><sf-page-path></sf-page-path></p><h1><sf-page-title></sf-page-title></h1><p class="sf-sub"><sf-page-summary></sf-page-summary></p><sf-files></sf-files>', "plain"),
406
404
  preview: document("preview", "<sf-page-title></sf-page-title>", '<p class="sf-eyebrow"><sf-page-path></sf-page-path></p><h1><sf-page-title></sf-page-title></h1><sf-file></sf-file>', "plain"),
407
405
  };
406
+ const PLATFORM_PAGE_COPY = {
407
+ login: [401, "This space is for members", "Sign in to continue — you’ll come right back here."],
408
+ undeployed: [503, "Waiting for launch", "This space hasn’t been published yet. Check back soon."],
409
+ suspended: [402, "This space is paused", "Serving is on hold until billing is sorted out."],
410
+ legal: [
411
+ 451,
412
+ "Unavailable for legal reasons",
413
+ "This space is blocked in response to a legal demand.",
414
+ ],
415
+ gone: [404, "Nothing here", "This space is no longer available."],
416
+ "runtime-error": [
417
+ 500,
418
+ "Something broke on our side",
419
+ "The runtime hit an error serving this page. Try again in a moment.",
420
+ ],
421
+ "rate-limited": [
422
+ 429,
423
+ "Slow down a second",
424
+ "Too many requests hit this space at once. Give it a moment and try again.",
425
+ ],
426
+ "tier-unavailable": [503, "Back in a bit", "This space is temporarily unavailable."],
427
+ "proxy-error": [502, "The upstream missed the connection", "Try again in a moment."],
428
+ "method-not-allowed": [405, "That method won’t work here", "Try the request another way."],
429
+ "content-too-large": [413, "That request is too large", "Send a smaller request and try again."],
430
+ };
431
+ function platformDocument(id) {
432
+ const [status, title, description] = PLATFORM_PAGE_COPY[id];
433
+ return `<!doctype html>\n<html lang="en">\n<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="robots" content="noindex"><title>${title}</title><style>${sharedCss}</style></head>\n<body><div class="sf-page sf-page-center">${pageHeader}<main class="sf-main"><p class="sf-eyebrow">${status}</p><h1>${title}</h1><p class="sf-copy">${description}</p></main>${pageFooter}</div></body>\n</html>\n`;
434
+ }
435
+ export const DEFAULT_PLATFORM_PAGE_TEMPLATES = {
436
+ login: platformDocument("login"),
437
+ undeployed: platformDocument("undeployed"),
438
+ suspended: platformDocument("suspended"),
439
+ legal: platformDocument("legal"),
440
+ gone: platformDocument("gone"),
441
+ "runtime-error": platformDocument("runtime-error"),
442
+ "rate-limited": platformDocument("rate-limited"),
443
+ "tier-unavailable": platformDocument("tier-unavailable"),
444
+ "proxy-error": platformDocument("proxy-error"),
445
+ "method-not-allowed": platformDocument("method-not-allowed"),
446
+ "content-too-large": platformDocument("content-too-large"),
447
+ };
408
448
  export const DEFAULT_LAYOUT_TEMPLATE = `<!doctype html>\n<html lang="en">\n<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title><sf-page-title></sf-page-title></title><style>${sharedCss}</style></head>\n<body><sf-content></sf-content></body>\n</html>\n`;
409
449
  export function defaultPageTemplate(id) {
410
450
  return DEFAULT_PAGE_TEMPLATES[id];
@@ -0,0 +1,19 @@
1
+ /** EU 27 + CH, IS, LI, NO, GB. */
2
+ export declare const GDPR_COUNTRY_CODES: Set<string>;
3
+ export declare const GEO_COUNTRY_UNKNOWN = "unknown";
4
+ /**
5
+ * GDPR applicability FAILS CLOSED: an unknown or missing country is treated as
6
+ * inside the GDPR zone (wpcom `isGdprCountry`). Country codes are ISO 3166-1
7
+ * alpha-2, case-insensitive.
8
+ */
9
+ export declare function isGdprCountry(countryCode: string | null | undefined): boolean;
10
+ /** US states with comprehensive privacy laws, lowercase full names (wpcom `CCPARegions`). */
11
+ export declare const CCPA_REGIONS: Set<string>;
12
+ /**
13
+ * CCPA applicability FAILS OPEN: an unknown or missing region is NOT assumed
14
+ * to be a CCPA region (wpcom `pertainsToCCPA`: "if we aren't sure what the
15
+ * region is we shouldn't assume it pertains to CCPA"). Matches on substring,
16
+ * like wpcom, so a region string such as "california" or "California, US"
17
+ * both qualify.
18
+ */
19
+ export declare function isCcpaRegion(countryCode: string | null | undefined, region: string | null | undefined): boolean;
@@ -0,0 +1,91 @@
1
+ // Privacy-regulation region lists, ported from wpcom's a8c-analytics
2
+ // (`a8c-analytics-src/kit/constants.ts`, verified 2026-08-23) so Spacefast's
3
+ // consent behavior matches WordPress.com's. One home for both the server-side
4
+ // Tag SDK and the dashboard consent engine.
5
+ /** EU 27 + CH, IS, LI, NO, GB. */
6
+ export const GDPR_COUNTRY_CODES = new Set([
7
+ "AT",
8
+ "BE",
9
+ "BG",
10
+ "CY",
11
+ "CZ",
12
+ "DE",
13
+ "DK",
14
+ "EE",
15
+ "ES",
16
+ "FI",
17
+ "FR",
18
+ "GR",
19
+ "HR",
20
+ "HU",
21
+ "IE",
22
+ "IT",
23
+ "LT",
24
+ "LU",
25
+ "LV",
26
+ "MT",
27
+ "NL",
28
+ "PL",
29
+ "PT",
30
+ "RO",
31
+ "SE",
32
+ "SI",
33
+ "SK",
34
+ "CH",
35
+ "IS",
36
+ "LI",
37
+ "NO",
38
+ "GB",
39
+ ]);
40
+ export const GEO_COUNTRY_UNKNOWN = "unknown";
41
+ /**
42
+ * GDPR applicability FAILS CLOSED: an unknown or missing country is treated as
43
+ * inside the GDPR zone (wpcom `isGdprCountry`). Country codes are ISO 3166-1
44
+ * alpha-2, case-insensitive.
45
+ */
46
+ export function isGdprCountry(countryCode) {
47
+ if (!countryCode || countryCode.toLowerCase() === GEO_COUNTRY_UNKNOWN) {
48
+ return true;
49
+ }
50
+ return GDPR_COUNTRY_CODES.has(countryCode.toUpperCase());
51
+ }
52
+ /** US states with comprehensive privacy laws, lowercase full names (wpcom `CCPARegions`). */
53
+ export const CCPA_REGIONS = new Set([
54
+ "california",
55
+ "colorado",
56
+ "connecticut",
57
+ "delaware",
58
+ "florida",
59
+ "indiana",
60
+ "iowa",
61
+ "kentucky",
62
+ "maryland",
63
+ "minnesota",
64
+ "montana",
65
+ "nebraska",
66
+ "new hampshire",
67
+ "new jersey",
68
+ "oregon",
69
+ "rhode island",
70
+ "tennessee",
71
+ "texas",
72
+ "utah",
73
+ "virginia",
74
+ ]);
75
+ /**
76
+ * CCPA applicability FAILS OPEN: an unknown or missing region is NOT assumed
77
+ * to be a CCPA region (wpcom `pertainsToCCPA`: "if we aren't sure what the
78
+ * region is we shouldn't assume it pertains to CCPA"). Matches on substring,
79
+ * like wpcom, so a region string such as "california" or "California, US"
80
+ * both qualify.
81
+ */
82
+ export function isCcpaRegion(countryCode, region) {
83
+ if (countryCode && countryCode.toUpperCase() !== "US") {
84
+ return false;
85
+ }
86
+ if (!region || region.toLowerCase() === GEO_COUNTRY_UNKNOWN) {
87
+ return false;
88
+ }
89
+ const normalized = region.toLowerCase();
90
+ return [...CCPA_REGIONS].some((candidate) => normalized.includes(candidate));
91
+ }
@@ -16,17 +16,16 @@ export declare function createPublishFormData(input: {
16
16
  upload: DirectPublishUpload;
17
17
  clientAttribution: string;
18
18
  spaceId?: string | undefined;
19
+ teamId?: string | undefined;
19
20
  slug?: string | undefined;
20
21
  title?: string | undefined;
21
22
  description?: string | undefined;
22
23
  /** Live promotion intent for archive builds; null produces an unpromoted ready version. */
23
24
  channel?: "live" | null | undefined;
24
25
  /**
25
- * Control-plane-only provenance for the version's build/deploy read models
26
- * a compiled runtime (Zero capsule, Functions worker) declares its artifact
27
- * here under its own key (e.g. `statticZero`). Same shape the CLI sends on the
28
- * declared-session path; the multipart intake reads it from the `metadata`
29
- * JSON field and folds it into `publishRequestSchema.sourceMetadata`.
26
+ * Build provenance for the version's build/deploy read models. A compiled
27
+ * runtime declares its artifact under its own key (e.g. `statticZero`); the
28
+ * multipart intake folds it into `publishRequestSchema.sourceMetadata`.
30
29
  */
31
30
  sourceMetadata?: Record<string, unknown> | undefined;
32
31
  /** Bounded build transcript recorded on the version when a build ran. */
@@ -3,11 +3,10 @@ export function createPublishFormData(input) {
3
3
  const form = new FormData();
4
4
  if (input.spaceId)
5
5
  form.append("spaceId", input.spaceId);
6
+ if (input.teamId)
7
+ form.append("teamId", input.teamId);
6
8
  if (input.description)
7
9
  form.append("description", input.description);
8
- // The multipart intake merges this JSON field into the parsed publish body
9
- // (it reads `payload`/`publish`/`metadata`), so build provenance rides the
10
- // one-shot form exactly as it rides the CLI's declared-session JSON body.
11
10
  if (input.sourceMetadata || input.buildLog || input.channel !== undefined) {
12
11
  form.append("metadata", JSON.stringify({
13
12
  ...(input.sourceMetadata ? { sourceMetadata: input.sourceMetadata } : {}),
@@ -11,26 +11,15 @@ export declare const STATIC_RUNTIME_CONTROL_PATHS: string[];
11
11
  export declare const STATIC_RUNTIME_CONTROL_PREFIXES: string[];
12
12
  export declare function normalizePublishPath(relativePath: string): string;
13
13
  /**
14
- * The one subtree inside the runtime control prefix that a publish may write.
14
+ * The one subtree inside the runtime control prefix a publish may write, so a
15
+ * compiled worker bundle travels the ordinary manifest and upload path while
16
+ * staying unservable as static content.
15
17
  *
16
- * `sf publish` compiles a version's worker into `__spacefast/functions/bundles/`
17
- * so the bundle travels through the ordinary manifest and upload path instead of
18
- * needing a parallel one. Keeping it under the control prefix is what makes it
19
- * unservable as static content by default — the runtime answers it only behind a
20
- * signature.
21
- *
22
- * Scoped to `bundles/` rather than the whole `__spacefast/functions/` directory
23
- * on purpose: the sibling `config.json` holds the key those signatures are
24
- * minted with, and a publish that could overwrite it would be a publish that
25
- * could mint its own tokens.
18
+ * Scoped to `bundles/`, not the whole `__spacefast/functions/` directory: the
19
+ * sibling `config.json` holds the key its signatures are minted with.
26
20
  */
27
21
  export declare const PUBLISHABLE_BUILD_ARTIFACT_PREFIX = "__spacefast/functions/bundles/";
28
- /**
29
- * The bundle carve-out's sibling for the Next-cache seed document: the same
30
- * reasoning (travel through the ordinary manifest and upload path, stay
31
- * unservable by default), the same deliberate narrowness (a prefix of its
32
- * own, never the whole `functions/` directory — see the bundle comment).
33
- */
22
+ /** The same carve-out for the Next-cache seed document. */
34
23
  export declare const PUBLISHABLE_SEED_ARTIFACT_PREFIX = "__spacefast/functions/seeds/";
35
24
  export declare function publishPathIgnored(relativePath: string): boolean;
36
25
  export declare function publishPathIsConvention(relativePath: string): boolean;
@@ -96,12 +85,10 @@ export type PublishRouteOwnership = {
96
85
  */
97
86
  export declare function canonicalizePublishRequestedRoute(route: string): string;
98
87
  /**
99
- * Expands artifact paths into the request routes they can serve. The runtime
100
- * resolves literal files, directory indexes, and clean `.html` aliases; two
101
- * different artifacts owning one request route is rejected at publish/finalize
102
- * instead of depending on lookup order. `routeOwnership` exposes the same
103
- * expansion in canonical access-route form so authorization and diagnostics
104
- * never have to infer a route from an artifact path.
88
+ * Expands artifact paths into the request routes they can serve: literal
89
+ * files, directory indexes and clean `.html` aliases. Two artifacts owning one
90
+ * route is rejected at publish rather than left to lookup order.
91
+ * `routeOwnership` restates the expansion in canonical access-route form.
105
92
  */
106
93
  export declare function analyzePublishRoutes(paths: readonly string[], options?: {
107
94
  index?: string | false;