@spacefast/common 0.0.24 → 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 (320) hide show
  1. package/brand-assets/LICENSE-Haskoy.txt +93 -0
  2. package/brand-assets/haskoy-latin-variable.woff2 +0 -0
  3. package/brand-assets/spacefast-favicon.svg +4 -4
  4. package/brand-assets/spacefast-sf-full-bleed.svg +3 -3
  5. package/brand-assets/spacefast-wordmark.svg +2 -4
  6. package/dist/agents/connect-targets.d.ts +6 -146
  7. package/dist/agents/connect-targets.js +63 -295
  8. package/dist/agents/private-key-oauth.d.ts +31 -2
  9. package/dist/agents/private-key-oauth.js +166 -92
  10. package/dist/agents/registry/core.d.ts +292 -0
  11. package/dist/agents/registry/core.js +1388 -0
  12. package/dist/agents/registry/deeplink-probes.d.ts +23 -0
  13. package/dist/agents/registry/deeplink-probes.js +18 -0
  14. package/dist/agents/registry/node.d.ts +56 -0
  15. package/dist/agents/registry/node.js +339 -0
  16. package/dist/brand-assets-build.js +3 -6
  17. package/dist/brand-assets.d.ts +5 -15
  18. package/dist/brand-assets.js +12 -14
  19. package/dist/brand.d.ts +17 -0
  20. package/dist/brand.js +24 -4
  21. package/dist/config/domains.d.ts +79 -12
  22. package/dist/config/domains.js +128 -29
  23. package/dist/config/index.js +1 -2
  24. package/dist/contracts/abuse.js +9 -24
  25. package/dist/contracts/access-profiles.d.ts +86 -0
  26. package/dist/contracts/access-profiles.js +89 -0
  27. package/dist/contracts/access.d.ts +24 -30
  28. package/dist/contracts/access.js +33 -64
  29. package/dist/contracts/activity.d.ts +18 -1
  30. package/dist/contracts/activity.js +72 -26
  31. package/dist/contracts/analytics.js +8 -10
  32. package/dist/contracts/api-keys.d.ts +77 -52
  33. package/dist/contracts/api-keys.js +44 -24
  34. package/dist/contracts/application-journal.d.ts +216 -0
  35. package/dist/contracts/application-journal.js +167 -0
  36. package/dist/contracts/auth.d.ts +90 -17
  37. package/dist/contracts/auth.js +86 -17
  38. package/dist/contracts/beta.d.ts +9 -4
  39. package/dist/contracts/beta.js +20 -16
  40. package/dist/contracts/billing.d.ts +2 -1
  41. package/dist/contracts/billing.js +37 -11
  42. package/dist/contracts/bootstrap.d.ts +791 -0
  43. package/dist/contracts/bootstrap.js +51 -0
  44. package/dist/contracts/builds.d.ts +209 -18
  45. package/dist/contracts/builds.js +93 -27
  46. package/dist/contracts/channels.d.ts +43 -0
  47. package/dist/contracts/channels.js +25 -9
  48. package/dist/contracts/cli.d.ts +7 -0
  49. package/dist/contracts/cli.js +6 -0
  50. package/dist/contracts/collab-public.d.ts +1 -1
  51. package/dist/contracts/collab-public.js +5 -8
  52. package/dist/contracts/comments.d.ts +44 -34
  53. package/dist/contracts/comments.js +107 -77
  54. package/dist/contracts/commerce.d.ts +165 -0
  55. package/dist/contracts/commerce.js +146 -0
  56. package/dist/contracts/common.d.ts +3 -3
  57. package/dist/contracts/common.js +20 -31
  58. package/dist/contracts/content-contract-verification.d.ts +521 -0
  59. package/dist/contracts/content-contract-verification.js +320 -0
  60. package/dist/contracts/content-platform-fixture.d.ts +1278 -0
  61. package/dist/contracts/content-platform-fixture.js +44 -0
  62. package/dist/contracts/content-program.d.ts +994 -0
  63. package/dist/contracts/content-program.js +658 -0
  64. package/dist/contracts/content-sync.d.ts +290 -0
  65. package/dist/contracts/content-sync.js +167 -0
  66. package/dist/contracts/content.d.ts +432 -0
  67. package/dist/contracts/content.js +303 -0
  68. package/dist/contracts/continuation.d.ts +17 -1
  69. package/dist/contracts/continuation.js +23 -23
  70. package/dist/contracts/countries.js +3 -4
  71. package/dist/contracts/crons.d.ts +52 -0
  72. package/dist/contracts/crons.js +60 -0
  73. package/dist/contracts/dashboard-prefs.d.ts +56 -0
  74. package/dist/contracts/dashboard-prefs.js +51 -0
  75. package/dist/contracts/device-auth.d.ts +234 -37
  76. package/dist/contracts/device-auth.js +267 -53
  77. package/dist/contracts/docs.d.ts +1 -5
  78. package/dist/contracts/docs.js +7 -15
  79. package/dist/contracts/domains.d.ts +501 -93
  80. package/dist/contracts/domains.js +193 -55
  81. package/dist/contracts/email-preferences.d.ts +3 -3
  82. package/dist/contracts/email-preferences.js +6 -7
  83. package/dist/contracts/enums.d.ts +27 -26
  84. package/dist/contracts/enums.js +68 -61
  85. package/dist/contracts/error-code-meta.d.ts +283 -7
  86. package/dist/contracts/error-code-meta.js +97 -5
  87. package/dist/contracts/error-codes.d.ts +5 -5
  88. package/dist/contracts/error-codes.js +82 -17
  89. package/dist/contracts/events.d.ts +100 -20
  90. package/dist/contracts/events.js +107 -20
  91. package/dist/contracts/execution.d.ts +48 -64
  92. package/dist/contracts/execution.js +52 -62
  93. package/dist/contracts/feature-lifecycle.d.ts +73 -27
  94. package/dist/contracts/feature-lifecycle.js +86 -26
  95. package/dist/contracts/features.d.ts +68 -19
  96. package/dist/contracts/features.js +42 -41
  97. package/dist/contracts/fixtures/content-platform-v1.json +1108 -0
  98. package/dist/contracts/frame-session.d.ts +192 -0
  99. package/dist/contracts/frame-session.js +164 -0
  100. package/dist/contracts/functions.d.ts +338 -164
  101. package/dist/contracts/functions.js +367 -198
  102. package/dist/contracts/git.d.ts +27 -33
  103. package/dist/contracts/git.js +10 -11
  104. package/dist/contracts/grant-copy.d.ts +43 -0
  105. package/dist/contracts/grant-copy.js +44 -0
  106. package/dist/contracts/grants.d.ts +62 -54
  107. package/dist/contracts/grants.js +124 -23
  108. package/dist/contracts/ids.d.ts +4 -1
  109. package/dist/contracts/ids.js +6 -3
  110. package/dist/contracts/internal.d.ts +8 -18
  111. package/dist/contracts/internal.js +13 -14
  112. package/dist/contracts/mcp.d.ts +28 -0
  113. package/dist/contracts/mcp.js +28 -0
  114. package/dist/contracts/me.d.ts +6 -1
  115. package/dist/contracts/me.js +12 -6
  116. package/dist/contracts/notifications.d.ts +27 -29
  117. package/dist/contracts/notifications.js +9 -4
  118. package/dist/contracts/oauth-resources.d.ts +112 -10
  119. package/dist/contracts/oauth-resources.js +116 -11
  120. package/dist/contracts/oauth-scope-actions.d.ts +90 -0
  121. package/dist/contracts/oauth-scope-actions.js +126 -0
  122. package/dist/contracts/operations.d.ts +27 -4
  123. package/dist/contracts/operations.js +12 -6
  124. package/dist/contracts/pages.d.ts +31 -7
  125. package/dist/contracts/pages.js +22 -5
  126. package/dist/contracts/partner-notifications.d.ts +3 -0
  127. package/dist/contracts/partner-notifications.js +65 -0
  128. package/dist/contracts/{platform.d.ts → partner.d.ts} +29 -42
  129. package/dist/contracts/{platform.js → partner.js} +27 -40
  130. package/dist/contracts/plan-policy.js +1 -1
  131. package/dist/contracts/principal-assertion.d.ts +43 -0
  132. package/dist/contracts/principal-assertion.js +67 -0
  133. package/dist/contracts/principals.d.ts +73 -0
  134. package/dist/contracts/principals.js +59 -0
  135. package/dist/contracts/privacy.d.ts +11 -0
  136. package/dist/contracts/privacy.js +17 -0
  137. package/dist/contracts/problem-document.js +3 -4
  138. package/dist/contracts/publish-archive.d.ts +269 -161
  139. package/dist/contracts/publish-archive.js +11 -1
  140. package/dist/contracts/push-new.d.ts +8 -8
  141. package/dist/contracts/quotas.js +5 -5
  142. package/dist/contracts/realtime.d.ts +52 -0
  143. package/dist/contracts/realtime.js +54 -0
  144. package/dist/contracts/repository-connections.d.ts +44 -31
  145. package/dist/contracts/repository-connections.js +17 -5
  146. package/dist/contracts/resources.d.ts +105 -14
  147. package/dist/contracts/resources.js +150 -26
  148. package/dist/contracts/route-inventory.d.ts +358 -0
  149. package/dist/contracts/route-inventory.js +141 -0
  150. package/dist/contracts/runtime-api.d.ts +206 -82
  151. package/dist/contracts/runtime-api.js +131 -70
  152. package/dist/contracts/runtime-app.d.ts +13 -23
  153. package/dist/contracts/runtime-app.js +39 -24
  154. package/dist/contracts/runtime-components.d.ts +143 -0
  155. package/dist/contracts/runtime-components.js +199 -0
  156. package/dist/contracts/runtime-db.d.ts +49 -23
  157. package/dist/contracts/runtime-db.js +87 -22
  158. package/dist/contracts/runtime-purge.d.ts +8 -0
  159. package/dist/contracts/runtime-purge.js +5 -0
  160. package/dist/contracts/runtime-services.d.ts +43 -75
  161. package/dist/contracts/runtime-services.js +29 -49
  162. package/dist/contracts/runtime-storage.d.ts +15 -14
  163. package/dist/contracts/runtime-storage.js +30 -14
  164. package/dist/contracts/sf-config-v1.d.ts +48 -14
  165. package/dist/contracts/slugs.js +13 -4
  166. package/dist/contracts/space-config.d.ts +283 -19
  167. package/dist/contracts/space-config.js +430 -80
  168. package/dist/contracts/spaces.d.ts +376 -290
  169. package/dist/contracts/spaces.js +200 -135
  170. package/dist/contracts/superadmin-activity.d.ts +3 -43
  171. package/dist/contracts/superadmin-activity.js +6 -30
  172. package/dist/contracts/superadmin-emails.d.ts +1 -0
  173. package/dist/contracts/superadmin-emails.js +17 -1
  174. package/dist/contracts/superadmin-runtime.d.ts +199 -0
  175. package/dist/contracts/superadmin-runtime.js +141 -0
  176. package/dist/contracts/superadmin-search.d.ts +22 -2
  177. package/dist/contracts/superadmin-search.js +14 -6
  178. package/dist/contracts/superadmin-spaces.d.ts +438 -189
  179. package/dist/contracts/superadmin-spaces.js +131 -25
  180. package/dist/contracts/superadmin-teams.d.ts +5 -2
  181. package/dist/contracts/superadmin-teams.js +1 -2
  182. package/dist/contracts/superadmin-tenants.d.ts +627 -12
  183. package/dist/contracts/superadmin-tenants.js +32 -13
  184. package/dist/contracts/superadmin.d.ts +232 -37
  185. package/dist/contracts/superadmin.js +106 -22
  186. package/dist/contracts/tags.d.ts +85 -58
  187. package/dist/contracts/tags.js +47 -37
  188. package/dist/contracts/teams.d.ts +86 -26
  189. package/dist/contracts/teams.js +90 -31
  190. package/dist/contracts/tenants.d.ts +135 -0
  191. package/dist/contracts/tenants.js +120 -0
  192. package/dist/contracts/test-triggers.d.ts +70 -0
  193. package/dist/contracts/test-triggers.js +116 -0
  194. package/dist/contracts/theme-json.js +3 -8
  195. package/dist/contracts/transfers.d.ts +1 -0
  196. package/dist/contracts/transfers.js +3 -2
  197. package/dist/contracts/usage.d.ts +209 -0
  198. package/dist/contracts/usage.js +124 -12
  199. package/dist/contracts/variables.d.ts +2 -2
  200. package/dist/contracts/variables.js +9 -13
  201. package/dist/contracts/webhooks.d.ts +13 -5
  202. package/dist/contracts/webhooks.js +3 -1
  203. package/dist/contracts/zero.d.ts +72 -81
  204. package/dist/contracts/zero.js +80 -78
  205. package/dist/dashboard-paths/index.d.ts +24 -21
  206. package/dist/dashboard-paths/index.js +35 -47
  207. package/dist/dashboard-paths/route-reservations.generated.d.ts +2 -0
  208. package/dist/dashboard-paths/route-reservations.generated.js +36 -0
  209. package/dist/docs/agent-arrival.d.ts +92 -0
  210. package/dist/docs/agent-arrival.js +227 -0
  211. package/dist/docs/agent-output-policy.d.ts +6 -0
  212. package/dist/docs/agent-output-policy.js +22 -0
  213. package/dist/docs/agent-prose.d.ts +12 -18
  214. package/dist/docs/agent-prose.js +73 -51
  215. package/dist/docs/agent-setup.d.ts +72 -41
  216. package/dist/docs/agent-setup.js +339 -436
  217. package/dist/docs/catalog.d.ts +153 -95
  218. package/dist/docs/catalog.js +163 -48
  219. package/dist/docs/error-docs.d.ts +2098 -1
  220. package/dist/docs/error-docs.js +421 -144
  221. package/dist/docs/index-build.d.ts +0 -1
  222. package/dist/docs/index-build.js +2 -3
  223. package/dist/docs/page-context-prompt.d.ts +77 -0
  224. package/dist/docs/page-context-prompt.js +131 -0
  225. package/dist/docs/reference-urls.d.ts +46 -0
  226. package/dist/docs/reference-urls.js +79 -0
  227. package/dist/docs/search.d.ts +6 -8
  228. package/dist/docs/search.js +10 -13
  229. package/dist/docs/skill-distribution.d.ts +4 -1
  230. package/dist/docs/skill-distribution.js +10 -5
  231. package/dist/docs/skills.d.ts +120 -120
  232. package/dist/docs/skills.js +121 -73
  233. package/dist/docs/start-prompts.d.ts +45 -0
  234. package/dist/docs/start-prompts.js +62 -0
  235. package/dist/domain-exploration.js +9 -13
  236. package/dist/og-template.d.ts +56 -0
  237. package/dist/og-template.js +56 -0
  238. package/dist/slug-policy/index.js +5 -11
  239. package/dist/test-helpers/fetch-stub.js +1 -0
  240. package/dist/utils/browser-credential.d.ts +13 -6
  241. package/dist/utils/browser-credential.js +14 -7
  242. package/dist/utils/build-settings.d.ts +21 -1
  243. package/dist/utils/build-settings.js +133 -15
  244. package/dist/utils/canonical-json.d.ts +3 -5
  245. package/dist/utils/canonical-json.js +4 -5
  246. package/dist/utils/cast-transport.d.ts +5 -17
  247. package/dist/utils/cast-transport.js +6 -19
  248. package/dist/utils/claim-token.js +1 -2
  249. package/dist/utils/comment-avatars.js +4 -6
  250. package/dist/utils/concurrency.js +3 -3
  251. package/dist/utils/content-type.d.ts +7 -6
  252. package/dist/utils/content-type.js +73 -51
  253. package/dist/utils/credential-policy.d.ts +50 -6
  254. package/dist/utils/credential-policy.js +126 -59
  255. package/dist/utils/dns-instructions.js +9 -9
  256. package/dist/utils/egress-policy.fixtures.json +1 -1
  257. package/dist/utils/error-code.js +1 -0
  258. package/dist/utils/generate-space-name.d.ts +3 -8
  259. package/dist/utils/generate-space-name.js +3 -8
  260. package/dist/utils/grant-decision.fixtures.json +2 -2
  261. package/dist/utils/grants.d.ts +0 -1
  262. package/dist/utils/grants.js +7 -8
  263. package/dist/utils/gravatar.d.ts +2 -4
  264. package/dist/utils/gravatar.js +6 -12
  265. package/dist/utils/id-hints.js +14 -23
  266. package/dist/utils/idempotency.d.ts +3 -3
  267. package/dist/utils/idempotency.js +6 -7
  268. package/dist/utils/local-space-state.d.ts +23 -26
  269. package/dist/utils/local-space-state.js +46 -46
  270. package/dist/utils/oauth-signed-query.d.ts +3 -5
  271. package/dist/utils/oauth-signed-query.js +6 -9
  272. package/dist/utils/one-shot-replay.d.ts +7 -6
  273. package/dist/utils/one-shot-replay.js +3 -5
  274. package/dist/utils/page-colors.d.ts +15 -19
  275. package/dist/utils/page-colors.js +23 -45
  276. package/dist/utils/page-fonts.d.ts +1 -1
  277. package/dist/utils/page-fonts.js +8 -20
  278. package/dist/utils/page-preview.d.ts +0 -1
  279. package/dist/utils/page-preview.js +0 -1
  280. package/dist/utils/pages.d.ts +33 -3
  281. package/dist/utils/pages.js +83 -30
  282. package/dist/utils/privacy-regions.d.ts +19 -0
  283. package/dist/utils/privacy-regions.js +91 -0
  284. package/dist/utils/publish-form-data.d.ts +4 -5
  285. package/dist/utils/publish-form-data.js +2 -3
  286. package/dist/utils/publish-policy.d.ts +11 -17
  287. package/dist/utils/publish-policy.fixtures.json +11 -5
  288. package/dist/utils/publish-policy.js +65 -110
  289. package/dist/utils/query-client.d.ts +2 -0
  290. package/dist/utils/query-client.js +10 -1
  291. package/dist/utils/runtime-paths.d.ts +4 -4
  292. package/dist/utils/runtime-paths.js +6 -8
  293. package/dist/utils/runtime-upload.d.ts +9 -0
  294. package/dist/utils/runtime-upload.js +12 -0
  295. package/dist/utils/secure-local-file.d.ts +3 -3
  296. package/dist/utils/secure-local-file.js +23 -40
  297. package/dist/utils/space-config.d.ts +12 -15
  298. package/dist/utils/space-config.js +13 -16
  299. package/dist/utils/static-runtime-policy.d.ts +10 -7
  300. package/dist/utils/static-runtime-policy.fixtures.json +38 -41
  301. package/dist/utils/static-runtime-policy.generated.d.ts +16 -0
  302. package/dist/utils/static-runtime-policy.generated.js +70 -0
  303. package/dist/utils/static-runtime-policy.js +31 -132
  304. package/dist/utils/storage-policy.js +1 -2
  305. package/dist/utils/upload-session.d.ts +4 -1
  306. package/dist/utils/upload-session.js +41 -19
  307. package/dist/utils/version-path.js +11 -19
  308. package/dist/utils/wpcom-auth-redirects.d.ts +5 -14
  309. package/dist/utils/wpcom-auth-redirects.js +1 -4
  310. package/dist/vocabulary.d.ts +13 -13
  311. package/dist/vocabulary.js +52 -27
  312. package/package.json +15 -18
  313. package/dist/agents/client-registry.d.ts +0 -22
  314. package/dist/agents/client-registry.js +0 -41
  315. package/dist/docs/agent-handoff-document.d.ts +0 -15
  316. package/dist/docs/agent-handoff-document.js +0 -180
  317. package/dist/docs/agent-solutions.d.ts +0 -110
  318. package/dist/docs/agent-solutions.js +0 -183
  319. package/dist/utils/query-keys.d.ts +0 -84
  320. package/dist/utils/query-keys.js +0 -108
