@spacefast/common 0.0.26 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/dist/agents/connect-targets.d.ts +6 -146
  2. package/dist/agents/connect-targets.js +63 -295
  3. package/dist/agents/private-key-oauth.d.ts +31 -1
  4. package/dist/agents/private-key-oauth.js +124 -33
  5. package/dist/agents/registry/core.d.ts +292 -0
  6. package/dist/agents/registry/core.js +1388 -0
  7. package/dist/agents/registry/deeplink-probes.d.ts +23 -0
  8. package/dist/agents/registry/deeplink-probes.js +18 -0
  9. package/dist/agents/registry/node.d.ts +56 -0
  10. package/dist/agents/registry/node.js +339 -0
  11. package/dist/brand-assets-build.js +1 -2
  12. package/dist/brand-assets.js +4 -7
  13. package/dist/brand.d.ts +17 -0
  14. package/dist/brand.js +24 -4
  15. package/dist/config/domains.d.ts +55 -28
  16. package/dist/config/domains.js +85 -41
  17. package/dist/config/index.js +1 -2
  18. package/dist/contracts/abuse.js +9 -24
  19. package/dist/contracts/access-profiles.d.ts +86 -0
  20. package/dist/contracts/access-profiles.js +89 -0
  21. package/dist/contracts/access.d.ts +21 -27
  22. package/dist/contracts/access.js +33 -64
  23. package/dist/contracts/activity.d.ts +18 -1
  24. package/dist/contracts/activity.js +70 -26
  25. package/dist/contracts/analytics.js +8 -10
  26. package/dist/contracts/api-keys.d.ts +77 -52
  27. package/dist/contracts/api-keys.js +44 -24
  28. package/dist/contracts/application-journal.d.ts +216 -0
  29. package/dist/contracts/application-journal.js +167 -0
  30. package/dist/contracts/auth.d.ts +90 -17
  31. package/dist/contracts/auth.js +86 -17
  32. package/dist/contracts/beta.d.ts +9 -4
  33. package/dist/contracts/beta.js +20 -16
  34. package/dist/contracts/billing.js +7 -11
  35. package/dist/contracts/bootstrap.d.ts +791 -0
  36. package/dist/contracts/bootstrap.js +51 -0
  37. package/dist/contracts/builds.d.ts +186 -7
  38. package/dist/contracts/builds.js +75 -21
  39. package/dist/contracts/channels.d.ts +43 -0
  40. package/dist/contracts/channels.js +25 -9
  41. package/dist/contracts/cli.d.ts +7 -0
  42. package/dist/contracts/cli.js +6 -0
  43. package/dist/contracts/collab-public.d.ts +1 -1
  44. package/dist/contracts/collab-public.js +5 -8
  45. package/dist/contracts/comments.d.ts +45 -35
  46. package/dist/contracts/comments.js +107 -77
  47. package/dist/contracts/commerce.d.ts +165 -0
  48. package/dist/contracts/commerce.js +146 -0
  49. package/dist/contracts/common.d.ts +3 -3
  50. package/dist/contracts/common.js +18 -29
  51. package/dist/contracts/content-contract-verification.d.ts +521 -0
  52. package/dist/contracts/content-contract-verification.js +320 -0
  53. package/dist/contracts/content-platform-fixture.d.ts +1278 -0
  54. package/dist/contracts/content-platform-fixture.js +44 -0
  55. package/dist/contracts/content-program.d.ts +994 -0
  56. package/dist/contracts/content-program.js +658 -0
  57. package/dist/contracts/content-sync.d.ts +290 -0
  58. package/dist/contracts/content-sync.js +167 -0
  59. package/dist/contracts/content.d.ts +432 -0
  60. package/dist/contracts/content.js +303 -0
  61. package/dist/contracts/continuation.d.ts +17 -1
  62. package/dist/contracts/continuation.js +23 -23
  63. package/dist/contracts/countries.js +3 -4
  64. package/dist/contracts/crons.d.ts +17 -0
  65. package/dist/contracts/crons.js +33 -15
  66. package/dist/contracts/dashboard-prefs.d.ts +56 -0
  67. package/dist/contracts/dashboard-prefs.js +51 -0
  68. package/dist/contracts/device-auth.d.ts +234 -37
  69. package/dist/contracts/device-auth.js +267 -53
  70. package/dist/contracts/docs.d.ts +6 -10
  71. package/dist/contracts/docs.js +5 -13
  72. package/dist/contracts/domains.d.ts +499 -102
  73. package/dist/contracts/domains.js +169 -58
  74. package/dist/contracts/email-preferences.d.ts +3 -3
  75. package/dist/contracts/email-preferences.js +6 -7
  76. package/dist/contracts/enums.d.ts +26 -26
  77. package/dist/contracts/enums.js +61 -54
  78. package/dist/contracts/error-code-meta.d.ts +269 -7
  79. package/dist/contracts/error-code-meta.js +80 -5
  80. package/dist/contracts/error-codes.d.ts +5 -5
  81. package/dist/contracts/error-codes.js +78 -16
  82. package/dist/contracts/events.d.ts +100 -20
  83. package/dist/contracts/events.js +107 -20
  84. package/dist/contracts/execution.d.ts +47 -66
  85. package/dist/contracts/execution.js +51 -64
  86. package/dist/contracts/feature-lifecycle.d.ts +70 -14
  87. package/dist/contracts/feature-lifecycle.js +86 -15
  88. package/dist/contracts/features.d.ts +100 -37
  89. package/dist/contracts/features.js +21 -27
  90. package/dist/contracts/fixtures/content-platform-v1.json +1108 -0
  91. package/dist/contracts/frame-session.d.ts +192 -0
  92. package/dist/contracts/frame-session.js +164 -0
  93. package/dist/contracts/functions.d.ts +218 -211
  94. package/dist/contracts/functions.js +273 -260
  95. package/dist/contracts/grant-copy.d.ts +43 -0
  96. package/dist/contracts/grant-copy.js +44 -0
  97. package/dist/contracts/grants.d.ts +64 -56
  98. package/dist/contracts/grants.js +124 -23
  99. package/dist/contracts/ids.d.ts +4 -1
  100. package/dist/contracts/ids.js +4 -1
  101. package/dist/contracts/internal.d.ts +5 -4
  102. package/dist/contracts/internal.js +12 -3
  103. package/dist/contracts/mcp.d.ts +17 -0
  104. package/dist/contracts/mcp.js +23 -0
  105. package/dist/contracts/me.d.ts +6 -1
  106. package/dist/contracts/me.js +12 -6
  107. package/dist/contracts/notifications.d.ts +27 -29
  108. package/dist/contracts/notifications.js +9 -4
  109. package/dist/contracts/oauth-resources.d.ts +112 -10
  110. package/dist/contracts/oauth-resources.js +116 -11
  111. package/dist/contracts/oauth-scope-actions.d.ts +90 -0
  112. package/dist/contracts/oauth-scope-actions.js +126 -0
  113. package/dist/contracts/operations.d.ts +27 -4
  114. package/dist/contracts/operations.js +11 -5
  115. package/dist/contracts/pages.d.ts +29 -5
  116. package/dist/contracts/pages.js +22 -5
  117. package/dist/contracts/partner-notifications.d.ts +3 -0
  118. package/dist/contracts/partner-notifications.js +65 -0
  119. package/dist/contracts/{platform.d.ts → partner.d.ts} +29 -42
  120. package/dist/contracts/{platform.js → partner.js} +27 -40
  121. package/dist/contracts/plan-policy.d.ts +1 -1
  122. package/dist/contracts/principal-assertion.d.ts +43 -0
  123. package/dist/contracts/principal-assertion.js +67 -0
  124. package/dist/contracts/principals.d.ts +73 -0
  125. package/dist/contracts/principals.js +59 -0
  126. package/dist/contracts/privacy.d.ts +11 -0
  127. package/dist/contracts/privacy.js +17 -0
  128. package/dist/contracts/problem-document.js +3 -4
  129. package/dist/contracts/publish-archive.d.ts +116 -18
  130. package/dist/contracts/publish-archive.js +6 -3
  131. package/dist/contracts/push-new.d.ts +4 -4
  132. package/dist/contracts/quotas.js +3 -3
  133. package/dist/contracts/realtime.d.ts +52 -0
  134. package/dist/contracts/realtime.js +54 -0
  135. package/dist/contracts/repository-connections.d.ts +1 -1
  136. package/dist/contracts/repository-connections.js +6 -2
  137. package/dist/contracts/resources.d.ts +105 -14
  138. package/dist/contracts/resources.js +145 -21
  139. package/dist/contracts/route-inventory.d.ts +358 -0
  140. package/dist/contracts/route-inventory.js +141 -0
  141. package/dist/contracts/runtime-api.d.ts +112 -35
  142. package/dist/contracts/runtime-api.js +86 -66
  143. package/dist/contracts/runtime-app.d.ts +11 -21
  144. package/dist/contracts/runtime-app.js +39 -24
  145. package/dist/contracts/runtime-components.d.ts +143 -0
  146. package/dist/contracts/runtime-components.js +199 -0
  147. package/dist/contracts/runtime-db.d.ts +45 -19
  148. package/dist/contracts/runtime-db.js +85 -20
  149. package/dist/contracts/runtime-purge.js +3 -5
  150. package/dist/contracts/runtime-services.d.ts +43 -75
  151. package/dist/contracts/runtime-services.js +29 -49
  152. package/dist/contracts/runtime-storage.d.ts +14 -14
  153. package/dist/contracts/runtime-storage.js +28 -13
  154. package/dist/contracts/sf-config-v1.d.ts +14 -18
  155. package/dist/contracts/slugs.js +13 -4
  156. package/dist/contracts/space-config.d.ts +235 -28
  157. package/dist/contracts/space-config.js +246 -91
  158. package/dist/contracts/spaces.d.ts +360 -255
  159. package/dist/contracts/spaces.js +190 -122
  160. package/dist/contracts/superadmin-activity.d.ts +3 -43
  161. package/dist/contracts/superadmin-activity.js +6 -30
  162. package/dist/contracts/superadmin-emails.d.ts +1 -0
  163. package/dist/contracts/superadmin-emails.js +17 -1
  164. package/dist/contracts/superadmin-runtime.d.ts +199 -0
  165. package/dist/contracts/superadmin-runtime.js +141 -0
  166. package/dist/contracts/superadmin-search.d.ts +22 -2
  167. package/dist/contracts/superadmin-search.js +14 -6
  168. package/dist/contracts/superadmin-spaces.d.ts +435 -186
  169. package/dist/contracts/superadmin-spaces.js +131 -25
  170. package/dist/contracts/superadmin-teams.d.ts +3 -0
  171. package/dist/contracts/superadmin-teams.js +1 -2
  172. package/dist/contracts/superadmin-tenants.d.ts +627 -6
  173. package/dist/contracts/superadmin-tenants.js +32 -7
  174. package/dist/contracts/superadmin.d.ts +98 -16
  175. package/dist/contracts/superadmin.js +63 -10
  176. package/dist/contracts/tags.d.ts +85 -58
  177. package/dist/contracts/tags.js +44 -34
  178. package/dist/contracts/teams.d.ts +72 -9
  179. package/dist/contracts/teams.js +84 -25
  180. package/dist/contracts/tenants.d.ts +135 -0
  181. package/dist/contracts/tenants.js +120 -0
  182. package/dist/contracts/test-triggers.d.ts +70 -0
  183. package/dist/contracts/test-triggers.js +116 -0
  184. package/dist/contracts/theme-json.js +3 -8
  185. package/dist/contracts/transfers.d.ts +1 -0
  186. package/dist/contracts/transfers.js +1 -0
  187. package/dist/contracts/usage.d.ts +209 -0
  188. package/dist/contracts/usage.js +124 -12
  189. package/dist/contracts/variables.d.ts +2 -2
  190. package/dist/contracts/variables.js +9 -13
  191. package/dist/contracts/webhooks.d.ts +13 -5
  192. package/dist/contracts/webhooks.js +3 -1
  193. package/dist/contracts/zero.d.ts +57 -64
  194. package/dist/contracts/zero.js +68 -66
  195. package/dist/dashboard-paths/index.d.ts +24 -21
  196. package/dist/dashboard-paths/index.js +35 -47
  197. package/dist/dashboard-paths/route-reservations.generated.d.ts +2 -0
  198. package/dist/dashboard-paths/route-reservations.generated.js +36 -0
  199. package/dist/docs/agent-arrival.d.ts +92 -0
  200. package/dist/docs/agent-arrival.js +227 -0
  201. package/dist/docs/agent-output-policy.d.ts +6 -0
  202. package/dist/docs/agent-output-policy.js +22 -0
  203. package/dist/docs/agent-prose.d.ts +11 -17
  204. package/dist/docs/agent-prose.js +62 -37
  205. package/dist/docs/agent-setup.d.ts +72 -41
  206. package/dist/docs/agent-setup.js +336 -436
  207. package/dist/docs/catalog.d.ts +147 -89
  208. package/dist/docs/catalog.js +157 -42
  209. package/dist/docs/error-docs.d.ts +2098 -1
  210. package/dist/docs/error-docs.js +281 -16
  211. package/dist/docs/index-build.d.ts +0 -1
  212. package/dist/docs/index-build.js +2 -3
  213. package/dist/docs/page-context-prompt.d.ts +77 -0
  214. package/dist/docs/page-context-prompt.js +131 -0
  215. package/dist/docs/reference-urls.d.ts +46 -0
  216. package/dist/docs/reference-urls.js +79 -0
  217. package/dist/docs/search.d.ts +6 -8
  218. package/dist/docs/search.js +10 -13
  219. package/dist/docs/skill-distribution.d.ts +4 -1
  220. package/dist/docs/skill-distribution.js +10 -5
  221. package/dist/docs/skills.d.ts +117 -117
  222. package/dist/docs/skills.js +120 -72
  223. package/dist/docs/start-prompts.d.ts +45 -0
  224. package/dist/docs/start-prompts.js +62 -0
  225. package/dist/domain-exploration.js +9 -13
  226. package/dist/og-template.d.ts +56 -0
  227. package/dist/og-template.js +56 -0
  228. package/dist/slug-policy/index.js +5 -11
  229. package/dist/utils/browser-credential.d.ts +13 -6
  230. package/dist/utils/browser-credential.js +14 -7
  231. package/dist/utils/build-settings.d.ts +16 -0
  232. package/dist/utils/build-settings.js +63 -17
  233. package/dist/utils/canonical-json.d.ts +3 -5
  234. package/dist/utils/canonical-json.js +3 -5
  235. package/dist/utils/cast-transport.d.ts +5 -17
  236. package/dist/utils/cast-transport.js +6 -19
  237. package/dist/utils/claim-token.js +1 -2
  238. package/dist/utils/comment-avatars.js +4 -6
  239. package/dist/utils/concurrency.js +2 -3
  240. package/dist/utils/content-type.d.ts +7 -6
  241. package/dist/utils/content-type.js +73 -51
  242. package/dist/utils/credential-policy.d.ts +50 -6
  243. package/dist/utils/credential-policy.js +123 -57
  244. package/dist/utils/egress-policy.fixtures.json +1 -1
  245. package/dist/utils/generate-space-name.d.ts +3 -8
  246. package/dist/utils/generate-space-name.js +3 -8
  247. package/dist/utils/grants.d.ts +0 -1
  248. package/dist/utils/grants.js +4 -7
  249. package/dist/utils/gravatar.d.ts +2 -4
  250. package/dist/utils/gravatar.js +6 -12
  251. package/dist/utils/id-hints.js +14 -23
  252. package/dist/utils/idempotency.d.ts +3 -3
  253. package/dist/utils/idempotency.js +6 -7
  254. package/dist/utils/local-space-state.d.ts +15 -15
  255. package/dist/utils/local-space-state.js +34 -23
  256. package/dist/utils/oauth-signed-query.d.ts +3 -5
  257. package/dist/utils/oauth-signed-query.js +6 -9
  258. package/dist/utils/one-shot-replay.d.ts +3 -5
  259. package/dist/utils/one-shot-replay.js +3 -5
  260. package/dist/utils/page-colors.d.ts +4 -10
  261. package/dist/utils/page-colors.js +11 -35
  262. package/dist/utils/page-fonts.js +6 -11
  263. package/dist/utils/page-preview.d.ts +0 -1
  264. package/dist/utils/page-preview.js +0 -1
  265. package/dist/utils/pages.d.ts +22 -11
  266. package/dist/utils/pages.js +70 -30
  267. package/dist/utils/privacy-regions.d.ts +19 -0
  268. package/dist/utils/privacy-regions.js +91 -0
  269. package/dist/utils/publish-form-data.d.ts +4 -5
  270. package/dist/utils/publish-form-data.js +2 -3
  271. package/dist/utils/publish-policy.d.ts +10 -23
  272. package/dist/utils/publish-policy.js +63 -116
  273. package/dist/utils/query-client.d.ts +2 -0
  274. package/dist/utils/query-client.js +10 -1
  275. package/dist/utils/runtime-paths.d.ts +4 -4
  276. package/dist/utils/runtime-paths.js +6 -8
  277. package/dist/utils/runtime-upload.d.ts +4 -0
  278. package/dist/utils/runtime-upload.js +5 -0
  279. package/dist/utils/secure-local-file.d.ts +3 -3
  280. package/dist/utils/secure-local-file.js +18 -24
  281. package/dist/utils/space-config.d.ts +11 -14
  282. package/dist/utils/space-config.js +10 -16
  283. package/dist/utils/static-runtime-policy.d.ts +5 -8
  284. package/dist/utils/static-runtime-policy.generated.d.ts +16 -0
  285. package/dist/utils/static-runtime-policy.generated.js +70 -0
  286. package/dist/utils/static-runtime-policy.js +17 -84
  287. package/dist/utils/storage-policy.js +1 -2
  288. package/dist/utils/upload-session.js +8 -14
  289. package/dist/utils/version-path.js +11 -19
  290. package/dist/utils/wpcom-auth-redirects.d.ts +5 -14
  291. package/dist/utils/wpcom-auth-redirects.js +1 -4
  292. package/dist/vocabulary.d.ts +7 -7
  293. package/dist/vocabulary.js +30 -16
  294. package/package.json +14 -2
  295. package/dist/agents/client-registry.d.ts +0 -22
  296. package/dist/agents/client-registry.js +0 -41
  297. package/dist/docs/agent-handoff-document.d.ts +0 -15
  298. package/dist/docs/agent-handoff-document.js +0 -180
  299. package/dist/docs/agent-solutions.d.ts +0 -110
  300. package/dist/docs/agent-solutions.js +0 -183
  301. package/dist/utils/query-keys.d.ts +0 -84
  302. package/dist/utils/query-keys.js +0 -108
