@spacefast/common 0.0.13 → 0.0.18

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 (154) hide show
  1. package/dist/agents/client-registry.d.ts +22 -0
  2. package/dist/agents/client-registry.js +41 -0
  3. package/dist/agents/connect-targets.d.ts +51 -6
  4. package/dist/agents/connect-targets.js +93 -28
  5. package/dist/brand.d.ts +0 -11
  6. package/dist/brand.js +0 -20
  7. package/dist/config/domains.d.ts +15 -6
  8. package/dist/config/domains.js +24 -10
  9. package/dist/config/postgres-budget.d.ts +3 -0
  10. package/dist/config/postgres-budget.js +6 -1
  11. package/dist/config/postgres-budget.json +2 -1
  12. package/dist/contracts/abuse.js +1 -1
  13. package/dist/contracts/access.d.ts +149 -44
  14. package/dist/contracts/access.js +94 -8
  15. package/dist/contracts/activity.js +5 -1
  16. package/dist/contracts/api-keys.js +9 -9
  17. package/dist/contracts/archives.js +11 -11
  18. package/dist/contracts/beta.js +1 -1
  19. package/dist/contracts/builds.js +14 -14
  20. package/dist/contracts/channels.js +2 -2
  21. package/dist/contracts/comments.d.ts +86 -15
  22. package/dist/contracts/comments.js +116 -20
  23. package/dist/contracts/common.d.ts +12 -12
  24. package/dist/contracts/common.js +33 -30
  25. package/dist/contracts/continuation.js +5 -5
  26. package/dist/contracts/data-source-routes.js +1 -1
  27. package/dist/contracts/device-auth.d.ts +6 -6
  28. package/dist/contracts/device-auth.js +12 -12
  29. package/dist/contracts/docs.d.ts +10 -10
  30. package/dist/contracts/domains.js +39 -33
  31. package/dist/contracts/enums.d.ts +2 -10
  32. package/dist/contracts/enums.js +0 -2
  33. package/dist/contracts/error-code-meta.d.ts +116 -47
  34. package/dist/contracts/error-code-meta.js +37 -16
  35. package/dist/contracts/error-codes.d.ts +7 -4
  36. package/dist/contracts/error-codes.js +46 -21
  37. package/dist/contracts/events.d.ts +10 -3
  38. package/dist/contracts/events.js +33 -5
  39. package/dist/contracts/execution.d.ts +26 -0
  40. package/dist/contracts/execution.js +21 -0
  41. package/dist/contracts/feature-lifecycle.d.ts +21 -24
  42. package/dist/contracts/feature-lifecycle.js +28 -26
  43. package/dist/contracts/features.js +4 -4
  44. package/dist/contracts/functions.d.ts +8 -140
  45. package/dist/contracts/functions.js +9 -19
  46. package/dist/contracts/git.d.ts +1 -1
  47. package/dist/contracts/grants.d.ts +96 -79
  48. package/dist/contracts/grants.js +130 -43
  49. package/dist/contracts/ids.d.ts +2 -2
  50. package/dist/contracts/ids.js +2 -4
  51. package/dist/contracts/internal.js +2 -2
  52. package/dist/contracts/mcp.d.ts +17 -556
  53. package/dist/contracts/mcp.js +9 -103
  54. package/dist/contracts/me.js +3 -4
  55. package/dist/contracts/notifications.d.ts +108 -0
  56. package/dist/contracts/notifications.js +54 -0
  57. package/dist/contracts/oauth-resources.d.ts +18 -1
  58. package/dist/contracts/oauth-resources.js +22 -2
  59. package/dist/contracts/operations.d.ts +2 -50
  60. package/dist/contracts/operations.js +0 -19
  61. package/dist/contracts/pages.d.ts +8 -4
  62. package/dist/contracts/pages.js +16 -3
  63. package/dist/contracts/platform.js +10 -8
  64. package/dist/contracts/problem-document.d.ts +14 -0
  65. package/dist/contracts/problem-document.js +35 -0
  66. package/dist/contracts/push-new.d.ts +21 -6
  67. package/dist/contracts/push-new.js +3 -7
  68. package/dist/contracts/resources.d.ts +8 -7
  69. package/dist/contracts/resources.js +9 -6
  70. package/dist/contracts/runtime-api.d.ts +162 -92
  71. package/dist/contracts/runtime-api.js +99 -27
  72. package/dist/contracts/runtime-app.d.ts +41 -11
  73. package/dist/contracts/runtime-app.js +22 -1
  74. package/dist/contracts/runtime-db.d.ts +424 -0
  75. package/dist/contracts/runtime-db.js +108 -0
  76. package/dist/contracts/runtime-storage.d.ts +120 -0
  77. package/dist/contracts/runtime-storage.js +40 -0
  78. package/dist/contracts/sf-config-v1.d.ts +49 -1
  79. package/dist/contracts/sf-config-v1.js +2 -2
  80. package/dist/contracts/sites.d.ts +1 -0
  81. package/dist/contracts/sites.js +20 -12
  82. package/dist/contracts/space-config.d.ts +62 -22
  83. package/dist/contracts/space-config.js +173 -47
  84. package/dist/contracts/spaces.d.ts +79 -45
  85. package/dist/contracts/spaces.js +66 -50
  86. package/dist/contracts/superadmin-spaces.d.ts +13 -2
  87. package/dist/contracts/superadmin-spaces.js +15 -0
  88. package/dist/contracts/superadmin-tenants.js +4 -4
  89. package/dist/contracts/superadmin.d.ts +4 -0
  90. package/dist/contracts/superadmin.js +14 -1
  91. package/dist/contracts/tags.d.ts +17 -17
  92. package/dist/contracts/tags.js +1 -1
  93. package/dist/contracts/teams.js +25 -16
  94. package/dist/contracts/theme-json.js +1 -1
  95. package/dist/contracts/transfers.js +4 -4
  96. package/dist/contracts/variables.js +3 -3
  97. package/dist/contracts/zero.d.ts +204 -338
  98. package/dist/contracts/zero.js +94 -98
  99. package/dist/dashboard-paths/index.d.ts +16 -1
  100. package/dist/dashboard-paths/index.js +18 -0
  101. package/dist/docs/agent-handoff-document.d.ts +2 -2
  102. package/dist/docs/agent-handoff-document.js +8 -7
  103. package/dist/docs/agent-prose.d.ts +22 -3
  104. package/dist/docs/agent-prose.js +221 -51
  105. package/dist/docs/agent-setup.d.ts +13 -10
  106. package/dist/docs/agent-setup.js +279 -53
  107. package/dist/docs/agent-solutions.d.ts +6 -6
  108. package/dist/docs/agent-solutions.js +23 -21
  109. package/dist/docs/catalog.d.ts +29 -74
  110. package/dist/docs/catalog.js +65 -92
  111. package/dist/docs/error-docs.js +293 -221
  112. package/dist/docs/skill-distribution.d.ts +2 -0
  113. package/dist/docs/skill-distribution.js +7 -4
  114. package/dist/docs/skills.d.ts +546 -0
  115. package/dist/docs/skills.js +340 -0
  116. package/dist/utils/browser-credential.d.ts +19 -0
  117. package/dist/utils/browser-credential.js +62 -0
  118. package/dist/utils/comment-avatars.d.ts +7 -0
  119. package/dist/utils/comment-avatars.js +42 -0
  120. package/dist/utils/content-type.d.ts +3 -3
  121. package/dist/utils/content-type.js +38 -61
  122. package/dist/utils/domain-diagnostics.d.ts +5 -5
  123. package/dist/utils/domain-diagnostics.js +21 -10
  124. package/dist/utils/local-space-state.d.ts +78 -4
  125. package/dist/utils/local-space-state.js +383 -82
  126. package/dist/utils/one-shot-replay.d.ts +14 -0
  127. package/dist/utils/one-shot-replay.js +21 -0
  128. package/dist/utils/page-preview.d.ts +7 -0
  129. package/dist/utils/page-preview.js +9 -0
  130. package/dist/utils/pages.d.ts +2 -11
  131. package/dist/utils/pages.js +58 -14
  132. package/dist/utils/publish-form-data.d.ts +22 -0
  133. package/dist/utils/publish-form-data.js +26 -0
  134. package/dist/utils/publish-policy.js +20 -4
  135. package/dist/utils/query-keys.d.ts +7 -4
  136. package/dist/utils/query-keys.js +13 -4
  137. package/dist/utils/runtime-paths.d.ts +3 -0
  138. package/dist/utils/runtime-paths.js +7 -0
  139. package/dist/utils/secure-local-file.d.ts +73 -0
  140. package/dist/utils/secure-local-file.js +1373 -0
  141. package/dist/utils/space-config.d.ts +13 -4
  142. package/dist/utils/space-config.js +123 -15
  143. package/dist/utils/storage-policy.d.ts +20 -0
  144. package/dist/utils/storage-policy.fixtures.json +174 -0
  145. package/dist/utils/storage-policy.js +193 -0
  146. package/dist/utils/upload-session.d.ts +12 -1
  147. package/dist/utils/upload-session.js +37 -2
  148. package/dist/utils/version-file-browser.d.ts +13 -0
  149. package/dist/utils/version-file-browser.js +59 -0
  150. package/package.json +19 -1
  151. package/dist/contracts/mounts.d.ts +0 -142
  152. package/dist/contracts/mounts.js +0 -56
  153. package/dist/utils/asset-fingerprint.d.ts +0 -64
  154. package/dist/utils/asset-fingerprint.js +0 -620