@@ -1,30 +1,28 @@
1
1
  import { z } from "zod";
2
2
  import { appRoutePathSchema, EXECUTION_ENV_MAX_KEYS, executionBundleSchema, executionCapabilitiesSchema, executionEnvNameSchema, executionIdentifierSchema, executionInspectPolicySchema, executionSha256Schema, executionStaticFileSchema, httpMethodSchema, LAKEBED_SERVER_ENV_FILE, PLATFORM_ROUTE_PREFIX, runtimeRealtimeModeSchema, SERVER_ENV_FILE, } from "./execution.js";
3
3
  /**
4
- * Spacefast Zero: capsules schema, queries, mutations and endpoints that run
5
- * together inside one parent-owned transaction executed by the native runner
6
- * on a dedicated wp.cloud site, against that site's own MySQL.
4
+ * Spacefast Zero: capsules of schema, queries, mutations and endpoints that run
5
+ * together inside one parent-owned transaction, executed by the native runner
6
+ * on a dedicated wp.cloud site against that site's own MySQL.
7
7
  *
8
- * The transaction is what makes this a separate product rather than a
9
- * placement option for `./functions.js`. A capsule handler's semantics depend
10
- * on the transaction wrapped around it, and an isolate reaching the database
11
- * over a relay cannot offer one. See `endpointIsPortable` in `./execution.js`
12
- * for the narrow surface both products can host.
8
+ * The transaction is what makes this a separate product rather than a placement
9
+ * option for `./functions.js`: an isolate reaching the database over a relay
10
+ * cannot offer one. See `endpointIsPortable` in `./execution.js` for the narrow
11
+ * surface both products can host.
13
12
  */