@@ -1,9 +1,8 @@
1
- // Error reference content (the platform spec "Global API Conventions"):
2
- // every problem document `type` points at `https://spacefast.com/docs/errors/{code}`,
3
- // and those pages are GENERATED from this table one entry per member of
4
- // `ERROR_CODES`, asserted complete by the conformance suite so links never rot
5
- // and pages never go missing. The standalone website renders the HTML pages and writes the
6
- // `.md` twins from the same entries.
1
+ // Error reference content (the platform spec "Global API Conventions"): every
2
+ // problem document `type` points at `https://spacefast.com/docs/errors/{code}`,
3
+ // and those pages are GENERATED from this table, one entry per `ERROR_CODES`
4
+ // member. The conformance suite asserts completeness, so links never rot; the
5
+ // website renders the HTML pages and `.md` twins from the same entries.
7
6
  import { BRAND } from "../brand.js";
8
7
  import { serviceOrigin } from "../config/domains.js";
9
8
  import { errorDocsUrl, errorTitle, PROBLEM_CONTENT_TYPE, } from "../contracts/error-codes.js";
@@ -69,6 +68,10 @@ export const ERROR_DOCS = {
69
68
  summary: "An authorization code is required to complete this step.",
70
69
  fix: "Pass the code returned by the authorization step.",
71
70
  },