@@ -103,9 +103,9 @@ export const analyticsQuerySchema = z.object({
103
103
  window: z
104
104
  .enum(["48h", "7d", "30d", "custom"])
105
105
  .optional()
106
- .describe('Analytics summary window; defaults to "7d". "custom" requires since/until.'),
107
- since: z.string().datetime().optional().describe("Custom analytics start."),
108
- until: z.string().datetime().optional().describe("Custom analytics end."),
106
+ .describe('Analytics summary window. Defaults to "7d". "custom" requires since/until.'),
107
+ since: z.string().datetime().optional().describe("Start of the custom analytics window."),
108
+ until: z.string().datetime().optional().describe("End of the custom analytics window."),
109
109
  });
110
110
  // Served by `GET /v1/spaces/{spaceId}/analytics`: traffic summary over the
111
111
  // requested window, read from Spacefast's own per-space rollups (ingested on
@@ -113,7 +113,7 @@ export const analyticsQuerySchema = z.object({
113
113
  // Counts cover main hostnames only: default, custom-domain, and channel.
114
114
  // Immutable version-URL traffic is ingested but never surfaced here.
115
115
  export const analyticsResponseSchema = z.object({
116
- spaceId: z.string().describe("Space the traffic was aggregated for."),
116
+ spaceId: z.string().describe("The space id the traffic was aggregated for."),
117
117
  window: z.enum(["48h", "7d", "30d", "custom"]).describe("Resolved summary window."),
118
118
  since: z.string().describe("Resolved window start (ISO 8601), after retention clamping."),
119
119
  until: z.string().describe("Resolved window end (ISO 8601)."),
@@ -121,15 +121,17 @@ export const analyticsResponseSchema = z.object({
121
121
  dataAsOf: z
122
122
  .string()
123
123
  .nullable()
124
- .describe("End of the last fully-ingested hour; null while the first ingest is running."),
125
- refreshing: z.boolean().describe("Whether an ingest run is active or was just triggered."),
124
+ .describe("End of the last fully-ingested hour; null until the first ingest starts."),
125
+ refreshing: z
126
+ .boolean()
127
+ .describe("Whether an ingest run is active or the server just triggered one."),
126
128
  views: z
127
129
  .number()
128
130
  .describe("Successful non-crawler requests (status < 400, assets included) summed across main hostnames over the window."),
129
131
  visitors: z
130
132
  .number()
131
133
  .nullable()
132
- .describe("Unique-visitor estimate. Currently always null: per-hostname unique-visitor data is not yet available from the hosting provider."),
134
+ .describe("Unique-visitor estimate. Always null because per-hostname unique-visitor data is not yet available from the hosting provider."),
133
135
  bandwidthBytes: z.number().describe("Total response bytes in the window."),
134
136
  visitorsByHost: z
135
137
  .array(z.object({
@@ -140,7 +142,7 @@ export const analyticsResponseSchema = z.object({
140
142
  views: z.number(),
141
143
  })),
142
144
  }))
143
- .describe("Per-hostname daily visitor estimates. Currently always empty: per-hostname unique-visitor data is not yet available from the hosting provider."),
145
+ .describe("Per-hostname daily visitor estimates. Always empty because per-hostname unique-visitor data is not yet available from the hosting provider."),
144
146
  topPaths: z
145
147
  .array(z.object({ path: z.string(), views: z.number() }))
146
148
  .describe("Most-viewed paths, capped at 10."),
@@ -0,0 +1,14 @@
1
+ export interface ProblemDocument {
2
+ code: string | undefined;
3
+ detail: string | undefined;
4
+ type: string | undefined;
5
+ title: string | undefined;
6
+ pointer: string | undefined;
7
+ /** Raw, unnarrowed: each caller decides what shape it accepts. */
8
+ details: unknown;
9
+ suggestions: string[];
10
+ next: string[];
11
+ requestId: string | undefined;
12
+ }
13
+ /** Returns undefined when the payload cannot be a problem document at all. */
14
+ export declare function parseProblemDocument(payload: unknown): ProblemDocument | undefined;
@@ -0,0 +1,35 @@
1
+ // Reader for the RFC 9457 problem document every 4xx/5xx response carries, so the
2
+ // client surfaces (CLI, MCP, SDK) share one definition of which members exist and
3
+ // which values are trusted. Callers keep their own entry guards, message fallbacks
4
+ // and public field names — this only extracts the wire members.
5
+ /** Returns undefined when the payload cannot be a problem document at all. */
6
+ export function parseProblemDocument(payload) {
7
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
8
+ return undefined;
9
+ }
10
+ const problem = payload;
11
+ if (!("code" in problem) && !("detail" in problem)) {
12
+ return undefined;
13
+ }
14
+ const stringField = (name) => {
15
+ const value = problem[name];
16
+ return typeof value === "string" ? value : undefined;
17
+ };
18
+ const stringArray = (name) => {
19
+ const value = problem[name];
20
+ return Array.isArray(value)
21
+ ? value.filter((entry) => typeof entry === "string")
22
+ : [];
23
+ };
24
+ return {
25
+ code: stringField("code"),
26
+ detail: stringField("detail"),
27
+ type: stringField("type"),
28
+ title: stringField("title"),
29
+ pointer: stringField("pointer"),
30
+ details: problem.details,
31
+ suggestions: stringArray("suggestions"),
32
+ next: stringArray("next"),
33
+ requestId: stringField("requestId"),
34
+ };
35
+ }
@@ -50,14 +50,19 @@ export declare const PushNewSessionSchema: z.ZodObject<{
50
50
  reusedVersionId: z.ZodNullable<z.ZodString>;
51
51
  webhookDeliveryId: z.ZodNullable<z.ZodString>;
52
52
  liveUrl: z.ZodString;
53
- open: z.ZodNullable<z.ZodObject<{
53
+ open: z.ZodNullable<z.ZodUnion<readonly [z.ZodObject<{
54
+ url: z.ZodString;
55
+ expiresAt: z.ZodNullable<z.ZodString>;
56
+ kind: z.ZodLiteral<"link">;
57
+ }, z.core.$strip>, z.ZodObject<{
54
58
  url: z.ZodString;
55
59
  expiresAt: z.ZodString;
56
60
  kind: z.ZodEnum<{
57
61
  management: "management";
62
+ person: "person";
58
63
  claim_preview: "claim_preview";
59
64
  }>;
60
- }, z.core.$strip>>;
65
+ }, z.core.$strip>]>>;
61
66
  sessionUrl: z.ZodString;
62
67
  logsUrl: z.ZodNullable<z.ZodString>;
63
68
  claimUrl: z.ZodString;
@@ -103,14 +108,19 @@ export declare const PushNewCreateSessionResponseSchema: z.ZodObject<{
103
108
  reusedVersionId: z.ZodNullable<z.ZodString>;
104
109
  webhookDeliveryId: z.ZodNullable<z.ZodString>;
105
110
  liveUrl: z.ZodString;
106
- open: z.ZodNullable<z.ZodObject<{
111
+ open: z.ZodNullable<z.ZodUnion<readonly [z.ZodObject<{
112
+ url: z.ZodString;
113
+ expiresAt: z.ZodNullable<z.ZodString>;
114
+ kind: z.ZodLiteral<"link">;
115
+ }, z.core.$strip>, z.ZodObject<{
107
116
  url: z.ZodString;
108
117
  expiresAt: z.ZodString;
109
118
  kind: z.ZodEnum<{
110
119
  management: "management";
120
+ person: "person";
111
121
  claim_preview: "claim_preview";
112
122
  }>;
113
- }, z.core.$strip>>;
123
+ }, z.core.$strip>]>>;
114
124
  sessionUrl: z.ZodString;
115
125
  logsUrl: z.ZodNullable<z.ZodString>;
116
126
  claimUrl: z.ZodString;
@@ -124,14 +134,19 @@ export declare const PushNewCreateSessionResponseSchema: z.ZodObject<{
124
134
  }, z.core.$strip>;
125
135
  export declare const PushNewStatusResponseSchema: z.ZodObject<{
126
136
  id: z.ZodString;
127
- open: z.ZodNullable<z.ZodObject<{
137
+ open: z.ZodNullable<z.ZodUnion<readonly [z.ZodObject<{
138
+ url: z.ZodString;
139
+ expiresAt: z.ZodNullable<z.ZodString>;
140
+ kind: z.ZodLiteral<"link">;
141
+ }, z.core.$strip>, z.ZodObject<{
128
142
  url: z.ZodString;
129
143
  expiresAt: z.ZodString;
130
144
  kind: z.ZodEnum<{
131
145
  management: "management";
146
+ person: "person";
132
147
  claim_preview: "claim_preview";
133
148
  }>;
134
- }, z.core.$strip>>;
149
+ }, z.core.$strip>]>>;
135
150
  status: z.ZodEnum<{
136
151
  live: "live";
137
152
  failed: "failed";
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { privateOpenSchema } from "./access.js";
2
3
  export const pushNewSessionStatusSchema = z.enum([
3
4
  "waiting_for_push",
4
5
  "waiting_for_upload",
@@ -31,14 +32,9 @@ export const PushNewSessionSchema = z.object({
31
32
  reusedVersionId: z.string().nullable(),
32
33
  webhookDeliveryId: z.string().nullable(),
33
34
  liveUrl: z.string().url(),
34
- open: z
35
- .object({
36
- url: z.string().url(),
37
- expiresAt: z.string().datetime(),
38
- kind: z.enum(["management", "claim_preview"]),
39
- })
35
+ open: privateOpenSchema
40
36
  .nullable()
41
- .describe("A short-lived, one-use private Open handoff. It is not a stable URL and clients must not persist it as Space state."),
37
+ .describe("Reusable Open link for the private space at live `/`. A null expiry means it remains valid until revoked."),
42
38
  sessionUrl: z.string().url(),
43
39
  logsUrl: z.string().url().nullable(),
44
40
  claimUrl: z.string().url(),
@@ -105,6 +105,7 @@ export declare const SpaceSchema: z.ZodObject<{
105
105
  always_hot: "always_hot";
106
106
  }>;
107
107
  moving: z.ZodBoolean;
108
+ hasRuntime: z.ZodBoolean;
108
109
  channels: z.ZodRecord<z.ZodString, z.ZodObject<{
109
110
  versionId: z.ZodString;
110
111
  updatedAt: z.ZodString;
@@ -187,7 +188,7 @@ export declare const SpaceSchema: z.ZodObject<{
187
188
  bodyEnd: z.ZodOptional<z.ZodArray<z.ZodString>>;
188
189
  noscript: z.ZodOptional<z.ZodArray<z.ZodString>>;
189
190
  }, z.core.$strip>>;
190
- dataSources: z.ZodOptional<z.ZodPreprocess<z.ZodRecord<z.ZodString, z.ZodObject<{
191
+ dataSources: z.ZodOptional<z.ZodPipe<z.ZodUnknown, z.ZodRecord<z.ZodString, z.ZodObject<{
191
192
  kind: z.ZodLiteral<"wordpress">;
192
193
  url: z.ZodString;
193
194
  }, z.core.$strict>>>>;
@@ -241,10 +242,10 @@ export declare const SpaceSchema: z.ZodObject<{
241
242
  }, z.core.$strip>;
242
243
  export declare const PublishSourceSchema: z.ZodObject<{
243
244
  kind: z.ZodEnum<{
244
- api: "api";
245
- dashboard: "dashboard";
246
245
  build: "build";
247
246
  agent: "agent";
247
+ api: "api";
248
+ dashboard: "dashboard";
248
249
  direct_upload: "direct_upload";
249
250
  cli: "cli";
250
251
  git: "git";
@@ -278,10 +279,10 @@ export declare const VersionSchema: z.ZodObject<{
278
279
  spaceId: z.ZodString;
279
280
  source: z.ZodNullable<z.ZodObject<{
280
281
  kind: z.ZodEnum<{
281
- api: "api";
282
- dashboard: "dashboard";
283
282
  build: "build";
284
283
  agent: "agent";
284
+ api: "api";
285
+ dashboard: "dashboard";
285
286
  direct_upload: "direct_upload";
286
287
  cli: "cli";
287
288
  git: "git";
@@ -420,7 +421,7 @@ export declare const VersionSchema: z.ZodObject<{
420
421
  bodyEnd: z.ZodOptional<z.ZodArray<z.ZodString>>;
421
422
  noscript: z.ZodOptional<z.ZodArray<z.ZodString>>;
422
423
  }, z.core.$strip>>;
423
- dataSources: z.ZodOptional<z.ZodPreprocess<z.ZodRecord<z.ZodString, z.ZodObject<{
424
+ dataSources: z.ZodOptional<z.ZodPipe<z.ZodUnknown, z.ZodRecord<z.ZodString, z.ZodObject<{
424
425
  kind: z.ZodLiteral<"wordpress">;
425
426
  url: z.ZodString;
426
427
  }, z.core.$strict>>>>;
@@ -470,7 +471,7 @@ export declare const VersionSchema: z.ZodObject<{
470
471
  headersRuleCount: z.ZodNumber;
471
472
  redirectsRuleCount: z.ZodNumber;
472
473
  proxyRouteCount: z.ZodNumber;
473
- functionsDetected: z.ZodBoolean;
474
+ runtimeCodeDetected: z.ZodBoolean;
474
475
  buildLog: z.ZodNullable<z.ZodString>;
475
476
  diagnostics: z.ZodDefault<z.ZodArray<z.ZodObject<{
476
477
  code: z.ZodString;
@@ -63,7 +63,7 @@ export const SpaceSchema = z.object({
63
63
  defaultHostname: z
64
64
  .string()
65
65
  .describe("Current Spacefast-owned managed hostname under view.fast. Renaming the space changes this hostname; previously managed hostnames temporarily redirect to the current one."),
66
- publicName: z.string().describe("Public project label used in the managed view.fast hostname."),
66
+ publicName: z.string().describe("Public space label used in the managed view.fast hostname."),
67
67
  liveUrl: z
68
68
  .string()
69
69
  .describe("Live space URL: the primary bound domain when one exists, else the default hostname. Always present on non-deleted spaces."),
@@ -86,17 +86,20 @@ export const SpaceSchema = z.object({
86
86
  burstable: z
87
87
  .boolean()
88
88
  .nullable()
89
- .describe("Whether a dedicated placement may burst provider PHP workers."),
89
+ .describe("Whether a dedicated placement can burst provider PHP workers."),
90
90
  archivedBytes: z
91
91
  .number()
92
92
  .int()
93
93
  .nonnegative()
94
94
  .describe("Bytes currently archived out of the hot runtime store."),
95
95
  tierPolicy: z.enum(["auto", "always_hot"]).describe("Storage tiering policy for this space."),
96
- moving: z.boolean().describe("True while a placement or transfer move is queued or running."),
96
+ moving: z.boolean().describe("Whether a placement or transfer move is queued or running."),
97
+ hasRuntime: z
98
+ .boolean()
99
+ .describe("Whether this space's live version runs code and therefore has a Runtime surface. Feature eligibility alone does not make the surface visible."),
97
100
  channels: z
98
101
  .record(z.string(), ChannelPointerSchema)
99
- .describe('Channel pointers by name; "live" is present once a version has been promoted.'),
102
+ .describe('Channel pointers by name. "live" is present after a version is promoted.'),
100
103
  config: spaceConfigSchema
101
104
  .nullable()
102
105
  .describe("Stored SpaceConfig overlay applied over the live version's sf.jsonc; null when nothing is overridden."),
@@ -129,7 +132,7 @@ export const PublishSourceSchema = z.object({
129
132
  dirty: z
130
133
  .boolean()
131
134
  .optional()
132
- .describe("True when the working tree had uncommitted changes at publish time."),
135
+ .describe("Whether the working tree had uncommitted changes at publish time."),
133
136
  metadata: z
134
137
  .record(z.string(), z.string())
135
138
  .optional()
@@ -193,7 +196,7 @@ export const VersionSchema = z.object({
193
196
  headersRuleCount: z.number().int(),
194
197
  redirectsRuleCount: z.number().int(),
195
198
  proxyRouteCount: z.number().int(),
196
- functionsDetected: z.boolean(),
199
+ runtimeCodeDetected: z.boolean(),
197
200
  buildLog: z.string().nullable(),
198
201
  diagnostics: z.array(DiagnosticSchema).default([]),
199
202
  createdAt: z.string().datetime(),