@spacefast/common 0.0.5 → 0.0.7

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 (183) hide show
  1. package/brand-assets/spacefast-favicon.svg +16 -0
  2. package/brand-assets/spacefast-sf-full-bleed.svg +13 -0
  3. package/brand-assets/spacefast-wordmark.svg +5 -0
  4. package/dist/agents/connect-targets.d.ts +138 -0
  5. package/dist/agents/connect-targets.js +243 -0
  6. package/dist/brand-assets-build.d.ts +26 -0
  7. package/dist/brand-assets-build.js +81 -0
  8. package/dist/brand-assets.d.ts +42 -0
  9. package/dist/brand-assets.js +30 -0
  10. package/dist/brand.d.ts +1 -0
  11. package/dist/brand.js +5 -0
  12. package/dist/config/domains.d.ts +12 -6
  13. package/dist/config/domains.js +30 -38
  14. package/dist/contracts/access.d.ts +967 -124
  15. package/dist/contracts/access.js +804 -148
  16. package/dist/contracts/activity.d.ts +1 -1
  17. package/dist/contracts/activity.js +28 -2
  18. package/dist/contracts/annotations.d.ts +2 -4
  19. package/dist/contracts/api-keys.d.ts +126 -4
  20. package/dist/contracts/api-keys.js +74 -6
  21. package/dist/contracts/archives.d.ts +8 -2
  22. package/dist/contracts/archives.js +11 -4
  23. package/dist/contracts/billing.d.ts +0 -9
  24. package/dist/contracts/builds.d.ts +65 -21
  25. package/dist/contracts/builds.js +29 -0
  26. package/dist/contracts/common.d.ts +2 -0
  27. package/dist/contracts/common.js +4 -0
  28. package/dist/contracts/continuation.d.ts +0 -3
  29. package/dist/contracts/countries.d.ts +2 -0
  30. package/dist/contracts/countries.js +261 -0
  31. package/dist/contracts/deployments.d.ts +34 -34
  32. package/dist/contracts/device-auth.d.ts +4 -11
  33. package/dist/contracts/device-auth.js +4 -0
  34. package/dist/contracts/docs.d.ts +119 -0
  35. package/dist/contracts/docs.js +51 -0
  36. package/dist/contracts/domains.d.ts +96 -54
  37. package/dist/contracts/domains.js +26 -4
  38. package/dist/contracts/enums.d.ts +15 -16
  39. package/dist/contracts/enums.js +26 -14
  40. package/dist/contracts/error-code-meta.d.ts +184 -0
  41. package/dist/contracts/error-code-meta.js +124 -10
  42. package/dist/contracts/error-codes.d.ts +1 -1
  43. package/dist/contracts/error-codes.js +42 -0
  44. package/dist/contracts/events.d.ts +1 -1
  45. package/dist/contracts/feature-lifecycle-core.d.ts +36 -0
  46. package/dist/contracts/feature-lifecycle-core.js +220 -0
  47. package/dist/contracts/feature-lifecycle.d.ts +7 -0
  48. package/dist/contracts/feature-lifecycle.js +31 -0
  49. package/dist/contracts/features.d.ts +76 -6
  50. package/dist/contracts/features.js +178 -13
  51. package/dist/contracts/generated-feature-launch-entries.d.ts +2 -0
  52. package/dist/contracts/generated-feature-launch-entries.js +518 -0
  53. package/dist/contracts/git.d.ts +2 -8
  54. package/dist/contracts/ids.d.ts +9 -0
  55. package/dist/contracts/ids.js +13 -0
  56. package/dist/contracts/mcp.d.ts +8 -10
  57. package/dist/contracts/me.js +1 -1
  58. package/dist/contracts/oauth-resources.d.ts +19 -8
  59. package/dist/contracts/oauth-resources.js +44 -13
  60. package/dist/contracts/operations.d.ts +161 -1
  61. package/dist/contracts/operations.js +49 -1
  62. package/dist/contracts/platform.d.ts +6 -102
  63. package/dist/contracts/platform.js +6 -50
  64. package/dist/contracts/publishes.d.ts +130 -0
  65. package/dist/contracts/publishes.js +145 -0
  66. package/dist/contracts/push-new.d.ts +4 -4
  67. package/dist/contracts/quotas.d.ts +2 -0
  68. package/dist/contracts/quotas.js +8 -0
  69. package/dist/contracts/repository-connections.d.ts +9 -8
  70. package/dist/contracts/repository-connections.js +13 -0
  71. package/dist/contracts/resources.d.ts +99 -13
  72. package/dist/contracts/resources.js +36 -4
  73. package/dist/contracts/routes.d.ts +0 -2
  74. package/dist/contracts/runtime-api.d.ts +363 -39
  75. package/dist/contracts/runtime-api.js +276 -6
  76. package/dist/contracts/sf-config-v1.d.ts +75 -0
  77. package/dist/contracts/sf-config-v1.js +6 -0
  78. package/dist/contracts/sites.d.ts +19 -2
  79. package/dist/contracts/sites.js +21 -0
  80. package/dist/contracts/space-config.d.ts +201 -2
  81. package/dist/contracts/space-config.js +135 -5
  82. package/dist/contracts/spaces.d.ts +376 -196
  83. package/dist/contracts/spaces.js +62 -10
  84. package/dist/contracts/superadmin-emails.d.ts +4 -2
  85. package/dist/contracts/superadmin-emails.js +8 -0
  86. package/dist/contracts/superadmin-queues.d.ts +26 -26
  87. package/dist/contracts/superadmin-spaces.d.ts +172 -42
  88. package/dist/contracts/superadmin-tenants.d.ts +6 -6
  89. package/dist/contracts/superadmin-tenants.js +6 -11
  90. package/dist/contracts/superadmin.d.ts +6 -93
  91. package/dist/contracts/superadmin.js +6 -14
  92. package/dist/contracts/tags.d.ts +10 -9
  93. package/dist/contracts/tags.js +2 -1
  94. package/dist/contracts/teams.d.ts +26 -30
  95. package/dist/contracts/teams.js +11 -17
  96. package/dist/contracts/theme-json.d.ts +30 -0
  97. package/dist/contracts/theme-json.js +48 -0
  98. package/dist/contracts/variables.d.ts +0 -2
  99. package/dist/contracts/variables.js +0 -5
  100. package/dist/contracts/webhooks.d.ts +2 -0
  101. package/dist/contracts/webhooks.js +1 -1
  102. package/dist/contracts/zero.d.ts +5 -10
  103. package/dist/docs/agent-prose.d.ts +43 -3
  104. package/dist/docs/agent-prose.js +146 -7
  105. package/dist/docs/agent-setup.d.ts +51 -0
  106. package/dist/docs/agent-setup.js +211 -14
  107. package/dist/docs/agent-solutions.d.ts +5 -5
  108. package/dist/docs/agent-solutions.js +2 -2
  109. package/dist/docs/catalog.d.ts +650 -0
  110. package/dist/docs/catalog.js +758 -0
  111. package/dist/docs/error-docs.d.ts +0 -2
  112. package/dist/docs/error-docs.js +189 -35
  113. package/dist/docs/index-build.d.ts +17 -0
  114. package/dist/docs/index-build.js +24 -0
  115. package/dist/docs/search.d.ts +54 -0
  116. package/dist/docs/search.js +96 -0
  117. package/dist/docs/skill-distribution.d.ts +5 -3
  118. package/dist/docs/skill-distribution.js +8 -8
  119. package/dist/slug-policy/blocklist.d.ts +4 -0
  120. package/dist/slug-policy/blocklist.js +122 -0
  121. package/dist/slug-policy/index.d.ts +17 -0
  122. package/dist/slug-policy/index.js +86 -0
  123. package/dist/utils/access-match.d.ts +39 -0
  124. package/dist/utils/access-match.js +296 -0
  125. package/dist/utils/auth-redirect.d.ts +3 -1
  126. package/dist/utils/auth-redirect.js +21 -1
  127. package/dist/utils/build-settings.d.ts +6 -0
  128. package/dist/utils/build-settings.js +429 -46
  129. package/dist/utils/claim-token.d.ts +8 -0
  130. package/dist/utils/claim-token.js +23 -2
  131. package/dist/utils/concurrency.d.ts +1 -0
  132. package/dist/utils/concurrency.js +22 -0
  133. package/dist/utils/content-type.d.ts +1 -0
  134. package/dist/utils/content-type.js +1 -1
  135. package/dist/utils/credential-policy.d.ts +54 -0
  136. package/dist/utils/{access-policy.js → credential-policy.js} +28 -2
  137. package/dist/utils/email.d.ts +1 -0
  138. package/dist/utils/email.js +3 -0
  139. package/dist/utils/gate-theme.d.ts +61 -0
  140. package/dist/utils/gate-theme.js +217 -0
  141. package/dist/utils/git-repository.d.ts +0 -1
  142. package/dist/utils/git-repository.js +0 -3
  143. package/dist/utils/id-hints.d.ts +8 -0
  144. package/dist/utils/id-hints.js +61 -0
  145. package/dist/utils/local-space-state.d.ts +91 -0
  146. package/dist/utils/local-space-state.js +251 -0
  147. package/dist/utils/oauth-signed-query.d.ts +8 -0
  148. package/dist/utils/oauth-signed-query.js +26 -0
  149. package/dist/utils/publish-detection.d.ts +0 -8
  150. package/dist/utils/publish-detection.js +0 -93
  151. package/dist/utils/publish-policy.d.ts +6 -5
  152. package/dist/utils/publish-policy.js +71 -7
  153. package/dist/utils/query-keys.d.ts +16 -4
  154. package/dist/utils/query-keys.js +31 -4
  155. package/dist/utils/runtime-paths.d.ts +0 -1
  156. package/dist/utils/runtime-paths.js +0 -1
  157. package/dist/utils/runtime-upload-batch.d.ts +18 -0
  158. package/dist/utils/runtime-upload-batch.js +90 -0
  159. package/dist/utils/runtime-upload.d.ts +2 -0
  160. package/dist/utils/runtime-upload.js +5 -0
  161. package/dist/utils/sf-config-v1.d.ts +2 -0
  162. package/dist/utils/sf-config-v1.js +542 -0
  163. package/dist/utils/space-config.d.ts +4 -0
  164. package/dist/utils/space-config.js +10 -1
  165. package/dist/utils/space-theme.d.ts +2 -0
  166. package/dist/utils/space-theme.js +9 -0
  167. package/dist/utils/static-runtime-policy.d.ts +0 -21
  168. package/dist/utils/static-runtime-policy.js +19 -103
  169. package/dist/utils/upload-session.d.ts +1 -1
  170. package/dist/utils/wpcom-auth-redirects.d.ts +32 -2
  171. package/dist/utils/wpcom-auth-redirects.js +26 -10
  172. package/dist/vocabulary.d.ts +130 -30
  173. package/dist/vocabulary.js +77 -36
  174. package/package.json +35 -1
  175. package/dist/contracts/account.d.ts +0 -28
  176. package/dist/contracts/account.js +0 -54
  177. package/dist/contracts/intercom.d.ts +0 -6
  178. package/dist/contracts/intercom.js +0 -5
  179. package/dist/contracts/telemetry.d.ts +0 -2
  180. package/dist/contracts/telemetry.js +0 -1
  181. package/dist/utils/access-policy.d.ts +0 -39
  182. package/dist/utils/error-display.d.ts +0 -7
  183. package/dist/utils/error-display.js +0 -42