71
+ authorization_level_not_allowed: {
72
+ summary: "This operation is reserved for a signed-in person, or the credential is acting at an authorization level the operation does not accept.",
73
+ fix: "This is not a scope problem and elevation will not clear it. Ask the person to perform the action in the dashboard.",
74
+ },
72
75
  authorization_pending: {
73
76
  summary: "The device login is not approved yet.",
74
77
  fix: "Keep polling at the advised interval until the user approves the request.",
@@ -189,9 +192,29 @@ export const ERROR_DOCS = {
189
192
  summary: "The configuration declares more template files than the plan allows.",
190
193
  fix: "Reduce the number of template entries in sf.jsonc. If you are still stuck, POST /v1/feedback with the error code and requestId.",
191
194
  },
195
+ confirmation_denied: {
196
+ summary: "A person reviewed this exact action and denied it. The denial is terminal.",
197
+ fix: "Stop retrying. You cannot clear this yourself; report the denial to the person who asked for the action.",
198
+ },
199
+ confirmation_expired: {
200
+ summary: "The confirmation for this action expired before a person decided it.",
201
+ fix: "Request the action again to get a fresh confirmation URL and continuation token. Do not retry the old token.",
202
+ },
203
+ confirmation_mismatch: {
204
+ summary: "The continuation token is bound to different action terms or a different resource revision than the request presenting it.",
205
+ fix: "Request a fresh confirmation for the action you actually intend to perform.",
206
+ },
207
+ confirmation_required: {
208
+ summary: "This action destroys live content or spends money, so a person must approve this exact action before it runs.",
209
+ fix: "Send the person to the `url` in the error details, then poll `pollUrl` with the `continuationToken` every 5 seconds. Give up after 10 minutes and report back. No flag or environment variable can clear this.",
210
+ },
211
+ confirmation_token_required: {
212
+ summary: "This exact action already has a decision, and a retry without its continuation token cannot clear the gate.",
213
+ fix: "Resume the existing decision with its continuation token instead of repeating the original request.",
214
+ },
192
215
  continuation_unavailable: {
193
216
  summary: "This space key can no longer be exchanged for an API key.",
194
- fix: "If the space is claimed, ask its owner for an API key (dashboard: Account → API keys). If it is still unclaimed, keep using the space key as bearer auth instead of exchanging it. If you are still stuck, POST /v1/feedback with the error code and requestId.",
217
+ fix: "If the space is claimed, ask its owner for an API key (dashboard: teamAgents → API keys). If it is still unclaimed, keep using the space key as bearer auth instead of exchanging it. If you are still stuck, POST /v1/feedback with the error code and requestId.",
195
218
  },
196
219
  continuation_used: {
197
220
  summary: "This space key was already exchanged for a durable API key.",
@@ -213,6 +236,10 @@ export const ERROR_DOCS = {
213
236
  summary: "The credential used for this request was revoked.",
214
237
  fix: "Create a new API key and update your client.",
215
238
  },
239
+ credential_sponsor_inactive: {
240
+ summary: "The person who authorized this machine credential is no longer an active member of the team it acts for.",
241
+ fix: "A team admin must re-authorize the credential, or point it at a live member, before it works again.",
242
+ },
216
243
  csam_blocked: {
217
244
  summary: "The content was blocked because it matched known child sexual abuse material.",
218
245
  fix: "This action is final and reported as required by law. Do not retry.",
@@ -221,6 +248,18 @@ export const ERROR_DOCS = {
221
248
  summary: "CSAM enforcement policy cannot be set below the mandatory account-suspend floor.",
222
249
  fix: "Set the CSAM category enforcement tier to account suspension.",
223
250
  },
251
+ dashboard_prefs_key_invalid: {
252
+ summary: "A dashboard preference key is empty or longer than the 64-character limit.",
253
+ fix: "Send preference keys that are between 1 and 64 characters long.",
254
+ },
255
+ dashboard_prefs_too_large: {
256
+ summary: "The merged dashboard preferences would exceed the 16KB serialized size limit.",
257
+ fix: "Store smaller values, or delete preferences you no longer need by setting them to null.",
258
+ },
259
+ dashboard_prefs_too_many_keys: {
260
+ summary: "The merged dashboard preferences would hold more than the 50 allowed keys.",
261
+ fix: "Delete preferences you no longer need by setting them to null before adding more.",
262
+ },
224
263
  data_location_immutable: {
225
264
  summary: "This request tried to change data location through an immutable path.",
226
265
  fix: "Data location is fixed when the space is created and cannot be changed afterwards. Create a new space in the region you want.",
@@ -229,6 +268,14 @@ export const ERROR_DOCS = {
229
268
  summary: "The live version has no database to read.",
230
269
  fix: 'Publish a Zero app, or declare `"database": true` under `runtime` in sf.jsonc for a Functions app.',
231
270
  },
271
+ decision_execution_lost: {
272
+ summary: "The approved action's execution lease is no longer held, so its result cannot be recorded.",
273
+ fix: "Poll the continuation to read the decision's current state before requesting the action again.",
274
+ },
275
+ decision_in_progress: {
276
+ summary: "This approved action is already executing.",
277
+ fix: "Poll the continuation instead of retrying the action; the original receipt is returned once it finishes.",
278
+ },
232
279
  device_authorization_failed: {
233
280
  summary: "The device login request failed and cannot be completed.",
234
281
  fix: "Start a new device login flow.",
@@ -419,7 +466,7 @@ export const ERROR_DOCS = {
419
466
  },
420
467
  domain_reserved_suffix: {
421
468
  summary: `The hostname is under a ${BRAND.productName}-managed suffix and cannot be added as a domain.`,
422
- fix: `Use a domain you own. ${BRAND.productName} assigns default and management hostnames automatically.`,
469
+ fix: `Use a domain you own. ${BRAND.productName} assigns default hostnames automatically.`,
423
470
  },
424
471
  domain_transfer_active: {
425
472
  summary: "The domain has a transfer in progress, which blocks this operation.",
@@ -441,6 +488,18 @@ export const ERROR_DOCS = {
441
488
  summary: "The version upload declares the same file path twice.",
442
489
  fix: "Deduplicate the file list so every path appears once.",
443
490
  },
491
+ elevation_not_required: {
492
+ summary: "The grant already includes every scope the elevation asked for.",
493
+ fix: "Retry the operation with the credential you already have; no elevation is needed.",
494
+ },
495
+ email_already_claimed: {
496
+ summary: "That email address is already verified on an account.",
497
+ fix: "Sign in with the address instead of adding it, or use a different address.",
498
+ },
499
+ email_verification_code_invalid: {
500
+ summary: "The emailed confirmation code is wrong, expired, or already used.",
501
+ fix: "Request a new code and enter the six digits from the newest email.",
502
+ },
444
503
  enforcement_policy_overlap: {
445
504
  summary: "Enforcement policy severity ranges overlap within a category.",
446
505
  fix: "Adjust the category ranges so at most one policy covers each severity.",
@@ -485,6 +544,10 @@ export const ERROR_DOCS = {
485
544
  summary: "An inject snippet exceeds the per-snippet size limit.",
486
545
  fix: "Keep each inject snippet at or under 8 KB.",
487
546
  },
547
+ insufficient_scope: {
548
+ summary: "The credential authenticated, but its granted scopes do not include a set this operation accepts.",
549
+ fix: "Read the `WWW-Authenticate` challenge for the missing scopes, then request elevation or reconnect with them.",
550
+ },
488
551
  internal_error: {
489
552
  summary: "Something went wrong on our side.",
490
553
  fix: "Retry the request. If the error persists, contact support with the requestId.",
@@ -501,6 +564,10 @@ export const ERROR_DOCS = {
501
564
  summary: "The requested data location is not a supported region.",
502
565
  fix: "Pick a region from the documented data locations, or use auto.",
503
566
  },
567
+ invalid_decision_state: {
568
+ summary: "The decision record is in a state this endpoint cannot interpret.",
569
+ fix: "Request the action again to open a fresh decision.",
570
+ },
504
571
  invalid_device_code: {
505
572
  summary: "The device code is invalid or expired.",
506
573
  fix: "Start a new device login flow.",
@@ -513,6 +580,10 @@ export const ERROR_DOCS = {
513
580
  summary: "The domain name is not a valid registrable hostname.",
514
581
  fix: "Check the spelling and use a fully qualified domain name.",
515
582
  },
583
+ invalid_elevation_request: {
584
+ summary: "An elevation request needs at least one scope and a rationale of 1 to 1024 characters.",
585
+ fix: "Send a non-empty scope list and a specific rationale, then retry.",
586
+ },
516
587
  invalid_file_path: {
517
588
  summary: "A file path in the request is not a valid space path.",
518
589
  fix: "Use forward-slash relative paths without traversal segments.",
@@ -557,6 +628,18 @@ export const ERROR_DOCS = {
557
628
  summary: "The user code does not match a pending device login.",
558
629
  fix: "Enter the code exactly as your CLI shows it. Codes expire after a few minutes.",
559
630
  },
631
+ invalid_usage_bucket: {
632
+ summary: "The usage bucket has an invalid time range.",
633
+ fix: "Set bucketEnd to an instant after bucketStart, then retry.",
634
+ },
635
+ invalid_usage_correction: {
636
+ summary: "The correction does not match the original usage record.",
637
+ fix: "Use the same tenant, principal, space, mode, dimension, and bucket as the original.",
638
+ },
639
+ invalid_usage_window: {
640
+ summary: "The requested usage window is invalid or longer than 92 days.",
641
+ fix: "Use a positive window of 92 days or less.",
642
+ },
560
643
  invalid_version_path: {
561
644
  summary: "A file path in the version is not a valid space path.",
562
645
  fix: "Use forward-slash relative paths without traversal segments.",
@@ -583,7 +666,7 @@ export const ERROR_DOCS = {
583
666
  },
584
667
  invalid_zero_realtime_replay_query: {
585
668
  summary: "The Zero realtime replay query parameters are invalid.",
586
- fix: "Use a valid afterEventId cursor and a numeric replay limit between 1 and 100.",
669
+ fix: "Send a retained `afterEventId` from a previous page's `nextAfterEventId`, and a replay limit between 1 and 100.",
587
670
  },
588
671
  invitation_already_exists: {
589
672
  summary: "An invitation for this email already exists on the team.",
@@ -605,6 +688,26 @@ export const ERROR_DOCS = {
605
688
  summary: "Requests from this IP address are blocked for abuse or policy reasons.",
606
689
  fix: "If you believe this block is a mistake, contact support with your IP address.",
607
690
  },
691
+ issuer_exists: {
692
+ summary: "This partner token issuer is already active for another tenant.",
693
+ fix: "Use a globally unique issuer URL, or revoke the existing issuer before registering it here.",
694
+ },
695
+ issuer_not_active: {
696
+ summary: "The partner token issuer is registered but is not active.",
697
+ fix: "Activate the issuer, then request a new partner token.",
698
+ },
699
+ issuer_proof_invalid: {
700
+ summary: "The partner token issuer key-possession proof is invalid.",
701
+ fix: "Sign the current challenge and minted audience with one of the registered Ed25519 keys, then retry activation.",
702
+ },
703
+ issuer_tenant_occupied: {
704
+ summary: "This tenant already has a pending or active partner token issuer.",
705
+ fix: "Activate or revoke the tenant's existing issuer before registering another one.",
706
+ },
707
+ issuer_unknown: {
708
+ summary: "The partner token names an issuer that Spacefast does not recognize.",
709
+ fix: "Register the exact token issuer, then request a new partner token.",
710
+ },
608
711
  job_not_found: {
609
712
  summary: "The background job was not found.",
610
713
  fix: "Verify the job id. Spacefast eventually prunes completed jobs.",
@@ -685,6 +788,10 @@ export const ERROR_DOCS = {
685
788
  summary: "The domain's observed nameservers diverge from the expected set.",
686
789
  fix: "Align the registrar's nameserver records with the expected set, then re-check.",
687
790
  },
791
+ no_space_selected: {
792
+ summary: "The command needs a Space and this directory does not select one.",
793
+ fix: "Pass --space, link the directory with `sf link --space <id>`, or run it where a project link already selects a Space. `sf spaces ls` lists what the credential can reach.",
794
+ },
688
795
  noop_publish: {
689
796
  summary: "The publish matched the live version exactly, so nothing changed.",
690
797
  fix: "No action is needed. The existing live version already serves this content.",
@@ -697,6 +804,22 @@ export const ERROR_DOCS = {
697
804
  summary: "The requested resource was not found.",
698
805
  fix: "Verify that the id is correct and that your credential can access the resource.",
699
806
  },
807
+ partner_preset_not_grantable: {
808
+ summary: "The `partner_admin` preset is a tenant-rooted partner credential and cannot be minted as an ordinary team API key.",
809
+ fix: "Ask an operator to bootstrap a partner key for the tenant, or request a team-scoped preset such as `space_admin`.",
810
+ },
811
+ partner_tenant_immutable_client: {
812
+ summary: "The tenant's provider client cannot be changed.",
813
+ fix: "Create a new tenant with the desired provider client instead.",
814
+ },
815
+ password_already_set: {
816
+ summary: "The account already has a password.",
817
+ fix: "Change the existing password instead of setting a new one.",
818
+ },
819
+ password_compromised: {
820
+ summary: "The password appears in a public breach corpus.",
821
+ fix: "Pick a password you have not used anywhere else, then try again.",
822
+ },
700
823
  path_case_collision: {
701
824
  summary: "Two file paths differ only by letter case, which collides on serving.",
702
825
  fix: "Rename one of the files so that paths are unique case-insensitively.",
@@ -713,14 +836,14 @@ export const ERROR_DOCS = {
713
836
  summary: "This plan grant was already revoked.",
714
837
  fix: "No action is needed. If the team should regain the plan, create a new grant.",
715
838
  },
839
+ plan_unknown: {
840
+ summary: "The requested plan name is not in the tenant's live plan catalog, so it cannot be assigned to a principal.",
841
+ fix: "Assign a plan declared in the tenant's system-space manifest. List the catalog's plan names and use one of them.",
842
+ },
716
843
  placement_invalid_burstable: {
717
844
  summary: "The placement burstable option was used with an unsupported placement mode.",
718
845
  fix: 'Set `placement.mode` to `"dedicated"` before setting `placement.burstable`, or remove the burstable option.',
719
846
  },
720
- platform_tenant_immutable_client: {
721
- summary: "The tenant's provider client cannot be changed.",
722
- fix: "Create a new tenant with the desired provider client instead.",
723
- },
724
847
  policy_exceeds_grantor: {
725
848
  summary: "The requested key policy grants more than your own credential allows.",
726
849
  fix: "Request a policy that is a subset of the credential creating the key.",
@@ -733,14 +856,66 @@ export const ERROR_DOCS = {
733
856
  summary: "Too many concurrent uploads for this space.",
734
857
  fix: "Wait for the Retry-After window, then resume. At most 4 uploads run per space at once.",
735
858
  },
859
+ primary_email_not_removable: {
860
+ summary: "The primary email address cannot be removed while it is the primary.",
861
+ fix: "Make another verified address primary first, then remove this one.",
862
+ },
863
+ principal_closed: {
864
+ summary: "The external principal is closed. Its spaces are tombstoned and cannot be modified.",
865
+ fix: "A closed principal is terminal and cannot be reopened; create a new principal to resume.",
866
+ },
867
+ principal_has_active_spaces: {
868
+ summary: "The external principal still owns spaces, so it cannot be closed.",
869
+ fix: "Delete the principal's spaces first, or retry with `force` to tombstone them as part of the close.",
870
+ },
871
+ principal_not_found: {
872
+ summary: "No external principal with that id exists in this tenant.",
873
+ fix: "List `/v1/principals` to see the ids this tenant knows; a principal appears only once it owns a resource.",
874
+ },
736
875
  principal_space_mismatch: {
737
876
  summary: "The space does not belong to the principal in the request.",
738
877
  fix: "Use the space's owning team or account in the request path.",
739
878
  },
879
+ principal_suspended: {
880
+ summary: "The external principal is suspended. Its spaces serve the suspended page and its mutations are blocked.",
881
+ fix: "Unsuspend the principal to restore serving and writes; a Spacefast-applied suspension can only be lifted by Spacefast.",
882
+ },
883
+ principal_suspension_locked: {
884
+ summary: "The suspension was applied by Spacefast (legal/abuse) and cannot be lifted by the partner.",
885
+ fix: "Contact Spacefast support to resolve a platform-applied suspension.",
886
+ },
740
887
  promote_admission_exceeded: {
741
888
  summary: "Too many archived files are being restored for this space right now.",
742
889
  fix: "Retry shortly. Spacefast limits restores to protect the host.",
743
890
  },
891
+ promotion_live_content_missing: {
892
+ summary: "The live tenant's system space has nothing published, so promotion has no content to carry forward.",
893
+ fix: "Publish the live system space once, then promote the test tenant again.",
894
+ },
895
+ promotion_live_system_space_invalid: {
896
+ summary: "The space designated as the live tenant's system space is not an active space that tenant owns.",
897
+ fix: "Designate a live, active space owned by this tenant as its system space, then promote again.",
898
+ },
899
+ promotion_live_system_space_not_designated: {
900
+ summary: "The live tenant has no designated system space, and promotion publishes the test manifest onto it.",
901
+ fix: "Set the live tenant's systemSpaceId to a space it owns, then promote again.",
902
+ },
903
+ promotion_not_live_tenant: {
904
+ summary: "Promotion targets a live tenant, and the tenant named in the request is not in live mode.",
905
+ fix: "Call promotion against the live tenant, not its test twin.",
906
+ },
907
+ promotion_nothing_to_promote: {
908
+ summary: "The test tenant's system space has no live manifest, so there is no configuration to promote.",
909
+ fix: "Publish the test tenant's system space first, then promote it.",
910
+ },
911
+ promotion_runtime_publish_incomplete: {
912
+ summary: "The promoted version was accepted but its runtime publish did not finish, so live is unchanged.",
913
+ fix: "Retry the promotion. If it keeps failing, contact support with the `requestId`.",
914
+ },
915
+ promotion_test_twin_missing: {
916
+ summary: "This live tenant has no linked test tenant, so there is nothing to promote from.",
917
+ fix: "Create the tenant's test twin and publish its system space before promoting.",
918
+ },
744
919
  provider_error: {
745
920
  summary: "WP Cloud reported an error.",
746
921
  fix: "Retry. If the error persists, contact support with the `requestId`.",
@@ -853,6 +1028,10 @@ export const ERROR_DOCS = {
853
1028
  summary: "The named job queue does not exist.",
854
1029
  fix: "Check the queue name against the operator queue list.",
855
1030
  },
1031
+ quota_exceeded: {
1032
+ summary: "This action would exceed a quota on the plan assigned to the owning customer. The problem details name which quota (for example, the spaces cap) and its limit.",
1033
+ fix: "Delete an existing resource to free room, or assign the customer a plan whose quota allows it.",
1034
+ },
856
1035
  response_headers_unservable: {
857
1036
  summary: "A file needs a response header that the platform cannot deliver for large files.",
858
1037
  fix: "Reduce the file below 100 MiB or drop the custom header.",
@@ -890,8 +1069,8 @@ export const ERROR_DOCS = {
890
1069
  fix: "Use a runtime token scoped for this action.",
891
1070
  },
892
1071
  runtime_api_not_found: {
893
- summary: "The runtime management endpoint was not found.",
894
- fix: "Send the request with the management hostname as the Host header. Spacefast does not serve management routes on public hostnames.",
1072
+ summary: "The requested runtime action was not found.",
1073
+ fix: "Use a supported runtime action and a token scoped for that action.",
895
1074
  },
896
1075
  runtime_callback_forbidden: {
897
1076
  summary: "The runtime callback cannot be authenticated.",
@@ -989,6 +1168,10 @@ export const ERROR_DOCS = {
989
1168
  summary: "The service request signature cannot be verified.",
990
1169
  fix: "Sign the exact request method, path, body digest, timestamp, and a fresh nonce.",
991
1170
  },
1171
+ session_not_fresh: {
1172
+ summary: "This action needs a recent identity confirmation.",
1173
+ fix: "Confirm it's you (password, authenticator code, or a code sent to your primary email), then retry.",
1174
+ },
992
1175
  site_already_deleted: {
993
1176
  summary: "The site was already deleted.",
994
1177
  fix: "No action is needed. The site is gone.",
@@ -1101,6 +1284,10 @@ export const ERROR_DOCS = {
1101
1284
  summary: "A space reference is required for this operation.",
1102
1285
  fix: "Pass a `spc_` id, slug, or hostname.",
1103
1286
  },
1287
+ space_selection_conflict: {
1288
+ summary: "The command asked to create a Space while this directory already selects one.",
1289
+ fix: "Drop --slug to publish to the selected Space, or publish from an unlinked directory to create a new one.",
1290
+ },
1104
1291
  space_transferring: {
1105
1292
  summary: "The space has a transfer in progress, which blocks this operation.",
1106
1293
  fix: "Complete or cancel the transfer first.",
@@ -1177,10 +1364,26 @@ export const ERROR_DOCS = {
1177
1364
  summary: "The billing provider reported an error.",
1178
1365
  fix: "Retry. If the error persists, check the team's billing settings.",
1179
1366
  },
1367
+ superadmin_two_factor_required: {
1368
+ summary: "The user must have two-factor authentication enrolled before being granted superadmin.",
1369
+ fix: "Ask them to enrol a second factor in account security, then grant the role again.",
1370
+ },
1371
+ superadmin_wpcom_account_required: {
1372
+ summary: "The user must have a WordPress.com account linked before being granted superadmin.",
1373
+ fix: "Ask them to link WordPress.com in account security, then grant the role again.",
1374
+ },
1180
1375
  superseded_by_publish: {
1181
1376
  summary: "A newer publish superseded this operation, so it was skipped.",
1182
1377
  fix: "No action is needed. The newer publish already carries the change.",
1183
1378
  },
1379
+ system_space_conflict: {
1380
+ summary: "The tenant's system space changed since the value you sent as `baseSystemSpaceId`, so the update was rejected.",
1381
+ fix: "Re-read `/v1/tenants/{tenantId}`, confirm the current `systemSpaceId`, and retry with a matching `baseSystemSpaceId`.",
1382
+ },
1383
+ system_space_invalid: {
1384
+ summary: "The requested system space does not exist, is disabled, or belongs to another tenant.",
1385
+ fix: "Designate a live space this tenant owns as its system space.",
1386
+ },
1184
1387
  takeover_notice_window: {
1185
1388
  summary: "The hostname was recently bound elsewhere. A takeover notice window applies.",
1186
1389
  fix: "Retry after the notice window, or have the current holder release the binding.",
@@ -1197,6 +1400,10 @@ export const ERROR_DOCS = {
1197
1400
  summary: "This operation requires an acting team.",
1198
1401
  fix: "Choose a team or pass a team reference.",
1199
1402
  },
1403
+ team_scope_mismatch: {
1404
+ summary: "The requested team conflicts with the team this credential or resource is bound to.",
1405
+ fix: "Drop the team parameter to act on the bound team, or use a credential for the team you named.",
1406
+ },
1200
1407
  team_slug_conflict: {
1201
1408
  summary: "The team slug is already taken.",
1202
1409
  fix: "Choose a different slug.",
@@ -1249,6 +1456,42 @@ export const ERROR_DOCS = {
1249
1456
  summary: "A theme value in the configuration is outside the allowed grammar.",
1250
1457
  fix: "Use allowed CSS values. Otherwise the offending key is dropped with a warning.",
1251
1458
  },
1459
+ token_alg_invalid: {
1460
+ summary: "The partner token uses a signing algorithm that Spacefast does not allow.",
1461
+ fix: "Sign the token with a registered Ed25519 key.",
1462
+ },
1463
+ token_audience_mismatch: {
1464
+ summary: "The partner token audience does not match the audience for its issuer.",
1465
+ fix: "Set aud to the exact audience that Spacefast assigned to the issuer.",
1466
+ },
1467
+ token_claims_invalid: {
1468
+ summary: "The partner token omits a required claim or contains an invalid claim value.",
1469
+ fix: "Add valid iss, aud, sub, client_id, jti, iat, and exp claims.",
1470
+ },
1471
+ token_header_forbidden: {
1472
+ summary: "The partner token contains a header that can select an untrusted key.",
1473
+ fix: "Remove jku, x5u, jwk, and x5c from the token header.",
1474
+ },
1475
+ token_malformed: {
1476
+ summary: "The partner token is not a valid compact JWT within the size limit.",
1477
+ fix: "Send a valid compact JWT that is no larger than 8192 bytes.",
1478
+ },
1479
+ token_signature_invalid: {
1480
+ summary: "The partner token signature does not match a registered issuer key.",
1481
+ fix: "Sign the token with an active key that is registered for the issuer.",
1482
+ },
1483
+ token_subject_invalid: {
1484
+ summary: "The partner token subject is not a normalized lowercase external principal id.",
1485
+ fix: "Use a trimmed lowercase ASCII subject without wildcards, slashes, or reserved policy characters.",
1486
+ },
1487
+ token_ttl_invalid: {
1488
+ summary: "The partner token time claims are expired, premature, or outside the lifetime limit.",
1489
+ fix: "Issue a new token with exp after iat and no more than 1800 seconds after iat.",
1490
+ },
1491
+ token_type_invalid: {
1492
+ summary: "The partner token has a typ header that Spacefast does not accept.",
1493
+ fix: "Set typ to at+jwt or application/at+jwt.",
1494
+ },
1252
1495
  transfer_cross_tenant_unsupported: {
1253
1496
  summary: "Spaces cannot be transferred across tenants.",
1254
1497
  fix: "Export the space and import it under the target tenant instead.",
@@ -1297,6 +1540,10 @@ export const ERROR_DOCS = {
1297
1540
  summary: "An uploaded file's size does not match the declared size.",
1298
1541
  fix: "Re-check the local file and upload it again.",
1299
1542
  },
1543
+ usage_period_not_found: {
1544
+ summary: "The requested usage period does not exist in this tenant.",
1545
+ fix: "List usage periods and use an id returned for the selected tenant.",
1546
+ },
1300
1547
  user_banned: {
1301
1548
  summary: "This user is banned for a policy or abuse violation and cannot perform this action.",
1302
1549
  fix: "If you believe the ban is a mistake, contact support to appeal it.",
@@ -1397,6 +1644,10 @@ export const ERROR_DOCS = {
1397
1644
  summary: "The webhook exhausted its delivery budget and was paused.",
1398
1645
  fix: "Fix the receiving endpoint, then redeliver or re-enable the webhook.",
1399
1646
  },
1647
+ webhook_managed_by_manifest: {
1648
+ summary: "The webhook is declared in the tenant's system-space manifest.",
1649
+ fix: "Edit its `system.subscriptions` entry and publish the system space.",
1650
+ },
1400
1651
  whois_unavailable: {
1401
1652
  summary: "WHOIS data is unavailable for this domain right now.",
1402
1653
  fix: "Retry later.",
@@ -1637,10 +1888,18 @@ export const ERROR_DOCS = {
1637
1888
  summary: "The Zero endpoints payload exceeds the supported endpoint count.",
1638
1889
  fix: "Reduce the project to at most 128 Zero endpoints, then publish again.",
1639
1890
  },
1891
+ zero_email_unavailable: {
1892
+ summary: "The local Zero email service is not configured.",
1893
+ fix: "Publish the capsule to call the hosted email service, or guard the `ctx.email` call so local runs skip it.",
1894
+ },
1640
1895
  zero_envelope_encode_failed: {
1641
1896
  summary: "The PHP bridge cannot encode the Zero runner request envelope.",
1642
1897
  fix: "Retry with valid request data. If the issue persists, report it.",
1643
1898
  },
1899
+ zero_gravatar_unavailable: {
1900
+ summary: "The local Zero gravatar service is not configured.",
1901
+ fix: "Publish the capsule to call the hosted gravatar service. `ctx.gravatar.avatarUrl` needs no service and works locally.",
1902
+ },
1644
1903
  zero_js_context_init_failed: {
1645
1904
  summary: "The Zero runner cannot initialize a QuickJS context.",
1646
1905
  fix: "Retry or rebuild the runner. Report persistent runtime initialization failures.",
@@ -1715,7 +1974,7 @@ export const ERROR_DOCS = {
1715
1974
  },
1716
1975
  zero_replay_query_invalid: {
1717
1976
  summary: "The hosted Zero realtime replay query is invalid.",
1718
- fix: "Use a valid `afterEventId` cursor and numeric limit.",
1977
+ fix: "Send a retained `afterEventId` from a previous page's `nextAfterEventId`, and a numeric limit.",
1719
1978
  },
1720
1979
  zero_replay_unavailable: {
1721
1980
  summary: "Realtime replay is not configured for this Zero version.",
@@ -1797,6 +2056,10 @@ export const ERROR_DOCS = {
1797
2056
  summary: "The Zero runner process cannot be started.",
1798
2057
  fix: "Verify the runner binary is installed and executable in the runtime.",
1799
2058
  },
2059
+ zero_spam_unavailable: {
2060
+ summary: "The local Zero spam service is not configured.",
2061
+ fix: "Publish the capsule to call the hosted spam service, or guard the `ctx.spam` call so local runs skip it.",
2062
+ },
1800
2063
  zero_runs_invalid: {
1801
2064
  summary: "The Zero run-handler payload is invalid.",
1802
2065
  fix: "Send a valid array of generated run handlers and publish again.",
@@ -1841,6 +2104,8 @@ export const ERROR_DOCS = {
1841
2104
  summary: "The infra webhook secret is not configured on this deployment.",
1842
2105
  fix: "Set the infra webhook secret in the control-plane environment.",
1843
2106
  },
2107
+ // `satisfies`, not an annotation, so the table keeps its literal types while
2108
+ // still failing the build the moment a code has no entry.
1844
2109
  };
1845
2110
  const PRODUCT = BRAND.productName;
1846
2111
  /** One generated reference page per error code; the `.md` twin is this exact text. */
@@ -9,7 +9,6 @@ export interface DocIndexEntry extends DocEntry {
9
9
  /** The bundled, generated docs index. */
10
10
  export interface DocsIndex {
11
11
  readonly version: typeof DOCS_INDEX_VERSION;
12
- /** Provenance marker so a reader knows the artifact is generated. */
13
12
  readonly generatedFrom: string;
14
13
  readonly entries: readonly DocIndexEntry[];
15
14
  }
@@ -1,7 +1,6 @@
1
1
  // Pure transform from the curated docs catalog (catalog.ts) to a search index.
2
- // Both the CLI's generator script and its drift-guard test call buildDocsIndex,
3
- // and the control-plane builds the same index in memory for GET /v1/docs, so the
4
- // served index, the bundled artifact, and the source can never silently diverge.
2
+ // The CLI's generator, its drift-guard test, and the control-plane's
3
+ // GET /v1/docs all call buildDocsIndex, so they cannot silently diverge.
5
4
  import { DOCS_CATALOG } from "./catalog.js";
6
5
  /** Current on-disk index schema version; bump when the shape changes. */
7
6
  export const DOCS_INDEX_VERSION = 1;
@@ -0,0 +1,77 @@
1
+ export type PageContextPromptInput = {
2
+ readonly page: {
3
+ readonly title: string;
4
+ readonly url: string;
5
+ readonly description?: string;
6
+ };
7
+ /**
8
+ * Live state of the resource the page is about: which space, whether its
9
+ * repository is connected, where it serves. This is what makes a builds brief
10
+ * about *this* space's builds rather than about builds in general, so it is
11
+ * rendered above the references an agent would use to act on it.
12
+ */
13
+ readonly facts?: {
14
+ readonly title: string;
15
+ readonly items: readonly {
16
+ readonly label: string;
17
+ readonly value: string;
18
+ }[];
19
+ };
20
+ readonly docs: readonly {
21
+ readonly title: string;
22
+ readonly url: string;
23
+ }[];
24
+ readonly operations: readonly {
25
+ readonly method: string;
26
+ readonly path: string;
27
+ readonly summary: string;
28
+ /**
29
+ * The operation's page in the API reference, which is also where its
30
+ * parameters and request/response schemas are rendered. Derived from the
31
+ * operation's id and tag (`apiOperationDocsUrl`), never written by hand.
32
+ */
33
+ readonly docsUrl?: string;
34
+ }[];
35
+ /**
36
+ * Real invocations, e.g. `sf builds ls --space lunar-sitemap --json`, derived
37
+ * from the oclif manifest's own examples with the current space substituted.
38
+ * `docsUrl` deep-links to that command's section of the CLI reference.
39
+ */
40
+ readonly cli: readonly {
41
+ readonly command: string;
42
+ readonly summary?: string;
43
+ readonly docsUrl?: string;
44
+ }[];
45
+ /** Include the short hosted-MCP pointer. */
46
+ readonly mcp?: boolean;
47
+ readonly form?: {
48
+ readonly surface: string;
49
+ readonly values: Readonly<Record<string, string | number | boolean | readonly string[]>>;
50
+ };
51
+ };
52
+ /** Builds the copy-ready markdown prompt for one dashboard page. Pure: same input, same bytes. */
53
+ export declare function buildPageContextPrompt(input: PageContextPromptInput): string;
54
+ /**
55
+ * Adds one private exchange to the safe page brief. The caller must send this
56
+ * result only to the clipboard. The private URL must not enter a rendered node,
57
+ * a query string, a log, or a cache key.
58
+ *
59
+ * The wording is calibrated on fresh-agent evals. First person — the user is
60
+ * the one pasting it, so the user is speaking. It says what the link is BEFORE
61
+ * asking for the fetch, because an unexplained "fetch this and obey it" reads
62
+ * as a phishing template to a careful agent. And it names the right mechanics:
63
+ * the naive `curl <url>` puts the bearer in argv and shell history, so the
64
+ * prompt says to use a URL-fetch tool.
65
+ */
66
+ export declare function buildPrivatePageContextPrompt(input: {
67
+ context: string;
68
+ expiresAt: string;
69
+ handoffUrl: string;
70
+ targetLabel: string;
71
+ /**
72
+ * What to do once connected. The default closes the loop back to the page
73
+ * brief above; a caller with no page brief (the /start copy) supplies its
74
+ * own so the prompt never points at references that are not there.
75
+ */
76
+ closing?: string | undefined;
77
+ }): string;