@spacefast/common 0.0.5 → 0.0.6
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.
- package/dist/agents/connect-targets.d.ts +133 -0
- package/dist/agents/connect-targets.js +224 -0
- package/dist/brand.d.ts +1 -0
- package/dist/brand.js +5 -0
- package/dist/config/domains.d.ts +12 -6
- package/dist/config/domains.js +30 -38
- package/dist/contracts/access.d.ts +825 -125
- package/dist/contracts/access.js +771 -148
- package/dist/contracts/activity.d.ts +1 -1
- package/dist/contracts/activity.js +28 -2
- package/dist/contracts/annotations.d.ts +2 -4
- package/dist/contracts/api-keys.d.ts +3 -4
- package/dist/contracts/api-keys.js +9 -6
- package/dist/contracts/archives.d.ts +8 -2
- package/dist/contracts/archives.js +11 -4
- package/dist/contracts/billing.d.ts +0 -9
- package/dist/contracts/builds.d.ts +25 -21
- package/dist/contracts/builds.js +12 -0
- package/dist/contracts/common.d.ts +2 -0
- package/dist/contracts/common.js +4 -0
- package/dist/contracts/continuation.d.ts +0 -3
- package/dist/contracts/countries.d.ts +2 -0
- package/dist/contracts/countries.js +261 -0
- package/dist/contracts/deployments.d.ts +34 -34
- package/dist/contracts/device-auth.d.ts +4 -11
- package/dist/contracts/device-auth.js +4 -0
- package/dist/contracts/docs.d.ts +119 -0
- package/dist/contracts/docs.js +51 -0
- package/dist/contracts/domains.d.ts +96 -54
- package/dist/contracts/domains.js +26 -4
- package/dist/contracts/enums.d.ts +15 -16
- package/dist/contracts/enums.js +25 -14
- package/dist/contracts/error-code-meta.d.ts +72 -0
- package/dist/contracts/error-code-meta.js +96 -10
- package/dist/contracts/error-codes.d.ts +1 -1
- package/dist/contracts/error-codes.js +14 -0
- package/dist/contracts/events.d.ts +1 -1
- package/dist/contracts/features.d.ts +76 -6
- package/dist/contracts/features.js +178 -13
- package/dist/contracts/git.d.ts +2 -8
- package/dist/contracts/ids.d.ts +5 -0
- package/dist/contracts/ids.js +5 -0
- package/dist/contracts/mcp.d.ts +8 -10
- package/dist/contracts/me.js +1 -1
- package/dist/contracts/oauth-resources.d.ts +19 -8
- package/dist/contracts/oauth-resources.js +44 -13
- package/dist/contracts/platform.d.ts +0 -102
- package/dist/contracts/platform.js +0 -50
- package/dist/contracts/push-new.d.ts +4 -4
- package/dist/contracts/quotas.d.ts +2 -0
- package/dist/contracts/quotas.js +8 -0
- package/dist/contracts/repository-connections.d.ts +6 -8
- package/dist/contracts/resources.d.ts +97 -13
- package/dist/contracts/resources.js +26 -2
- package/dist/contracts/routes.d.ts +0 -2
- package/dist/contracts/runtime-api.d.ts +361 -39
- package/dist/contracts/runtime-api.js +275 -6
- package/dist/contracts/sites.d.ts +19 -2
- package/dist/contracts/sites.js +21 -0
- package/dist/contracts/space-config.d.ts +201 -2
- package/dist/contracts/space-config.js +135 -5
- package/dist/contracts/spaces.d.ts +364 -193
- package/dist/contracts/spaces.js +40 -8
- package/dist/contracts/superadmin-emails.d.ts +4 -2
- package/dist/contracts/superadmin-emails.js +8 -0
- package/dist/contracts/superadmin-queues.d.ts +26 -26
- package/dist/contracts/superadmin-spaces.d.ts +170 -42
- package/dist/contracts/superadmin.d.ts +6 -93
- package/dist/contracts/superadmin.js +6 -14
- package/dist/contracts/tags.d.ts +10 -9
- package/dist/contracts/tags.js +2 -1
- package/dist/contracts/teams.d.ts +21 -22
- package/dist/contracts/teams.js +0 -1
- package/dist/contracts/theme-json.d.ts +30 -0
- package/dist/contracts/theme-json.js +48 -0
- package/dist/contracts/variables.d.ts +0 -2
- package/dist/contracts/variables.js +0 -5
- package/dist/contracts/webhooks.d.ts +2 -0
- package/dist/contracts/webhooks.js +1 -1
- package/dist/contracts/zero.d.ts +5 -10
- package/dist/docs/agent-prose.d.ts +43 -3
- package/dist/docs/agent-prose.js +146 -7
- package/dist/docs/agent-setup.js +45 -13
- package/dist/docs/agent-solutions.d.ts +5 -5
- package/dist/docs/agent-solutions.js +2 -2
- package/dist/docs/catalog.d.ts +650 -0
- package/dist/docs/catalog.js +758 -0
- package/dist/docs/error-docs.d.ts +0 -2
- package/dist/docs/error-docs.js +77 -35
- package/dist/docs/index-build.d.ts +17 -0
- package/dist/docs/index-build.js +24 -0
- package/dist/docs/search.d.ts +54 -0
- package/dist/docs/search.js +96 -0
- package/dist/docs/skill-distribution.d.ts +5 -3
- package/dist/docs/skill-distribution.js +8 -8
- package/dist/utils/access-match.d.ts +39 -0
- package/dist/utils/access-match.js +296 -0
- package/dist/utils/auth-redirect.d.ts +3 -1
- package/dist/utils/auth-redirect.js +21 -1
- package/dist/utils/build-settings.d.ts +6 -0
- package/dist/utils/build-settings.js +429 -46
- package/dist/utils/claim-token.d.ts +8 -0
- package/dist/utils/claim-token.js +23 -2
- package/dist/utils/content-type.d.ts +1 -0
- package/dist/utils/content-type.js +1 -1
- package/dist/utils/credential-policy.d.ts +54 -0
- package/dist/utils/{access-policy.js → credential-policy.js} +28 -2
- package/dist/utils/gate-theme.d.ts +61 -0
- package/dist/utils/gate-theme.js +217 -0
- package/dist/utils/git-repository.d.ts +0 -1
- package/dist/utils/git-repository.js +0 -3
- package/dist/utils/id-hints.d.ts +8 -0
- package/dist/utils/id-hints.js +61 -0
- package/dist/utils/local-space-state.d.ts +91 -0
- package/dist/utils/local-space-state.js +251 -0
- package/dist/utils/oauth-signed-query.d.ts +8 -0
- package/dist/utils/oauth-signed-query.js +26 -0
- package/dist/utils/publish-detection.d.ts +0 -8
- package/dist/utils/publish-detection.js +0 -93
- package/dist/utils/publish-policy.d.ts +6 -5
- package/dist/utils/publish-policy.js +71 -7
- package/dist/utils/query-keys.d.ts +15 -4
- package/dist/utils/query-keys.js +27 -4
- package/dist/utils/runtime-paths.d.ts +0 -1
- package/dist/utils/runtime-paths.js +0 -1
- package/dist/utils/runtime-upload-batch.d.ts +18 -0
- package/dist/utils/runtime-upload-batch.js +90 -0
- package/dist/utils/runtime-upload.d.ts +2 -0
- package/dist/utils/runtime-upload.js +5 -0
- package/dist/utils/space-config.d.ts +4 -0
- package/dist/utils/space-config.js +10 -1
- package/dist/utils/space-theme.d.ts +2 -0
- package/dist/utils/space-theme.js +9 -0
- package/dist/utils/static-runtime-policy.d.ts +0 -21
- package/dist/utils/static-runtime-policy.js +19 -103
- package/dist/utils/upload-session.d.ts +1 -1
- package/dist/utils/wpcom-auth-redirects.d.ts +32 -2
- package/dist/utils/wpcom-auth-redirects.js +26 -10
- package/dist/vocabulary.d.ts +130 -30
- package/dist/vocabulary.js +77 -36
- package/package.json +16 -1
- package/dist/contracts/account.d.ts +0 -28
- package/dist/contracts/account.js +0 -54
- package/dist/contracts/intercom.d.ts +0 -6
- package/dist/contracts/intercom.js +0 -5
- package/dist/contracts/telemetry.d.ts +0 -2
- package/dist/contracts/telemetry.js +0 -1
- package/dist/utils/access-policy.d.ts +0 -39
- package/dist/utils/error-display.d.ts +0 -7
- package/dist/utils/error-display.js +0 -42
|
@@ -8,5 +8,3 @@ export type ErrorDoc = {
|
|
|
8
8
|
export declare const ERROR_DOCS: Record<ErrorCode, ErrorDoc>;
|
|
9
9
|
/** One generated reference page per error code; the `.md` twin is this exact text. */
|
|
10
10
|
export declare function errorDocMarkdown(code: ErrorCode): string;
|
|
11
|
-
/** The generated `/docs/errors` index page; the `.md` twin is this exact text. */
|
|
12
|
-
export declare function errorDocsIndexMarkdown(): string;
|
package/dist/docs/error-docs.js
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
// and pages never go missing. apps/www renders the HTML pages and writes the
|
|
6
6
|
// `.md` twins from the same entries.
|
|
7
7
|
import { BRAND } from "../brand.js";
|
|
8
|
-
import { ERROR_CODES, errorDocsUrl } from "../contracts/error-codes.js";
|
|
8
|
+
import { ERROR_CODES, errorDocsUrl, } from "../contracts/error-codes.js";
|
|
9
|
+
// Restore upgrade-oriented recovery copy here when paid plan checkout is live.
|
|
9
10
|
export const ERROR_DOCS = {
|
|
10
11
|
abuse_report_invalid_transition: {
|
|
11
12
|
summary: "The abuse report cannot move to the requested status from its current status.",
|
|
@@ -33,7 +34,7 @@ export const ERROR_DOCS = {
|
|
|
33
34
|
},
|
|
34
35
|
anonymous_expired: {
|
|
35
36
|
summary: "This anonymous space expired before it was claimed.",
|
|
36
|
-
fix: "Publish
|
|
37
|
+
fix: "Publish a fresh space and share its claim link right away this time. If you meant to update a space that is still live, check .spacefast/ (or your saved receipt) for its spaceId and publish to that with its credential instead of creating a new space.",
|
|
37
38
|
},
|
|
38
39
|
anonymous_pool_unavailable: {
|
|
39
40
|
summary: "No pooled capacity is available for anonymous publishes right now.",
|
|
@@ -43,6 +44,10 @@ export const ERROR_DOCS = {
|
|
|
43
44
|
summary: "Too many anonymous publishes came from this network in a short window.",
|
|
44
45
|
fix: "Wait for the window to pass, or sign in with an API key for higher limits.",
|
|
45
46
|
},
|
|
47
|
+
anonymous_space_limit_reached: {
|
|
48
|
+
summary: "Too many unclaimed anonymous spaces are already active for this client.",
|
|
49
|
+
fix: "Log in to publish into an authenticated space, or claim/delete an existing anonymous space before creating another.",
|
|
50
|
+
},
|
|
46
51
|
archive_body_required: {
|
|
47
52
|
summary: "This request must carry an archive body but none was provided.",
|
|
48
53
|
fix: "Send the zip bytes as the request body with the matching content-type header.",
|
|
@@ -145,7 +150,7 @@ export const ERROR_DOCS = {
|
|
|
145
150
|
},
|
|
146
151
|
claimed_space_quota_exceeded: {
|
|
147
152
|
summary: "Claiming this space would exceed the target team's space quota.",
|
|
148
|
-
fix: "Delete unused spaces
|
|
153
|
+
fix: "Delete unused spaces, then claim again. Still stuck? POST /v1/feedback with the error code and request id.",
|
|
149
154
|
},
|
|
150
155
|
cli_upgrade_required: {
|
|
151
156
|
summary: "This CLI version is too old to talk to the API safely.",
|
|
@@ -165,7 +170,15 @@ export const ERROR_DOCS = {
|
|
|
165
170
|
},
|
|
166
171
|
config_templates_over_limit: {
|
|
167
172
|
summary: "The configuration declares more template files than the plan allows.",
|
|
168
|
-
fix: "Reduce the number of template entries in sf.jsonc.",
|
|
173
|
+
fix: "Reduce the number of template entries in sf.jsonc. Still stuck? POST /v1/feedback with the error code and request id.",
|
|
174
|
+
},
|
|
175
|
+
continuation_unavailable: {
|
|
176
|
+
summary: "This claim token can no longer be exchanged for an access token.",
|
|
177
|
+
fix: "If the space is claimed, ask its owner for an access token (dashboard: Account → Access tokens). If it is still unclaimed, keep using the claim token as bearer auth instead of exchanging it. Still stuck? POST /v1/feedback with the error code and request id.",
|
|
178
|
+
},
|
|
179
|
+
continuation_used: {
|
|
180
|
+
summary: "This claim token was already exchanged for a durable access token.",
|
|
181
|
+
fix: "Authenticate with the exchanged access token (check .spacefast/state.json or wherever it was saved). If it was lost, ask the space owner to mint a new access token.",
|
|
169
182
|
},
|
|
170
183
|
credential_expired: {
|
|
171
184
|
summary: "The credential used for this request has expired.",
|
|
@@ -191,9 +204,13 @@ export const ERROR_DOCS = {
|
|
|
191
204
|
summary: "CSAM enforcement policy cannot be set below the mandatory account-suspend floor.",
|
|
192
205
|
fix: "Set the CSAM category enforcement tier to account suspension.",
|
|
193
206
|
},
|
|
207
|
+
datacenters_unavailable: {
|
|
208
|
+
summary: "Placement regions are temporarily unavailable.",
|
|
209
|
+
fix: "Retry after the datacenter list has synced.",
|
|
210
|
+
},
|
|
194
211
|
data_location_immutable: {
|
|
195
|
-
summary: "
|
|
196
|
-
fix: "
|
|
212
|
+
summary: "This request tried to change data location through an immutable path.",
|
|
213
|
+
fix: "Use PATCH /v1/spaces/{id} to queue a region move when region changes are supported for this space.",
|
|
197
214
|
},
|
|
198
215
|
device_authorization_failed: {
|
|
199
216
|
summary: "The device login request failed and cannot be completed.",
|
|
@@ -373,7 +390,7 @@ export const ERROR_DOCS = {
|
|
|
373
390
|
},
|
|
374
391
|
domain_quota_exceeded: {
|
|
375
392
|
summary: "Adding this domain would exceed the plan's external domain allowance.",
|
|
376
|
-
fix: "Remove unused domains
|
|
393
|
+
fix: "Remove unused domains. Still stuck? POST /v1/feedback with the error code and request id.",
|
|
377
394
|
},
|
|
378
395
|
domain_registration_active: {
|
|
379
396
|
summary: "The domain has an active registration, which blocks this operation.",
|
|
@@ -421,7 +438,7 @@ export const ERROR_DOCS = {
|
|
|
421
438
|
},
|
|
422
439
|
feature_unavailable: {
|
|
423
440
|
summary: "This feature is not available on this deployment or plan.",
|
|
424
|
-
fix: "Check the feature's availability
|
|
441
|
+
fix: "Check the feature's availability and try again when it is enabled for your team.",
|
|
425
442
|
},
|
|
426
443
|
files_mode_does_not_support_spa: {
|
|
427
444
|
summary: "SPA fallback cannot be combined with files-listing mode.",
|
|
@@ -433,11 +450,11 @@ export const ERROR_DOCS = {
|
|
|
433
450
|
},
|
|
434
451
|
free_external_proxy_disabled: {
|
|
435
452
|
summary: "Proxy routes to external upstreams are not available on the Free plan.",
|
|
436
|
-
fix: "Remove the proxy rules
|
|
453
|
+
fix: "Remove the proxy rules before publishing. Still stuck? POST /v1/feedback with the error code and request id.",
|
|
437
454
|
},
|
|
438
455
|
free_headers_basic_auth_disabled: {
|
|
439
456
|
summary: "Basic-Auth via _headers is not available on the Free plan.",
|
|
440
|
-
fix: "Use space password protection
|
|
457
|
+
fix: "Use space password protection instead. Still stuck? POST /v1/feedback with the error code and request id.",
|
|
441
458
|
},
|
|
442
459
|
idempotency_conflict_in_progress: {
|
|
443
460
|
summary: "Another request with the same Idempotency-Key is still in flight.",
|
|
@@ -613,7 +630,7 @@ export const ERROR_DOCS = {
|
|
|
613
630
|
},
|
|
614
631
|
log_retention_clamped: {
|
|
615
632
|
summary: "The requested log range exceeds the plan's retention and was clamped.",
|
|
616
|
-
fix: "Narrow the range
|
|
633
|
+
fix: "Narrow the range.",
|
|
617
634
|
},
|
|
618
635
|
lost_domain_control: {
|
|
619
636
|
summary: `${BRAND.productName} no longer observes DNS control for this domain.`,
|
|
@@ -647,6 +664,10 @@ export const ERROR_DOCS = {
|
|
|
647
664
|
summary: "A required route parameter is missing from the request path.",
|
|
648
665
|
fix: "Check the endpoint path in the API reference and include every parameter.",
|
|
649
666
|
},
|
|
667
|
+
move_target_capacity_lost: {
|
|
668
|
+
summary: "The selected move target no longer has capacity for the space.",
|
|
669
|
+
fix: "Retry the move with a different target or after capacity is freed.",
|
|
670
|
+
},
|
|
650
671
|
nameserver_delegation_required: {
|
|
651
672
|
summary: `This operation requires the domain to be delegated to ${BRAND.productName} nameservers.`,
|
|
652
673
|
fix: "Update the domain's nameservers at the registrar, then retry once delegation propagates.",
|
|
@@ -683,6 +704,14 @@ export const ERROR_DOCS = {
|
|
|
683
704
|
summary: "This plan grant was already revoked.",
|
|
684
705
|
fix: "Nothing to do; create a new grant if the team should regain the plan.",
|
|
685
706
|
},
|
|
707
|
+
placement_invalid_burstable: {
|
|
708
|
+
summary: "The placement burstable option was used with an unsupported placement mode.",
|
|
709
|
+
fix: 'Set placement.mode to "dedicated" before setting placement.burstable, or remove the burstable option.',
|
|
710
|
+
},
|
|
711
|
+
placement_mode_requires_plan: {
|
|
712
|
+
summary: "The requested placement mode requires a plan entitlement.",
|
|
713
|
+
fix: "Upgrade the team plan or choose shared placement.",
|
|
714
|
+
},
|
|
686
715
|
platform_tenant_immutable_client: {
|
|
687
716
|
summary: "The tenant's provider client cannot be changed.",
|
|
688
717
|
fix: "Create a new tenant with the desired provider client instead.",
|
|
@@ -729,7 +758,7 @@ export const ERROR_DOCS = {
|
|
|
729
758
|
},
|
|
730
759
|
publish_archive_expanded_size_exceeded: {
|
|
731
760
|
summary: "The archive expands beyond the maximum allowed total size.",
|
|
732
|
-
fix: "Reduce the content size
|
|
761
|
+
fix: "Reduce the content size.",
|
|
733
762
|
},
|
|
734
763
|
publish_archive_file_count_exceeded: {
|
|
735
764
|
summary: "The archive contains more files than the allowed ceiling.",
|
|
@@ -781,7 +810,7 @@ export const ERROR_DOCS = {
|
|
|
781
810
|
},
|
|
782
811
|
routing_rules_over_plan: {
|
|
783
812
|
summary: "The published _redirects and _headers exceed the plan's routing-rule allowance.",
|
|
784
|
-
fix: "Reduce the rule count
|
|
813
|
+
fix: "Reduce the rule count. Still stuck? POST /v1/feedback with the error code and request id.",
|
|
785
814
|
},
|
|
786
815
|
runtime_action_forbidden: {
|
|
787
816
|
summary: "The runtime credential does not allow this action.",
|
|
@@ -789,7 +818,7 @@ export const ERROR_DOCS = {
|
|
|
789
818
|
},
|
|
790
819
|
runtime_api_not_found: {
|
|
791
820
|
summary: "The runtime management endpoint was not found.",
|
|
792
|
-
fix: "
|
|
821
|
+
fix: "Send the request with the management hostname as the Host header; management routes are not served on public hostnames.",
|
|
793
822
|
},
|
|
794
823
|
runtime_callback_forbidden: {
|
|
795
824
|
summary: "The runtime callback could not be authenticated.",
|
|
@@ -900,13 +929,17 @@ export const ERROR_DOCS = {
|
|
|
900
929
|
fix: "Increase the polling interval; aggressive polling invalidates the flow.",
|
|
901
930
|
},
|
|
902
931
|
space_already_claimed: {
|
|
903
|
-
summary: "The space was already claimed
|
|
904
|
-
fix: "
|
|
932
|
+
summary: "The space was already claimed; a claim can only succeed once.",
|
|
933
|
+
fix: "If you are the agent that published this space, exchange your claim token once at POST /v1/anonymous-claim/exchange for a durable access token and keep publishing to the same spaceId. Otherwise ask the owner for access — do not publish a duplicate space.",
|
|
905
934
|
},
|
|
906
935
|
space_claim_unavailable: {
|
|
907
936
|
summary: "This space cannot be claimed.",
|
|
908
937
|
fix: "Only anonymous, unexpired spaces with a valid claim token can be claimed.",
|
|
909
938
|
},
|
|
939
|
+
space_claimed_credential_available: {
|
|
940
|
+
summary: "The space was claimed and its owner kept agent publishing enabled; this claim token now works exactly once as an exchange voucher.",
|
|
941
|
+
fix: "POST /v1/anonymous-claim/exchange with this claim token as bearer auth. Save the returned access token (e.g. .spacefast/state.json), then retry the request with it as Authorization: Bearer. Do not publish a new space.",
|
|
942
|
+
},
|
|
910
943
|
space_disabled: {
|
|
911
944
|
summary: "The space is disabled and cannot be served or modified.",
|
|
912
945
|
fix: "Check the disabled reason on the space; it explains the path to restore it.",
|
|
@@ -983,9 +1016,13 @@ export const ERROR_DOCS = {
|
|
|
983
1016
|
summary: "This operation only applies to static-runtime spaces.",
|
|
984
1017
|
fix: "Target a static-runtime space.",
|
|
985
1018
|
},
|
|
1019
|
+
storage_bucket_unavailable: {
|
|
1020
|
+
summary: "No usable internal storage bucket is configured for this operation.",
|
|
1021
|
+
fix: "Check the storage bucket registry and credential environment references, then retry.",
|
|
1022
|
+
},
|
|
986
1023
|
storage_quota_exceeded: {
|
|
987
1024
|
summary: "The publish would exceed the plan's storage allowance.",
|
|
988
|
-
fix: "Delete old versions
|
|
1025
|
+
fix: "Delete old versions. Still stuck? POST /v1/feedback with the error code and request id.",
|
|
989
1026
|
},
|
|
990
1027
|
storage_usage_unavailable: {
|
|
991
1028
|
summary: "Storage usage could not be computed right now.",
|
|
@@ -1003,6 +1040,10 @@ export const ERROR_DOCS = {
|
|
|
1003
1040
|
summary: "The hostname was recently bound elsewhere; a takeover notice window applies.",
|
|
1004
1041
|
fix: "Retry after the notice window, or have the current holder release the binding.",
|
|
1005
1042
|
},
|
|
1043
|
+
team_member_quota_exceeded: {
|
|
1044
|
+
summary: "Inviting this person would exceed the team's seat limit.",
|
|
1045
|
+
fix: "Remove a team member or cancel a pending invitation to free a seat; pending invitations count toward the limit.",
|
|
1046
|
+
},
|
|
1006
1047
|
team_ref_required: {
|
|
1007
1048
|
summary: "A team reference is required for this operation.",
|
|
1008
1049
|
fix: "Pass the team id or slug.",
|
|
@@ -1075,6 +1116,10 @@ export const ERROR_DOCS = {
|
|
|
1075
1116
|
summary: "The transfer has progressed past the point where it can be canceled.",
|
|
1076
1117
|
fix: "Wait for the transfer to finish.",
|
|
1077
1118
|
},
|
|
1119
|
+
transfer_push_failed: {
|
|
1120
|
+
summary: "The source runtime could not push the space blobs into the transfer bucket.",
|
|
1121
|
+
fix: "Retry the move; if it persists, check the source runtime and bucket configuration.",
|
|
1122
|
+
},
|
|
1078
1123
|
transfer_source_changed: {
|
|
1079
1124
|
summary: "The space changed since the transfer was created, so it must be re-confirmed.",
|
|
1080
1125
|
fix: "Review the space's current state and confirm the transfer again.",
|
|
@@ -1083,6 +1128,10 @@ export const ERROR_DOCS = {
|
|
|
1083
1128
|
summary: "The transfer target is the same principal that already owns the space.",
|
|
1084
1129
|
fix: "Pick a different target team or account.",
|
|
1085
1130
|
},
|
|
1131
|
+
transfer_verify_failed: {
|
|
1132
|
+
summary: "The target runtime could not verify transferred blob content.",
|
|
1133
|
+
fix: "Retry the move; if it persists, check the target runtime and bucket integrity.",
|
|
1134
|
+
},
|
|
1086
1135
|
unauthorized: {
|
|
1087
1136
|
summary: "The request carried no valid credential.",
|
|
1088
1137
|
fix: "Send a bearer access token, use an agent OAuth client, or sign in.",
|
|
@@ -1165,7 +1214,7 @@ export const ERROR_DOCS = {
|
|
|
1165
1214
|
},
|
|
1166
1215
|
version_file_too_large: {
|
|
1167
1216
|
summary: "A file exceeds the plan's maximum file size.",
|
|
1168
|
-
fix: "Reduce the file size
|
|
1217
|
+
fix: "Reduce the file size.",
|
|
1169
1218
|
},
|
|
1170
1219
|
version_files_missing: {
|
|
1171
1220
|
summary: "Declared files were never uploaded, so the version cannot finalize.",
|
|
@@ -1205,11 +1254,11 @@ export const ERROR_DOCS = {
|
|
|
1205
1254
|
},
|
|
1206
1255
|
version_quota_exceeded: {
|
|
1207
1256
|
summary: "The space has reached its version quota.",
|
|
1208
|
-
fix: "Delete old versions
|
|
1257
|
+
fix: "Delete old versions. Still stuck? POST /v1/feedback with the error code and request id.",
|
|
1209
1258
|
},
|
|
1210
1259
|
version_total_bytes_exceeded: {
|
|
1211
1260
|
summary: "The version exceeds the maximum total size.",
|
|
1212
|
-
fix: "Reduce the content size
|
|
1261
|
+
fix: "Reduce the content size.",
|
|
1213
1262
|
},
|
|
1214
1263
|
webhook_delivery_budget_exceeded: {
|
|
1215
1264
|
summary: "The webhook exhausted its delivery budget and was paused.",
|
|
@@ -1219,6 +1268,10 @@ export const ERROR_DOCS = {
|
|
|
1219
1268
|
summary: "WHOIS data is unavailable for this domain right now.",
|
|
1220
1269
|
fix: "Retry later.",
|
|
1221
1270
|
},
|
|
1271
|
+
zero_activating: {
|
|
1272
|
+
summary: "Zero endpoints are activating.",
|
|
1273
|
+
fix: "Wait for the dedicated runtime move to complete, then retry the request.",
|
|
1274
|
+
},
|
|
1222
1275
|
zero_artifact_abi_mismatch: {
|
|
1223
1276
|
summary: "The Zero endpoint artifact was built for a different runner ABI.",
|
|
1224
1277
|
fix: `Rebuild and republish the Zero project with the current ${BRAND.productName} CLI and runtime.`,
|
|
@@ -1375,6 +1428,10 @@ export const ERROR_DOCS = {
|
|
|
1375
1428
|
summary: "No Zero endpoint artifact exists for this endpoint id.",
|
|
1376
1429
|
fix: "Check the route path and rebuild the Zero endpoint index.",
|
|
1377
1430
|
},
|
|
1431
|
+
zero_requires_dedicated_plan: {
|
|
1432
|
+
summary: "Zero endpoints require a plan with dedicated runtime isolation.",
|
|
1433
|
+
fix: "Upgrade the team to a plan that includes Zero and dedicated runtime, then publish again.",
|
|
1434
|
+
},
|
|
1378
1435
|
zero_envelope_encode_failed: {
|
|
1379
1436
|
summary: "The PHP bridge could not encode the Zero runner request envelope.",
|
|
1380
1437
|
fix: "Retry with valid request data; report the issue if it persists.",
|
|
@@ -1596,18 +1653,3 @@ export function errorDocMarkdown(code) {
|
|
|
1596
1653
|
"",
|
|
1597
1654
|
].join("\n");
|
|
1598
1655
|
}
|
|
1599
|
-
/** The generated `/docs/errors` index page; the `.md` twin is this exact text. */
|
|
1600
|
-
export function errorDocsIndexMarkdown() {
|
|
1601
|
-
return [
|
|
1602
|
-
"# Error reference",
|
|
1603
|
-
"",
|
|
1604
|
-
`Every ${PRODUCT} API error response carries a stable \`code\` and a \`docsUrl\` that`,
|
|
1605
|
-
"links to one of the pages below. Codes are never renamed or removed. Match on",
|
|
1606
|
-
"`code` in clients; `message` text may improve over time.",
|
|
1607
|
-
"",
|
|
1608
|
-
"| Code | Meaning |",
|
|
1609
|
-
"| --- | --- |",
|
|
1610
|
-
...ERROR_CODES.map((code) => `| [\`${code}\`](/docs/errors/${code}) | ${ERROR_DOCS[code].summary} |`),
|
|
1611
|
-
"",
|
|
1612
|
-
].join("\n");
|
|
1613
|
-
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type DocEntry } from "./catalog.js";
|
|
2
|
+
/** Current on-disk index schema version; bump when the shape changes. */
|
|
3
|
+
export declare const DOCS_INDEX_VERSION: 1;
|
|
4
|
+
/** A catalog entry plus its precomputed search blob. */
|
|
5
|
+
export interface DocIndexEntry extends DocEntry {
|
|
6
|
+
/** Lowercased haystack (slug + title + summary + kind + keywords) for offline search. */
|
|
7
|
+
readonly haystack: string;
|
|
8
|
+
}
|
|
9
|
+
/** The bundled, generated docs index. */
|
|
10
|
+
export interface DocsIndex {
|
|
11
|
+
readonly version: typeof DOCS_INDEX_VERSION;
|
|
12
|
+
/** Provenance marker so a reader knows the artifact is generated. */
|
|
13
|
+
readonly generatedFrom: string;
|
|
14
|
+
readonly entries: readonly DocIndexEntry[];
|
|
15
|
+
}
|
|
16
|
+
/** Build the derived search index from a catalog (defaults to the bundled one). */
|
|
17
|
+
export declare function buildDocsIndex(catalog?: readonly DocEntry[]): DocsIndex;
|
|
@@ -0,0 +1,24 @@
|
|
|
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.
|
|
5
|
+
import { DOCS_CATALOG } from "./catalog.js";
|
|
6
|
+
/** Current on-disk index schema version; bump when the shape changes. */
|
|
7
|
+
export const DOCS_INDEX_VERSION = 1;
|
|
8
|
+
/** Build the derived search index from a catalog (defaults to the bundled one). */
|
|
9
|
+
export function buildDocsIndex(catalog = DOCS_CATALOG) {
|
|
10
|
+
const entries = catalog.map((entry) => ({
|
|
11
|
+
...entry,
|
|
12
|
+
keywords: [...entry.keywords],
|
|
13
|
+
haystack: [entry.slug, entry.title, entry.summary, entry.kind, ...entry.keywords]
|
|
14
|
+
.join(" ")
|
|
15
|
+
.toLowerCase(),
|
|
16
|
+
}));
|
|
17
|
+
return {
|
|
18
|
+
version: DOCS_INDEX_VERSION,
|
|
19
|
+
// Provenance points at the CLI's re-export path, which the committed
|
|
20
|
+
// docs-index.generated.json artifact (and its drift-guard test) pin.
|
|
21
|
+
generatedFrom: "src/docs-catalog.ts",
|
|
22
|
+
entries,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type CliDisclosureTier } from "../vocabulary.js";
|
|
2
|
+
import type { DocIndexEntry, DocsIndex } from "./index-build.js";
|
|
3
|
+
/** The public, machine-readable shape of a single matched doc. */
|
|
4
|
+
export interface DocResult {
|
|
5
|
+
readonly slug: string;
|
|
6
|
+
readonly title: string;
|
|
7
|
+
readonly kind: DocIndexEntry["kind"];
|
|
8
|
+
readonly tier: CliDisclosureTier;
|
|
9
|
+
readonly summary: string;
|
|
10
|
+
readonly url: string;
|
|
11
|
+
}
|
|
12
|
+
/** A topic result additionally carries the printable body. */
|
|
13
|
+
export interface DocTopic extends DocResult {
|
|
14
|
+
readonly body: string;
|
|
15
|
+
}
|
|
16
|
+
/** The exact `data` payload `sf docs` emits (drives both human + `--json` output). */
|
|
17
|
+
export interface DocsCommandResult {
|
|
18
|
+
/** The trimmed query, or null when listing. */
|
|
19
|
+
readonly query: string | null;
|
|
20
|
+
/** The tier the listing/search ran at. */
|
|
21
|
+
readonly tier: CliDisclosureTier;
|
|
22
|
+
/** Present when the query resolved to an exact topic. */
|
|
23
|
+
readonly topic: DocTopic | null;
|
|
24
|
+
/** Matched docs (or the full tier listing when no query). */
|
|
25
|
+
readonly results: readonly DocResult[];
|
|
26
|
+
}
|
|
27
|
+
/** Entries visible at `viewTier`, in catalog order. */
|
|
28
|
+
export declare function visibleEntries(index: DocsIndex, viewTier: CliDisclosureTier): DocIndexEntry[];
|
|
29
|
+
/** Exact topic lookup by slug (case-insensitive). Ignores tier — explicit intent wins. */
|
|
30
|
+
export declare function findTopic(index: DocsIndex, slug: string): DocIndexEntry | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Ranked query results are capped so a broad term (e.g. one that hits a chunk
|
|
33
|
+
* of the ~390 generated error-reference entries) can never return the whole
|
|
34
|
+
* catalog in one response. Listing a tier with no query is unaffected — that's
|
|
35
|
+
* an intentional "show me everything at this tier" request, not a search.
|
|
36
|
+
*/
|
|
37
|
+
export declare const SEARCH_DOCS_RESULT_LIMIT = 25;
|
|
38
|
+
/**
|
|
39
|
+
* Rank docs matching `query` within the tier. Empty query returns the full tier
|
|
40
|
+
* listing (catalog order), uncapped. A non-empty query ranks matches and caps
|
|
41
|
+
* the result count at {@link SEARCH_DOCS_RESULT_LIMIT}.
|
|
42
|
+
*/
|
|
43
|
+
export declare function searchDocs(index: DocsIndex, options: {
|
|
44
|
+
query?: string;
|
|
45
|
+
tier: CliDisclosureTier;
|
|
46
|
+
}): DocIndexEntry[];
|
|
47
|
+
/**
|
|
48
|
+
* Resolve the `sf docs [query]` request: an exact-slug query prints that topic;
|
|
49
|
+
* any other query searches; an empty query lists the tier. Pure + offline.
|
|
50
|
+
*/
|
|
51
|
+
export declare function resolveDocsCommand(index: DocsIndex, options: {
|
|
52
|
+
query?: string;
|
|
53
|
+
tier: CliDisclosureTier;
|
|
54
|
+
}): DocsCommandResult;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Pure, offline search + tier filtering over a docs index. Shared by the CLI's
|
|
2
|
+
// `sf docs` (offline, against the bundled JSON) and the control-plane's
|
|
3
|
+
// GET /v1/docs (in memory, against the catalog-derived index) so both rank and
|
|
4
|
+
// gate identically. Tier-aware — ESSENTIAL by default, widening to FULL
|
|
5
|
+
// (`--full`) and REFERENCE (`--all`).
|
|
6
|
+
import { tierVisibleAt } from "../vocabulary.js";
|
|
7
|
+
function toResult(entry) {
|
|
8
|
+
return {
|
|
9
|
+
slug: entry.slug,
|
|
10
|
+
title: entry.title,
|
|
11
|
+
kind: entry.kind,
|
|
12
|
+
tier: entry.tier,
|
|
13
|
+
summary: entry.summary,
|
|
14
|
+
url: entry.url,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function toTopic(entry) {
|
|
18
|
+
return { ...toResult(entry), body: entry.body };
|
|
19
|
+
}
|
|
20
|
+
/** Entries visible at `viewTier`, in catalog order. */
|
|
21
|
+
export function visibleEntries(index, viewTier) {
|
|
22
|
+
return index.entries.filter((entry) => tierVisibleAt(viewTier, entry.tier));
|
|
23
|
+
}
|
|
24
|
+
/** Exact topic lookup by slug (case-insensitive). Ignores tier — explicit intent wins. */
|
|
25
|
+
export function findTopic(index, slug) {
|
|
26
|
+
const needle = slug.trim().toLowerCase();
|
|
27
|
+
if (!needle)
|
|
28
|
+
return undefined;
|
|
29
|
+
return index.entries.find((entry) => entry.slug.toLowerCase() === needle);
|
|
30
|
+
}
|
|
31
|
+
function scoreEntry(entry, tokens) {
|
|
32
|
+
const slug = entry.slug.toLowerCase();
|
|
33
|
+
const title = entry.title.toLowerCase();
|
|
34
|
+
const keywords = entry.keywords.map((keyword) => keyword.toLowerCase());
|
|
35
|
+
let total = 0;
|
|
36
|
+
for (const token of tokens) {
|
|
37
|
+
let tokenScore = 0;
|
|
38
|
+
if (slug === token)
|
|
39
|
+
tokenScore = Math.max(tokenScore, 5);
|
|
40
|
+
else if (slug.includes(token))
|
|
41
|
+
tokenScore = Math.max(tokenScore, 3);
|
|
42
|
+
if (title.includes(token))
|
|
43
|
+
tokenScore = Math.max(tokenScore, 3);
|
|
44
|
+
if (keywords.some((keyword) => keyword.includes(token)))
|
|
45
|
+
tokenScore = Math.max(tokenScore, 2);
|
|
46
|
+
if (tokenScore === 0 && entry.haystack.includes(token))
|
|
47
|
+
tokenScore = 1;
|
|
48
|
+
// AND semantics: every query token must match somewhere.
|
|
49
|
+
if (tokenScore === 0)
|
|
50
|
+
return 0;
|
|
51
|
+
total += tokenScore;
|
|
52
|
+
}
|
|
53
|
+
return total;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Ranked query results are capped so a broad term (e.g. one that hits a chunk
|
|
57
|
+
* of the ~390 generated error-reference entries) can never return the whole
|
|
58
|
+
* catalog in one response. Listing a tier with no query is unaffected — that's
|
|
59
|
+
* an intentional "show me everything at this tier" request, not a search.
|
|
60
|
+
*/
|
|
61
|
+
export const SEARCH_DOCS_RESULT_LIMIT = 25;
|
|
62
|
+
/**
|
|
63
|
+
* Rank docs matching `query` within the tier. Empty query returns the full tier
|
|
64
|
+
* listing (catalog order), uncapped. A non-empty query ranks matches and caps
|
|
65
|
+
* the result count at {@link SEARCH_DOCS_RESULT_LIMIT}.
|
|
66
|
+
*/
|
|
67
|
+
export function searchDocs(index, options) {
|
|
68
|
+
const pool = visibleEntries(index, options.tier);
|
|
69
|
+
const tokens = (options.query ?? "").toLowerCase().split(/\s+/).filter(Boolean);
|
|
70
|
+
if (tokens.length === 0)
|
|
71
|
+
return pool;
|
|
72
|
+
return pool
|
|
73
|
+
.map((entry) => ({ entry, score: scoreEntry(entry, tokens) }))
|
|
74
|
+
.filter((scored) => scored.score > 0)
|
|
75
|
+
.toSorted((a, b) => b.score - a.score || a.entry.slug.localeCompare(b.entry.slug))
|
|
76
|
+
.slice(0, SEARCH_DOCS_RESULT_LIMIT)
|
|
77
|
+
.map((scored) => scored.entry);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Resolve the `sf docs [query]` request: an exact-slug query prints that topic;
|
|
81
|
+
* any other query searches; an empty query lists the tier. Pure + offline.
|
|
82
|
+
*/
|
|
83
|
+
export function resolveDocsCommand(index, options) {
|
|
84
|
+
const trimmed = (options.query ?? "").trim();
|
|
85
|
+
const exact = trimmed ? findTopic(index, trimmed) : undefined;
|
|
86
|
+
if (exact) {
|
|
87
|
+
return {
|
|
88
|
+
query: trimmed || null,
|
|
89
|
+
tier: options.tier,
|
|
90
|
+
topic: toTopic(exact),
|
|
91
|
+
results: [toResult(exact)],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const results = searchDocs(index, { query: trimmed, tier: options.tier }).map(toResult);
|
|
95
|
+
return { query: trimmed || null, tier: options.tier, topic: null, results };
|
|
96
|
+
}
|
|
@@ -3,10 +3,12 @@ export declare const spacefastSkillRepoOwner = "spacefast";
|
|
|
3
3
|
export declare const spacefastSkillRepoName = "plugins";
|
|
4
4
|
export declare const spacefastSkillRepoRef = "spacefast/plugins";
|
|
5
5
|
export declare const spacefastSkillUrl: string;
|
|
6
|
-
export declare const
|
|
6
|
+
export declare const spacefastSkillFetchCommand: string;
|
|
7
|
+
export declare const spacefastSkillInstallCommand = "npx -y skills add spacefast/plugins --skill spacefast -g -y";
|
|
7
8
|
export declare const spacefastInstallCurlCommand: string;
|
|
8
9
|
export declare const spacefastInstallPowerShellCommand: string;
|
|
9
10
|
export declare const spacefastClaudePluginAddCommand = "claude plugin marketplace add spacefast/plugins";
|
|
10
11
|
export declare const spacefastClaudePluginInstallCommand = "claude plugin install spacefast@spacefast";
|
|
11
|
-
export declare const
|
|
12
|
-
export declare const
|
|
12
|
+
export declare const spacefastCodexPluginAddCommand = "codex plugin marketplace add spacefast/plugins";
|
|
13
|
+
export declare const spacefastCodexPluginInstallCommand = "codex plugin add spacefast@spacefast";
|
|
14
|
+
export declare const spacefastCodexSkillInstallCommand = "npx -y skills add spacefast/plugins --skill spacefast -g -a codex -y";
|
|
@@ -4,15 +4,15 @@ export const spacefastSkillRepoOwner = "spacefast";
|
|
|
4
4
|
export const spacefastSkillRepoName = "plugins";
|
|
5
5
|
export const spacefastSkillRepoRef = `${spacefastSkillRepoOwner}/${spacefastSkillRepoName}`;
|
|
6
6
|
export const spacefastSkillUrl = `${BRAND.apiOrigin}/skill`;
|
|
7
|
-
export const
|
|
7
|
+
export const spacefastSkillFetchCommand = `curl -fsSL ${spacefastSkillUrl}`;
|
|
8
|
+
export const spacefastSkillInstallCommand = `npx -y skills add ${spacefastSkillRepoRef} --skill ${spacefastSkillName} -g -y`;
|
|
8
9
|
export const spacefastInstallCurlCommand = `curl -fsSL ${BRAND.websiteOrigin}/install.sh | bash`;
|
|
9
10
|
export const spacefastInstallPowerShellCommand = `irm ${BRAND.websiteOrigin}/install.ps1 | iex`;
|
|
10
11
|
export const spacefastClaudePluginAddCommand = `claude plugin marketplace add ${spacefastSkillRepoRef}`;
|
|
11
12
|
export const spacefastClaudePluginInstallCommand = `claude plugin install ${spacefastSkillName}@${spacefastSkillName}`;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
If your environment supports manual skill import, fetch the official ${BRAND.productName} skill from: ${spacefastSkillUrl}`;
|
|
13
|
+
// Codex mirrors the Claude plugin commands (same marketplace repo, same
|
|
14
|
+
// plugin name); the release workflow validates both installs against the
|
|
15
|
+
// assembled dist/plugins tree.
|
|
16
|
+
export const spacefastCodexPluginAddCommand = `codex plugin marketplace add ${spacefastSkillRepoRef}`;
|
|
17
|
+
export const spacefastCodexPluginInstallCommand = `codex plugin add ${spacefastSkillName}@${spacefastSkillName}`;
|
|
18
|
+
export const spacefastCodexSkillInstallCommand = `npx -y skills add ${spacefastSkillRepoRef} --skill ${spacefastSkillName} -g -a codex -y`;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare function filterGrantsByNamespace(grants: string[], namespaces: string[]): string[];
|
|
2
|
+
export declare function grantGlobMatches(pattern: string, grant: string): boolean;
|
|
3
|
+
export declare function grantsIntersect(grants: string[], requiredGrants: string[]): boolean;
|
|
4
|
+
export declare function grantsSatisfyRule(input: {
|
|
5
|
+
grants: string[];
|
|
6
|
+
requiredGrants: string[];
|
|
7
|
+
grantNamespaces: string[];
|
|
8
|
+
}): boolean;
|
|
9
|
+
export declare function canonicalizeHost(host: string): string;
|
|
10
|
+
export declare function hostGlobMatches(pattern: string, host: string): boolean;
|
|
11
|
+
export declare function hostTemplateMatches(template: string, host: string): boolean;
|
|
12
|
+
export declare function pathGlobMatches(pattern: string, path: string): boolean;
|
|
13
|
+
export declare function agentMatches(needle: string, agent: string): boolean;
|
|
14
|
+
export declare function ipInCidr(ip: string, cidr: string): boolean;
|
|
15
|
+
export declare function ipInAnyCidr(ip: string, cidrs: string[]): boolean;
|
|
16
|
+
export type RuleMatchContext = {
|
|
17
|
+
host: string;
|
|
18
|
+
path: string;
|
|
19
|
+
channel?: string | undefined;
|
|
20
|
+
ip?: string | undefined;
|
|
21
|
+
agent?: string | undefined;
|
|
22
|
+
country?: string | undefined;
|
|
23
|
+
headers?: Record<string, string> | undefined;
|
|
24
|
+
};
|
|
25
|
+
export type RuleMatchInput = {
|
|
26
|
+
host?: string | undefined;
|
|
27
|
+
hostPattern?: string | undefined;
|
|
28
|
+
hostTemplate?: string | undefined;
|
|
29
|
+
pathPattern?: string | undefined;
|
|
30
|
+
channel?: string | undefined;
|
|
31
|
+
ipCidrs?: string[] | undefined;
|
|
32
|
+
agent?: string | undefined;
|
|
33
|
+
country?: string | undefined;
|
|
34
|
+
header?: {
|
|
35
|
+
name: string;
|
|
36
|
+
value: string;
|
|
37
|
+
} | undefined;
|
|
38
|
+
};
|
|
39
|
+
export declare function ruleMatchApplies(match: RuleMatchInput, context: RuleMatchContext): boolean;
|