@spacefast/common 0.0.26 → 0.2.2
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 +6 -146
- package/dist/agents/connect-targets.js +63 -295
- package/dist/agents/private-key-oauth.d.ts +31 -1
- package/dist/agents/private-key-oauth.js +124 -33
- package/dist/agents/registry/core.d.ts +292 -0
- package/dist/agents/registry/core.js +1388 -0
- package/dist/agents/registry/deeplink-probes.d.ts +23 -0
- package/dist/agents/registry/deeplink-probes.js +18 -0
- package/dist/agents/registry/node.d.ts +56 -0
- package/dist/agents/registry/node.js +339 -0
- package/dist/brand-assets-build.js +1 -2
- package/dist/brand-assets.js +4 -7
- package/dist/brand.d.ts +17 -0
- package/dist/brand.js +24 -4
- package/dist/config/domains.d.ts +55 -28
- package/dist/config/domains.js +85 -41
- package/dist/config/index.js +1 -2
- package/dist/contracts/abuse.js +9 -24
- package/dist/contracts/access-profiles.d.ts +86 -0
- package/dist/contracts/access-profiles.js +89 -0
- package/dist/contracts/access.d.ts +21 -27
- package/dist/contracts/access.js +33 -64
- package/dist/contracts/activity.d.ts +18 -1
- package/dist/contracts/activity.js +70 -26
- package/dist/contracts/analytics.js +8 -10
- package/dist/contracts/api-keys.d.ts +77 -52
- package/dist/contracts/api-keys.js +44 -24
- package/dist/contracts/application-journal.d.ts +216 -0
- package/dist/contracts/application-journal.js +167 -0
- package/dist/contracts/auth.d.ts +90 -17
- package/dist/contracts/auth.js +86 -17
- package/dist/contracts/beta.d.ts +9 -4
- package/dist/contracts/beta.js +20 -16
- package/dist/contracts/billing.js +7 -11
- package/dist/contracts/bootstrap.d.ts +791 -0
- package/dist/contracts/bootstrap.js +51 -0
- package/dist/contracts/builds.d.ts +192 -7
- package/dist/contracts/builds.js +84 -21
- package/dist/contracts/channels.d.ts +43 -0
- package/dist/contracts/channels.js +25 -9
- package/dist/contracts/cli.d.ts +7 -0
- package/dist/contracts/cli.js +6 -0
- package/dist/contracts/collab-public.d.ts +1 -1
- package/dist/contracts/collab-public.js +5 -8
- package/dist/contracts/comments.d.ts +45 -35
- package/dist/contracts/comments.js +107 -77
- package/dist/contracts/commerce.d.ts +165 -0
- package/dist/contracts/commerce.js +146 -0
- package/dist/contracts/common.d.ts +3 -3
- package/dist/contracts/common.js +18 -29
- package/dist/contracts/content-contract-verification.d.ts +521 -0
- package/dist/contracts/content-contract-verification.js +320 -0
- package/dist/contracts/content-platform-fixture.d.ts +1278 -0
- package/dist/contracts/content-platform-fixture.js +44 -0
- package/dist/contracts/content-program.d.ts +994 -0
- package/dist/contracts/content-program.js +658 -0
- package/dist/contracts/content-sync.d.ts +290 -0
- package/dist/contracts/content-sync.js +167 -0
- package/dist/contracts/content.d.ts +432 -0
- package/dist/contracts/content.js +303 -0
- package/dist/contracts/continuation.d.ts +17 -1
- package/dist/contracts/continuation.js +23 -23
- package/dist/contracts/countries.js +3 -4
- package/dist/contracts/crons.d.ts +17 -0
- package/dist/contracts/crons.js +33 -15
- package/dist/contracts/dashboard-prefs.d.ts +56 -0
- package/dist/contracts/dashboard-prefs.js +51 -0
- package/dist/contracts/device-auth.d.ts +234 -37
- package/dist/contracts/device-auth.js +267 -53
- package/dist/contracts/docs.d.ts +6 -10
- package/dist/contracts/docs.js +5 -13
- package/dist/contracts/domains.d.ts +499 -102
- package/dist/contracts/domains.js +169 -58
- package/dist/contracts/email-preferences.d.ts +3 -3
- package/dist/contracts/email-preferences.js +6 -7
- package/dist/contracts/enums.d.ts +26 -26
- package/dist/contracts/enums.js +61 -54
- package/dist/contracts/error-code-meta.d.ts +273 -7
- package/dist/contracts/error-code-meta.js +81 -5
- package/dist/contracts/error-codes.d.ts +5 -5
- package/dist/contracts/error-codes.js +79 -16
- package/dist/contracts/events.d.ts +100 -20
- package/dist/contracts/events.js +107 -20
- package/dist/contracts/execution.d.ts +47 -66
- package/dist/contracts/execution.js +51 -64
- package/dist/contracts/feature-lifecycle.d.ts +70 -14
- package/dist/contracts/feature-lifecycle.js +86 -15
- package/dist/contracts/features.d.ts +100 -37
- package/dist/contracts/features.js +21 -27
- package/dist/contracts/fixtures/content-platform-v1.json +1108 -0
- package/dist/contracts/frame-session.d.ts +192 -0
- package/dist/contracts/frame-session.js +164 -0
- package/dist/contracts/functions.d.ts +218 -211
- package/dist/contracts/functions.js +273 -260
- package/dist/contracts/grant-copy.d.ts +43 -0
- package/dist/contracts/grant-copy.js +44 -0
- package/dist/contracts/grants.d.ts +64 -56
- package/dist/contracts/grants.js +124 -23
- package/dist/contracts/ids.d.ts +4 -1
- package/dist/contracts/ids.js +4 -1
- package/dist/contracts/internal.d.ts +5 -4
- package/dist/contracts/internal.js +12 -3
- package/dist/contracts/mcp.d.ts +17 -0
- package/dist/contracts/mcp.js +23 -0
- package/dist/contracts/me.d.ts +6 -1
- package/dist/contracts/me.js +12 -6
- package/dist/contracts/notifications.d.ts +27 -29
- package/dist/contracts/notifications.js +9 -4
- package/dist/contracts/oauth-resources.d.ts +121 -10
- package/dist/contracts/oauth-resources.js +130 -11
- package/dist/contracts/oauth-scope-actions.d.ts +90 -0
- package/dist/contracts/oauth-scope-actions.js +126 -0
- package/dist/contracts/operations.d.ts +27 -4
- package/dist/contracts/operations.js +11 -5
- package/dist/contracts/pages.d.ts +29 -5
- package/dist/contracts/pages.js +22 -5
- package/dist/contracts/partner-notifications.d.ts +3 -0
- package/dist/contracts/partner-notifications.js +65 -0
- package/dist/contracts/{platform.d.ts → partner.d.ts} +29 -42
- package/dist/contracts/{platform.js → partner.js} +27 -40
- package/dist/contracts/plan-policy.d.ts +1 -1
- package/dist/contracts/principal-assertion.d.ts +43 -0
- package/dist/contracts/principal-assertion.js +67 -0
- package/dist/contracts/principals.d.ts +73 -0
- package/dist/contracts/principals.js +59 -0
- package/dist/contracts/privacy.d.ts +11 -0
- package/dist/contracts/privacy.js +17 -0
- package/dist/contracts/problem-document.js +3 -4
- package/dist/contracts/publish-archive.d.ts +116 -18
- package/dist/contracts/publish-archive.js +6 -3
- package/dist/contracts/push-new.d.ts +4 -4
- package/dist/contracts/quotas.js +3 -3
- package/dist/contracts/realtime.d.ts +52 -0
- package/dist/contracts/realtime.js +54 -0
- package/dist/contracts/repository-connections.d.ts +1 -1
- package/dist/contracts/repository-connections.js +6 -2
- package/dist/contracts/resources.d.ts +105 -14
- package/dist/contracts/resources.js +145 -21
- package/dist/contracts/route-inventory.d.ts +358 -0
- package/dist/contracts/route-inventory.js +141 -0
- package/dist/contracts/runtime-api.d.ts +112 -35
- package/dist/contracts/runtime-api.js +86 -66
- package/dist/contracts/runtime-app.d.ts +11 -21
- package/dist/contracts/runtime-app.js +39 -24
- package/dist/contracts/runtime-components.d.ts +143 -0
- package/dist/contracts/runtime-components.js +199 -0
- package/dist/contracts/runtime-db.d.ts +45 -19
- package/dist/contracts/runtime-db.js +85 -20
- package/dist/contracts/runtime-purge.js +3 -5
- package/dist/contracts/runtime-services.d.ts +43 -75
- package/dist/contracts/runtime-services.js +29 -49
- package/dist/contracts/runtime-storage.d.ts +14 -14
- package/dist/contracts/runtime-storage.js +28 -13
- package/dist/contracts/sf-config-v1.d.ts +14 -18
- package/dist/contracts/slugs.js +13 -4
- package/dist/contracts/space-config.d.ts +235 -28
- package/dist/contracts/space-config.js +246 -91
- package/dist/contracts/spaces.d.ts +360 -255
- package/dist/contracts/spaces.js +190 -122
- package/dist/contracts/superadmin-activity.d.ts +3 -43
- package/dist/contracts/superadmin-activity.js +6 -30
- package/dist/contracts/superadmin-emails.d.ts +1 -0
- package/dist/contracts/superadmin-emails.js +17 -1
- package/dist/contracts/superadmin-runtime.d.ts +199 -0
- package/dist/contracts/superadmin-runtime.js +141 -0
- package/dist/contracts/superadmin-search.d.ts +22 -2
- package/dist/contracts/superadmin-search.js +14 -6
- package/dist/contracts/superadmin-spaces.d.ts +435 -186
- package/dist/contracts/superadmin-spaces.js +131 -25
- package/dist/contracts/superadmin-teams.d.ts +3 -0
- package/dist/contracts/superadmin-teams.js +1 -2
- package/dist/contracts/superadmin-tenants.d.ts +627 -6
- package/dist/contracts/superadmin-tenants.js +32 -7
- package/dist/contracts/superadmin.d.ts +98 -16
- package/dist/contracts/superadmin.js +63 -10
- package/dist/contracts/tags.d.ts +85 -58
- package/dist/contracts/tags.js +44 -34
- package/dist/contracts/teams.d.ts +72 -9
- package/dist/contracts/teams.js +84 -25
- package/dist/contracts/tenants.d.ts +135 -0
- package/dist/contracts/tenants.js +120 -0
- package/dist/contracts/test-triggers.d.ts +70 -0
- package/dist/contracts/test-triggers.js +116 -0
- package/dist/contracts/theme-json.js +3 -8
- package/dist/contracts/transfers.d.ts +1 -0
- package/dist/contracts/transfers.js +1 -0
- package/dist/contracts/usage.d.ts +209 -0
- package/dist/contracts/usage.js +124 -12
- package/dist/contracts/variables.d.ts +2 -2
- package/dist/contracts/variables.js +9 -13
- package/dist/contracts/webhooks.d.ts +13 -5
- package/dist/contracts/webhooks.js +3 -1
- package/dist/contracts/zero.d.ts +57 -64
- package/dist/contracts/zero.js +68 -66
- package/dist/dashboard-paths/index.d.ts +24 -21
- package/dist/dashboard-paths/index.js +35 -47
- package/dist/dashboard-paths/route-reservations.generated.d.ts +2 -0
- package/dist/dashboard-paths/route-reservations.generated.js +36 -0
- package/dist/docs/agent-arrival.d.ts +92 -0
- package/dist/docs/agent-arrival.js +227 -0
- package/dist/docs/agent-output-policy.d.ts +6 -0
- package/dist/docs/agent-output-policy.js +22 -0
- package/dist/docs/agent-prose.d.ts +11 -17
- package/dist/docs/agent-prose.js +62 -37
- package/dist/docs/agent-setup.d.ts +72 -41
- package/dist/docs/agent-setup.js +336 -436
- package/dist/docs/catalog.d.ts +147 -89
- package/dist/docs/catalog.js +157 -42
- package/dist/docs/error-docs.d.ts +2102 -1
- package/dist/docs/error-docs.js +285 -16
- package/dist/docs/index-build.d.ts +0 -1
- package/dist/docs/index-build.js +2 -3
- package/dist/docs/page-context-prompt.d.ts +77 -0
- package/dist/docs/page-context-prompt.js +131 -0
- package/dist/docs/reference-urls.d.ts +46 -0
- package/dist/docs/reference-urls.js +79 -0
- package/dist/docs/search.d.ts +6 -8
- package/dist/docs/search.js +10 -13
- package/dist/docs/skill-distribution.d.ts +4 -1
- package/dist/docs/skill-distribution.js +10 -5
- package/dist/docs/skills.d.ts +117 -117
- package/dist/docs/skills.js +120 -72
- package/dist/docs/start-prompts.d.ts +45 -0
- package/dist/docs/start-prompts.js +62 -0
- package/dist/domain-exploration.js +9 -13
- package/dist/og-template.d.ts +56 -0
- package/dist/og-template.js +56 -0
- package/dist/slug-policy/index.js +5 -11
- package/dist/utils/browser-credential.d.ts +13 -6
- package/dist/utils/browser-credential.js +14 -7
- package/dist/utils/build-settings.d.ts +16 -0
- package/dist/utils/build-settings.js +63 -17
- package/dist/utils/canonical-json.d.ts +3 -5
- package/dist/utils/canonical-json.js +3 -5
- package/dist/utils/cast-transport.d.ts +5 -17
- package/dist/utils/cast-transport.js +6 -19
- package/dist/utils/claim-token.js +1 -2
- package/dist/utils/comment-avatars.js +4 -6
- package/dist/utils/concurrency.js +2 -3
- package/dist/utils/content-type.d.ts +7 -6
- package/dist/utils/content-type.js +73 -51
- package/dist/utils/credential-policy.d.ts +50 -6
- package/dist/utils/credential-policy.js +123 -57
- package/dist/utils/egress-policy.fixtures.json +1 -1
- package/dist/utils/generate-space-name.d.ts +3 -8
- package/dist/utils/generate-space-name.js +3 -8
- package/dist/utils/grants.d.ts +0 -1
- package/dist/utils/grants.js +4 -7
- package/dist/utils/gravatar.d.ts +2 -4
- package/dist/utils/gravatar.js +6 -12
- package/dist/utils/id-hints.js +14 -23
- package/dist/utils/idempotency.d.ts +3 -3
- package/dist/utils/idempotency.js +6 -7
- package/dist/utils/local-space-state.d.ts +15 -15
- package/dist/utils/local-space-state.js +34 -23
- package/dist/utils/oauth-signed-query.d.ts +3 -5
- package/dist/utils/oauth-signed-query.js +6 -9
- package/dist/utils/one-shot-replay.d.ts +3 -5
- package/dist/utils/one-shot-replay.js +3 -5
- package/dist/utils/page-colors.d.ts +4 -10
- package/dist/utils/page-colors.js +11 -35
- package/dist/utils/page-fonts.js +6 -11
- package/dist/utils/page-preview.d.ts +0 -1
- package/dist/utils/page-preview.js +0 -1
- package/dist/utils/pages.d.ts +22 -11
- package/dist/utils/pages.js +70 -30
- package/dist/utils/privacy-regions.d.ts +19 -0
- package/dist/utils/privacy-regions.js +91 -0
- package/dist/utils/publish-form-data.d.ts +4 -5
- package/dist/utils/publish-form-data.js +2 -3
- package/dist/utils/publish-policy.d.ts +10 -23
- package/dist/utils/publish-policy.js +63 -116
- package/dist/utils/query-client.d.ts +2 -0
- package/dist/utils/query-client.js +10 -1
- package/dist/utils/runtime-paths.d.ts +4 -4
- package/dist/utils/runtime-paths.js +6 -8
- package/dist/utils/runtime-upload.d.ts +4 -0
- package/dist/utils/runtime-upload.js +5 -0
- package/dist/utils/secure-local-file.d.ts +3 -3
- package/dist/utils/secure-local-file.js +18 -24
- package/dist/utils/space-config.d.ts +11 -14
- package/dist/utils/space-config.js +10 -16
- package/dist/utils/static-runtime-policy.d.ts +5 -8
- package/dist/utils/static-runtime-policy.generated.d.ts +16 -0
- package/dist/utils/static-runtime-policy.generated.js +70 -0
- package/dist/utils/static-runtime-policy.js +17 -84
- package/dist/utils/storage-policy.js +1 -2
- package/dist/utils/upload-session.js +8 -14
- package/dist/utils/version-path.js +11 -19
- package/dist/utils/wpcom-auth-redirects.d.ts +5 -14
- package/dist/utils/wpcom-auth-redirects.js +1 -4
- package/dist/vocabulary.d.ts +7 -7
- package/dist/vocabulary.js +30 -16
- package/package.json +14 -2
- package/dist/agents/client-registry.d.ts +0 -22
- package/dist/agents/client-registry.js +0 -41
- package/dist/docs/agent-handoff-document.d.ts +0 -15
- package/dist/docs/agent-handoff-document.js +0 -180
- package/dist/docs/agent-solutions.d.ts +0 -110
- package/dist/docs/agent-solutions.js +0 -183
- package/dist/utils/query-keys.d.ts +0 -84
- package/dist/utils/query-keys.js +0 -108
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { canonicalJson } from "../utils/canonical-json.js";
|
|
3
|
+
import { applicationJournalDeliveryClaimV1Schema, applicationJournalDeliveryReceiptV1Schema, applicationJournalEntryV1Schema, } from "./application-journal.js";
|
|
4
|
+
import { compiledContentProgramV1Schema, contentExecutableSetV1Schema, contentProgramJsonValueSchema, contentProgramReleaseV1Schema, contentProgramSha256Schema, contentRouteContributionSetV1Schema, contentSdkDescriptorSetV1Schema, } from "./content-program.js";
|
|
5
|
+
import { contentMarkdownConflictProblemSchema, syncReconciliationExchangeV1Schema, syncSourceAcknowledgementV1Schema, syncLedgerV1Schema, } from "./content-sync.js";
|
|
6
|
+
import { frameGrantDecisionV1Schema, frameLaunchTicketClaimsV1Schema, frameSessionClaimsV1Schema, } from "./frame-session.js";
|
|
7
|
+
import { principalAssertionV1Schema } from "./principal-assertion.js";
|
|
8
|
+
import { routeInventoryV1Schema, spaceRouteSnapshotV1Schema, } from "./route-inventory.js";
|
|
9
|
+
import { programRequirementsV1Schema, runtimeComponentInventoryV1Schema, runtimeComponentPlacementReceiptV1Schema, runtimeComponentPlacementTargetV1Schema, } from "./runtime-components.js";
|
|
10
|
+
const encoder = new TextEncoder();
|
|
11
|
+
async function sha256Text(value) {
|
|
12
|
+
const encoded = encoder.encode(value);
|
|
13
|
+
const bytes = new ArrayBuffer(encoded.byteLength);
|
|
14
|
+
new Uint8Array(bytes).set(encoded);
|
|
15
|
+
const digest = await globalThis.crypto.subtle.digest("SHA-256", bytes);
|
|
16
|
+
const hex = Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
17
|
+
return contentProgramSha256Schema.parse(`sha256:${hex}`);
|
|
18
|
+
}
|
|
19
|
+
export function contentContractSha256(value) {
|
|
20
|
+
return sha256Text(canonicalJson(value));
|
|
21
|
+
}
|
|
22
|
+
export function contentContractTextSha256(value) {
|
|
23
|
+
return sha256Text(value);
|
|
24
|
+
}
|
|
25
|
+
async function requireDigest(actual, meaning, subject) {
|
|
26
|
+
const expected = await contentContractSha256(meaning);
|
|
27
|
+
if (actual !== expected) {
|
|
28
|
+
throw new TypeError(`${subject} digest mismatch: expected ${expected}, received ${actual}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function requireTextDigest(actual, value, subject) {
|
|
32
|
+
const expected = await contentContractTextSha256(value);
|
|
33
|
+
if (actual !== expected) {
|
|
34
|
+
throw new TypeError(`${subject} digest mismatch: expected ${expected}, received ${actual}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function requireSameValue(actual, expected, subject) {
|
|
38
|
+
if (canonicalJson(actual) !== canonicalJson(expected)) {
|
|
39
|
+
throw new TypeError(`${subject} mismatch`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function frameGrantDecisionMeaning(claims) {
|
|
43
|
+
return frameGrantDecisionV1Schema.parse({
|
|
44
|
+
format: "spacefast.frame-grant-decision",
|
|
45
|
+
version: 1,
|
|
46
|
+
audience: claims.audience,
|
|
47
|
+
link: claims.link,
|
|
48
|
+
principal: claims.principal,
|
|
49
|
+
target: claims.target,
|
|
50
|
+
surface: claims.surface,
|
|
51
|
+
parentOrigin: claims.parentOrigin,
|
|
52
|
+
capabilities: claims.capabilities,
|
|
53
|
+
accessGeneration: claims.accessGeneration,
|
|
54
|
+
sessionVersion: claims.sessionVersion,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
export async function verifyContentProgramReleaseV1(value) {
|
|
58
|
+
const program = contentProgramReleaseV1Schema.parse(value);
|
|
59
|
+
await Promise.all(program.schemas.map((definition) => requireDigest(definition.sha256, definition.schema, `schema ${definition.id}`)));
|
|
60
|
+
const { revision, ...meaning } = program;
|
|
61
|
+
await requireDigest(revision, meaning, "content program revision");
|
|
62
|
+
return program;
|
|
63
|
+
}
|
|
64
|
+
export const compiledContentProgramBundleV1Schema = z
|
|
65
|
+
.object({
|
|
66
|
+
capsule: contentProgramJsonValueSchema,
|
|
67
|
+
artifacts: z
|
|
68
|
+
.object({
|
|
69
|
+
program: contentProgramReleaseV1Schema,
|
|
70
|
+
executables: contentExecutableSetV1Schema,
|
|
71
|
+
sdk: contentSdkDescriptorSetV1Schema,
|
|
72
|
+
routes: contentRouteContributionSetV1Schema,
|
|
73
|
+
requirements: programRequirementsV1Schema,
|
|
74
|
+
})
|
|
75
|
+
.strict(),
|
|
76
|
+
compiled: compiledContentProgramV1Schema,
|
|
77
|
+
})
|
|
78
|
+
.strict();
|
|
79
|
+
export async function verifyCompiledContentProgramBundleV1(value) {
|
|
80
|
+
const bundle = compiledContentProgramBundleV1Schema.parse(value);
|
|
81
|
+
const capsuleDigest = await contentContractSha256(bundle.capsule);
|
|
82
|
+
const program = await verifyContentProgramReleaseV1(bundle.artifacts.program);
|
|
83
|
+
await Promise.all([
|
|
84
|
+
verifyContentArtifactV1(bundle.compiled.program, bundle.artifacts.program, capsuleDigest, false),
|
|
85
|
+
verifyContentArtifactV1(bundle.compiled.executables, bundle.artifacts.executables, program.revision),
|
|
86
|
+
verifyContentArtifactV1(bundle.compiled.sdk, bundle.artifacts.sdk, program.revision),
|
|
87
|
+
verifyContentArtifactV1(bundle.compiled.routes, bundle.artifacts.routes, program.revision),
|
|
88
|
+
verifyContentArtifactV1(bundle.compiled.requirements, bundle.artifacts.requirements, program.revision),
|
|
89
|
+
]);
|
|
90
|
+
requireSameValue(bundle.artifacts.executables.executables.map((executable) => executable.id), [...program.abilities.map((ability) => ability.id), ...program.hooks.map((hook) => hook.id)], "content executable identities");
|
|
91
|
+
requireSameValue(bundle.artifacts.sdk.operations.map(({ invalidates: _invalidates, ...operation }) => operation), program.abilities.map((ability) => ({
|
|
92
|
+
id: ability.id,
|
|
93
|
+
kind: ability.kind,
|
|
94
|
+
mode: ability.mode,
|
|
95
|
+
input: ability.input,
|
|
96
|
+
output: ability.output,
|
|
97
|
+
cache: ability.cache,
|
|
98
|
+
})), "content SDK operation descriptors");
|
|
99
|
+
const abilityIds = new Set(program.abilities.map((ability) => ability.id));
|
|
100
|
+
for (const operation of bundle.artifacts.sdk.operations) {
|
|
101
|
+
for (const invalidatedAbility of operation.invalidates) {
|
|
102
|
+
if (!abilityIds.has(invalidatedAbility)) {
|
|
103
|
+
throw new TypeError(`content SDK operation ${operation.id} invalidates unknown ability ${invalidatedAbility}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
requireSameValue(bundle.artifacts.sdk.sync, program.syncBindings.map((binding) => ({
|
|
108
|
+
id: binding.id,
|
|
109
|
+
resourceId: binding.resourceId,
|
|
110
|
+
source: binding.source,
|
|
111
|
+
})), "content SDK sync descriptors");
|
|
112
|
+
requireSameValue(bundle.artifacts.routes.routes, program.abilities.flatMap((ability) => ability.exposure.kind === "routed"
|
|
113
|
+
? [{ abilityId: ability.id, route: ability.exposure.route }]
|
|
114
|
+
: []), "content route contributions");
|
|
115
|
+
return bundle;
|
|
116
|
+
}
|
|
117
|
+
export async function verifySyncLedgerV1(value) {
|
|
118
|
+
const ledger = syncLedgerV1Schema.parse(value);
|
|
119
|
+
const { revision, ...meaning } = ledger;
|
|
120
|
+
await requireDigest(revision, meaning, "sync ledger revision");
|
|
121
|
+
await requireTextDigest(ledger.markdownDigest, ledger.baseMarkdown, "sync ledger Markdown");
|
|
122
|
+
return ledger;
|
|
123
|
+
}
|
|
124
|
+
export async function verifySyncReconciliationExchangeV1(value, acknowledgement) {
|
|
125
|
+
const exchange = syncReconciliationExchangeV1Schema.parse(value);
|
|
126
|
+
await verifySyncLedgerV1(exchange.receipt.ledger);
|
|
127
|
+
if (exchange.receipt.status !== "pulled" &&
|
|
128
|
+
exchange.receipt.ledger.baseMarkdown !== exchange.request.markdown) {
|
|
129
|
+
throw new TypeError(`sync ${exchange.receipt.status} receipt must commit the requested Markdown`);
|
|
130
|
+
}
|
|
131
|
+
if (acknowledgement === undefined)
|
|
132
|
+
return { exchange };
|
|
133
|
+
const parsedAcknowledgement = syncSourceAcknowledgementV1Schema.parse(acknowledgement);
|
|
134
|
+
if (exchange.receipt.status !== "pulled") {
|
|
135
|
+
throw new TypeError("only a prepared source pull accepts a source acknowledgement");
|
|
136
|
+
}
|
|
137
|
+
if (parsedAcknowledgement.bindingId !== exchange.request.bindingId) {
|
|
138
|
+
throw new TypeError("sync acknowledgement binding mismatch");
|
|
139
|
+
}
|
|
140
|
+
if (parsedAcknowledgement.operationId !== exchange.request.operationId) {
|
|
141
|
+
throw new TypeError("sync acknowledgement operation mismatch");
|
|
142
|
+
}
|
|
143
|
+
if (parsedAcknowledgement.baseRevision !== exchange.receipt.ledger.revision) {
|
|
144
|
+
throw new TypeError("sync acknowledgement base revision mismatch");
|
|
145
|
+
}
|
|
146
|
+
return { exchange, acknowledgement: parsedAcknowledgement };
|
|
147
|
+
}
|
|
148
|
+
export async function verifyContentMarkdownConflictProblem(value) {
|
|
149
|
+
const problem = contentMarkdownConflictProblemSchema.parse(value);
|
|
150
|
+
await Promise.all(["base", "source", "wordpress"].map((side) => requireTextDigest(problem.details[side].digest, problem.details[side].markdown, `sync conflict ${side}`)));
|
|
151
|
+
return problem;
|
|
152
|
+
}
|
|
153
|
+
export async function verifyFrameLaunchTicketClaimsV1(value) {
|
|
154
|
+
const ticket = frameLaunchTicketClaimsV1Schema.parse(value);
|
|
155
|
+
await requireDigest(ticket.grantDecisionDigest, frameGrantDecisionMeaning(ticket), "Frame launch Grant decision");
|
|
156
|
+
return ticket;
|
|
157
|
+
}
|
|
158
|
+
export async function verifyFrameSessionClaimsV1(value) {
|
|
159
|
+
const session = frameSessionClaimsV1Schema.parse(value);
|
|
160
|
+
await requireDigest(session.grantDecisionDigest, frameGrantDecisionMeaning(session), "Frame session Grant decision");
|
|
161
|
+
return session;
|
|
162
|
+
}
|
|
163
|
+
export async function verifyFrameProtocolV1(input) {
|
|
164
|
+
const principalAssertion = principalAssertionV1Schema.parse(input.principalAssertion);
|
|
165
|
+
const [launchTicket, session] = await Promise.all([
|
|
166
|
+
verifyFrameLaunchTicketClaimsV1(input.launchTicket),
|
|
167
|
+
verifyFrameSessionClaimsV1(input.session),
|
|
168
|
+
]);
|
|
169
|
+
if (principalAssertion.actor.kind !== "user") {
|
|
170
|
+
throw new TypeError("Frame sessions require a user principal assertion");
|
|
171
|
+
}
|
|
172
|
+
requireSameValue(launchTicket.audience, principalAssertion.audience, "Frame ticket audience");
|
|
173
|
+
requireSameValue(session.audience, principalAssertion.audience, "Frame session audience");
|
|
174
|
+
const assertedPrincipal = {
|
|
175
|
+
kind: "user",
|
|
176
|
+
id: principalAssertion.actor.id,
|
|
177
|
+
assertionNonce: principalAssertion.nonce,
|
|
178
|
+
};
|
|
179
|
+
requireSameValue(launchTicket.principal, assertedPrincipal, "Frame ticket principal");
|
|
180
|
+
requireSameValue(session.principal, assertedPrincipal, "Frame session principal");
|
|
181
|
+
if (launchTicket.accessGeneration !== principalAssertion.accessGeneration ||
|
|
182
|
+
session.accessGeneration !== principalAssertion.accessGeneration) {
|
|
183
|
+
throw new TypeError("Frame access generation mismatch");
|
|
184
|
+
}
|
|
185
|
+
if (launchTicket.sessionVersion !== principalAssertion.sessionVersion ||
|
|
186
|
+
session.sessionVersion !== principalAssertion.sessionVersion) {
|
|
187
|
+
throw new TypeError("Frame session version mismatch");
|
|
188
|
+
}
|
|
189
|
+
requireSameValue(frameGrantDecisionMeaning(session), frameGrantDecisionMeaning(launchTicket), "Frame ticket and session Grant decision");
|
|
190
|
+
if (session.launchTicketId !== launchTicket.ticketId) {
|
|
191
|
+
throw new TypeError("Frame session launch ticket mismatch");
|
|
192
|
+
}
|
|
193
|
+
if (launchTicket.issuedAt < principalAssertion.issuedAt ||
|
|
194
|
+
launchTicket.expiresAt > principalAssertion.expiresAt) {
|
|
195
|
+
throw new TypeError("Frame launch ticket exceeds its principal assertion lifetime");
|
|
196
|
+
}
|
|
197
|
+
if (session.issuedAt < launchTicket.issuedAt || session.issuedAt >= launchTicket.expiresAt) {
|
|
198
|
+
throw new TypeError("Frame session was not issued while its launch ticket was valid");
|
|
199
|
+
}
|
|
200
|
+
if (session.expiresAt > principalAssertion.expiresAt) {
|
|
201
|
+
throw new TypeError("Frame session exceeds its principal assertion lifetime");
|
|
202
|
+
}
|
|
203
|
+
return { principalAssertion, launchTicket, session };
|
|
204
|
+
}
|
|
205
|
+
export async function verifyApplicationJournalEntryV1(value) {
|
|
206
|
+
const entry = applicationJournalEntryV1Schema.parse(value);
|
|
207
|
+
await requireDigest(entry.payloadDigest, entry.payload, "application journal payload");
|
|
208
|
+
return entry;
|
|
209
|
+
}
|
|
210
|
+
export async function verifyApplicationJournalDeliveryV1(entryValue, claimValue, receiptValue) {
|
|
211
|
+
const entry = await verifyApplicationJournalEntryV1(entryValue);
|
|
212
|
+
const claim = applicationJournalDeliveryClaimV1Schema.parse(claimValue);
|
|
213
|
+
const receipt = applicationJournalDeliveryReceiptV1Schema.parse(receiptValue);
|
|
214
|
+
await verifyApplicationJournalEntryV1(claim.entry);
|
|
215
|
+
requireSameValue(claim.entry, entry, "application journal claim entry");
|
|
216
|
+
requireSameValue(receipt.fence, claim.fence, "application journal delivery fence");
|
|
217
|
+
if (receipt.idempotencyKey !== claim.idempotencyKey) {
|
|
218
|
+
throw new TypeError("application journal delivery idempotency key mismatch");
|
|
219
|
+
}
|
|
220
|
+
return { entry, claim, receipt };
|
|
221
|
+
}
|
|
222
|
+
export async function verifyRuntimeComponentInventoryV1(value) {
|
|
223
|
+
const inventory = runtimeComponentInventoryV1Schema.parse(value);
|
|
224
|
+
const { digest, ...meaning } = inventory;
|
|
225
|
+
await requireDigest(digest, meaning, "runtime component inventory");
|
|
226
|
+
return inventory;
|
|
227
|
+
}
|
|
228
|
+
export async function verifyProgramRuntimeCompatibilityV1(requirementsValue, inventoryValue) {
|
|
229
|
+
const requirements = programRequirementsV1Schema.parse(requirementsValue);
|
|
230
|
+
const inventory = await verifyRuntimeComponentInventoryV1(inventoryValue);
|
|
231
|
+
const provided = new Set(inventory.components.flatMap((component) => component.provides));
|
|
232
|
+
const missing = requirements.capabilities.filter((capability) => !provided.has(capability));
|
|
233
|
+
if (missing.length > 0) {
|
|
234
|
+
throw new TypeError(`runtime components do not provide ${missing.join(", ")}`);
|
|
235
|
+
}
|
|
236
|
+
return { requirements, inventory };
|
|
237
|
+
}
|
|
238
|
+
export async function verifyRuntimePlacementReadinessV1(input) {
|
|
239
|
+
const receipt = runtimeComponentPlacementReceiptV1Schema.parse(input.receipt);
|
|
240
|
+
if (receipt.status !== "ready") {
|
|
241
|
+
throw new TypeError("runtime placement is not ready");
|
|
242
|
+
}
|
|
243
|
+
const expectedTarget = runtimeComponentPlacementTargetV1Schema.parse(input.expectedTarget);
|
|
244
|
+
const [inventory, routeInventory, routeSnapshot] = await Promise.all([
|
|
245
|
+
verifyRuntimeComponentInventoryV1(input.inventory),
|
|
246
|
+
verifyRouteInventoryV1(input.routeInventory),
|
|
247
|
+
verifySpaceRouteSnapshotV1(input.routeSnapshot),
|
|
248
|
+
]);
|
|
249
|
+
requireSameValue(receipt.target, expectedTarget, "runtime placement target");
|
|
250
|
+
if (receipt.platformRelease !== inventory.platformRelease) {
|
|
251
|
+
throw new TypeError("runtime placement platform release mismatch");
|
|
252
|
+
}
|
|
253
|
+
if (receipt.expectedInventoryDigest !== inventory.digest ||
|
|
254
|
+
receipt.observedInventoryDigest !== inventory.digest) {
|
|
255
|
+
throw new TypeError("runtime placement component inventory mismatch");
|
|
256
|
+
}
|
|
257
|
+
if (receipt.substrate.routing.snapshotRevision !== routeSnapshot.revision) {
|
|
258
|
+
throw new TypeError("runtime placement route snapshot mismatch");
|
|
259
|
+
}
|
|
260
|
+
const routeInventoryDigest = await contentContractSha256(routeInventory);
|
|
261
|
+
if (receipt.substrate.routing.inventoryDigest !== routeInventoryDigest) {
|
|
262
|
+
throw new TypeError("runtime placement route inventory mismatch");
|
|
263
|
+
}
|
|
264
|
+
if (routeSnapshot.spaceId !== expectedTarget.spaceId) {
|
|
265
|
+
throw new TypeError("runtime placement route snapshot target mismatch");
|
|
266
|
+
}
|
|
267
|
+
return { receipt, expectedTarget, inventory, routeInventory, routeSnapshot };
|
|
268
|
+
}
|
|
269
|
+
export async function verifySpaceRouteSnapshotV1(value) {
|
|
270
|
+
const snapshot = spaceRouteSnapshotV1Schema.parse(value);
|
|
271
|
+
const { revision, ...meaning } = snapshot;
|
|
272
|
+
await requireDigest(revision, meaning, "Space route snapshot revision");
|
|
273
|
+
return snapshot;
|
|
274
|
+
}
|
|
275
|
+
function routeInventoryRecordIdMeaning(route) {
|
|
276
|
+
return {
|
|
277
|
+
kind: route.kind,
|
|
278
|
+
source: route.source,
|
|
279
|
+
runtime: route.runtime,
|
|
280
|
+
host: route.host,
|
|
281
|
+
path: route.path,
|
|
282
|
+
methods: route.methods,
|
|
283
|
+
auth: route.auth,
|
|
284
|
+
cache: "cache" in route ? (route.cache ?? null) : null,
|
|
285
|
+
destination: "destination" in route ? route.destination : null,
|
|
286
|
+
status: "status" in route ? route.status : null,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
export async function verifyRouteInventoryV1(value) {
|
|
290
|
+
const inventory = routeInventoryV1Schema.parse(value);
|
|
291
|
+
const semanticIds = await Promise.all(inventory.routes.map((route) => contentContractSha256(routeInventoryRecordIdMeaning(route))));
|
|
292
|
+
const occurrences = new Map();
|
|
293
|
+
const expectedIds = await Promise.all(semanticIds.map((semanticId) => {
|
|
294
|
+
const occurrence = occurrences.get(semanticId) ?? 0;
|
|
295
|
+
occurrences.set(semanticId, occurrence + 1);
|
|
296
|
+
return occurrence === 0
|
|
297
|
+
? semanticId
|
|
298
|
+
: contentContractSha256({ route: semanticId, occurrence });
|
|
299
|
+
}));
|
|
300
|
+
for (const [index, route] of inventory.routes.entries()) {
|
|
301
|
+
const expected = expectedIds[index];
|
|
302
|
+
if (route.id !== expected) {
|
|
303
|
+
throw new TypeError(`route ${route.source} digest mismatch: expected ${expected}, received ${route.id}`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return inventory;
|
|
307
|
+
}
|
|
308
|
+
export async function verifyContentArtifactV1(ref, artifact, expectedInputDigest, payloadCarriesInputDigest = true) {
|
|
309
|
+
if (ref.inputDigest !== expectedInputDigest) {
|
|
310
|
+
throw new TypeError(`content artifact input digest mismatch: expected ${expectedInputDigest}, received ${ref.inputDigest}`);
|
|
311
|
+
}
|
|
312
|
+
if (payloadCarriesInputDigest && artifact.inputDigest !== expectedInputDigest) {
|
|
313
|
+
throw new TypeError(`content artifact payload input digest mismatch: expected ${expectedInputDigest}, received ${String(artifact.inputDigest)}`);
|
|
314
|
+
}
|
|
315
|
+
await requireDigest(ref.sha256, artifact, "content artifact");
|
|
316
|
+
const bytes = encoder.encode(canonicalJson(artifact)).byteLength;
|
|
317
|
+
if (ref.bytes !== bytes) {
|
|
318
|
+
throw new TypeError(`content artifact byte length mismatch: expected ${bytes}, received ${ref.bytes}`);
|
|
319
|
+
}
|
|
320
|
+
}
|