14
13
  export const ZERO_SOURCE_METADATA_KEY = "statticZero";
15
14
  /**
16
- * The tag a compiled capsule artifact carries in the finalize payload, the
17
- * runtime config, the install profile, the client config the browser reads, and
18
- * every realtime event so PHP and the Rust runner can tell what they were
19
- * handed. It is a property of the artifact the tree produced, not a kind a
20
- * space declares: a publish can carry this beside a worker.
15
+ * The tag a compiled capsule artifact carries everywhere it travels, so PHP and
16
+ * the Rust runner can tell what they were handed. It is a property of the
17
+ * artifact, not a kind a space declares: a publish can carry this beside a
18
+ * worker.
21
19
  */
22
20
  export const ZERO_RUNTIME_KIND = "zero";
23
21
  export const ZERO_PLATFORM_ROUTE_PREFIX = `${PLATFORM_ROUTE_PREFIX}/zero`;
24
22
  /**
25
- * Entry paths the Zero scaffold writes into `sf.jsonc#runtime`. They are
26
- * starting points, not the contract: a capsule's entries are whatever its
27
- * `runtime.server`/`runtime.client` say, and nothing infers them.
23
+ * Entry paths the Zero scaffold writes into `sf.jsonc#runtime`. Starting points
24
+ * only: a capsule's entries are whatever its `runtime.server`/`runtime.client`
25
+ * say, and nothing infers them.
28
26
  */
