@opendatalabs/personal-server-ts-core 0.0.1-canary.00328bf
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/api/index.d.ts +408 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +1257 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/raw-envelope.d.ts +3 -0
- package/dist/api/raw-envelope.d.ts.map +1 -0
- package/dist/api/raw-envelope.js +215 -0
- package/dist/api/raw-envelope.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/request.d.ts +28 -0
- package/dist/auth/request.d.ts.map +1 -0
- package/dist/auth/request.js +106 -0
- package/dist/auth/request.js.map +1 -0
- package/dist/client.d.ts +233 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +243 -0
- package/dist/client.js.map +1 -0
- package/dist/config/defaults.d.ts +12 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +12 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/paths.d.ts +9 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +14 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/contracts/access-logs.d.ts +8 -0
- package/dist/contracts/access-logs.d.ts.map +1 -0
- package/dist/contracts/access-logs.js +7 -0
- package/dist/contracts/access-logs.js.map +1 -0
- package/dist/contracts/auth-device.d.ts +70 -0
- package/dist/contracts/auth-device.d.ts.map +1 -0
- package/dist/contracts/auth-device.js +163 -0
- package/dist/contracts/auth-device.js.map +1 -0
- package/dist/contracts/binary.d.ts +66 -0
- package/dist/contracts/binary.d.ts.map +1 -0
- package/dist/contracts/binary.js +123 -0
- package/dist/contracts/binary.js.map +1 -0
- package/dist/contracts/config.d.ts +5 -0
- package/dist/contracts/config.d.ts.map +1 -0
- package/dist/contracts/config.js +30 -0
- package/dist/contracts/config.js.map +1 -0
- package/dist/contracts/data.d.ts +165 -0
- package/dist/contracts/data.d.ts.map +1 -0
- package/dist/contracts/data.js +371 -0
- package/dist/contracts/data.js.map +1 -0
- package/dist/contracts/grants.d.ts +45 -0
- package/dist/contracts/grants.d.ts.map +1 -0
- package/dist/contracts/grants.js +177 -0
- package/dist/contracts/grants.js.map +1 -0
- package/dist/contracts/http.d.ts +21 -0
- package/dist/contracts/http.d.ts.map +1 -0
- package/dist/contracts/http.js +49 -0
- package/dist/contracts/http.js.map +1 -0
- package/dist/contracts/index.d.ts +16 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +10 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/oauth.d.ts +38 -0
- package/dist/contracts/oauth.d.ts.map +1 -0
- package/dist/contracts/oauth.js +130 -0
- package/dist/contracts/oauth.js.map +1 -0
- package/dist/contracts/sync.d.ts +10 -0
- package/dist/contracts/sync.d.ts.map +1 -0
- package/dist/contracts/sync.js +35 -0
- package/dist/contracts/sync.js.map +1 -0
- package/dist/derivatives/answer-shape.d.ts +83 -0
- package/dist/derivatives/answer-shape.d.ts.map +1 -0
- package/dist/derivatives/answer-shape.js +320 -0
- package/dist/derivatives/answer-shape.js.map +1 -0
- package/dist/derivatives/api.d.ts +48 -0
- package/dist/derivatives/api.d.ts.map +1 -0
- package/dist/derivatives/api.js +374 -0
- package/dist/derivatives/api.js.map +1 -0
- package/dist/derivatives/compute.d.ts +112 -0
- package/dist/derivatives/compute.d.ts.map +1 -0
- package/dist/derivatives/compute.js +476 -0
- package/dist/derivatives/compute.js.map +1 -0
- package/dist/derivatives/e2ee/aad.d.ts +22 -0
- package/dist/derivatives/e2ee/aad.d.ts.map +1 -0
- package/dist/derivatives/e2ee/aad.js +32 -0
- package/dist/derivatives/e2ee/aad.js.map +1 -0
- package/dist/derivatives/e2ee/attestation.d.ts +134 -0
- package/dist/derivatives/e2ee/attestation.d.ts.map +1 -0
- package/dist/derivatives/e2ee/attestation.js +248 -0
- package/dist/derivatives/e2ee/attestation.js.map +1 -0
- package/dist/derivatives/e2ee/index.d.ts +6 -0
- package/dist/derivatives/e2ee/index.d.ts.map +1 -0
- package/dist/derivatives/e2ee/index.js +6 -0
- package/dist/derivatives/e2ee/index.js.map +1 -0
- package/dist/derivatives/e2ee/jcs.d.ts +17 -0
- package/dist/derivatives/e2ee/jcs.d.ts.map +1 -0
- package/dist/derivatives/e2ee/jcs.js +55 -0
- package/dist/derivatives/e2ee/jcs.js.map +1 -0
- package/dist/derivatives/e2ee/phala.d.ts +62 -0
- package/dist/derivatives/e2ee/phala.d.ts.map +1 -0
- package/dist/derivatives/e2ee/phala.js +168 -0
- package/dist/derivatives/e2ee/phala.js.map +1 -0
- package/dist/derivatives/e2ee/suite.d.ts +56 -0
- package/dist/derivatives/e2ee/suite.d.ts.map +1 -0
- package/dist/derivatives/e2ee/suite.js +164 -0
- package/dist/derivatives/e2ee/suite.js.map +1 -0
- package/dist/derivatives/index.d.ts +11 -0
- package/dist/derivatives/index.d.ts.map +1 -0
- package/dist/derivatives/index.js +11 -0
- package/dist/derivatives/index.js.map +1 -0
- package/dist/derivatives/inference.d.ts +151 -0
- package/dist/derivatives/inference.d.ts.map +1 -0
- package/dist/derivatives/inference.js +262 -0
- package/dist/derivatives/inference.js.map +1 -0
- package/dist/derivatives/prompt.d.ts +99 -0
- package/dist/derivatives/prompt.d.ts.map +1 -0
- package/dist/derivatives/prompt.js +281 -0
- package/dist/derivatives/prompt.js.map +1 -0
- package/dist/derivatives/registration.d.ts +56 -0
- package/dist/derivatives/registration.d.ts.map +1 -0
- package/dist/derivatives/registration.js +187 -0
- package/dist/derivatives/registration.js.map +1 -0
- package/dist/derivatives/scheduler.d.ts +114 -0
- package/dist/derivatives/scheduler.d.ts.map +1 -0
- package/dist/derivatives/scheduler.js +331 -0
- package/dist/derivatives/scheduler.js.map +1 -0
- package/dist/derivatives/store.d.ts +14 -0
- package/dist/derivatives/store.d.ts.map +1 -0
- package/dist/derivatives/store.js +79 -0
- package/dist/derivatives/store.js.map +1 -0
- package/dist/derivatives/types.d.ts +102 -0
- package/dist/derivatives/types.d.ts.map +1 -0
- package/dist/derivatives/types.js +29 -0
- package/dist/derivatives/types.js.map +1 -0
- package/dist/errors/catalog.d.ts +125 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/catalog.js +198 -0
- package/dist/errors/catalog.js.map +1 -0
- package/dist/errors/pdpp-catalog.d.ts +36 -0
- package/dist/errors/pdpp-catalog.d.ts.map +1 -0
- package/dist/errors/pdpp-catalog.js +82 -0
- package/dist/errors/pdpp-catalog.js.map +1 -0
- package/dist/grants/index.d.ts +5 -0
- package/dist/grants/index.d.ts.map +1 -0
- package/dist/grants/index.js +6 -0
- package/dist/grants/index.js.map +1 -0
- package/dist/grants/pdpp-binding-store.d.ts +58 -0
- package/dist/grants/pdpp-binding-store.d.ts.map +1 -0
- package/dist/grants/pdpp-binding-store.js +97 -0
- package/dist/grants/pdpp-binding-store.js.map +1 -0
- package/dist/grants/pdpp-binding.d.ts +179 -0
- package/dist/grants/pdpp-binding.d.ts.map +1 -0
- package/dist/grants/pdpp-binding.js +214 -0
- package/dist/grants/pdpp-binding.js.map +1 -0
- package/dist/keys/index.d.ts +3 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +2 -0
- package/dist/keys/index.js.map +1 -0
- package/dist/keys/public-only-account.d.ts +8 -0
- package/dist/keys/public-only-account.d.ts.map +1 -0
- package/dist/keys/public-only-account.js +21 -0
- package/dist/keys/public-only-account.js.map +1 -0
- package/dist/keys/server-account.d.ts +24 -0
- package/dist/keys/server-account.d.ts.map +1 -0
- package/dist/keys/server-account.js +2 -0
- package/dist/keys/server-account.js.map +1 -0
- package/dist/lineage/attestation.d.ts +42 -0
- package/dist/lineage/attestation.d.ts.map +1 -0
- package/dist/lineage/attestation.js +25 -0
- package/dist/lineage/attestation.js.map +1 -0
- package/dist/lineage/gateway.d.ts +105 -0
- package/dist/lineage/gateway.d.ts.map +1 -0
- package/dist/lineage/gateway.js +242 -0
- package/dist/lineage/gateway.js.map +1 -0
- package/dist/lineage/index.d.ts +5 -0
- package/dist/lineage/index.d.ts.map +1 -0
- package/dist/lineage/index.js +5 -0
- package/dist/lineage/index.js.map +1 -0
- package/dist/lineage/lineage.d.ts +141 -0
- package/dist/lineage/lineage.d.ts.map +1 -0
- package/dist/lineage/lineage.js +255 -0
- package/dist/lineage/lineage.js.map +1 -0
- package/dist/logger/index.d.ts +9 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +5 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logging/access-log.d.ts +23 -0
- package/dist/logging/access-log.d.ts.map +1 -0
- package/dist/logging/access-log.js +2 -0
- package/dist/logging/access-log.js.map +1 -0
- package/dist/logging/access-reader.d.ts +14 -0
- package/dist/logging/access-reader.d.ts.map +1 -0
- package/dist/logging/access-reader.js +2 -0
- package/dist/logging/access-reader.js.map +1 -0
- package/dist/mcp/activity.d.ts +68 -0
- package/dist/mcp/activity.d.ts.map +1 -0
- package/dist/mcp/activity.js +111 -0
- package/dist/mcp/activity.js.map +1 -0
- package/dist/mcp/builder-registration.d.ts +24 -0
- package/dist/mcp/builder-registration.d.ts.map +1 -0
- package/dist/mcp/builder-registration.js +89 -0
- package/dist/mcp/builder-registration.js.map +1 -0
- package/dist/mcp/connection-api.d.ts +201 -0
- package/dist/mcp/connection-api.d.ts.map +1 -0
- package/dist/mcp/connection-api.js +506 -0
- package/dist/mcp/connection-api.js.map +1 -0
- package/dist/mcp/grantee.d.ts +52 -0
- package/dist/mcp/grantee.d.ts.map +1 -0
- package/dist/mcp/grantee.js +91 -0
- package/dist/mcp/grantee.js.map +1 -0
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +12 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/read-client.d.ts +176 -0
- package/dist/mcp/read-client.d.ts.map +1 -0
- package/dist/mcp/read-client.js +579 -0
- package/dist/mcp/read-client.js.map +1 -0
- package/dist/mcp/resources.d.ts +37 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +114 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/search/index.d.ts +34 -0
- package/dist/mcp/search/index.d.ts.map +1 -0
- package/dist/mcp/search/index.js +156 -0
- package/dist/mcp/search/index.js.map +1 -0
- package/dist/mcp/server.d.ts +72 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +447 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +160 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +243 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/store.d.ts +13 -0
- package/dist/mcp/store.d.ts.map +1 -0
- package/dist/mcp/store.js +119 -0
- package/dist/mcp/store.js.map +1 -0
- package/dist/mcp/token-expiry.d.ts +38 -0
- package/dist/mcp/token-expiry.d.ts.map +1 -0
- package/dist/mcp/token-expiry.js +55 -0
- package/dist/mcp/token-expiry.js.map +1 -0
- package/dist/mcp/tools.d.ts +95 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +1381 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +135 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +24 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/payment/index.d.ts +2 -0
- package/dist/payment/index.d.ts.map +1 -0
- package/dist/payment/index.js +2 -0
- package/dist/payment/index.js.map +1 -0
- package/dist/payment/x402.d.ts +155 -0
- package/dist/payment/x402.d.ts.map +1 -0
- package/dist/payment/x402.js +402 -0
- package/dist/payment/x402.js.map +1 -0
- package/dist/pdpp/approval.d.ts +182 -0
- package/dist/pdpp/approval.d.ts.map +1 -0
- package/dist/pdpp/approval.js +337 -0
- package/dist/pdpp/approval.js.map +1 -0
- package/dist/pdpp/client-identity.d.ts +88 -0
- package/dist/pdpp/client-identity.d.ts.map +1 -0
- package/dist/pdpp/client-identity.js +183 -0
- package/dist/pdpp/client-identity.js.map +1 -0
- package/dist/pdpp/client-metadata.d.ts +95 -0
- package/dist/pdpp/client-metadata.d.ts.map +1 -0
- package/dist/pdpp/client-metadata.js +96 -0
- package/dist/pdpp/client-metadata.js.map +1 -0
- package/dist/pdpp/declaration.d.ts +118 -0
- package/dist/pdpp/declaration.d.ts.map +1 -0
- package/dist/pdpp/declaration.js +549 -0
- package/dist/pdpp/declaration.js.map +1 -0
- package/dist/pdpp/index.d.ts +35 -0
- package/dist/pdpp/index.d.ts.map +1 -0
- package/dist/pdpp/index.js +22 -0
- package/dist/pdpp/index.js.map +1 -0
- package/dist/pdpp/issuance.d.ts +91 -0
- package/dist/pdpp/issuance.d.ts.map +1 -0
- package/dist/pdpp/issuance.js +124 -0
- package/dist/pdpp/issuance.js.map +1 -0
- package/dist/pdpp/pkce.d.ts +53 -0
- package/dist/pdpp/pkce.d.ts.map +1 -0
- package/dist/pdpp/pkce.js +109 -0
- package/dist/pdpp/pkce.js.map +1 -0
- package/dist/pdpp/redirect.d.ts +60 -0
- package/dist/pdpp/redirect.d.ts.map +1 -0
- package/dist/pdpp/redirect.js +125 -0
- package/dist/pdpp/redirect.js.map +1 -0
- package/dist/pdpp/resolve.d.ts +53 -0
- package/dist/pdpp/resolve.d.ts.map +1 -0
- package/dist/pdpp/resolve.js +218 -0
- package/dist/pdpp/resolve.js.map +1 -0
- package/dist/pdpp/review.d.ts +155 -0
- package/dist/pdpp/review.d.ts.map +1 -0
- package/dist/pdpp/review.js +142 -0
- package/dist/pdpp/review.js.map +1 -0
- package/dist/pdpp/selection.d.ts +43 -0
- package/dist/pdpp/selection.d.ts.map +1 -0
- package/dist/pdpp/selection.js +211 -0
- package/dist/pdpp/selection.js.map +1 -0
- package/dist/pdpp/store.d.ts +204 -0
- package/dist/pdpp/store.d.ts.map +1 -0
- package/dist/pdpp/store.js +501 -0
- package/dist/pdpp/store.js.map +1 -0
- package/dist/pdpp/tokens.d.ts +149 -0
- package/dist/pdpp/tokens.d.ts.map +1 -0
- package/dist/pdpp/tokens.js +387 -0
- package/dist/pdpp/tokens.js.map +1 -0
- package/dist/pdpp/types.d.ts +258 -0
- package/dist/pdpp/types.d.ts.map +1 -0
- package/dist/pdpp/types.js +40 -0
- package/dist/pdpp/types.js.map +1 -0
- package/dist/pdpp-version.d.ts +28 -0
- package/dist/pdpp-version.d.ts.map +1 -0
- package/dist/pdpp-version.js +28 -0
- package/dist/pdpp-version.js.map +1 -0
- package/dist/policy/data-read.d.ts +56 -0
- package/dist/policy/data-read.d.ts.map +1 -0
- package/dist/policy/data-read.js +176 -0
- package/dist/policy/data-read.js.map +1 -0
- package/dist/policy/data-write.d.ts +69 -0
- package/dist/policy/data-write.d.ts.map +1 -0
- package/dist/policy/data-write.js +131 -0
- package/dist/policy/data-write.js.map +1 -0
- package/dist/policy/index.d.ts +4 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +4 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/signed-artifacts.d.ts +17 -0
- package/dist/policy/signed-artifacts.d.ts.map +1 -0
- package/dist/policy/signed-artifacts.js +110 -0
- package/dist/policy/signed-artifacts.js.map +1 -0
- package/dist/ports/index.d.ts +243 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +7 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/pdpp-auth.d.ts +103 -0
- package/dist/ports/pdpp-auth.d.ts.map +1 -0
- package/dist/ports/pdpp-auth.js +37 -0
- package/dist/ports/pdpp-auth.js.map +1 -0
- package/dist/ports/pdpp-auth.test-utils.d.ts +9 -0
- package/dist/ports/pdpp-auth.test-utils.d.ts.map +1 -0
- package/dist/ports/pdpp-auth.test-utils.js +18 -0
- package/dist/ports/pdpp-auth.test-utils.js.map +1 -0
- package/dist/schemas/server-config.d.ts +190 -0
- package/dist/schemas/server-config.d.ts.map +1 -0
- package/dist/schemas/server-config.js +282 -0
- package/dist/schemas/server-config.js.map +1 -0
- package/dist/signing/index.d.ts +3 -0
- package/dist/signing/index.d.ts.map +1 -0
- package/dist/signing/index.js +3 -0
- package/dist/signing/index.js.map +1 -0
- package/dist/signing/request-signer.d.ts +20 -0
- package/dist/signing/request-signer.d.ts.map +1 -0
- package/dist/signing/request-signer.js +23 -0
- package/dist/signing/request-signer.js.map +1 -0
- package/dist/signing/signer.d.ts +40 -0
- package/dist/signing/signer.d.ts.map +1 -0
- package/dist/signing/signer.js +56 -0
- package/dist/signing/signer.js.map +1 -0
- package/dist/storage/adapters/index.d.ts +4 -0
- package/dist/storage/adapters/index.d.ts.map +1 -0
- package/dist/storage/adapters/index.js +3 -0
- package/dist/storage/adapters/index.js.map +1 -0
- package/dist/storage/adapters/interface.d.ts +57 -0
- package/dist/storage/adapters/interface.d.ts.map +1 -0
- package/dist/storage/adapters/interface.js +2 -0
- package/dist/storage/adapters/interface.js.map +1 -0
- package/dist/storage/adapters/sdk.d.ts +23 -0
- package/dist/storage/adapters/sdk.d.ts.map +1 -0
- package/dist/storage/adapters/sdk.js +73 -0
- package/dist/storage/adapters/sdk.js.map +1 -0
- package/dist/storage/adapters/vana.d.ts +12 -0
- package/dist/storage/adapters/vana.d.ts.map +1 -0
- package/dist/storage/adapters/vana.js +111 -0
- package/dist/storage/adapters/vana.js.map +1 -0
- package/dist/storage/blocks/build.d.ts +20 -0
- package/dist/storage/blocks/build.d.ts.map +1 -0
- package/dist/storage/blocks/build.js +378 -0
- package/dist/storage/blocks/build.js.map +1 -0
- package/dist/storage/blocks/cursor.d.ts +33 -0
- package/dist/storage/blocks/cursor.d.ts.map +1 -0
- package/dist/storage/blocks/cursor.js +142 -0
- package/dist/storage/blocks/cursor.js.map +1 -0
- package/dist/storage/blocks/errors.d.ts +6 -0
- package/dist/storage/blocks/errors.d.ts.map +1 -0
- package/dist/storage/blocks/errors.js +9 -0
- package/dist/storage/blocks/errors.js.map +1 -0
- package/dist/storage/blocks/index.d.ts +6 -0
- package/dist/storage/blocks/index.d.ts.map +1 -0
- package/dist/storage/blocks/index.js +5 -0
- package/dist/storage/blocks/index.js.map +1 -0
- package/dist/storage/blocks/select.d.ts +29 -0
- package/dist/storage/blocks/select.d.ts.map +1 -0
- package/dist/storage/blocks/select.js +120 -0
- package/dist/storage/blocks/select.js.map +1 -0
- package/dist/storage/blocks/types.d.ts +56 -0
- package/dist/storage/blocks/types.d.ts.map +1 -0
- package/dist/storage/blocks/types.js +2 -0
- package/dist/storage/blocks/types.js.map +1 -0
- package/dist/storage/hierarchy/index.d.ts +3 -0
- package/dist/storage/hierarchy/index.d.ts.map +1 -0
- package/dist/storage/hierarchy/index.js +2 -0
- package/dist/storage/hierarchy/index.js.map +1 -0
- package/dist/storage/hierarchy/manager.d.ts +9 -0
- package/dist/storage/hierarchy/manager.d.ts.map +1 -0
- package/dist/storage/hierarchy/manager.js +2 -0
- package/dist/storage/hierarchy/manager.js.map +1 -0
- package/dist/storage/hierarchy/paths.d.ts +11 -0
- package/dist/storage/hierarchy/paths.d.ts.map +1 -0
- package/dist/storage/hierarchy/paths.js +43 -0
- package/dist/storage/hierarchy/paths.js.map +1 -0
- package/dist/storage/index/index.d.ts +3 -0
- package/dist/storage/index/index.d.ts.map +1 -0
- package/dist/storage/index/index.js +2 -0
- package/dist/storage/index/index.js.map +1 -0
- package/dist/storage/index/manager.d.ts +63 -0
- package/dist/storage/index/manager.d.ts.map +1 -0
- package/dist/storage/index/manager.js +2 -0
- package/dist/storage/index/manager.js.map +1 -0
- package/dist/storage/index/schema.d.ts +2 -0
- package/dist/storage/index/schema.d.ts.map +1 -0
- package/dist/storage/index/schema.js +2 -0
- package/dist/storage/index/schema.js.map +1 -0
- package/dist/storage/index/types.d.ts +37 -0
- package/dist/storage/index/types.d.ts.map +1 -0
- package/dist/storage/index/types.js +2 -0
- package/dist/storage/index/types.js.map +1 -0
- package/dist/storage/pdpp-records/cursor.d.ts +27 -0
- package/dist/storage/pdpp-records/cursor.d.ts.map +1 -0
- package/dist/storage/pdpp-records/cursor.js +49 -0
- package/dist/storage/pdpp-records/cursor.js.map +1 -0
- package/dist/storage/pdpp-records/enforcement.d.ts +37 -0
- package/dist/storage/pdpp-records/enforcement.d.ts.map +1 -0
- package/dist/storage/pdpp-records/enforcement.js +79 -0
- package/dist/storage/pdpp-records/enforcement.js.map +1 -0
- package/dist/storage/pdpp-records/index.d.ts +8 -0
- package/dist/storage/pdpp-records/index.d.ts.map +1 -0
- package/dist/storage/pdpp-records/index.js +8 -0
- package/dist/storage/pdpp-records/index.js.map +1 -0
- package/dist/storage/pdpp-records/interface.d.ts +49 -0
- package/dist/storage/pdpp-records/interface.d.ts.map +1 -0
- package/dist/storage/pdpp-records/interface.js +2 -0
- package/dist/storage/pdpp-records/interface.js.map +1 -0
- package/dist/storage/pdpp-records/memory-store.d.ts +9 -0
- package/dist/storage/pdpp-records/memory-store.d.ts.map +1 -0
- package/dist/storage/pdpp-records/memory-store.js +0 -0
- package/dist/storage/pdpp-records/memory-store.js.map +1 -0
- package/dist/storage/pdpp-records/record-key.d.ts +52 -0
- package/dist/storage/pdpp-records/record-key.d.ts.map +1 -0
- package/dist/storage/pdpp-records/record-key.js +97 -0
- package/dist/storage/pdpp-records/record-key.js.map +1 -0
- package/dist/storage/pdpp-records/stream-declaration.d.ts +43 -0
- package/dist/storage/pdpp-records/stream-declaration.d.ts.map +1 -0
- package/dist/storage/pdpp-records/stream-declaration.js +17 -0
- package/dist/storage/pdpp-records/stream-declaration.js.map +1 -0
- package/dist/storage/pdpp-records/types.d.ts +93 -0
- package/dist/storage/pdpp-records/types.d.ts.map +1 -0
- package/dist/storage/pdpp-records/types.js +17 -0
- package/dist/storage/pdpp-records/types.js.map +1 -0
- package/dist/storage/preview.d.ts +12 -0
- package/dist/storage/preview.d.ts.map +1 -0
- package/dist/storage/preview.js +239 -0
- package/dist/storage/preview.js.map +1 -0
- package/dist/sync/cursor.d.ts +10 -0
- package/dist/sync/cursor.d.ts.map +1 -0
- package/dist/sync/cursor.js +2 -0
- package/dist/sync/cursor.js.map +1 -0
- package/dist/sync/data-point-feed.d.ts +35 -0
- package/dist/sync/data-point-feed.d.ts.map +1 -0
- package/dist/sync/data-point-feed.js +122 -0
- package/dist/sync/data-point-feed.js.map +1 -0
- package/dist/sync/data-point-id.d.ts +7 -0
- package/dist/sync/data-point-id.d.ts.map +1 -0
- package/dist/sync/data-point-id.js +16 -0
- package/dist/sync/data-point-id.js.map +1 -0
- package/dist/sync/delete-data-port.d.ts +50 -0
- package/dist/sync/delete-data-port.d.ts.map +1 -0
- package/dist/sync/delete-data-port.js +244 -0
- package/dist/sync/delete-data-port.js.map +1 -0
- package/dist/sync/engine/sync-manager.d.ts +58 -0
- package/dist/sync/engine/sync-manager.d.ts.map +1 -0
- package/dist/sync/engine/sync-manager.js +285 -0
- package/dist/sync/engine/sync-manager.js.map +1 -0
- package/dist/sync/index.d.ts +15 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +14 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/issues.d.ts +55 -0
- package/dist/sync/issues.d.ts.map +1 -0
- package/dist/sync/issues.js +168 -0
- package/dist/sync/issues.js.map +1 -0
- package/dist/sync/pdpp-import.d.ts +192 -0
- package/dist/sync/pdpp-import.d.ts.map +1 -0
- package/dist/sync/pdpp-import.js +422 -0
- package/dist/sync/pdpp-import.js.map +1 -0
- package/dist/sync/pending-blob-deletions.d.ts +29 -0
- package/dist/sync/pending-blob-deletions.d.ts.map +1 -0
- package/dist/sync/pending-blob-deletions.js +116 -0
- package/dist/sync/pending-blob-deletions.js.map +1 -0
- package/dist/sync/retry-memory.d.ts +33 -0
- package/dist/sync/retry-memory.d.ts.map +1 -0
- package/dist/sync/retry-memory.js +68 -0
- package/dist/sync/retry-memory.js.map +1 -0
- package/dist/sync/scope-deletions.d.ts +155 -0
- package/dist/sync/scope-deletions.d.ts.map +1 -0
- package/dist/sync/scope-deletions.js +225 -0
- package/dist/sync/scope-deletions.js.map +1 -0
- package/dist/sync/tombstone.d.ts +27 -0
- package/dist/sync/tombstone.d.ts.map +1 -0
- package/dist/sync/tombstone.js +28 -0
- package/dist/sync/tombstone.js.map +1 -0
- package/dist/sync/types.d.ts +27 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +2 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/workers/delete.d.ts +163 -0
- package/dist/sync/workers/delete.d.ts.map +1 -0
- package/dist/sync/workers/delete.js +474 -0
- package/dist/sync/workers/delete.js.map +1 -0
- package/dist/sync/workers/download.d.ts +159 -0
- package/dist/sync/workers/download.d.ts.map +1 -0
- package/dist/sync/workers/download.js +731 -0
- package/dist/sync/workers/download.js.map +1 -0
- package/dist/sync/workers/upload.d.ts +98 -0
- package/dist/sync/workers/upload.d.ts.map +1 -0
- package/dist/sync/workers/upload.js +412 -0
- package/dist/sync/workers/upload.js.map +1 -0
- package/dist/test-utils/e2ee-fixtures.d.ts +94 -0
- package/dist/test-utils/e2ee-fixtures.d.ts.map +1 -0
- package/dist/test-utils/e2ee-fixtures.js +116 -0
- package/dist/test-utils/e2ee-fixtures.js.map +1 -0
- package/dist/test-utils/e2ee-gateway.d.ts +61 -0
- package/dist/test-utils/e2ee-gateway.d.ts.map +1 -0
- package/dist/test-utils/e2ee-gateway.js +248 -0
- package/dist/test-utils/e2ee-gateway.js.map +1 -0
- package/dist/test-utils/index.d.ts +5 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/index.js +5 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/memory-storage.d.ts +12 -0
- package/dist/test-utils/memory-storage.d.ts.map +1 -0
- package/dist/test-utils/memory-storage.js +146 -0
- package/dist/test-utils/memory-storage.js.map +1 -0
- package/dist/test-utils/wallet.d.ts +47 -0
- package/dist/test-utils/wallet.d.ts.map +1 -0
- package/dist/test-utils/wallet.js +98 -0
- package/dist/test-utils/wallet.js.map +1 -0
- package/dist/write/attribution.d.ts +185 -0
- package/dist/write/attribution.d.ts.map +1 -0
- package/dist/write/attribution.js +450 -0
- package/dist/write/attribution.js.map +1 -0
- package/dist/write/authorize.d.ts +77 -0
- package/dist/write/authorize.d.ts.map +1 -0
- package/dist/write/authorize.js +109 -0
- package/dist/write/authorize.js.map +1 -0
- package/dist/write/index.d.ts +5 -0
- package/dist/write/index.d.ts.map +1 -0
- package/dist/write/index.js +5 -0
- package/dist/write/index.js.map +1 -0
- package/dist/write/route.d.ts +61 -0
- package/dist/write/route.d.ts.map +1 -0
- package/dist/write/route.js +132 -0
- package/dist/write/route.js.map +1 -0
- package/dist/write/session.d.ts +96 -0
- package/dist/write/session.d.ts.map +1 -0
- package/dist/write/session.js +136 -0
- package/dist/write/session.js.map +1 -0
- package/package.json +175 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDPP Core §6→§7 resolution: turn a validated selection request into the
|
|
3
|
+
* explicit grant facts that get frozen at issuance.
|
|
4
|
+
*
|
|
5
|
+
* Every request-only convenience dies here. Wildcards and presets expand to
|
|
6
|
+
* concrete stream rows, views resolve to field lists, omitted fields become
|
|
7
|
+
* the declaration's full field set, omitted instance handles resolve against
|
|
8
|
+
* the owner's connection inventory, and `time_range` freezes against the
|
|
9
|
+
* declaration's `consent_time_field`. §7 is explicit that none of these
|
|
10
|
+
* conveniences are continuing authority in the grant — the RS must never have
|
|
11
|
+
* to resolve anything, which is also what the AS→RS contract promises.
|
|
12
|
+
*
|
|
13
|
+
* Resolution runs against the same retained snapshot `selection.ts` validated
|
|
14
|
+
* against. Passing a newer declaration here is the bug §9 AS item 16 exists to
|
|
15
|
+
* prevent: it would let a later declaration widen an in-flight authorization.
|
|
16
|
+
*/
|
|
17
|
+
function failure(code, message, extra) {
|
|
18
|
+
return { ok: false, failure: { code, message, ...extra } };
|
|
19
|
+
}
|
|
20
|
+
/** Stable de-duplication. Grant field and instance lists must be unique (§7). */
|
|
21
|
+
function unique(values) {
|
|
22
|
+
return Array.from(new Set(values));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the field allowlist for one stream.
|
|
26
|
+
*
|
|
27
|
+
* Schema-required fields are unioned in unconditionally: §6 calls them the
|
|
28
|
+
* per-stream consent floor, because a record missing them is not a valid
|
|
29
|
+
* record of that stream. That means a client asking for fewer fields than the
|
|
30
|
+
* floor gets the floor, not an error.
|
|
31
|
+
*/
|
|
32
|
+
function resolveFields(request, declared, snapshot) {
|
|
33
|
+
let requested;
|
|
34
|
+
if (request.view !== undefined) {
|
|
35
|
+
const view = snapshot.views?.find((v) => v.name === request.view);
|
|
36
|
+
if (!view) {
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
failure: {
|
|
40
|
+
code: "unknown_view",
|
|
41
|
+
message: `view '${request.view}' is not defined for this source`,
|
|
42
|
+
stream: declared.name,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
requested = view.fields;
|
|
47
|
+
}
|
|
48
|
+
else if (request.fields !== undefined) {
|
|
49
|
+
requested = request.fields;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// §6 "Note on defaults": omitting both asks the AS to resolve all
|
|
53
|
+
// permitted fields from the retained snapshot.
|
|
54
|
+
requested = declared.fields;
|
|
55
|
+
}
|
|
56
|
+
// Intersect with the declared schema before adding the floor, so a view or
|
|
57
|
+
// allowlist can never introduce a field the snapshot does not define.
|
|
58
|
+
const permitted = requested.filter((f) => declared.fields.includes(f));
|
|
59
|
+
const fields = unique([...permitted, ...declared.required_fields]);
|
|
60
|
+
if (fields.length === 0) {
|
|
61
|
+
return {
|
|
62
|
+
ok: false,
|
|
63
|
+
failure: {
|
|
64
|
+
code: "empty_field_set",
|
|
65
|
+
message: `stream '${declared.name}' resolved to an empty field set`,
|
|
66
|
+
stream: declared.name,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return { ok: true, fields };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Resolve instance handles for one stream.
|
|
74
|
+
*
|
|
75
|
+
* Three outcomes, per §6 and §7: explicit handles are verified for
|
|
76
|
+
* eligibility; a single eligible handle resolves automatically; anything else
|
|
77
|
+
* is an owner choice the AS must surface before the final approval surface.
|
|
78
|
+
*/
|
|
79
|
+
function resolveInstances(request, streamName, inventory) {
|
|
80
|
+
const eligible = inventory.eligibleFor(streamName);
|
|
81
|
+
if (request.instance_ids !== undefined && request.instance_ids.length > 0) {
|
|
82
|
+
const ineligible = request.instance_ids.filter((id) => !eligible.includes(id));
|
|
83
|
+
if (ineligible.length > 0) {
|
|
84
|
+
return {
|
|
85
|
+
ok: false,
|
|
86
|
+
failure: {
|
|
87
|
+
code: "unknown_instance",
|
|
88
|
+
message: `stream '${streamName}' requests instance handles that are not eligible: ${ineligible.join(", ")}`,
|
|
89
|
+
stream: streamName,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Explicitly listing more than one handle is how a client asks for
|
|
94
|
+
// fan-in, and it is allowed precisely because it is explicit.
|
|
95
|
+
return { ok: true, instanceIds: unique(request.instance_ids) };
|
|
96
|
+
}
|
|
97
|
+
if (eligible.length === 0) {
|
|
98
|
+
return {
|
|
99
|
+
ok: false,
|
|
100
|
+
failure: {
|
|
101
|
+
code: "no_eligible_instance",
|
|
102
|
+
message: `stream '${streamName}' has no connected instance to authorize`,
|
|
103
|
+
stream: streamName,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
if (eligible.length > 1) {
|
|
108
|
+
// Omission never means fan-in. The owner picks.
|
|
109
|
+
return {
|
|
110
|
+
ok: false,
|
|
111
|
+
failure: {
|
|
112
|
+
code: "instance_choice_required",
|
|
113
|
+
message: `stream '${streamName}' has ${eligible.length} eligible instances and the request named none`,
|
|
114
|
+
stream: streamName,
|
|
115
|
+
candidates: eligible,
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return { ok: true, instanceIds: [eligible[0]] };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Freeze `time_range` into the grant's `time_constraint`, binding the
|
|
123
|
+
* declaration's `consent_time_field` as the field the RS evaluates against.
|
|
124
|
+
* Freezing the field name (not just the bounds) is what stops a later
|
|
125
|
+
* declaration that renames its time field from silently re-scoping the grant.
|
|
126
|
+
*/
|
|
127
|
+
function resolveTimeConstraint(request, declared) {
|
|
128
|
+
if (!request.time_range)
|
|
129
|
+
return undefined;
|
|
130
|
+
const { since, until } = request.time_range;
|
|
131
|
+
if (since === undefined && until === undefined)
|
|
132
|
+
return undefined;
|
|
133
|
+
// Validation already rejected time_range on a stream with no time field.
|
|
134
|
+
const field = declared.consent_time_field;
|
|
135
|
+
if (!field)
|
|
136
|
+
return undefined;
|
|
137
|
+
return {
|
|
138
|
+
field,
|
|
139
|
+
...(since !== undefined && { since }),
|
|
140
|
+
...(until !== undefined && { until }),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function resolveOneStream(request, declared, snapshot, inventory) {
|
|
144
|
+
const fields = resolveFields(request, declared, snapshot);
|
|
145
|
+
if (!fields.ok)
|
|
146
|
+
return fields;
|
|
147
|
+
const instances = resolveInstances(request, declared.name, inventory);
|
|
148
|
+
if (!instances.ok)
|
|
149
|
+
return instances;
|
|
150
|
+
const timeConstraint = resolveTimeConstraint(request, declared);
|
|
151
|
+
return {
|
|
152
|
+
ok: true,
|
|
153
|
+
stream: {
|
|
154
|
+
name: declared.name,
|
|
155
|
+
instance_ids: instances.instanceIds,
|
|
156
|
+
fields: fields.fields,
|
|
157
|
+
...(timeConstraint && { time_constraint: timeConstraint }),
|
|
158
|
+
...(request.resources && { resources: unique(request.resources) }),
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Expand the request's stream selections into the concrete list to resolve.
|
|
164
|
+
*
|
|
165
|
+
* A wildcard entry fans out to every declared stream, carrying its own
|
|
166
|
+
* per-stream parameters with it — §6 says a wildcard's `instance_ids` apply to
|
|
167
|
+
* every expanded stream, and each handle is then verified per stream by
|
|
168
|
+
* `resolveInstances`. A preset expands from the snapshot instead.
|
|
169
|
+
*/
|
|
170
|
+
function expandSelections(request, snapshot) {
|
|
171
|
+
if (request.selection_preset !== undefined) {
|
|
172
|
+
const preset = snapshot.selection_presets?.find((p) => p.name === request.selection_preset);
|
|
173
|
+
return preset ? preset.streams : [];
|
|
174
|
+
}
|
|
175
|
+
const streams = request.streams ?? [];
|
|
176
|
+
const wildcard = streams.find((s) => s.name === "*");
|
|
177
|
+
if (wildcard) {
|
|
178
|
+
return snapshot.streams.map((declared) => ({
|
|
179
|
+
...wildcard,
|
|
180
|
+
name: declared.name,
|
|
181
|
+
// A wildcard cannot carry a view (validation rejects that pairing), and
|
|
182
|
+
// its time_range only applies to streams that can accept one. Dropping
|
|
183
|
+
// it for time-incapable streams is what makes `{"name":"*"}` with a
|
|
184
|
+
// time_range usable on a mixed-capability source at all.
|
|
185
|
+
...(wildcard.time_range && !declared.consent_time_field
|
|
186
|
+
? { time_range: undefined }
|
|
187
|
+
: {}),
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
190
|
+
return streams;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Resolve every enforcement axis for a validated selection request.
|
|
194
|
+
*
|
|
195
|
+
* Call this before showing the final approval surface: §7 requires the
|
|
196
|
+
* approval artifact to contain the exact resolved instance handles, stream
|
|
197
|
+
* names, fields, resources, and temporal bounds, which only exist once this
|
|
198
|
+
* has run.
|
|
199
|
+
*/
|
|
200
|
+
export function resolveSelection(request, snapshot, inventory) {
|
|
201
|
+
const selections = expandSelections(request, snapshot);
|
|
202
|
+
if (selections.length === 0) {
|
|
203
|
+
return failure("unknown_stream", "the selection resolved to no streams against the retained snapshot");
|
|
204
|
+
}
|
|
205
|
+
const resolved = [];
|
|
206
|
+
for (const selection of selections) {
|
|
207
|
+
const declared = snapshot.streams.find((s) => s.name === selection.name);
|
|
208
|
+
if (!declared) {
|
|
209
|
+
return failure("unknown_stream", `stream '${selection.name}' is not declared by the retained snapshot`, { stream: selection.name });
|
|
210
|
+
}
|
|
211
|
+
const result = resolveOneStream(selection, declared, snapshot, inventory);
|
|
212
|
+
if (!result.ok)
|
|
213
|
+
return { ok: false, failure: result.failure };
|
|
214
|
+
resolved.push(result.stream);
|
|
215
|
+
}
|
|
216
|
+
return { ok: true, streams: resolved };
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/pdpp/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDPP Core §6/§7 consent review model and immutable review digest.
|
|
3
|
+
*
|
|
4
|
+
* Two jobs here, and they are related:
|
|
5
|
+
*
|
|
6
|
+
* 1. Build the review model Account/Web renders. §6 forbids flattening the
|
|
7
|
+
* consent surface: requester identity, declaration-authored data
|
|
8
|
+
* descriptions, structured policy declarations, and attributed client
|
|
9
|
+
* claims are four distinct categories, and a client claim must never be
|
|
10
|
+
* rendered in the same register as a protocol-enforced term. The model
|
|
11
|
+
* below keeps them in four separate fields so a renderer cannot
|
|
12
|
+
* accidentally merge them.
|
|
13
|
+
*
|
|
14
|
+
* 2. Compute a digest over the decision fields. §7 requires the approval
|
|
15
|
+
* mutation to bind to an immutable review revision or digest, and to reject
|
|
16
|
+
* approval if eligibility or the reviewed revision changed in the meantime.
|
|
17
|
+
* That is what stops a resolved-then-widened race: the owner approves a
|
|
18
|
+
* digest, and issuance re-derives the digest from what it is about to issue.
|
|
19
|
+
* If they differ, the approval is stale and dies.
|
|
20
|
+
*
|
|
21
|
+
* The digest covers exactly the decision fields §7 enumerates, plus the
|
|
22
|
+
* normalized client claims when they were rendered. It deliberately does NOT
|
|
23
|
+
* cover `issued_at` or `grant_id`, which do not exist yet at review time.
|
|
24
|
+
*/
|
|
25
|
+
import { type ClientClaims, type ClientDisplay, type DeclarationSnapshot, type Retention, type SelectionRequest, type StreamGrant } from "./types.js";
|
|
26
|
+
/** How the AS resolved requester identity, and how much it actually knows. */
|
|
27
|
+
export interface RequesterIdentity {
|
|
28
|
+
client_id: string;
|
|
29
|
+
/** Resolved per §6 precedence. Falls back to `client_id` when nothing else exists. */
|
|
30
|
+
display_name: string;
|
|
31
|
+
display?: ClientDisplay;
|
|
32
|
+
/**
|
|
33
|
+
* §6 obligation 5: verified domain control is named, never presented as an
|
|
34
|
+
* unqualified "verified app". Absent means no positive trust signal, and the
|
|
35
|
+
* surface must show an unverified indicator.
|
|
36
|
+
*/
|
|
37
|
+
verified_domain?: string;
|
|
38
|
+
/** True only for a local registration or trust-registry admission decision. */
|
|
39
|
+
app_approved: boolean;
|
|
40
|
+
}
|
|
41
|
+
/** One stream row as the owner reviews it, with declaration-authored copy. */
|
|
42
|
+
export interface ReviewStream {
|
|
43
|
+
name: string;
|
|
44
|
+
/** Declaration-authored description. Its own category — not a client claim. */
|
|
45
|
+
description?: string;
|
|
46
|
+
instance_ids: string[];
|
|
47
|
+
fields: string[];
|
|
48
|
+
time_constraint?: {
|
|
49
|
+
field: string;
|
|
50
|
+
since?: string;
|
|
51
|
+
until?: string;
|
|
52
|
+
};
|
|
53
|
+
resources?: string[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The four semantic categories §6 requires a conformant consent surface to
|
|
57
|
+
* keep distinct. A renderer that wants to flatten them has to do so
|
|
58
|
+
* deliberately; it cannot do so by accident.
|
|
59
|
+
*/
|
|
60
|
+
export interface ConsentReviewModel {
|
|
61
|
+
/** Category 1: who is asking. */
|
|
62
|
+
requester: RequesterIdentity;
|
|
63
|
+
/** Category 2: declaration-authored data descriptions + protocol-enforced terms. */
|
|
64
|
+
data: {
|
|
65
|
+
source: {
|
|
66
|
+
kind: string;
|
|
67
|
+
id: string;
|
|
68
|
+
};
|
|
69
|
+
source_declaration_version: string;
|
|
70
|
+
access_mode: "single_use" | "continuous";
|
|
71
|
+
streams: ReviewStream[];
|
|
72
|
+
expires_at?: string;
|
|
73
|
+
};
|
|
74
|
+
/** Category 3: structured policy declarations. */
|
|
75
|
+
policy: {
|
|
76
|
+
purpose_code: string;
|
|
77
|
+
purpose_description?: string;
|
|
78
|
+
/**
|
|
79
|
+
* True when the code is absent from the PDPP registry. §9 AS item 6:
|
|
80
|
+
* this drives *rendering* (show the description or raw URI), never
|
|
81
|
+
* rejection.
|
|
82
|
+
*/
|
|
83
|
+
purpose_unregistered: boolean;
|
|
84
|
+
retention?: Retention;
|
|
85
|
+
/**
|
|
86
|
+
* §6: the sole purpose code with a protocol-level consent requirement.
|
|
87
|
+
* The surface must collect explicit affirmative consent when this is set.
|
|
88
|
+
*/
|
|
89
|
+
requires_explicit_ai_training_consent: boolean;
|
|
90
|
+
};
|
|
91
|
+
/** Category 4: attributed, unverifiable, non-enforceable client claims. */
|
|
92
|
+
client_claims?: {
|
|
93
|
+
/** Always rendered as "<name> says:" — never as a protocol term. */
|
|
94
|
+
attributed_to: string;
|
|
95
|
+
commitments: string[];
|
|
96
|
+
};
|
|
97
|
+
/** Digest over the decision fields. The approval must carry this back. */
|
|
98
|
+
review_digest: string;
|
|
99
|
+
}
|
|
100
|
+
export declare function isRegisteredPurposeCode(code: string): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Normalize client claims before binding. §6 requires the *normalized exact*
|
|
103
|
+
* claims to be bound into the approval artifact, so the digest has to be
|
|
104
|
+
* computed over a canonical form — otherwise re-rendering with different
|
|
105
|
+
* whitespace would spuriously invalidate an approval.
|
|
106
|
+
*/
|
|
107
|
+
export declare function normalizeClientClaims(claims: ClientClaims | undefined): string[] | undefined;
|
|
108
|
+
/**
|
|
109
|
+
* The exact set of fields the digest covers. Kept as its own type so that
|
|
110
|
+
* adding a decision field to the grant without adding it here is a visible
|
|
111
|
+
* omission rather than a silent hole in the binding.
|
|
112
|
+
*/
|
|
113
|
+
interface ReviewDecisionFields {
|
|
114
|
+
subject_id: string;
|
|
115
|
+
client_id: string;
|
|
116
|
+
source_id: string;
|
|
117
|
+
source_kind: string;
|
|
118
|
+
source_declaration_version: string;
|
|
119
|
+
/** The digest of the retained snapshot, so a re-fetched declaration cannot pass. */
|
|
120
|
+
declaration_digest: string;
|
|
121
|
+
purpose_code: string;
|
|
122
|
+
purpose_description?: string;
|
|
123
|
+
access_mode: string;
|
|
124
|
+
streams: StreamGrant[];
|
|
125
|
+
retention?: Retention;
|
|
126
|
+
expires_at?: string;
|
|
127
|
+
/** Bound with attribution when rendered; stays outside the grant regardless. */
|
|
128
|
+
client_claims?: {
|
|
129
|
+
attributed_to: string;
|
|
130
|
+
commitments: string[];
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export declare function computeReviewDigest(fields: ReviewDecisionFields): string;
|
|
134
|
+
export interface BuildReviewInput {
|
|
135
|
+
subjectId: string;
|
|
136
|
+
request: SelectionRequest;
|
|
137
|
+
snapshot: DeclarationSnapshot;
|
|
138
|
+
/** The output of `resolveSelection` — fully concrete. */
|
|
139
|
+
resolvedStreams: StreamGrant[];
|
|
140
|
+
requester: RequesterIdentity;
|
|
141
|
+
/** AS-policy grant expiry, when the deployment sets one. */
|
|
142
|
+
expiresAt?: string;
|
|
143
|
+
/** Declaration-authored stream descriptions, keyed by stream name. */
|
|
144
|
+
streamDescriptions?: Record<string, string>;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Build the review model and its binding digest.
|
|
148
|
+
*
|
|
149
|
+
* The digest is computed from the same resolved streams that will be issued.
|
|
150
|
+
* `issueGrant` recomputes it and refuses to issue if it moved — see
|
|
151
|
+
* `issuance.ts`.
|
|
152
|
+
*/
|
|
153
|
+
export declare function buildConsentReview(input: BuildReviewInput): ConsentReviewModel;
|
|
154
|
+
export {};
|
|
155
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/pdpp/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDPP Core §6/§7 consent review model and immutable review digest.
|
|
3
|
+
*
|
|
4
|
+
* Two jobs here, and they are related:
|
|
5
|
+
*
|
|
6
|
+
* 1. Build the review model Account/Web renders. §6 forbids flattening the
|
|
7
|
+
* consent surface: requester identity, declaration-authored data
|
|
8
|
+
* descriptions, structured policy declarations, and attributed client
|
|
9
|
+
* claims are four distinct categories, and a client claim must never be
|
|
10
|
+
* rendered in the same register as a protocol-enforced term. The model
|
|
11
|
+
* below keeps them in four separate fields so a renderer cannot
|
|
12
|
+
* accidentally merge them.
|
|
13
|
+
*
|
|
14
|
+
* 2. Compute a digest over the decision fields. §7 requires the approval
|
|
15
|
+
* mutation to bind to an immutable review revision or digest, and to reject
|
|
16
|
+
* approval if eligibility or the reviewed revision changed in the meantime.
|
|
17
|
+
* That is what stops a resolved-then-widened race: the owner approves a
|
|
18
|
+
* digest, and issuance re-derives the digest from what it is about to issue.
|
|
19
|
+
* If they differ, the approval is stale and dies.
|
|
20
|
+
*
|
|
21
|
+
* The digest covers exactly the decision fields §7 enumerates, plus the
|
|
22
|
+
* normalized client claims when they were rendered. It deliberately does NOT
|
|
23
|
+
* cover `issued_at` or `grant_id`, which do not exist yet at review time.
|
|
24
|
+
*/
|
|
25
|
+
import { createHash } from "node:crypto";
|
|
26
|
+
import { AI_TRAINING_PURPOSE, } from "./types.js";
|
|
27
|
+
/**
|
|
28
|
+
* Purpose codes in the Appendix A initial registry. Membership drives display
|
|
29
|
+
* only. An unrecognized code is displayed from its description or raw URI and
|
|
30
|
+
* is never a rejection reason on its own (§9 AS item 6).
|
|
31
|
+
*/
|
|
32
|
+
const REGISTERED_PURPOSE_CODES = new Set([
|
|
33
|
+
"https://pdpp.dev/purpose/personalization",
|
|
34
|
+
"https://pdpp.dev/purpose/analytics",
|
|
35
|
+
"https://pdpp.dev/purpose/research",
|
|
36
|
+
"https://pdpp.dev/purpose/portability",
|
|
37
|
+
"https://pdpp.dev/purpose/ai_training",
|
|
38
|
+
]);
|
|
39
|
+
export function isRegisteredPurposeCode(code) {
|
|
40
|
+
return REGISTERED_PURPOSE_CODES.has(code);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Normalize client claims before binding. §6 requires the *normalized exact*
|
|
44
|
+
* claims to be bound into the approval artifact, so the digest has to be
|
|
45
|
+
* computed over a canonical form — otherwise re-rendering with different
|
|
46
|
+
* whitespace would spuriously invalidate an approval.
|
|
47
|
+
*/
|
|
48
|
+
export function normalizeClientClaims(claims) {
|
|
49
|
+
const commitments = claims?.commitments;
|
|
50
|
+
if (!commitments || commitments.length === 0)
|
|
51
|
+
return undefined;
|
|
52
|
+
const normalized = commitments
|
|
53
|
+
.map((c) => c.trim().replace(/\s+/g, " "))
|
|
54
|
+
.filter((c) => c.length > 0);
|
|
55
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Deterministic serialization. `JSON.stringify` preserves insertion order, so
|
|
59
|
+
* we sort keys explicitly — two structurally identical decisions must produce
|
|
60
|
+
* one digest regardless of how the objects were built.
|
|
61
|
+
*/
|
|
62
|
+
function canonicalize(value) {
|
|
63
|
+
if (value === null || typeof value !== "object") {
|
|
64
|
+
return JSON.stringify(value) ?? "null";
|
|
65
|
+
}
|
|
66
|
+
if (Array.isArray(value)) {
|
|
67
|
+
// Array order is meaningful (a field list's order is part of the decision
|
|
68
|
+
// the owner saw), so we do not sort array members.
|
|
69
|
+
return `[${value.map(canonicalize).join(",")}]`;
|
|
70
|
+
}
|
|
71
|
+
const entries = Object.entries(value)
|
|
72
|
+
.filter(([, v]) => v !== undefined)
|
|
73
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
74
|
+
return `{${entries
|
|
75
|
+
.map(([k, v]) => `${JSON.stringify(k)}:${canonicalize(v)}`)
|
|
76
|
+
.join(",")}}`;
|
|
77
|
+
}
|
|
78
|
+
export function computeReviewDigest(fields) {
|
|
79
|
+
return createHash("sha256")
|
|
80
|
+
.update(canonicalize(fields), "utf8")
|
|
81
|
+
.digest("hex");
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Build the review model and its binding digest.
|
|
85
|
+
*
|
|
86
|
+
* The digest is computed from the same resolved streams that will be issued.
|
|
87
|
+
* `issueGrant` recomputes it and refuses to issue if it moved — see
|
|
88
|
+
* `issuance.ts`.
|
|
89
|
+
*/
|
|
90
|
+
export function buildConsentReview(input) {
|
|
91
|
+
const { request, snapshot, resolvedStreams, requester } = input;
|
|
92
|
+
const normalizedClaims = normalizeClientClaims(request.client_claims);
|
|
93
|
+
const boundClaims = normalizedClaims
|
|
94
|
+
? { attributed_to: requester.display_name, commitments: normalizedClaims }
|
|
95
|
+
: undefined;
|
|
96
|
+
const review_digest = computeReviewDigest({
|
|
97
|
+
subject_id: input.subjectId,
|
|
98
|
+
client_id: requester.client_id,
|
|
99
|
+
source_id: snapshot.source_id,
|
|
100
|
+
source_kind: snapshot.source_kind,
|
|
101
|
+
source_declaration_version: snapshot.version,
|
|
102
|
+
declaration_digest: snapshot.digest,
|
|
103
|
+
purpose_code: request.purpose_code,
|
|
104
|
+
purpose_description: request.purpose_description,
|
|
105
|
+
access_mode: request.access_mode,
|
|
106
|
+
streams: resolvedStreams,
|
|
107
|
+
retention: request.retention,
|
|
108
|
+
expires_at: input.expiresAt,
|
|
109
|
+
client_claims: boundClaims,
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
requester,
|
|
113
|
+
data: {
|
|
114
|
+
source: { kind: snapshot.source_kind, id: snapshot.source_id },
|
|
115
|
+
source_declaration_version: snapshot.version,
|
|
116
|
+
access_mode: request.access_mode,
|
|
117
|
+
streams: resolvedStreams.map((s) => ({
|
|
118
|
+
name: s.name,
|
|
119
|
+
...(input.streamDescriptions?.[s.name] && {
|
|
120
|
+
description: input.streamDescriptions[s.name],
|
|
121
|
+
}),
|
|
122
|
+
instance_ids: s.instance_ids,
|
|
123
|
+
fields: s.fields,
|
|
124
|
+
...(s.time_constraint && { time_constraint: s.time_constraint }),
|
|
125
|
+
...(s.resources && { resources: s.resources }),
|
|
126
|
+
})),
|
|
127
|
+
...(input.expiresAt && { expires_at: input.expiresAt }),
|
|
128
|
+
},
|
|
129
|
+
policy: {
|
|
130
|
+
purpose_code: request.purpose_code,
|
|
131
|
+
...(request.purpose_description && {
|
|
132
|
+
purpose_description: request.purpose_description,
|
|
133
|
+
}),
|
|
134
|
+
purpose_unregistered: !isRegisteredPurposeCode(request.purpose_code),
|
|
135
|
+
...(request.retention && { retention: request.retention }),
|
|
136
|
+
requires_explicit_ai_training_consent: request.purpose_code === AI_TRAINING_PURPOSE,
|
|
137
|
+
},
|
|
138
|
+
...(boundClaims && { client_claims: boundClaims }),
|
|
139
|
+
review_digest,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/pdpp/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDPP Core §6 selection-request validation.
|
|
3
|
+
*
|
|
4
|
+
* This is the shape gate that runs before consent. It answers one question:
|
|
5
|
+
* is this request expressible against the retained declaration snapshot? It
|
|
6
|
+
* does not resolve anything — `resolve.ts` does that, and only against the
|
|
7
|
+
* same snapshot this module validated against.
|
|
8
|
+
*
|
|
9
|
+
* "Fails neutrally" in §6 means the both/neither `streams`/`selection_preset`
|
|
10
|
+
* failure is a Source validation failure the binding maps to an error code; it
|
|
11
|
+
* must not leak which of the two the client got wrong, and it must not depend
|
|
12
|
+
* on any owner-specific state. We return a binding-neutral failure and let the
|
|
13
|
+
* OAuth/RAR layer map it to RFC 9396 `invalid_authorization_details`.
|
|
14
|
+
*/
|
|
15
|
+
import { type DeclarationSnapshot, type SelectionRequest } from "./types.js";
|
|
16
|
+
/**
|
|
17
|
+
* Binding-neutral validation failure codes. The OAuth/RAR binding maps these
|
|
18
|
+
* to wire errors in `../../../server/src/routes/pdpp-authorize.ts`; Core
|
|
19
|
+
* itself stays binding-neutral (§9 AS item 5).
|
|
20
|
+
*/
|
|
21
|
+
export type SelectionFailureCode =
|
|
22
|
+
/** Both or neither of `streams` and `selection_preset`. */
|
|
23
|
+
"source_validation_failed" | "unknown_stream" | "unknown_preset" | "unknown_view" | "unknown_field" | "unsupported_selection_parameter" | "invalid_resource_key" | "invalid_request";
|
|
24
|
+
export interface SelectionFailure {
|
|
25
|
+
code: SelectionFailureCode;
|
|
26
|
+
message: string;
|
|
27
|
+
}
|
|
28
|
+
export type SelectionValidation = {
|
|
29
|
+
ok: true;
|
|
30
|
+
} | {
|
|
31
|
+
ok: false;
|
|
32
|
+
failure: SelectionFailure;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Validate one selection request against the retained declaration snapshot.
|
|
36
|
+
*
|
|
37
|
+
* The caller must have already retrieved and pinned `snapshot`; this function
|
|
38
|
+
* never fetches. §9 AS item 16 requires that the same snapshot carry through
|
|
39
|
+
* consent and issuance, so passing a freshly fetched declaration here and a
|
|
40
|
+
* different one to `resolveGrant` would defeat the whole guarantee.
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateSelectionRequest(request: SelectionRequest, snapshot: DeclarationSnapshot): SelectionValidation;
|
|
43
|
+
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/pdpp/selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EAEtB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,MAAM,MAAM,oBAAoB;AAC9B,2DAA2D;AACzD,0BAA0B,GAC1B,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,GACd,eAAe,GACf,iCAAiC,GACjC,sBAAsB,GACtB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,mBAAmB,GAC7B;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAsK1D;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,mBAAmB,GAC5B,mBAAmB,CAwGrB"}
|