@@ -0,0 +1,16 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" role="img" aria-label="Spacefast">
2
+ <style>
3
+ .sf-favicon-primary { fill: #141419; }
4
+ @media (prefers-color-scheme: dark) { .sf-favicon-primary { fill: #fbf8f1; } }
5
+ </style>
6
+ <g transform="rotate(-1 80 80)">
7
+ <g transform="translate(22.5 48) scale(2.15)" fill="#ff4217">
8
+ <path d="M0 0h24v7H7v7h17v20H0v-7h17v-7H0V0Z"/>
9
+ <path d="M0 0h25v7H7v6h15v7H7v14H0V0Z" transform="translate(31 0)"/>
10
+ </g>
11
+ <g class="sf-favicon-primary" transform="translate(17.5 43) scale(2.15)" fill="#141419">
12
+ <path d="M0 0h24v7H7v7h17v20H0v-7h17v-7H0V0Z"/>
13
+ <path d="M0 0h25v7H7v6h15v7H7v14H0V0Z" transform="translate(31 0)"/>
14
+ </g>
15
+ </g>
16
+ </svg>
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" role="img" aria-label="Spacefast">
2
+ <rect width="160" height="160" fill="#141419"/>
3
+ <g transform="rotate(-1 80 80)">
4
+ <g transform="translate(39.75 55.5) scale(1.5)" fill="#ff4217">
5
+ <path d="M0 0h24v7H7v7h17v20H0v-7h17v-7H0V0Z"/>
6
+ <path d="M0 0h25v7H7v6h15v7H7v14H0V0Z" transform="translate(31 0)"/>
7
+ </g>
8
+ <g transform="translate(34.75 50.5) scale(1.5)" fill="#fbf8f1">
9
+ <path d="M0 0h24v7H7v7h17v20H0v-7h17v-7H0V0Z"/>
10
+ <path d="M0 0h25v7H7v6h15v7H7v14H0V0Z" transform="translate(31 0)"/>
11
+ </g>
12
+ </g>
13
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 326 62" role="img" aria-label="Spacefast">
2
+ <rect x="14" y="12" width="306" height="48" fill="#ff4217"/>
3
+ <rect x="10" y="8" width="306" height="48" fill="#141419" stroke="#141419" stroke-width="1"/>
4
+ <path fill="#fbf8f1" d="M20 15h24v7H27v7h17v20H20v-7h17v-7H20V15ZM51 15h24v18H58v16h-7V15Zm7 11h10v-4H58v4ZM83 15h24l9 34h-8l-2-8H84l-2 8h-8l9-34Zm3 19h18l-4-12H90l-4 12ZM145 22h-19v20h19v7h-26V15h26v7ZM152 15h26v7h-19v6h15v7h-15v7h19v7h-26V15ZM185 15h25v7h-18v6h15v7h-15v14h-7V15ZM215 15h24l9 34h-8l-2-8h-22l-2 8h-8l9-34Zm3 19h18l-4-12h-10l-4 12ZM250 15h24v7h-17v7h17v20h-24v-7h17v-7h-17V15ZM279 15h27v7h-10v27h-7V22h-10v-7Z"/>
5
+ </svg>
@@ -0,0 +1,138 @@
1
+ export declare const LOCAL_MCP_PACKAGE = "spacefast";
2
+ export declare const LOCAL_MCP_COMMAND = "npx";
3
+ export declare const LOCAL_MCP_ARGS: readonly ["-y", "spacefast", "mcp"];
4
+ /** The copy-paste one-liner form, e.g. `npx -y spacefast mcp`. */
5
+ export declare const LOCAL_MCP_COMMAND_LINE: string;
6
+ /**
7
+ * base64 of a UTF-8 string, without Buffer. Byte-identical to
8
+ * `Buffer.from(value, "utf8").toString("base64")`, so deeplinks stay stable
9
+ * whether they are built at the Astro build (Node) or in the dashboard (browser).
10
+ */
11
+ export declare function base64Utf8(value: string): string;
12
+ /** The on-device MCP server entry, byte-identical to the committed plugin `.mcp.json`. */
13
+ export declare function localMcpServersJson(): {
14
+ mcpServers: {
15
+ spacefast: {
16
+ command: string;
17
+ args: ("mcp" | "spacefast" | "-y")[];
18
+ env: {};
19
+ };
20
+ };
21
+ };
22
+ /**
23
+ * VS Code's `.vscode/mcp.json` uses a top-level `servers` key (not the
24
+ * `mcpServers` key Cursor/Claude Code use), so it gets its own generator —
25
+ * single-sourced from the same command/args/package so it can never drift.
26
+ * See https://code.visualstudio.com/docs/agent-customization/mcp-servers.
27
+ */
28
+ export declare function vscodeMcpServersJson(): {
29
+ servers: {
30
+ spacefast: {
31
+ type: string;
32
+ command: string;
33
+ args: ("mcp" | "spacefast" | "-y")[];
34
+ };
35
+ };
36
+ };
37
+ export declare function cursorHostedMcpDeeplink(mcpEndpoint: string): string;
38
+ export declare function vscodeHostedMcpDeeplink(mcpEndpoint: string): string;
39
+ /**
40
+ * The hosted server entry for Claude Code's `.mcp.json`. Claude Code rejects a
41
+ * bare `{ url }` as invalid, so the entry carries `type: "http"` — byte-identical
42
+ * to the committed `plugins/claude-code/.mcp.json`.
43
+ */
44
+ export declare function hostedMcpServersJson(mcpEndpoint: string): {
45
+ mcpServers: {
46
+ spacefast: {
47
+ type: string;
48
+ url: string;
49
+ };
50
+ };
51
+ };
52
+ /**
53
+ * The hosted server entry for Cursor's `~/.cursor/mcp.json`. Cursor's known-good
54
+ * shape is a bare `{ url }` (no `type`) — matching the committed
55
+ * `plugins/cursor/.mcp.json`. Kept separate from the Claude Code generator
56
+ * rather than adding `type` everywhere, since `type: "http"` in Cursor's file is
57
+ * untested territory.
58
+ */
59
+ export declare function cursorHostedMcpServersJson(mcpEndpoint: string): {
60
+ mcpServers: {
61
+ spacefast: {
62
+ url: string;
63
+ };
64
+ };
65
+ };
66
+ /** The hosted server entry for VS Code's `.vscode/mcp.json` (`servers` + `type: http`). */
67
+ export declare function vscodeHostedMcpServersJson(mcpEndpoint: string): {
68
+ servers: {
69
+ spacefast: {
70
+ type: string;
71
+ url: string;
72
+ };
73
+ };
74
+ };
75
+ export declare function codexHostedMcpToml(mcpEndpoint: string): string;
76
+ export declare const CODEX_MCP_TOML: string;
77
+ /**
78
+ * Claude Code's one-command hosted-MCP connect (`claude mcp add`). Parameterized
79
+ * by the hosted endpoint so the dashboard can point it at the runtime-derived
80
+ * endpoint while the marketing site passes the prod constant.
81
+ */
82
+ export declare function buildClaudeMcpAddCommand(mcpEndpoint: string): string;
83
+ /**
84
+ * Codex's hosted-MCP connect. `codex mcp add` registers the server; OAuth is a
85
+ * separate `codex mcp login` step, so both are chained — a bare `add` leaves the
86
+ * connection unauthenticated and the tools 401.
87
+ */
88
+ export declare function buildCodexMcpAddCommand(mcpEndpoint: string): string;
89
+ export type ConnectCopyLanguage = "bash" | "json" | "toml" | "text";
90
+ export type ConnectCopy = Readonly<{
91
+ /** Short label for the affordance and the copied-value toast. */
92
+ label: string;
93
+ /** The string written to the clipboard. */
94
+ value: string;
95
+ language: ConnectCopyLanguage;
96
+ }>;
97
+ export type ConnectDeeplink = Readonly<{
98
+ href: string;
99
+ label: string;
100
+ }>;
101
+ /** A downloadable artifact that wires the agent (e.g. the Claude desktop extension). */
102
+ export type ConnectDownload = Readonly<{
103
+ href: string;
104
+ label: string;
105
+ }>;
106
+ /**
107
+ * A single connect card: one agent, one primary action (a one-click deeplink or
108
+ * a copy of the command/endpoint that wires it), plus an optional secondary
109
+ * "copy the client config file" affordance.
110
+ */
111
+ export declare const CONNECT_TARGET_IDS: readonly ["claude-code", "cursor", "vscode", "codex", "claude", "chatgpt"];
112
+ export type ConnectTargetId = (typeof CONNECT_TARGET_IDS)[number];
113
+ export type ConnectTarget = Readonly<{
114
+ id: ConnectTargetId;
115
+ name: string;
116
+ /** One short line on how this agent connects. */
117
+ blurb: string;
118
+ /** One-click URL-scheme install, when the client supports one. */
119
+ deeplink?: ConnectDeeplink;
120
+ /** The primary copy action when there is no deeplink (command or endpoint). */
121
+ primary?: ConnectCopy;
122
+ /** Secondary copy-the-config affordance (the client's MCP config file). */
123
+ config?: ConnectCopy;
124
+ /** A downloadable installer for clients that ship one (Claude Desktop). */
125
+ download?: ConnectDownload;
126
+ }>;
127
+ /**
128
+ * The per-agent connect catalog, parameterized by the hosted MCP endpoint.
129
+ * Every one-click and copy-config path carries the hosted endpoint (OAuth,
130
+ * nothing to install); on-device stdio is the CLI users' alternative and
131
+ * lives in the docs/marketing setup lanes, not here.
132
+ */
133
+ export declare function buildConnectTargets({ mcpEndpoint }: {
134
+ mcpEndpoint: string;
135
+ }): ConnectTarget[];
136
+ export declare function getConnectTarget(id: ConnectTargetId, options: {
137
+ mcpEndpoint: string;
138
+ }): ConnectTarget;
@@ -0,0 +1,243 @@
1
+ /*
2
+ * Shared, browser-safe agent connect catalog.
3
+ *
4
+ * One source of truth for "add Spacefast to your agent": the MCP launch config,
5
+ * the one-click deeplinks, and the per-agent connect entries. Both the marketing
6
+ * site (apps/www/src/lib/llmo.ts + agent-targets.ts, with the hardcoded prod
7
+ * endpoint) and the dashboard (apps/my /account/agents, with the runtime-derived
8
+ * hosted endpoint) consume these, so every "connect an agent" surface advertises
9
+ * the identical command, package, and config — they can never drift apart.
10
+ *
11
+ * ISOMORPHIC ON PURPOSE: no Buffer, no process, no Node-only APIs. The dashboard
12
+ * renders this in the browser, so base64 goes through TextEncoder + btoa (both
13
+ * standard in browsers, Node 16+, and Bun) rather than Buffer.
14
+ */
15
+ import { spacefastClaudePluginAddCommand, spacefastClaudePluginInstallCommand, spacefastCodexPluginAddCommand, spacefastCodexPluginInstallCommand, } from "../docs/skill-distribution.js";
16
+ export const LOCAL_MCP_PACKAGE = "spacefast";
17
+ export const LOCAL_MCP_COMMAND = "npx";
18
+ export const LOCAL_MCP_ARGS = ["-y", LOCAL_MCP_PACKAGE, "mcp"];
19
+ /** The copy-paste one-liner form, e.g. `npx -y spacefast mcp`. */
20
+ export const LOCAL_MCP_COMMAND_LINE = `${LOCAL_MCP_COMMAND} ${LOCAL_MCP_ARGS.join(" ")}`;
21
+ /**
22
+ * base64 of a UTF-8 string, without Buffer. Byte-identical to
23
+ * `Buffer.from(value, "utf8").toString("base64")`, so deeplinks stay stable
24
+ * whether they are built at the Astro build (Node) or in the dashboard (browser).
25
+ */
26
+ export function base64Utf8(value) {
27
+ const bytes = new TextEncoder().encode(value);
28
+ let binary = "";
29
+ for (const byte of bytes) {
30
+ binary += String.fromCharCode(byte);
31
+ }
32
+ return btoa(binary);
33
+ }
34
+ /** The on-device MCP server entry, byte-identical to the committed plugin `.mcp.json`. */
35
+ export function localMcpServersJson() {
36
+ return {
37
+ mcpServers: {
38
+ [LOCAL_MCP_PACKAGE]: {
39
+ command: LOCAL_MCP_COMMAND,
40
+ args: [...LOCAL_MCP_ARGS],
41
+ env: {},
42
+ },
43
+ },
44
+ };
45
+ }
46
+ /**
47
+ * VS Code's `.vscode/mcp.json` uses a top-level `servers` key (not the
48
+ * `mcpServers` key Cursor/Claude Code use), so it gets its own generator —
49
+ * single-sourced from the same command/args/package so it can never drift.
50
+ * See https://code.visualstudio.com/docs/agent-customization/mcp-servers.
51
+ */
52
+ export function vscodeMcpServersJson() {
53
+ return {
54
+ servers: {
55
+ [LOCAL_MCP_PACKAGE]: {
56
+ type: "stdio",
57
+ command: LOCAL_MCP_COMMAND,
58
+ args: [...LOCAL_MCP_ARGS],
59
+ },
60
+ },
61
+ };
62
+ }
63
+ /*
64
+ * ONE-CLICK PATHS ARE ALWAYS HOSTED. Policy: hosted MCP for cloud agents,
65
+ * on-device for local ones — but a one-click install must never depend on the
66
+ * user having npm/npx. The hosted URL server needs no runtime at all (the
67
+ * client speaks HTTP + OAuth), so every deeplink and every primary action
68
+ * carries the hosted endpoint. On-device stdio (`npx -y spacefast mcp`) stays
69
+ * available as the explicitly-labeled alternative for people who run the CLI —
70
+ * their environment already provides npx.
71
+ */
72
+ // Cursor one-click MCP install link — the canonical form Cursor's own directory
73
+ // badges emit is the HTTPS web link (`https://cursor.com/install-mcp`), which
74
+ // renders as a normal anchor everywhere; the `cursor://` scheme still works but
75
+ // isn't what Cursor advertises. The inner config is the hosted URL entry
76
+ // (base64-encoded); Cursor handles the OAuth dance itself.
77
+ export function cursorHostedMcpDeeplink(mcpEndpoint) {
78
+ return `https://cursor.com/install-mcp?name=${LOCAL_MCP_PACKAGE}&config=${encodeURIComponent(base64Utf8(JSON.stringify({ url: mcpEndpoint })))}`;
79
+ }
80
+ // VS Code one-click MCP install link — the HTTPS redirect service GitHub's
81
+ // install badges use, which works for stable VS Code (not just Insiders). The
82
+ // config is the server object WITHOUT the name (name is the query param), and
83
+ // `type: "http"` is mandatory — VS Code treats a bare `url` as a stdio command
84
+ // and fails confusingly.
85
+ export function vscodeHostedMcpDeeplink(mcpEndpoint) {
86
+ return `https://insiders.vscode.dev/redirect/mcp/install?name=${LOCAL_MCP_PACKAGE}&config=${encodeURIComponent(JSON.stringify({ type: "http", url: mcpEndpoint }))}`;
87
+ }
88
+ /**
89
+ * The hosted server entry for Claude Code's `.mcp.json`. Claude Code rejects a
90
+ * bare `{ url }` as invalid, so the entry carries `type: "http"` — byte-identical
91
+ * to the committed `plugins/claude-code/.mcp.json`.
92
+ */
93
+ export function hostedMcpServersJson(mcpEndpoint) {
94
+ return {
95
+ mcpServers: {
96
+ [LOCAL_MCP_PACKAGE]: { type: "http", url: mcpEndpoint },
97
+ },
98
+ };
99
+ }
100
+ /**
101
+ * The hosted server entry for Cursor's `~/.cursor/mcp.json`. Cursor's known-good
102
+ * shape is a bare `{ url }` (no `type`) — matching the committed
103
+ * `plugins/cursor/.mcp.json`. Kept separate from the Claude Code generator
104
+ * rather than adding `type` everywhere, since `type: "http"` in Cursor's file is
105
+ * untested territory.
106
+ */
107
+ export function cursorHostedMcpServersJson(mcpEndpoint) {
108
+ return {
109
+ mcpServers: {
110
+ [LOCAL_MCP_PACKAGE]: { url: mcpEndpoint },
111
+ },
112
+ };
113
+ }
114
+ /** The hosted server entry for VS Code's `.vscode/mcp.json` (`servers` + `type: http`). */
115
+ export function vscodeHostedMcpServersJson(mcpEndpoint) {
116
+ return {
117
+ servers: {
118
+ [LOCAL_MCP_PACKAGE]: { type: "http", url: mcpEndpoint },
119
+ },
120
+ };
121
+ }
122
+ // Codex reads MCP servers from `~/.codex/config.toml`; the hosted entry is a
123
+ // bare streamable-HTTP url (same lane the committed codex plugin ships).
124
+ export function codexHostedMcpToml(mcpEndpoint) {
125
+ return [`[mcp_servers.${LOCAL_MCP_PACKAGE}]`, `url = ${JSON.stringify(mcpEndpoint)}`].join("\n");
126
+ }
127
+ // The on-device stdio TOML, for CLI users whose environment provides npx.
128
+ export const CODEX_MCP_TOML = [
129
+ `[mcp_servers.${LOCAL_MCP_PACKAGE}]`,
130
+ `command = ${JSON.stringify(LOCAL_MCP_COMMAND)}`,
131
+ `args = [${LOCAL_MCP_ARGS.map((arg) => JSON.stringify(arg)).join(", ")}]`,
132
+ ].join("\n");
133
+ /**
134
+ * Claude Code's one-command hosted-MCP connect (`claude mcp add`). Parameterized
135
+ * by the hosted endpoint so the dashboard can point it at the runtime-derived
136
+ * endpoint while the marketing site passes the prod constant.
137
+ */
138
+ export function buildClaudeMcpAddCommand(mcpEndpoint) {
139
+ return `claude mcp add --transport http ${LOCAL_MCP_PACKAGE} ${mcpEndpoint}`;
140
+ }
141
+ /**
142
+ * Codex's hosted-MCP connect. `codex mcp add` registers the server; OAuth is a
143
+ * separate `codex mcp login` step, so both are chained — a bare `add` leaves the
144
+ * connection unauthenticated and the tools 401.
145
+ */
146
+ export function buildCodexMcpAddCommand(mcpEndpoint) {
147
+ return `codex mcp add ${LOCAL_MCP_PACKAGE} --url ${mcpEndpoint} && codex mcp login ${LOCAL_MCP_PACKAGE}`;
148
+ }
149
+ /**
150
+ * A single connect card: one agent, one primary action (a one-click deeplink or
151
+ * a copy of the command/endpoint that wires it), plus an optional secondary
152
+ * "copy the client config file" affordance.
153
+ */
154
+ export const CONNECT_TARGET_IDS = [
155
+ "claude-code",
156
+ "cursor",
157
+ "vscode",
158
+ "codex",
159
+ "claude",
160
+ "chatgpt",
161
+ ];
162
+ /**
163
+ * The per-agent connect catalog, parameterized by the hosted MCP endpoint.
164
+ * Every one-click and copy-config path carries the hosted endpoint (OAuth,
165
+ * nothing to install); on-device stdio is the CLI users' alternative and
166
+ * lives in the docs/marketing setup lanes, not here.
167
+ */
168
+ export function buildConnectTargets({ mcpEndpoint }) {
169
+ const cursorConfigJson = JSON.stringify(cursorHostedMcpServersJson(mcpEndpoint), null, 2);
170
+ const vscodeHostedConfigJson = JSON.stringify(vscodeHostedMcpServersJson(mcpEndpoint), null, 2);
171
+ return [
172
+ {
173
+ // The plugin is the recommended lane for CLI agents that support one:
174
+ // one paste ships the publish skill AND the MCP servers (hosted primary)
175
+ // and stays updated through the marketplace. `claude mcp add` remains
176
+ // the minimal MCP-only path in the config slot and on /agents.
177
+ id: "claude-code",
178
+ name: "Claude Code",
179
+ blurb: "One paste installs the plugin: publish skill plus MCP, updated from the marketplace.",
180
+ primary: {
181
+ label: "Install plugin",
182
+ value: `${spacefastClaudePluginAddCommand} && ${spacefastClaudePluginInstallCommand}`,
183
+ language: "bash",
184
+ },
185
+ config: {
186
+ label: "MCP only: claude mcp add",
187
+ value: buildClaudeMcpAddCommand(mcpEndpoint),
188
+ language: "bash",
189
+ },
190
+ },
191
+ {
192
+ id: "cursor",
193
+ name: "Cursor",
194
+ blurb: "One click adds hosted MCP. OAuth sign-in, nothing to install.",
195
+ deeplink: { href: cursorHostedMcpDeeplink(mcpEndpoint), label: "Add to Cursor" },
196
+ config: { label: "~/.cursor/mcp.json", value: cursorConfigJson, language: "json" },
197
+ },
198
+ {
199
+ id: "vscode",
200
+ name: "VS Code",
201
+ blurb: "One click adds hosted MCP for Copilot agent mode.",
202
+ deeplink: { href: vscodeHostedMcpDeeplink(mcpEndpoint), label: "Add to VS Code" },
203
+ config: { label: ".vscode/mcp.json", value: vscodeHostedConfigJson, language: "json" },
204
+ },
205
+ {
206
+ id: "codex",
207
+ name: "Codex",
208
+ blurb: "One paste installs the plugin: publish skill plus MCP, updated from the marketplace.",
209
+ primary: {
210
+ label: "Install plugin",
211
+ value: `${spacefastCodexPluginAddCommand} && ${spacefastCodexPluginInstallCommand}`,
212
+ language: "bash",
213
+ },
214
+ config: {
215
+ label: "MCP only: codex mcp add",
216
+ value: buildCodexMcpAddCommand(mcpEndpoint),
217
+ language: "bash",
218
+ },
219
+ },
220
+ {
221
+ id: "claude",
222
+ name: "Claude",
223
+ blurb: "Settings → Connectors → Add custom connector, paste this endpoint. Or grab the desktop extension.",
224
+ primary: { label: "MCP endpoint", value: mcpEndpoint, language: "text" },
225
+ download: {
226
+ href: "https://github.com/spacefast/plugins/releases/latest/download/claude-desktop.mcpb",
227
+ label: "Download desktop extension",
228
+ },
229
+ },
230
+ {
231
+ id: "chatgpt",
232
+ name: "ChatGPT",
233
+ blurb: "Turn on Developer mode (Settings → Apps & Connectors → Advanced), then Connectors → Create with this endpoint.",
234
+ primary: { label: "MCP endpoint", value: mcpEndpoint, language: "text" },
235
+ },
236
+ ];
237
+ }
238
+ export function getConnectTarget(id, options) {
239
+ const target = buildConnectTargets(options).find((entry) => entry.id === id);
240
+ if (!target)
241
+ throw new TypeError(`Unknown agent target: ${id}`);
242
+ return target;
243
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Build-only SVG serialization for the canonical Spacefast brand geometry.
3
+ *
4
+ * Browser and application modules must import `@spacefast/common/brand-assets`
5
+ * and render ordinary SVG markup from its constants. Only asset generators,
6
+ * plugin packaging, and other build steps may import this module.
7
+ */
8
+ import { type SpacefastBrandColors } from "./brand-assets.js";
9
+ export type WordmarkSvgOptions = {
10
+ ariaLabel?: string;
11
+ colors?: Partial<SpacefastBrandColors>;
12
+ height?: number;
13
+ width?: number;
14
+ };
15
+ export type IconSvgOptions = {
16
+ ariaLabel?: string;
17
+ colors?: Partial<SpacefastBrandColors>;
18
+ size?: number;
19
+ };
20
+ export type FaviconSvgOptions = {
21
+ ariaLabel?: string;
22
+ theme?: "adaptive" | "dark" | "light";
23
+ };
24
+ export declare function spacefastWordmarkSvg(options?: WordmarkSvgOptions): string;
25
+ export declare function spacefastIconSvg(options?: IconSvgOptions): string;
26
+ export declare function spacefastFaviconSvg(options?: FaviconSvgOptions): string;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Build-only SVG serialization for the canonical Spacefast brand geometry.
3
+ *
4
+ * Browser and application modules must import `@spacefast/common/brand-assets`
5
+ * and render ordinary SVG markup from its constants. Only asset generators,
6
+ * plugin packaging, and other build steps may import this module.
7
+ */
8
+ import { SPACEFAST_BRAND_COLORS, SPACEFAST_ICON_F_OFFSET_X, SPACEFAST_ICON_F_PATH, SPACEFAST_ICON_LETTER_ORIGIN, SPACEFAST_ICON_LETTER_SCALE, SPACEFAST_ICON_S_PATH, SPACEFAST_ICON_SHADOW_OFFSET, SPACEFAST_ICON_VIEW_BOX, SPACEFAST_WORDMARK_PATH, SPACEFAST_WORDMARK_PLATE, SPACEFAST_WORDMARK_SHADOW_OFFSET, SPACEFAST_WORDMARK_VIEW_BOX, } from "./brand-assets.js";
9
+ function resolvedColors(colors) {
10
+ return { ...SPACEFAST_BRAND_COLORS, ...colors };
11
+ }
12
+ function svgAttribute(value) {
13
+ return value
14
+ .replaceAll("&", "&amp;")
15
+ .replaceAll('"', "&quot;")
16
+ .replaceAll("<", "&lt;")
17
+ .replaceAll(">", "&gt;");
18
+ }
19
+ function numericAttribute(name, value) {
20
+ if (value === undefined)
21
+ return "";
22
+ if (!Number.isFinite(value) || value <= 0) {
23
+ throw new RangeError(`${name} must be a positive finite number`);
24
+ }
25
+ return ` ${name}="${value}"`;
26
+ }
27
+ export function spacefastWordmarkSvg(options = {}) {
28
+ const colors = resolvedColors(options.colors);
29
+ const plate = SPACEFAST_WORDMARK_PLATE;
30
+ const shadow = SPACEFAST_WORDMARK_SHADOW_OFFSET;
31
+ const label = svgAttribute(options.ariaLabel ?? "Spacefast");
32
+ return `<svg xmlns="http://www.w3.org/2000/svg"${numericAttribute("width", options.width)}${numericAttribute("height", options.height)} viewBox="${SPACEFAST_WORDMARK_VIEW_BOX}" role="img" aria-label="${label}">
33
+ <rect x="${plate.x + shadow.x}" y="${plate.y + shadow.y}" width="${plate.width}" height="${plate.height}" fill="${svgAttribute(colors.shadow)}"/>
34
+ <rect x="${plate.x}" y="${plate.y}" width="${plate.width}" height="${plate.height}" fill="${svgAttribute(colors.plate)}" stroke="${svgAttribute(colors.plate)}" stroke-width="1"/>
35
+ <path fill="${svgAttribute(colors.paper)}" d="${SPACEFAST_WORDMARK_PATH}"/>
36
+ </svg>
37
+ `;
38
+ }
39
+ function iconLetters(fill, x, y, scale = SPACEFAST_ICON_LETTER_SCALE, className) {
40
+ const classAttribute = className ? ` class="${svgAttribute(className)}"` : "";
41
+ return `<g${classAttribute} transform="translate(${x} ${y}) scale(${scale})" fill="${svgAttribute(fill)}">
42
+ <path d="${SPACEFAST_ICON_S_PATH}"/>
43
+ <path d="${SPACEFAST_ICON_F_PATH}" transform="translate(${SPACEFAST_ICON_F_OFFSET_X} 0)"/>
44
+ </g>`;
45
+ }
46
+ export function spacefastIconSvg(options = {}) {
47
+ const colors = resolvedColors(options.colors);
48
+ const origin = SPACEFAST_ICON_LETTER_ORIGIN;
49
+ const shadow = SPACEFAST_ICON_SHADOW_OFFSET;
50
+ const label = svgAttribute(options.ariaLabel ?? "Spacefast");
51
+ const size = numericAttribute("width", options.size) + numericAttribute("height", options.size);
52
+ return `<svg xmlns="http://www.w3.org/2000/svg"${size} viewBox="${SPACEFAST_ICON_VIEW_BOX}" role="img" aria-label="${label}">
53
+ <rect width="160" height="160" fill="${svgAttribute(colors.plate)}"/>
54
+ <g transform="rotate(-1 80 80)">
55
+ ${iconLetters(colors.shadow, origin.x + shadow.x, origin.y + shadow.y)}
56
+ ${iconLetters(colors.paper, origin.x, origin.y)}
57
+ </g>
58
+ </svg>
59
+ `;
60
+ }
61
+ export function spacefastFaviconSvg(options = {}) {
62
+ const theme = options.theme ?? "adaptive";
63
+ const label = svgAttribute(options.ariaLabel ?? "Spacefast");
64
+ const primary = theme === "dark" ? SPACEFAST_BRAND_COLORS.paper : SPACEFAST_BRAND_COLORS.plate;
65
+ const adaptiveStyles = theme === "adaptive"
66
+ ? `
67
+ <style>
68
+ .sf-favicon-primary { fill: ${SPACEFAST_BRAND_COLORS.plate}; }
69
+ @media (prefers-color-scheme: dark) { .sf-favicon-primary { fill: ${SPACEFAST_BRAND_COLORS.paper}; } }
70
+ </style>`
71
+ : "";
72
+ const origin = { x: 17.5, y: 43 };
73
+ const scale = 2.15;
74
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${SPACEFAST_ICON_VIEW_BOX}" role="img" aria-label="${label}">${adaptiveStyles}
75
+ <g transform="rotate(-1 80 80)">
76
+ ${iconLetters(SPACEFAST_BRAND_COLORS.shadow, origin.x + 5, origin.y + 5, scale)}
77
+ ${iconLetters(primary, origin.x, origin.y, scale, "sf-favicon-primary")}
78
+ </g>
79
+ </svg>
80
+ `;
81
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Canonical Spacefast visual geometry.
3
+ *
4
+ * Keep this module dependency-free: React, Astro, build scripts, social-card
5
+ * renderers, and plugin generators all consume it. Generated SVG/PNG files are
6
+ * build outputs of these constants, never independent sources of truth.
7
+ */
8
+ export declare const SPACEFAST_BRAND_COLORS: {
9
+ readonly shadow: "#ff4217";
10
+ readonly plate: "#141419";
11
+ readonly paper: "#fbf8f1";
12
+ };
13
+ export type SpacefastBrandColors = {
14
+ shadow: string;
15
+ plate: string;
16
+ paper: string;
17
+ };
18
+ export declare const SPACEFAST_WORDMARK_VIEW_BOX = "0 0 326 62";
19
+ export declare const SPACEFAST_WORDMARK_PLATE: {
20
+ readonly x: 10;
21
+ readonly y: 8;
22
+ readonly width: 306;
23
+ readonly height: 48;
24
+ };
25
+ export declare const SPACEFAST_WORDMARK_SHADOW_OFFSET: {
26
+ readonly x: 4;
27
+ readonly y: 4;
28
+ };
29
+ export declare const SPACEFAST_WORDMARK_PATH = "M20 15h24v7H27v7h17v20H20v-7h17v-7H20V15ZM51 15h24v18H58v16h-7V15Zm7 11h10v-4H58v4ZM83 15h24l9 34h-8l-2-8H84l-2 8h-8l9-34Zm3 19h18l-4-12H90l-4 12ZM145 22h-19v20h19v7h-26V15h26v7ZM152 15h26v7h-19v6h15v7h-15v7h19v7h-26V15ZM185 15h25v7h-18v6h15v7h-15v14h-7V15ZM215 15h24l9 34h-8l-2-8h-22l-2 8h-8l9-34Zm3 19h18l-4-12h-10l-4 12ZM250 15h24v7h-17v7h17v20h-24v-7h17v-7h-17V15ZM279 15h27v7h-10v27h-7V22h-10v-7Z";
30
+ export declare const SPACEFAST_ICON_VIEW_BOX = "0 0 160 160";
31
+ export declare const SPACEFAST_ICON_S_PATH = "M0 0h24v7H7v7h17v20H0v-7h17v-7H0V0Z";
32
+ export declare const SPACEFAST_ICON_F_PATH = "M0 0h25v7H7v6h15v7H7v14H0V0Z";
33
+ export declare const SPACEFAST_ICON_LETTER_ORIGIN: {
34
+ readonly x: 34.75;
35
+ readonly y: 50.5;
36
+ };
37
+ export declare const SPACEFAST_ICON_LETTER_SCALE = 1.5;
38
+ export declare const SPACEFAST_ICON_F_OFFSET_X = 31;
39
+ export declare const SPACEFAST_ICON_SHADOW_OFFSET: {
40
+ readonly x: 5;
41
+ readonly y: 5;
42
+ };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Canonical Spacefast visual geometry.
3
+ *
4
+ * Keep this module dependency-free: React, Astro, build scripts, social-card
5
+ * renderers, and plugin generators all consume it. Generated SVG/PNG files are
6
+ * build outputs of these constants, never independent sources of truth.
7
+ */
8
+ export const SPACEFAST_BRAND_COLORS = {
9
+ shadow: "#ff4217",
10
+ plate: "#141419",
11
+ paper: "#fbf8f1",
12
+ };
13
+ export const SPACEFAST_WORDMARK_VIEW_BOX = "0 0 326 62";
14
+ export const SPACEFAST_WORDMARK_PLATE = {
15
+ x: 10,
16
+ y: 8,
17
+ width: 306,
18
+ height: 48,
19
+ };
20
+ export const SPACEFAST_WORDMARK_SHADOW_OFFSET = { x: 4, y: 4 };
21
+ // Re-kerned and vertically centered on the plate. This is a literal so browser
22
+ // consumers render ordinary SVG markup without assembling path text at runtime.
23
+ export const SPACEFAST_WORDMARK_PATH = "M20 15h24v7H27v7h17v20H20v-7h17v-7H20V15ZM51 15h24v18H58v16h-7V15Zm7 11h10v-4H58v4ZM83 15h24l9 34h-8l-2-8H84l-2 8h-8l9-34Zm3 19h18l-4-12H90l-4 12ZM145 22h-19v20h19v7h-26V15h26v7ZM152 15h26v7h-19v6h15v7h-15v7h19v7h-26V15ZM185 15h25v7h-18v6h15v7h-15v14h-7V15ZM215 15h24l9 34h-8l-2-8h-22l-2 8h-8l9-34Zm3 19h18l-4-12h-10l-4 12ZM250 15h24v7h-17v7h17v20h-24v-7h17v-7h-17V15ZM279 15h27v7h-10v27h-7V22h-10v-7Z";
24
+ export const SPACEFAST_ICON_VIEW_BOX = "0 0 160 160";
25
+ export const SPACEFAST_ICON_S_PATH = "M0 0h24v7H7v7h17v20H0v-7h17v-7H0V0Z";
26
+ export const SPACEFAST_ICON_F_PATH = "M0 0h25v7H7v6h15v7H7v14H0V0Z";
27
+ export const SPACEFAST_ICON_LETTER_ORIGIN = { x: 34.75, y: 50.5 };
28
+ export const SPACEFAST_ICON_LETTER_SCALE = 1.5;
29
+ export const SPACEFAST_ICON_F_OFFSET_X = 31;
30
+ export const SPACEFAST_ICON_SHADOW_OFFSET = { x: 5, y: 5 };
package/dist/brand.d.ts CHANGED
@@ -13,3 +13,4 @@ export declare const BRAND: {
13
13
  readonly managementHostnameApex: "view.fast";
14
14
  };
15
15
  export declare const ERROR_DOCS_BASE_URL: `${string}/docs/errors`;
16
+ export declare const GITHUB_CHECK_RUN_NAME: "Spacefast Builds";
package/dist/brand.js CHANGED
@@ -22,3 +22,8 @@ export const BRAND = {
22
22
  // plan: `${websiteOrigin}/docs/errors/{code}` forever). Lives next to the
23
23
  // brand origin it derives from; `error-codes.ts` consumes it.
24
24
  export const ERROR_DOCS_BASE_URL = `${BRAND.websiteOrigin}/docs/errors`;
25
+ // The GitHub check-run name every build reports under. One constant because the
26
+ // create and update paths live in different modules and drifted once
27
+ // ("Stattic" vs "Spacefast") — GitHub keys check runs by name, so a mismatch
28
+ // shows two orphaned checks per commit.
29
+ export const GITHUB_CHECK_RUN_NAME = `${BRAND.productName} Builds`;
@@ -12,14 +12,20 @@ export type EnvDomains = {
12
12
  /** Fully-qualified hostname per service. */
13
13
  readonly hosts: Readonly<Record<Service, string>>;
14
14
  };
15
- /** The full domain map for an environment. */
16
- export declare function domainsFor(env: DeployEnv): EnvDomains;
15
+ /** The production apex. Everything else about prod derives from this string. */
16
+ export declare const PROD_ENV_DOMAIN: "spacefast.com";
17
+ /** The local-dev apex (portless serves every subdomain over HTTPS). */
18
+ export declare const DEV_ENV_DOMAIN: "sf.localhost";
19
+ /**
20
+ * Construct the full per-service host map from a single env domain
21
+ * (`spacefast.com`, `sf.localhost`, …). One knob — services are always
22
+ * `<service>.<domain>` over https, with two deliberate exceptions:
23
+ * the marketing site sits on the bare prod apex, and the internal handbook
24
+ * lives on the view.fast infra apex in prod.
25
+ */
26
+ export declare function envDomainsFor(domain: string): EnvDomains;
17
27
  /** Origin (scheme + host, no trailing slash) for a service in an environment. */
18
28
  export declare function serviceOrigin(service: Service, env: DeployEnv): string;
19
- /** Cookie domain that scopes auth across all subdomains of an environment. */
20
- export declare function cookieDomainFor(env: DeployEnv): string;
21
- /** Domain Search Terminal (Fly.io); its web redirects to spacefast.com/domains. */
22
- export declare const FAST_DOMAIN_SEARCH_APEX: "fastdomainsearch.com";
23
29
  /** Atomic infrastructure apex used for public managed/custom domains. */
24
30
  export declare const VIEW_FAST_APEX: "view.fast";
25
31
  /** Apex for default space hostnames: `{hostLabel}.view.fast`. */