29
27
  export const ZERO_CLIENT_ENTRY = "client/index.tsx";
30
28
  export const ZERO_SERVER_ENTRY = "server/index.ts";
@@ -42,7 +40,7 @@ export const ZERO_RUNTIME_STORAGE_ROOT = "__spacefast/zero";
42
40
  export const ZERO_RUNTIME_ARTIFACT_PATH = `${ZERO_RUNTIME_STORAGE_ROOT}/artifact.json`;
43
41
  export const ZERO_RUNTIME_CONFIG_PATH = `${ZERO_RUNTIME_STORAGE_ROOT}/config.json`;
44
42
  export const ZERO_RUNTIME_BINARY_PATH = `${ZERO_RUNTIME_STORAGE_ROOT}/bin/stattic-runtime`;
45
- export const ZERO_RUNTIME_BINARY_COMPATIBILITY_TARGET = "wpcloud-linux-x86_64-gnu-v1";
43
+ export const ZERO_RUNTIME_BINARY_COMPATIBILITY_TARGET = "linux-x86_64-gnu-v1";
46
44
  export const ZERO_RUNTIME_BUNDLE_ROOT = `${ZERO_RUNTIME_STORAGE_ROOT}/bundles`;
47
45
  export const ZERO_RUNTIME_SERVER_BUNDLE_PATH = `${ZERO_RUNTIME_BUNDLE_ROOT}/server.qjs.mjs`;
48
46
  /** The compiled capsule client, served at the app root. */
@@ -51,15 +49,13 @@ export const ZERO_PUBLIC_CLIENT_BUNDLE_PATH = "client.js";
51
49
  * Where platform-owned client bytes serve from: same origin as the space, one
52
50
  * content-addressed directory per platform build.
53
51
  *
54
- * Same origin is the whole point. Browsers have partitioned the HTTP cache by
55
- * top-level site since 2020, so a shared third-party CDN buys nothing a
56
- * same-origin URL does not and costs a `script-src` hole. What a stable,
57
- * content-addressed URL does buy is real: the digest changes only when the
58
- * platform bytes change, so publishing a capsule a hundred times re-downloads
59
- * the capsule's own bundle a hundred times and the platform's exactly once.
52
+ * Browsers have partitioned the HTTP cache by top-level site since 2020, so a
53
+ * shared third-party CDN buys nothing a same-origin URL does not, and costs a
54
+ * `script-src` hole. The digest changes only when the platform bytes change, so
55
+ * republishing a capsule re-downloads its own bundle but not the platform's.
60
56
  *
61
57
  * Underscore-prefixed by framework convention (`_next/static`, `_astro`), which
62
- * is also how the runtime recognises it as immutable see `immutable_path` in
58
+ * is also how the runtime recognises it as immutable. See `immutable_path` in
63
59
  * `crates/stattic-runtime-core/src/finalize.rs`.
64
60
  */
65
61
  export const ZERO_PLATFORM_ASSET_NAMESPACE = "_spacefast";
@@ -71,39 +67,33 @@ export function zeroPlatformAssetPath(digest, fileName) {
71
67
  /**
72
68
  * The compiled capsule server, which the QuickJS runner instantiates whole.
73
69
  *
74
- * 768 KiB is inherited, not measured: nobody has yet established what the
75
- * runner actually tolerates, and DS77 keeps the number only until someone does.
76
- * It binds a real resource — the runner holds the module graph in the site's
77
- * PHP-worker memory before executing anything — so it stays low deliberately;
78
- * server code is handlers, not an application.
70
+ * 768 KiB is inherited, not measured: nobody has established what the runner
71
+ * actually tolerates. It binds a real resource, since the runner holds the
72
+ * module graph in the site's PHP-worker memory before executing anything, so it
73
+ * stays low deliberately.
79
74
  */
80
75
  export const ZERO_SERVER_BUNDLE_MAX_BYTES = 786_432;
81
76
  /**
82
77
  * The tenant client bundle, and every other file the compile ships as content.
83
78
  *
84
- * This measures what the tenant publishes, and only that: the SDK, the kit, the
79
+ * This measures what the tenant publishes, and only that. The SDK, the kit, the
85
80
  * chart layer, preact, recharts and lucide are externals resolved through the
86
81
  * shell's import map to {@link ZERO_PLATFORM_ASSET_ROOT}, so platform bytes are
87
- * never weighed here (DS42). What remains is author code plus whatever npm the
88
- * author chose to bundle.
82
+ * never weighed here.
89
83
  *
90
- * 8 MiB matches the Functions per-entry cap (DS77) because the same reasoning
91
- * applies: a client bundle is static bytes to a browser, so nothing on the
92
- * serving side binds it, and the cap exists to fail an accidental
93
- * hundred-megabyte dependency in our tooling — where the build can say which
94
- * modules are large — rather than at upload. It is a guardrail, not a budget;
95
- * the size report is what an author should be reading.
84
+ * 8 MiB matches the Functions per-entry cap. A client bundle is static bytes to
85
+ * a browser, so nothing on the serving side binds it; the cap exists to fail an
86
+ * accidental hundred-megabyte dependency in tooling that can say which modules
87
+ * are large, rather than at upload.
96
88
  */
97
89
  export const ZERO_CLIENT_BUNDLE_MAX_BYTES = 8 * 1024 * 1024;
98
90
  /**
99
91
  * A capsule's compiled server travels as version metadata, not as content, so a
100
- * server-only change leaves the published app shell byte-identical and the
101
- * version intent's manifest comparison would read it as "no changes" and never
102
- * deploy it. The publish writes this one small file into the version instead:
103
- * it holds a digest of everything the deploy would install, so any server,
104
- * schema, or runtime-config change moves the manifest. Same channel a Functions
105
- * bundle uses (`functionsBundleStoragePath`) — an ordinary manifest entry, no
106
- * artifact-specific plumbing.
92
+ * server-only change would leave the app shell byte-identical and the version
93
+ * intent's manifest comparison would read it as "no changes". The publish writes
94
+ * this one small file into the version instead: it holds a digest of everything
95
+ * the deploy would install, so any server, schema, or runtime-config change
96
+ * moves the manifest.
107
97
  */
108
98
  export const ZERO_RUNTIME_DEPLOY_PATH = `${ZERO_RUNTIME_STORAGE_ROOT}/deploy.json`;
109
99
  export const ZERO_MANAGED_TABLE_COLUMNS = ["id", "createdAt", "updatedAt"];
@@ -118,9 +108,8 @@ export const ZERO_RESERVED_APP_ROUTE_PATHS = [
118
108
  `/${ZERO_PUBLIC_CLIENT_BUNDLE_PATH}`,
119
109
  "/auth/callback",
120
110
  ];
121
- // The whole platform namespace is reserved, not just the one directory a build
122
- // happens to write: an endpoint claiming a path under it would shadow bytes the
123
- // shell's import map already told the browser to fetch.
111
+ // The whole platform namespace is reserved: an endpoint claiming a path under it
112
+ // would shadow bytes the shell's import map already told the browser to fetch.
124
113
  export const ZERO_RESERVED_APP_ROUTE_PREFIXES = [
125
114
  "/auth/",
126
115
  `/${ZERO_PLATFORM_ASSET_NAMESPACE}/`,
@@ -137,7 +126,7 @@ export const zeroEndpointSchema = z
137
126
  path: zeroRoutePathSchema,
138
127
  })
139
128
  .strict();
140
- function zeroEndpointRouteMatchShape(path) {
129
+ function zeroEndpointRouteMatch(path) {
141
130
  const segments = [];
142
131
  let score = 0;
143
132
  let splat = false;
@@ -166,17 +155,17 @@ export function zeroEndpointRoutesAmbiguous(left, right) {
166
155
  (left.method === "HEAD" && right.method === "GET");
167
156
  if (!methodsOverlap)
168
157
  return false;
169
- const leftShape = zeroEndpointRouteMatchShape(left.path);
170
- const rightShape = zeroEndpointRouteMatchShape(right.path);
171
- if (leftShape.score !== rightShape.score)
158
+ const leftMatch = zeroEndpointRouteMatch(left.path);
159
+ const rightMatch = zeroEndpointRouteMatch(right.path);
160
+ if (leftMatch.score !== rightMatch.score)
172
161
  return false;
173
- if (!leftShape.splat && leftShape.segments.length < rightShape.segments.length)
162
+ if (!leftMatch.splat && leftMatch.segments.length < rightMatch.segments.length)
174
163
  return false;
175
- if (!rightShape.splat && rightShape.segments.length < leftShape.segments.length)
164
+ if (!rightMatch.splat && rightMatch.segments.length < leftMatch.segments.length)
176
165
  return false;
177
- return Array.from({ length: Math.min(leftShape.segments.length, rightShape.segments.length) }, (_, index) => index).every((index) => {
178
- const segment = leftShape.segments[index];
179
- const other = rightShape.segments[index];
166
+ return Array.from({ length: Math.min(leftMatch.segments.length, rightMatch.segments.length) }, (_, index) => index).every((index) => {
167
+ const segment = leftMatch.segments[index];
168
+ const other = rightMatch.segments[index];
180
169
  return segment === null || other === null || segment === other;
181
170
  });
182
171
  }
@@ -264,12 +253,12 @@ export const zeroTableSchema = z
264
253
  export const zeroDatabaseSchema = z.record(z.string(), zeroTableSchema);
265
254
  const zeroSha256Schema = executionSha256Schema;
266
255
  /**
267
- * The compiled server travels inline in the finalize payload; inlining keeps the
268
- * whole version one atomic write. Functions bundles do the opposite and land
269
- * in the content store first; see `functionsBundleRefSchema`.
256
+ * The compiled server travels inline in the finalize payload, which keeps the
257
+ * whole version one atomic write. Functions bundles land in the content store
258
+ * first; see `functionsBundleRefSchema`.
270
259
  *
271
- * The client never travels this way. It is content the browser fetches it
272
- * from the version tree like any other asset — so it ships as a static file.
260
+ * The client never travels this way: it is content the browser fetches from the
261
+ * version tree, so it ships as a static file.
273
262
  */
274
263
  export const zeroRuntimeBundleSchema = executionBundleSchema({
275
264
  bundleRoot: ZERO_RUNTIME_BUNDLE_ROOT,
@@ -536,7 +525,7 @@ export const zeroCapsuleArtifactSchema = z
536
525
  .strict(),
537
526
  db: z
538
527
  .object({
539
- backend: z.literal("wpcloud-mysql"),
528
+ backend: z.literal("mysql"),
540
529
  migrations: z.array(zeroMigrationOperationSchema).default([]),
541
530
  })
542
531
  .strict(),
@@ -636,18 +625,13 @@ export const zeroDeployMetadataSchema = z
636
625
  * What a live Zero capsule is, as the `capsule` member of a space's runtime
637
626
  * status.
638
627
  *
639
- * There is no `versionId` here: this only ever describes the version the status
640
- * response already names as live, and repeating it would invite the two to
641
- * disagree. `artifactId` stays because it identifies the built capsule rather
642
- * than the publish that carries it. There is no kind tag either — the member it
643
- * rides in already says which product answered.
628
+ * No `versionId`: the status response already names the live version, and
629
+ * repeating it would invite the two to disagree. `artifactId` stays because it
630
+ * identifies the built capsule rather than the publish that carries it.
644
631
  *
645
- * Every field is derived from the version's own finalize metadata, which is
646
- * what makes this safe to answer for a space whose runtime is asleep,
647
- * mid-move, or failing: nothing here costs a call to the space's origin. It is
648
- * also why there are no counts of things listed here — a caller that wants
649
- * `tables.length` can take it — and why the database is not a field: a capsule
650
- * always owns one, so its presence already said so.
632
+ * Every field is derived from the version's own finalize metadata, so this is
633
+ * safe to answer for a space whose runtime is asleep, mid-move, or failing.
634
+ * Nothing here costs a call to the space's origin.
651
635
  */
652
636
  export const zeroAppSchema = z
653
637
  .object({
@@ -667,9 +651,27 @@ export const zeroAppSchema = z
667
651
  endpoints: z.array(zeroEndpointSchema).default([]),
668
652
  sockets: z.array(z.string()).default([]),
669
653
  /**
670
- * Migrations are operations, not names `create_table`, `add_column` and
671
- * friendsso a count is the honest summary here. The operations
672
- * themselves are the database surface's answer (`GET /v1/spaces/{id}/db`).
654
+ * Compiled bundle sizes in bytes, read from the finalize payload's own
655
+ * declarations. Null never 0 when a legacy version's metadata predates
656
+ * size reporting, so absence stays honest. Meter these against
657
+ * {@link ZERO_SERVER_BUNDLE_MAX_BYTES} and {@link ZERO_CLIENT_BUNDLE_MAX_BYTES}.
658
+ */
659
+ serverBundleSize: z
660
+ .number()
661
+ .int()
662
+ .nonnegative()
663
+ .nullable()
664
+ .describe("Compiled server bundle size in bytes, or null when this version's metadata does not record it."),
665
+ clientBundleSize: z
666
+ .number()
667
+ .int()
668
+ .nonnegative()
669
+ .nullable()
670
+ .describe("Compiled client bundle size in bytes, or null when this version's metadata does not record it."),
671
+ /**
672
+ * Migrations are operations, not names, so a count is the summary here. The
673
+ * operations themselves are the database surface's answer
674
+ * (`GET /v1/spaces/{id}/db`).
673
675
  */
674
676
  migrationCount: z.number().int().nonnegative(),
675
677
  /** Digest of the schema the live migration plan settled on, if it ran one. */
@@ -726,7 +728,7 @@ export function createZeroCapsuleArtifact(input) {
726
728
  sockets: input.sockets ?? [],
727
729
  },
728
730
  db: {
729
- backend: "wpcloud-mysql",
731
+ backend: "mysql",
730
732
  migrations: [],
731
733
  },
732
734
  realtime: {
@@ -1,46 +1,49 @@
1
1
  /**
2
- * Dashboard route first-segments that cannot be used as team slugs.
3
- *
4
- * Append-only: add a new top-level static dashboard route's first segment here
5
- * before its route module lands. A repository structural test enforces this.
2
+ * `connect` is held for the team-level connect page (see
3
+ * `reservedSegmentActivationContract` in apps/my's dashboard route ledger).
6
4
  */
7
- export declare const TEAM_SLUG_ROUTE_RESERVATIONS: readonly ["accept-beta-invite", "accept-invitation", "account", "access", "agent", "claim", "device", "drop", "new-team", "oauth", "push", "sign-in", "start", "terminal", "two-factor"];
8
- /**
9
- * Dashboard route first-segments that cannot be used as space slugs.
10
- *
11
- * Append-only: add a new static route directly below a team's first segment
12
- * here before its route module lands. A repository structural test enforces
13
- * this.
14
- */
15
- export declare const SPACE_SLUG_ROUTE_RESERVATIONS: readonly ["billing", "connect", "domains", "drop", "members", "new", "resume", "settings"];
5
+ export declare const UNBUILT_SPACE_SLUG_ROUTE_RESERVATIONS: readonly ["connect"];
6
+ /** Dashboard route first-segments that cannot be used as team slugs. */
7
+ export declare const TEAM_SLUG_ROUTE_RESERVATIONS: readonly ["accept-beta-invite", "accept-invitation", "access", "account", "approvals", "claim", "device", "drop", "new-team", "oauth", "push", "sign-in", "start", "terminal", "two-factor"];
8
+ /** Dashboard route first-segments that cannot be used as space slugs. */
9
+ export declare const SPACE_SLUG_ROUTE_RESERVATIONS: readonly ["agents", "api-keys", "billing", "domains", "drop", "handoffs", "members", "new", "resume", "settings", "variables", "webhooks", "connect"];
16
10
  export type TeamSlugRouteReservation = (typeof TEAM_SLUG_ROUTE_RESERVATIONS)[number];
17
11
  export type SpaceSlugRouteReservation = (typeof SPACE_SLUG_ROUTE_RESERVATIONS)[number];
18
12
  export declare const TEAM_SLUG_ROUTE_RESERVATION_SET: ReadonlySet<string>;
19
13
  export declare const SPACE_SLUG_ROUTE_RESERVATION_SET: ReadonlySet<string>;
20
14
  /**
21
- * The Runtime page's sections. They are search params rather than path
22
- * segments, so `runtime` stays a single route (and a single ledger row) and a
23
- * space slugged "runtime" keeps its own Runtime page at
15
+ * The Runtime page's sections. Search params, not path segments, so `runtime`
16
+ * stays one route and a space slugged "runtime" keeps its own Runtime page at
24
17
  * `/<team>/runtime/runtime`.
25
18
  */
26
19
  export declare const SPACE_RUNTIME_SECTIONS: readonly ["overview", "database", "storage", "logs"];
27
20
  export type SpaceRuntimeSection = (typeof SPACE_RUNTIME_SECTIONS)[number];
28
21
  export declare const DEFAULT_SPACE_RUNTIME_SECTION: SpaceRuntimeSection;
29
- export type SpaceSettingsDestination = "access" | "advanced" | "builds" | "integrations" | "integrations/add" | "source-builds";
30
- export type TeamSettingsDestination = "access" | "audit" | "developer" | "developer/agents" | "developer/environment-variables" | "developer/handoffs" | "developer/webhooks" | "integrations";
22
+ /**
23
+ * What is left under a Space's Settings dialog. Builds, Integrations, and
24
+ * Variables are top-level Space surfaces with their own builders below.
25
+ */
26
+ export type SpaceSettingsDestination = "advanced" | "data-sources";
27
+ export type TeamSettingsDestination = "access" | "activity" | "billing" | "integrations" | "usage";
28
+ /** Top-level team surfaces; the name comes from the old Settings > Developer group. */
29
+ export type TeamDeveloperSurface = "agents" | "api-keys" | "handoffs" | "variables" | "webhooks";
31
30
  export declare function teamPath(teamSlug: string): string;
32
31
  export declare function spacePath(teamSlug: string, spaceSlug: string): string;
33
32
  export declare function versionDetailPath(teamSlug: string, spaceSlug: string, versionRef: string): string;
34
33
  export declare function buildDetailPath(teamSlug: string, spaceSlug: string, buildId: string): string;
35
34
  export declare function spaceDomainsPath(teamSlug: string, spaceSlug: string): string;
35
+ /** Build runs and the repository connection that produces them. */
36
+ export declare function spaceBuildsPath(teamSlug: string, spaceSlug: string): string;
37
+ export declare function spaceIntegrationsPath(teamSlug: string, spaceSlug: string): string;
38
+ export declare function spaceVariablesPath(teamSlug: string, spaceSlug: string): string;
36
39
  /**
37
- * The space's Runtime page. The default section is the bare URL — the route
38
- * strips it back out of the address bar so a link to "overview" and a link to
39
- * the page itself are the same link.
40
+ * The space's Runtime page. The route strips the default section back out of the
41
+ * address bar, so a link to "overview" and a link to the page are the same link.
40
42
  */
41
43
  export declare function spaceRuntimePath(teamSlug: string, spaceSlug: string, section?: SpaceRuntimeSection): string;
42
44
  export declare function spaceSettingsPath(teamSlug: string, spaceSlug: string, destination?: SpaceSettingsDestination): string;
43
45
  export declare function teamDomainsPath(teamSlug: string): string;
44
46
  export declare function teamBillingPath(teamSlug: string): string;
47
+ export declare function teamDeveloperSurfacePath(teamSlug: string, surface: TeamDeveloperSurface): string;
45
48
  export declare function teamDomainDetailPath(teamSlug: string, domainRef: string): string;
46
49
  export declare function teamSettingsPath(teamSlug: string, destination?: TeamSettingsDestination): string;
@@ -1,55 +1,31 @@
1
+ import { DERIVED_SPACE_SLUG_ROUTE_RESERVATIONS, DERIVED_TEAM_SLUG_ROUTE_RESERVATIONS, } from "./route-reservations.generated.js";
1
2
  /**
2
- * Dashboard route first-segments that cannot be used as team slugs.
3
- *
4
- * Append-only: add a new top-level static dashboard route's first segment here
5
- * before its route module lands. A repository structural test enforces this.
3
+ * Reservations for a dashboard surface that has not shipped yet. Shipped
4
+ * surfaces are derived in route-reservations.generated.ts, so this is the only
5
+ * hand-authored list. Delete an entry once the generator starts deriving it;
6
+ * leaving both is a duplicate that fails this module's own test.
6
7
  */
7
- export const TEAM_SLUG_ROUTE_RESERVATIONS = [
8
- "accept-beta-invite",
9
- "accept-invitation",
10
- "account",
11
- "access",
12
- // Not a TanStack route module: /agent* is the edge-served handoff-document
13
- // surface (apps/my/public/_redirects + vite middleware, #417). Those rewrite
14
- // rules deliberately swallow every /agent-prefixed path, so a team named
15
- // "agent" could never reach its canonical dashboard. Reserved per the spec's
16
- // own rule that a static first segment is reserved before the surface owning
17
- // it ships (#417 predates this set; this closes that drift).
18
- "agent",
19
- "claim",
20
- "device",
21
- "drop",
22
- "new-team",
23
- "oauth",
24
- "push",
25
- "sign-in",
26
- "start",
27
- "terminal",
28
- "two-factor",
29
- ];
8
+ const UNBUILT_TEAM_SLUG_ROUTE_RESERVATIONS = [];
30
9
  /**
31
- * Dashboard route first-segments that cannot be used as space slugs.
32
- *
33
- * Append-only: add a new static route directly below a team's first segment
34
- * here before its route module lands. A repository structural test enforces
35
- * this.
10
+ * `connect` is held for the team-level connect page (see
11
+ * `reservedSegmentActivationContract` in apps/my's dashboard route ledger).
36
12
  */
13
+ export const UNBUILT_SPACE_SLUG_ROUTE_RESERVATIONS = ["connect"];
14
+ /** Dashboard route first-segments that cannot be used as team slugs. */
15
+ export const TEAM_SLUG_ROUTE_RESERVATIONS = [
16
+ ...DERIVED_TEAM_SLUG_ROUTE_RESERVATIONS,
17
+ ...UNBUILT_TEAM_SLUG_ROUTE_RESERVATIONS,
18
+ ];
19
+ /** Dashboard route first-segments that cannot be used as space slugs. */
37
20
  export const SPACE_SLUG_ROUTE_RESERVATIONS = [
38
- "billing",
39
- "connect",
40
- "domains",
41
- "drop",
42
- "members",
43
- "new",
44
- "resume",
45
- "settings",
21
+ ...DERIVED_SPACE_SLUG_ROUTE_RESERVATIONS,
22
+ ...UNBUILT_SPACE_SLUG_ROUTE_RESERVATIONS,
46
23
  ];
47
24
  export const TEAM_SLUG_ROUTE_RESERVATION_SET = new Set(TEAM_SLUG_ROUTE_RESERVATIONS);
48
25
  export const SPACE_SLUG_ROUTE_RESERVATION_SET = new Set(SPACE_SLUG_ROUTE_RESERVATIONS);
49
26
  /**
50
- * The Runtime page's sections. They are search params rather than path
51
- * segments, so `runtime` stays a single route (and a single ledger row) and a
52
- * space slugged "runtime" keeps its own Runtime page at
27
+ * The Runtime page's sections. Search params, not path segments, so `runtime`
28
+ * stays one route and a space slugged "runtime" keeps its own Runtime page at
53
29
  * `/<team>/runtime/runtime`.
54
30
  */
55
31
  export const SPACE_RUNTIME_SECTIONS = ["overview", "database", "storage", "logs"];
@@ -72,10 +48,19 @@ export function buildDetailPath(teamSlug, spaceSlug, buildId) {
72
48
  export function spaceDomainsPath(teamSlug, spaceSlug) {
73
49
  return `${spacePath(teamSlug, spaceSlug)}/domains`;
74
50
  }
51
+ /** Build runs and the repository connection that produces them. */
52
+ export function spaceBuildsPath(teamSlug, spaceSlug) {
53
+ return `${spacePath(teamSlug, spaceSlug)}/builds`;
54
+ }
55
+ export function spaceIntegrationsPath(teamSlug, spaceSlug) {
56
+ return `${spacePath(teamSlug, spaceSlug)}/integrations`;
57
+ }
58
+ export function spaceVariablesPath(teamSlug, spaceSlug) {
59
+ return `${spacePath(teamSlug, spaceSlug)}/variables`;
60
+ }
75
61
  /**
76
- * The space's Runtime page. The default section is the bare URL — the route
77
- * strips it back out of the address bar so a link to "overview" and a link to
78
- * the page itself are the same link.
62
+ * The space's Runtime page. The route strips the default section back out of the
63
+ * address bar, so a link to "overview" and a link to the page are the same link.
79
64
  */
80
65
  export function spaceRuntimePath(teamSlug, spaceSlug, section = DEFAULT_SPACE_RUNTIME_SECTION) {
81
66
  const root = `${spacePath(teamSlug, spaceSlug)}/runtime`;
@@ -89,7 +74,10 @@ export function teamDomainsPath(teamSlug) {
89
74
  return `${teamPath(teamSlug)}/domains`;
90
75
  }
91
76
  export function teamBillingPath(teamSlug) {
92
- return `${teamPath(teamSlug)}/billing`;
77
+ return teamSettingsPath(teamSlug, "billing");
78
+ }
79
+ export function teamDeveloperSurfacePath(teamSlug, surface) {
80
+ return `${teamPath(teamSlug)}/${surface}`;
93
81
  }
94
82
  export function teamDomainDetailPath(teamSlug, domainRef) {
95
83
  return `${teamDomainsPath(teamSlug)}/${dynamicSegment(domainRef)}`;
@@ -0,0 +1,2 @@
1
+ export declare const DERIVED_TEAM_SLUG_ROUTE_RESERVATIONS: readonly ["accept-beta-invite", "accept-invitation", "access", "account", "approvals", "claim", "device", "drop", "new-team", "oauth", "push", "sign-in", "start", "terminal", "two-factor"];
2
+ export declare const DERIVED_SPACE_SLUG_ROUTE_RESERVATIONS: readonly ["agents", "api-keys", "billing", "domains", "drop", "handoffs", "members", "new", "resume", "settings", "variables", "webhooks"];
@@ -0,0 +1,36 @@
1
+ // @generated by `bun run check:dashboard-route-reservations -- --write`.
2
+ // Source: apps/my/src/routes (static first segments of route modules) and
3
+ // apps/my/public/_redirects (same-origin edge rules that claim a path before the
4
+ // router sees it). Add the route or the rule, regenerate, and the slug stops
5
+ // being claimable. Hand edits are overwritten.
6
+ export const DERIVED_TEAM_SLUG_ROUTE_RESERVATIONS = [
7
+ "accept-beta-invite",
8
+ "accept-invitation",
9
+ "access",
10
+ "account",
11
+ "approvals",
12
+ "claim",
13
+ "device",
14
+ "drop",
15
+ "new-team",
16
+ "oauth",
17
+ "push",
18
+ "sign-in",
19
+ "start",
20
+ "terminal",
21
+ "two-factor",
22
+ ];
23
+ export const DERIVED_SPACE_SLUG_ROUTE_RESERVATIONS = [
24
+ "agents",
25
+ "api-keys",
26
+ "billing",
27
+ "domains",
28
+ "drop",
29
+ "handoffs",
30
+ "members",
31
+ "new",
32
+ "resume",
33
+ "settings",
34
+ "variables",
35
+ "webhooks",
36
+ ];
@@ -0,0 +1,92 @@
1
+ import { type AnonymousAgentHandoffStatus } from "../contracts/device-auth.js";
2
+ export declare const AGENT_HANDOFF_REQUEST_FAILED_MESSAGE = "Request failed.";
3
+ export declare const AGENT_HANDOFF_INVALID_RESPONSE_MESSAGE = "Invalid agent handoff response.";
4
+ /**
5
+ * The messages that say nothing a person can act on. A UI showing an error
6
+ * detail line suppresses these, so it never renders "failed: Request failed."
7
+ */
8
+ export declare const AGENT_HANDOFF_GENERIC_MESSAGES: ReadonlySet<string>;
9
+ export declare class AgentHandoffRequestError extends Error {
10
+ readonly code: string | null;
11
+ constructor(message: string, code?: string | null);
12
+ }
13
+ export type AgentArrivalConfig = {
14
+ /** Origin the anonymous handoff endpoints live on. */
15
+ apiOrigin: string;
16
+ /**
17
+ * Origins a minted link may legitimately carry, most likely first. A deploy
18
+ * may mint on the API origin or on a front-end origin that proxies
19
+ * `/handoffs/*` to it, so this is a list, not a guess. Defaults to the API
20
+ * origin alone.
21
+ */
22
+ allowedOrigins?: readonly string[];
23
+ /** Transport seam: tests and the dashboard's attributed client swap it. */
24
+ fetch?: typeof globalThis.fetch;
25
+ /** Clock seam for the cadence and reuse policies. */
26
+ now?: () => number;
27
+ };
28
+ export type MintedAnonymousArrival = {
29
+ /** Ledger id of the handoff. Not a secret — the poll and analytics key off it. */
30
+ id: string;
31
+ /**
32
+ * Composes the copy-ready prompt for the task selected RIGHT NOW. It is a
33
+ * function, not a stored string, for two reasons: one handoff is reused
34
+ * across a visit while the task behind the prompt keeps changing, and the
35
+ * bearer stays captured in this closure instead of sitting in caller state.
36
+ * The result contains the one-use URL: clipboard only.
37
+ */
38
+ promptFor: (context: string) => string;
39
+ /** Epoch ms. */
40
+ expiresAt: number;
41
+ };
42
+ /**
43
+ * Mints the signed-out handoff a copied prompt carries.
44
+ *
45
+ * The anonymous surface is anonymous by contract, so this deliberately sends no
46
+ * credentials: it works signed out, and a mint that carried a session would
47
+ * answer differently for gated accounts.
48
+ */
49
+ export declare function mintAnonymousArrival(config: AgentArrivalConfig): Promise<MintedAnonymousArrival>;
50
+ /** Reads one anonymous handoff's fetch state by its non-secret ledger id. */
51
+ export declare function readAnonymousArrivalStatus(id: string, config: AgentArrivalConfig): Promise<AnonymousAgentHandoffStatus>;
52
+ export declare const AGENT_ARRIVAL_EAGER_POLL_MS = 2000;
53
+ export declare const AGENT_ARRIVAL_EAGER_WINDOW_MS: number;
54
+ export declare const AGENT_ARRIVAL_RELAXED_POLL_MS = 10000;
55
+ /**
56
+ * The handoff's own TTL is the clock: with no `since` to carry, "how much
57
+ * runway is left" says how long ago it was minted.
58
+ */
59
+ export declare const AGENT_ARRIVAL_RELAXED_AFTER_MS: number;
60
+ /**
61
+ * One live handoff per visit is reused while it still has this much runway.
62
+ * Every copy gesture minting its own would spend rows against the caller's
63
+ * budget for a signal that only has to flip once.
64
+ */
65
+ export declare const AGENT_ARRIVAL_REFRESH_RUNWAY_MS: number;
66
+ /** How long to wait before the next status read, or `false` to stop polling. */
67
+ export declare function anonymousArrivalPollDelayMs(status: AnonymousAgentHandoffStatus | undefined, now?: number): number | false;
68
+ /** The arrival itself: one fetch of the private URL is the whole signal. */
69
+ export declare function hasAgentArrived(status: AnonymousAgentHandoffStatus | undefined): boolean;
70
+ export type ComposedAnonymousPrompt = {
71
+ /** Ledger id to watch for the arrival. */
72
+ id: string;
73
+ /** Copy-ready text carrying the one-use URL. Clipboard only. */
74
+ prompt: string;
75
+ /** Epoch ms. */
76
+ expiresAt: number;
77
+ };
78
+ export type AnonymousArrival = {
79
+ /** The visit's handoff: minted once, reused while it still has runway. */
80
+ ensureMinted: () => Promise<MintedAnonymousArrival>;
81
+ /** ensureMinted, then the prompt for the task selected at this moment. */
82
+ promptFor: (context: string) => Promise<ComposedAnonymousPrompt>;
83
+ readStatus: (id: string) => Promise<AnonymousAgentHandoffStatus>;
84
+ nextPollDelayMs: (status: AnonymousAgentHandoffStatus | undefined) => number | false;
85
+ hasArrived: (status: AnonymousAgentHandoffStatus | undefined) => boolean;
86
+ };
87
+ /**
88
+ * One visit's arrival flow. Hold one of these for as long as the visitor is on
89
+ * the surface: the reuse discipline lives in the instance, so re-copies keep
90
+ * the same handoff instead of piling fresh rows behind one signal.
91
+ */
92
+ export declare function createAnonymousArrival(config: AgentArrivalConfig): AnonymousArrival;