@ixo/decision-oracle 0.0.0-stage → 0.2.0
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/README.md +794 -2
- package/dist/act.d.ts +87 -0
- package/dist/act.d.ts.map +1 -0
- package/dist/act.js +20 -0
- package/dist/act.js.map +1 -0
- package/dist/app.d.ts +22 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +128 -0
- package/dist/app.js.map +1 -0
- package/dist/c2pa.wasm +0 -0
- package/dist/cli/commands/api.d.ts +50 -0
- package/dist/cli/commands/api.d.ts.map +1 -0
- package/dist/cli/commands/api.js +737 -0
- package/dist/cli/commands/api.js.map +1 -0
- package/dist/cli/commands/create-collection.d.ts +40 -0
- package/dist/cli/commands/create-collection.d.ts.map +1 -0
- package/dist/cli/commands/create-collection.js +318 -0
- package/dist/cli/commands/create-collection.js.map +1 -0
- package/dist/cli/commands/create-deed.d.ts +31 -0
- package/dist/cli/commands/create-deed.d.ts.map +1 -0
- package/dist/cli/commands/create-deed.js +208 -0
- package/dist/cli/commands/create-deed.js.map +1 -0
- package/dist/cli/commands/delegation.d.ts +26 -0
- package/dist/cli/commands/delegation.d.ts.map +1 -0
- package/dist/cli/commands/delegation.js +162 -0
- package/dist/cli/commands/delegation.js.map +1 -0
- package/dist/cli/commands/derive.d.ts +22 -0
- package/dist/cli/commands/derive.d.ts.map +1 -0
- package/dist/cli/commands/derive.js +53 -0
- package/dist/cli/commands/derive.js.map +1 -0
- package/dist/cli/commands/engine.d.ts +25 -0
- package/dist/cli/commands/engine.d.ts.map +1 -0
- package/dist/cli/commands/engine.js +107 -0
- package/dist/cli/commands/engine.js.map +1 -0
- package/dist/cli/commands/erase.d.ts +17 -0
- package/dist/cli/commands/erase.d.ts.map +1 -0
- package/dist/cli/commands/erase.js +117 -0
- package/dist/cli/commands/erase.js.map +1 -0
- package/dist/cli/commands/facts-run.d.ts +30 -0
- package/dist/cli/commands/facts-run.d.ts.map +1 -0
- package/dist/cli/commands/facts-run.js +409 -0
- package/dist/cli/commands/facts-run.js.map +1 -0
- package/dist/cli/commands/facts-scaffold.d.ts +22 -0
- package/dist/cli/commands/facts-scaffold.d.ts.map +1 -0
- package/dist/cli/commands/facts-scaffold.js +208 -0
- package/dist/cli/commands/facts-scaffold.js.map +1 -0
- package/dist/cli/commands/init.d.ts +18 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +34 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/login.d.ts +9 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +16 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +10 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +28 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/manifest.d.ts +12 -0
- package/dist/cli/commands/manifest.d.ts.map +1 -0
- package/dist/cli/commands/manifest.js +48 -0
- package/dist/cli/commands/manifest.js.map +1 -0
- package/dist/cli/commands/oracle-init.d.ts +48 -0
- package/dist/cli/commands/oracle-init.d.ts.map +1 -0
- package/dist/cli/commands/oracle-init.js +1122 -0
- package/dist/cli/commands/oracle-init.js.map +1 -0
- package/dist/cli/commands/org.d.ts +28 -0
- package/dist/cli/commands/org.d.ts.map +1 -0
- package/dist/cli/commands/org.js +309 -0
- package/dist/cli/commands/org.js.map +1 -0
- package/dist/cli/commands/protocol-review.d.ts +20 -0
- package/dist/cli/commands/protocol-review.d.ts.map +1 -0
- package/dist/cli/commands/protocol-review.js +162 -0
- package/dist/cli/commands/protocol-review.js.map +1 -0
- package/dist/cli/commands/publish-protocol.d.ts +43 -0
- package/dist/cli/commands/publish-protocol.d.ts.map +1 -0
- package/dist/cli/commands/publish-protocol.js +345 -0
- package/dist/cli/commands/publish-protocol.js.map +1 -0
- package/dist/cli/commands/register.d.ts +16 -0
- package/dist/cli/commands/register.d.ts.map +1 -0
- package/dist/cli/commands/register.js +54 -0
- package/dist/cli/commands/register.js.map +1 -0
- package/dist/cli/commands/relink.d.ts +11 -0
- package/dist/cli/commands/relink.d.ts.map +1 -0
- package/dist/cli/commands/relink.js +36 -0
- package/dist/cli/commands/relink.js.map +1 -0
- package/dist/cli/commands/rubric-fetch-form.d.ts +16 -0
- package/dist/cli/commands/rubric-fetch-form.d.ts.map +1 -0
- package/dist/cli/commands/rubric-fetch-form.js +83 -0
- package/dist/cli/commands/rubric-fetch-form.js.map +1 -0
- package/dist/cli/commands/rubric-validate.d.ts +72 -0
- package/dist/cli/commands/rubric-validate.d.ts.map +1 -0
- package/dist/cli/commands/rubric-validate.js +163 -0
- package/dist/cli/commands/rubric-validate.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +13 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +39 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +11 -0
- package/dist/cli/commands/skills.d.ts.map +1 -0
- package/dist/cli/commands/skills.js +19 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/submit-claim.d.ts +25 -0
- package/dist/cli/commands/submit-claim.d.ts.map +1 -0
- package/dist/cli/commands/submit-claim.js +155 -0
- package/dist/cli/commands/submit-claim.js.map +1 -0
- package/dist/cli/index.d.ts +15 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +206 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/lib/agent-card-schema.d.ts +8 -0
- package/dist/cli/lib/agent-card-schema.d.ts.map +1 -0
- package/dist/cli/lib/agent-card-schema.js +169 -0
- package/dist/cli/lib/agent-card-schema.js.map +1 -0
- package/dist/cli/lib/ai-rest.d.ts +12 -0
- package/dist/cli/lib/ai-rest.d.ts.map +1 -0
- package/dist/cli/lib/ai-rest.js +36 -0
- package/dist/cli/lib/ai-rest.js.map +1 -0
- package/dist/cli/lib/args.d.ts +33 -0
- package/dist/cli/lib/args.d.ts.map +1 -0
- package/dist/cli/lib/args.js +24 -0
- package/dist/cli/lib/args.js.map +1 -0
- package/dist/cli/lib/authhub.d.ts +7 -0
- package/dist/cli/lib/authhub.d.ts.map +1 -0
- package/dist/cli/lib/authhub.js +210 -0
- package/dist/cli/lib/authhub.js.map +1 -0
- package/dist/cli/lib/chain.d.ts +264 -0
- package/dist/cli/lib/chain.d.ts.map +1 -0
- package/dist/cli/lib/chain.js +584 -0
- package/dist/cli/lib/chain.js.map +1 -0
- package/dist/cli/lib/devvars.d.ts +59 -0
- package/dist/cli/lib/devvars.d.ts.map +1 -0
- package/dist/cli/lib/devvars.js +206 -0
- package/dist/cli/lib/devvars.js.map +1 -0
- package/dist/cli/lib/engine.d.ts +54 -0
- package/dist/cli/lib/engine.d.ts.map +1 -0
- package/dist/cli/lib/engine.js +112 -0
- package/dist/cli/lib/engine.js.map +1 -0
- package/dist/cli/lib/identity-cards.d.ts +188 -0
- package/dist/cli/lib/identity-cards.d.ts.map +1 -0
- package/dist/cli/lib/identity-cards.js +261 -0
- package/dist/cli/lib/identity-cards.js.map +1 -0
- package/dist/cli/lib/matrix-account.d.ts +79 -0
- package/dist/cli/lib/matrix-account.d.ts.map +1 -0
- package/dist/cli/lib/matrix-account.js +228 -0
- package/dist/cli/lib/matrix-account.js.map +1 -0
- package/dist/cli/lib/oracle-account.d.ts +108 -0
- package/dist/cli/lib/oracle-account.d.ts.map +1 -0
- package/dist/cli/lib/oracle-account.js +207 -0
- package/dist/cli/lib/oracle-account.js.map +1 -0
- package/dist/cli/lib/project.d.ts +22 -0
- package/dist/cli/lib/project.d.ts.map +1 -0
- package/dist/cli/lib/project.js +62 -0
- package/dist/cli/lib/project.js.map +1 -0
- package/dist/cli/lib/session.d.ts +109 -0
- package/dist/cli/lib/session.d.ts.map +1 -0
- package/dist/cli/lib/session.js +354 -0
- package/dist/cli/lib/session.js.map +1 -0
- package/dist/cli/lib/workorder.d.ts +57 -0
- package/dist/cli/lib/workorder.d.ts.map +1 -0
- package/dist/cli/lib/workorder.js +101 -0
- package/dist/cli/lib/workorder.js.map +1 -0
- package/dist/config.d.ts +221 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +431 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +88 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +9 -0
- package/dist/context.js.map +1 -0
- package/dist/contracts/api.d.ts +3367 -0
- package/dist/contracts/api.d.ts.map +1 -0
- package/dist/contracts/api.js +1303 -0
- package/dist/contracts/api.js.map +1 -0
- package/dist/contracts/capabilities.d.ts +126 -0
- package/dist/contracts/capabilities.d.ts.map +1 -0
- package/dist/contracts/capabilities.js +164 -0
- package/dist/contracts/capabilities.js.map +1 -0
- package/dist/contracts/claim-source.d.ts +98 -0
- package/dist/contracts/claim-source.d.ts.map +1 -0
- package/dist/contracts/claim-source.js +17 -0
- package/dist/contracts/claim-source.js.map +1 -0
- package/dist/contracts/errors.d.ts +150 -0
- package/dist/contracts/errors.d.ts.map +1 -0
- package/dist/contracts/errors.js +121 -0
- package/dist/contracts/errors.js.map +1 -0
- package/dist/contracts/index.d.ts +15 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +11 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/payment-gate.d.ts +129 -0
- package/dist/contracts/payment-gate.d.ts.map +1 -0
- package/dist/contracts/payment-gate.js +24 -0
- package/dist/contracts/payment-gate.js.map +1 -0
- package/dist/contracts/start-api-claim.d.ts +90 -0
- package/dist/contracts/start-api-claim.d.ts.map +1 -0
- package/dist/contracts/start-api-claim.js +22 -0
- package/dist/contracts/start-api-claim.js.map +1 -0
- package/dist/contracts/webhooks.d.ts +1487 -0
- package/dist/contracts/webhooks.d.ts.map +1 -0
- package/dist/contracts/webhooks.js +71 -0
- package/dist/contracts/webhooks.js.map +1 -0
- package/dist/contracts/work-order.d.ts +29 -0
- package/dist/contracts/work-order.d.ts.map +1 -0
- package/dist/contracts/work-order.js +12 -0
- package/dist/contracts/work-order.js.map +1 -0
- package/dist/cron/ai-cost.d.ts +29 -0
- package/dist/cron/ai-cost.d.ts.map +1 -0
- package/dist/cron/ai-cost.js +80 -0
- package/dist/cron/ai-cost.js.map +1 -0
- package/dist/cron/api-lane.d.ts +39 -0
- package/dist/cron/api-lane.d.ts.map +1 -0
- package/dist/cron/api-lane.js +203 -0
- package/dist/cron/api-lane.js.map +1 -0
- package/dist/cron/backlog.d.ts +50 -0
- package/dist/cron/backlog.d.ts.map +1 -0
- package/dist/cron/backlog.js +115 -0
- package/dist/cron/backlog.js.map +1 -0
- package/dist/cron/billing.d.ts +11 -0
- package/dist/cron/billing.d.ts.map +1 -0
- package/dist/cron/billing.js +69 -0
- package/dist/cron/billing.js.map +1 -0
- package/dist/cron/collection.d.ts +50 -0
- package/dist/cron/collection.d.ts.map +1 -0
- package/dist/cron/collection.js +118 -0
- package/dist/cron/collection.js.map +1 -0
- package/dist/cron/funding.d.ts +16 -0
- package/dist/cron/funding.d.ts.map +1 -0
- package/dist/cron/funding.js +262 -0
- package/dist/cron/funding.js.map +1 -0
- package/dist/cron/payer-billing.d.ts +38 -0
- package/dist/cron/payer-billing.d.ts.map +1 -0
- package/dist/cron/payer-billing.js +119 -0
- package/dist/cron/payer-billing.js.map +1 -0
- package/dist/cron/scan.d.ts +43 -0
- package/dist/cron/scan.d.ts.map +1 -0
- package/dist/cron/scan.js +250 -0
- package/dist/cron/scan.js.map +1 -0
- package/dist/db/client.d.ts +14 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +14 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +6738 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +1433 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/define-oracle.d.ts +32 -0
- package/dist/define-oracle.d.ts.map +1 -0
- package/dist/define-oracle.js +80 -0
- package/dist/define-oracle.js.map +1 -0
- package/dist/dev-oracle.d.ts +9 -0
- package/dist/dev-oracle.d.ts.map +1 -0
- package/dist/dev-oracle.js +19 -0
- package/dist/dev-oracle.js.map +1 -0
- package/dist/dev-worker.d.ts +10 -0
- package/dist/dev-worker.d.ts.map +1 -0
- package/dist/dev-worker.js +12 -0
- package/dist/dev-worker.js.map +1 -0
- package/dist/env.d.ts +146 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +10 -0
- package/dist/env.js.map +1 -0
- package/dist/facts/exif.d.ts +43 -0
- package/dist/facts/exif.d.ts.map +1 -0
- package/dist/facts/exif.js +224 -0
- package/dist/facts/exif.js.map +1 -0
- package/dist/facts/fact.d.ts +62 -0
- package/dist/facts/fact.d.ts.map +1 -0
- package/dist/facts/fact.js +105 -0
- package/dist/facts/fact.js.map +1 -0
- package/dist/facts/geo.d.ts +55 -0
- package/dist/facts/geo.d.ts.map +1 -0
- package/dist/facts/geo.js +267 -0
- package/dist/facts/geo.js.map +1 -0
- package/dist/facts/index.d.ts +31 -0
- package/dist/facts/index.d.ts.map +1 -0
- package/dist/facts/index.js +27 -0
- package/dist/facts/index.js.map +1 -0
- package/dist/facts/linked-doc.d.ts +60 -0
- package/dist/facts/linked-doc.d.ts.map +1 -0
- package/dist/facts/linked-doc.js +101 -0
- package/dist/facts/linked-doc.js.map +1 -0
- package/dist/facts/types.d.ts +278 -0
- package/dist/facts/types.d.ts.map +1 -0
- package/dist/facts/types.js +19 -0
- package/dist/facts/types.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-lane/accept.d.ts +29 -0
- package/dist/lib/api-lane/accept.d.ts.map +1 -0
- package/dist/lib/api-lane/accept.js +218 -0
- package/dist/lib/api-lane/accept.js.map +1 -0
- package/dist/lib/api-lane/claim-list.d.ts +44 -0
- package/dist/lib/api-lane/claim-list.d.ts.map +1 -0
- package/dist/lib/api-lane/claim-list.js +92 -0
- package/dist/lib/api-lane/claim-list.js.map +1 -0
- package/dist/lib/api-lane/company.d.ts +56 -0
- package/dist/lib/api-lane/company.d.ts.map +1 -0
- package/dist/lib/api-lane/company.js +103 -0
- package/dist/lib/api-lane/company.js.map +1 -0
- package/dist/lib/api-lane/events.d.ts +21 -0
- package/dist/lib/api-lane/events.d.ts.map +1 -0
- package/dist/lib/api-lane/events.js +111 -0
- package/dist/lib/api-lane/events.js.map +1 -0
- package/dist/lib/api-lane/ids.d.ts +39 -0
- package/dist/lib/api-lane/ids.d.ts.map +1 -0
- package/dist/lib/api-lane/ids.js +78 -0
- package/dist/lib/api-lane/ids.js.map +1 -0
- package/dist/lib/api-lane/index.d.ts +16 -0
- package/dist/lib/api-lane/index.d.ts.map +1 -0
- package/dist/lib/api-lane/index.js +16 -0
- package/dist/lib/api-lane/index.js.map +1 -0
- package/dist/lib/api-lane/linked.d.ts +264 -0
- package/dist/lib/api-lane/linked.d.ts.map +1 -0
- package/dist/lib/api-lane/linked.js +272 -0
- package/dist/lib/api-lane/linked.js.map +1 -0
- package/dist/lib/api-lane/media-type.d.ts +15 -0
- package/dist/lib/api-lane/media-type.d.ts.map +1 -0
- package/dist/lib/api-lane/media-type.js +73 -0
- package/dist/lib/api-lane/media-type.js.map +1 -0
- package/dist/lib/api-lane/member-emails.d.ts +83 -0
- package/dist/lib/api-lane/member-emails.d.ts.map +1 -0
- package/dist/lib/api-lane/member-emails.js +213 -0
- package/dist/lib/api-lane/member-emails.js.map +1 -0
- package/dist/lib/api-lane/members.d.ts +42 -0
- package/dist/lib/api-lane/members.d.ts.map +1 -0
- package/dist/lib/api-lane/members.js +75 -0
- package/dist/lib/api-lane/members.js.map +1 -0
- package/dist/lib/api-lane/notify.d.ts +47 -0
- package/dist/lib/api-lane/notify.d.ts.map +1 -0
- package/dist/lib/api-lane/notify.js +240 -0
- package/dist/lib/api-lane/notify.js.map +1 -0
- package/dist/lib/api-lane/pause.d.ts +41 -0
- package/dist/lib/api-lane/pause.d.ts.map +1 -0
- package/dist/lib/api-lane/pause.js +155 -0
- package/dist/lib/api-lane/pause.js.map +1 -0
- package/dist/lib/api-lane/record.d.ts +76 -0
- package/dist/lib/api-lane/record.d.ts.map +1 -0
- package/dist/lib/api-lane/record.js +337 -0
- package/dist/lib/api-lane/record.js.map +1 -0
- package/dist/lib/api-lane/retention.d.ts +43 -0
- package/dist/lib/api-lane/retention.d.ts.map +1 -0
- package/dist/lib/api-lane/retention.js +176 -0
- package/dist/lib/api-lane/retention.js.map +1 -0
- package/dist/lib/api-lane/review.d.ts +76 -0
- package/dist/lib/api-lane/review.d.ts.map +1 -0
- package/dist/lib/api-lane/review.js +355 -0
- package/dist/lib/api-lane/review.js.map +1 -0
- package/dist/lib/api-lane/reviewers.d.ts +109 -0
- package/dist/lib/api-lane/reviewers.d.ts.map +1 -0
- package/dist/lib/api-lane/reviewers.js +755 -0
- package/dist/lib/api-lane/reviewers.js.map +1 -0
- package/dist/lib/api-lane/source-delete.d.ts +16 -0
- package/dist/lib/api-lane/source-delete.d.ts.map +1 -0
- package/dist/lib/api-lane/source-delete.js +50 -0
- package/dist/lib/api-lane/source-delete.js.map +1 -0
- package/dist/lib/api-lane/source.d.ts +19 -0
- package/dist/lib/api-lane/source.d.ts.map +1 -0
- package/dist/lib/api-lane/source.js +226 -0
- package/dist/lib/api-lane/source.js.map +1 -0
- package/dist/lib/api-lane/submitter.d.ts +22 -0
- package/dist/lib/api-lane/submitter.d.ts.map +1 -0
- package/dist/lib/api-lane/submitter.js +34 -0
- package/dist/lib/api-lane/submitter.js.map +1 -0
- package/dist/lib/api-lane/timeline.d.ts +20 -0
- package/dist/lib/api-lane/timeline.d.ts.map +1 -0
- package/dist/lib/api-lane/timeline.js +23 -0
- package/dist/lib/api-lane/timeline.js.map +1 -0
- package/dist/lib/api-lane/webhook-crypto.d.ts +44 -0
- package/dist/lib/api-lane/webhook-crypto.d.ts.map +1 -0
- package/dist/lib/api-lane/webhook-crypto.js +103 -0
- package/dist/lib/api-lane/webhook-crypto.js.map +1 -0
- package/dist/lib/api-lane/webhooks.d.ts +117 -0
- package/dist/lib/api-lane/webhooks.d.ts.map +1 -0
- package/dist/lib/api-lane/webhooks.js +503 -0
- package/dist/lib/api-lane/webhooks.js.map +1 -0
- package/dist/lib/archive.d.ts +64 -0
- package/dist/lib/archive.d.ts.map +1 -0
- package/dist/lib/archive.js +305 -0
- package/dist/lib/archive.js.map +1 -0
- package/dist/lib/bech32.d.ts +8 -0
- package/dist/lib/bech32.d.ts.map +1 -0
- package/dist/lib/bech32.js +39 -0
- package/dist/lib/bech32.js.map +1 -0
- package/dist/lib/claim-erase.d.ts +22 -0
- package/dist/lib/claim-erase.d.ts.map +1 -0
- package/dist/lib/claim-erase.js +44 -0
- package/dist/lib/claim-erase.js.map +1 -0
- package/dist/lib/cursor.d.ts +11 -0
- package/dist/lib/cursor.d.ts.map +1 -0
- package/dist/lib/cursor.js +20 -0
- package/dist/lib/cursor.js.map +1 -0
- package/dist/lib/email/send.d.ts +43 -0
- package/dist/lib/email/send.d.ts.map +1 -0
- package/dist/lib/email/send.js +71 -0
- package/dist/lib/email/send.js.map +1 -0
- package/dist/lib/email/template.d.ts +217 -0
- package/dist/lib/email/template.d.ts.map +1 -0
- package/dist/lib/email/template.js +713 -0
- package/dist/lib/email/template.js.map +1 -0
- package/dist/lib/engine/adr36.d.ts +56 -0
- package/dist/lib/engine/adr36.d.ts.map +1 -0
- package/dist/lib/engine/adr36.js +76 -0
- package/dist/lib/engine/adr36.js.map +1 -0
- package/dist/lib/engine/client.d.ts +162 -0
- package/dist/lib/engine/client.d.ts.map +1 -0
- package/dist/lib/engine/client.js +473 -0
- package/dist/lib/engine/client.js.map +1 -0
- package/dist/lib/engine/types.d.ts +1356 -0
- package/dist/lib/engine/types.d.ts.map +1 -0
- package/dist/lib/engine/types.js +562 -0
- package/dist/lib/engine/types.js.map +1 -0
- package/dist/lib/errors.d.ts +73 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +96 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/facts/builder.d.ts +88 -0
- package/dist/lib/facts/builder.d.ts.map +1 -0
- package/dist/lib/facts/builder.js +239 -0
- package/dist/lib/facts/builder.js.map +1 -0
- package/dist/lib/facts/ctx.d.ts +34 -0
- package/dist/lib/facts/ctx.d.ts.map +1 -0
- package/dist/lib/facts/ctx.js +51 -0
- package/dist/lib/facts/ctx.js.map +1 -0
- package/dist/lib/facts/expected.d.ts +23 -0
- package/dist/lib/facts/expected.d.ts.map +1 -0
- package/dist/lib/facts/expected.js +16 -0
- package/dist/lib/facts/expected.js.map +1 -0
- package/dist/lib/facts/fact-cache.d.ts +469 -0
- package/dist/lib/facts/fact-cache.d.ts.map +1 -0
- package/dist/lib/facts/fact-cache.js +52 -0
- package/dist/lib/facts/fact-cache.js.map +1 -0
- package/dist/lib/facts/factset.d.ts +608 -0
- package/dist/lib/facts/factset.d.ts.map +1 -0
- package/dist/lib/facts/factset.js +226 -0
- package/dist/lib/facts/factset.js.map +1 -0
- package/dist/lib/facts/producer.d.ts +190 -0
- package/dist/lib/facts/producer.d.ts.map +1 -0
- package/dist/lib/facts/producer.js +15 -0
- package/dist/lib/facts/producer.js.map +1 -0
- package/dist/lib/facts/runner.d.ts +111 -0
- package/dist/lib/facts/runner.d.ts.map +1 -0
- package/dist/lib/facts/runner.js +438 -0
- package/dist/lib/facts/runner.js.map +1 -0
- package/dist/lib/facts/stock/ai-check.d.ts +100 -0
- package/dist/lib/facts/stock/ai-check.d.ts.map +1 -0
- package/dist/lib/facts/stock/ai-check.js +526 -0
- package/dist/lib/facts/stock/ai-check.js.map +1 -0
- package/dist/lib/facts/stock/ai-inputs.d.ts +104 -0
- package/dist/lib/facts/stock/ai-inputs.d.ts.map +1 -0
- package/dist/lib/facts/stock/ai-inputs.js +332 -0
- package/dist/lib/facts/stock/ai-inputs.js.map +1 -0
- package/dist/lib/facts/stock/ai-provider.d.ts +105 -0
- package/dist/lib/facts/stock/ai-provider.d.ts.map +1 -0
- package/dist/lib/facts/stock/ai-provider.js +250 -0
- package/dist/lib/facts/stock/ai-provider.js.map +1 -0
- package/dist/lib/facts/stock/ai-unique.d.ts +85 -0
- package/dist/lib/facts/stock/ai-unique.d.ts.map +1 -0
- package/dist/lib/facts/stock/ai-unique.js +208 -0
- package/dist/lib/facts/stock/ai-unique.js.map +1 -0
- package/dist/lib/facts/stock/archive.d.ts +63 -0
- package/dist/lib/facts/stock/archive.d.ts.map +1 -0
- package/dist/lib/facts/stock/archive.js +349 -0
- package/dist/lib/facts/stock/archive.js.map +1 -0
- package/dist/lib/facts/stock/c2pa-trust-list.d.ts +16 -0
- package/dist/lib/facts/stock/c2pa-trust-list.d.ts.map +1 -0
- package/dist/lib/facts/stock/c2pa-trust-list.js +637 -0
- package/dist/lib/facts/stock/c2pa-trust-list.js.map +1 -0
- package/dist/lib/facts/stock/c2pa.d.ts +56 -0
- package/dist/lib/facts/stock/c2pa.d.ts.map +1 -0
- package/dist/lib/facts/stock/c2pa.js +234 -0
- package/dist/lib/facts/stock/c2pa.js.map +1 -0
- package/dist/lib/facts/stock/call.d.ts +91 -0
- package/dist/lib/facts/stock/call.d.ts.map +1 -0
- package/dist/lib/facts/stock/call.js +281 -0
- package/dist/lib/facts/stock/call.js.map +1 -0
- package/dist/lib/facts/stock/capability.d.ts +39 -0
- package/dist/lib/facts/stock/capability.d.ts.map +1 -0
- package/dist/lib/facts/stock/capability.js +59 -0
- package/dist/lib/facts/stock/capability.js.map +1 -0
- package/dist/lib/facts/stock/ext-source.d.ts +51 -0
- package/dist/lib/facts/stock/ext-source.d.ts.map +1 -0
- package/dist/lib/facts/stock/ext-source.js +201 -0
- package/dist/lib/facts/stock/ext-source.js.map +1 -0
- package/dist/lib/facts/stock/frequency-fact.d.ts +59 -0
- package/dist/lib/facts/stock/frequency-fact.d.ts.map +1 -0
- package/dist/lib/facts/stock/frequency-fact.js +86 -0
- package/dist/lib/facts/stock/frequency-fact.js.map +1 -0
- package/dist/lib/facts/stock/frequency.d.ts +32 -0
- package/dist/lib/facts/stock/frequency.d.ts.map +1 -0
- package/dist/lib/facts/stock/frequency.js +48 -0
- package/dist/lib/facts/stock/frequency.js.map +1 -0
- package/dist/lib/facts/stock/index.d.ts +27 -0
- package/dist/lib/facts/stock/index.d.ts.map +1 -0
- package/dist/lib/facts/stock/index.js +28 -0
- package/dist/lib/facts/stock/index.js.map +1 -0
- package/dist/lib/facts/stock/normalize.d.ts +45 -0
- package/dist/lib/facts/stock/normalize.d.ts.map +1 -0
- package/dist/lib/facts/stock/normalize.js +135 -0
- package/dist/lib/facts/stock/normalize.js.map +1 -0
- package/dist/lib/facts/stock/phash.d.ts +55 -0
- package/dist/lib/facts/stock/phash.d.ts.map +1 -0
- package/dist/lib/facts/stock/phash.js +256 -0
- package/dist/lib/facts/stock/phash.js.map +1 -0
- package/dist/lib/facts/stock/rule-defaults.d.ts +72 -0
- package/dist/lib/facts/stock/rule-defaults.d.ts.map +1 -0
- package/dist/lib/facts/stock/rule-defaults.js +55 -0
- package/dist/lib/facts/stock/rule-defaults.js.map +1 -0
- package/dist/lib/facts/stock/send.d.ts +52 -0
- package/dist/lib/facts/stock/send.d.ts.map +1 -0
- package/dist/lib/facts/stock/send.js +148 -0
- package/dist/lib/facts/stock/send.js.map +1 -0
- package/dist/lib/facts/stock/unique-score.d.ts +138 -0
- package/dist/lib/facts/stock/unique-score.d.ts.map +1 -0
- package/dist/lib/facts/stock/unique-score.js +257 -0
- package/dist/lib/facts/stock/unique-score.js.map +1 -0
- package/dist/lib/facts/stock/unique-store.d.ts +420 -0
- package/dist/lib/facts/stock/unique-store.d.ts.map +1 -0
- package/dist/lib/facts/stock/unique-store.js +328 -0
- package/dist/lib/facts/stock/unique-store.js.map +1 -0
- package/dist/lib/facts/stock/unique.d.ts +35 -0
- package/dist/lib/facts/stock/unique.d.ts.map +1 -0
- package/dist/lib/facts/stock/unique.js +327 -0
- package/dist/lib/facts/stock/unique.js.map +1 -0
- package/dist/lib/facts/tools.d.ts +57 -0
- package/dist/lib/facts/tools.d.ts.map +1 -0
- package/dist/lib/facts/tools.js +325 -0
- package/dist/lib/facts/tools.js.map +1 -0
- package/dist/lib/facts/validate.d.ts +33 -0
- package/dist/lib/facts/validate.d.ts.map +1 -0
- package/dist/lib/facts/validate.js +137 -0
- package/dist/lib/facts/validate.js.map +1 -0
- package/dist/lib/hash.d.ts +44 -0
- package/dist/lib/hash.d.ts.map +1 -0
- package/dist/lib/hash.js +80 -0
- package/dist/lib/hash.js.map +1 -0
- package/dist/lib/http/client.d.ts +113 -0
- package/dist/lib/http/client.d.ts.map +1 -0
- package/dist/lib/http/client.js +330 -0
- package/dist/lib/http/client.js.map +1 -0
- package/dist/lib/ids.d.ts +17 -0
- package/dist/lib/ids.d.ts.map +1 -0
- package/dist/lib/ids.js +26 -0
- package/dist/lib/ids.js.map +1 -0
- package/dist/lib/ixo/attachments.d.ts +116 -0
- package/dist/lib/ixo/attachments.d.ts.map +1 -0
- package/dist/lib/ixo/attachments.js +290 -0
- package/dist/lib/ixo/attachments.js.map +1 -0
- package/dist/lib/ixo/authz.d.ts +40 -0
- package/dist/lib/ixo/authz.d.ts.map +1 -0
- package/dist/lib/ixo/authz.js +113 -0
- package/dist/lib/ixo/authz.js.map +1 -0
- package/dist/lib/ixo/blocksync/index.d.ts +90 -0
- package/dist/lib/ixo/blocksync/index.d.ts.map +1 -0
- package/dist/lib/ixo/blocksync/index.js +251 -0
- package/dist/lib/ixo/blocksync/index.js.map +1 -0
- package/dist/lib/ixo/blocksync/queries.d.ts +15 -0
- package/dist/lib/ixo/blocksync/queries.d.ts.map +1 -0
- package/dist/lib/ixo/blocksync/queries.js +144 -0
- package/dist/lib/ixo/blocksync/queries.js.map +1 -0
- package/dist/lib/ixo/blocksync/types.d.ts +184 -0
- package/dist/lib/ixo/blocksync/types.d.ts.map +1 -0
- package/dist/lib/ixo/blocksync/types.js +108 -0
- package/dist/lib/ixo/blocksync/types.js.map +1 -0
- package/dist/lib/ixo/cellnode.d.ts +35 -0
- package/dist/lib/ixo/cellnode.d.ts.map +1 -0
- package/dist/lib/ixo/cellnode.js +43 -0
- package/dist/lib/ixo/cellnode.js.map +1 -0
- package/dist/lib/ixo/chain-write.d.ts +130 -0
- package/dist/lib/ixo/chain-write.d.ts.map +1 -0
- package/dist/lib/ixo/chain-write.js +460 -0
- package/dist/lib/ixo/chain-write.js.map +1 -0
- package/dist/lib/ixo/chain.d.ts +1046 -0
- package/dist/lib/ixo/chain.d.ts.map +1 -0
- package/dist/lib/ixo/chain.js +279 -0
- package/dist/lib/ixo/chain.js.map +1 -0
- package/dist/lib/ixo/claim-bot.d.ts +49 -0
- package/dist/lib/ixo/claim-bot.d.ts.map +1 -0
- package/dist/lib/ixo/claim-bot.js +141 -0
- package/dist/lib/ixo/claim-bot.js.map +1 -0
- package/dist/lib/ixo/delegation-verify.d.ts +44 -0
- package/dist/lib/ixo/delegation-verify.d.ts.map +1 -0
- package/dist/lib/ixo/delegation-verify.js +101 -0
- package/dist/lib/ixo/delegation-verify.js.map +1 -0
- package/dist/lib/ixo/did.d.ts +13 -0
- package/dist/lib/ixo/did.d.ts.map +1 -0
- package/dist/lib/ixo/did.js +85 -0
- package/dist/lib/ixo/did.js.map +1 -0
- package/dist/lib/ixo/grant-chain.d.ts +55 -0
- package/dist/lib/ixo/grant-chain.d.ts.map +1 -0
- package/dist/lib/ixo/grant-chain.js +185 -0
- package/dist/lib/ixo/grant-chain.js.map +1 -0
- package/dist/lib/ixo/identity.d.ts +32 -0
- package/dist/lib/ixo/identity.d.ts.map +1 -0
- package/dist/lib/ixo/identity.js +104 -0
- package/dist/lib/ixo/identity.js.map +1 -0
- package/dist/lib/ixo/index.d.ts +118 -0
- package/dist/lib/ixo/index.d.ts.map +1 -0
- package/dist/lib/ixo/index.js +395 -0
- package/dist/lib/ixo/index.js.map +1 -0
- package/dist/lib/ixo/payment.d.ts +104 -0
- package/dist/lib/ixo/payment.d.ts.map +1 -0
- package/dist/lib/ixo/payment.js +136 -0
- package/dist/lib/ixo/payment.js.map +1 -0
- package/dist/lib/ixo/ucan-store.d.ts +30 -0
- package/dist/lib/ixo/ucan-store.d.ts.map +1 -0
- package/dist/lib/ixo/ucan-store.js +134 -0
- package/dist/lib/ixo/ucan-store.js.map +1 -0
- package/dist/lib/ixo/ucan.d.ts +96 -0
- package/dist/lib/ixo/ucan.d.ts.map +1 -0
- package/dist/lib/ixo/ucan.js +216 -0
- package/dist/lib/ixo/ucan.js.map +1 -0
- package/dist/lib/ixo/verified-read.d.ts +43 -0
- package/dist/lib/ixo/verified-read.d.ts.map +1 -0
- package/dist/lib/ixo/verified-read.js +73 -0
- package/dist/lib/ixo/verified-read.js.map +1 -0
- package/dist/lib/ixo/vfs.d.ts +27 -0
- package/dist/lib/ixo/vfs.d.ts.map +1 -0
- package/dist/lib/ixo/vfs.js +42 -0
- package/dist/lib/ixo/vfs.js.map +1 -0
- package/dist/lib/ixo/web-did.d.ts +7 -0
- package/dist/lib/ixo/web-did.d.ts.map +1 -0
- package/dist/lib/ixo/web-did.js +9 -0
- package/dist/lib/ixo/web-did.js.map +1 -0
- package/dist/lib/logger.d.ts +34 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +126 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/matrix/api.d.ts +57 -0
- package/dist/lib/matrix/api.d.ts.map +1 -0
- package/dist/lib/matrix/api.js +58 -0
- package/dist/lib/matrix/api.js.map +1 -0
- package/dist/lib/matrix/client.d.ts +41 -0
- package/dist/lib/matrix/client.d.ts.map +1 -0
- package/dist/lib/matrix/client.js +104 -0
- package/dist/lib/matrix/client.js.map +1 -0
- package/dist/lib/matrix/deliver.d.ts +224 -0
- package/dist/lib/matrix/deliver.d.ts.map +1 -0
- package/dist/lib/matrix/deliver.js +788 -0
- package/dist/lib/matrix/deliver.js.map +1 -0
- package/dist/lib/matrix/events.d.ts +114 -0
- package/dist/lib/matrix/events.d.ts.map +1 -0
- package/dist/lib/matrix/events.js +143 -0
- package/dist/lib/matrix/events.js.map +1 -0
- package/dist/lib/matrix/mxid.d.ts +24 -0
- package/dist/lib/matrix/mxid.d.ts.map +1 -0
- package/dist/lib/matrix/mxid.js +47 -0
- package/dist/lib/matrix/mxid.js.map +1 -0
- package/dist/lib/metrics.d.ts +105 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +204 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/oauth/approvals.d.ts +160 -0
- package/dist/lib/oauth/approvals.d.ts.map +1 -0
- package/dist/lib/oauth/approvals.js +273 -0
- package/dist/lib/oauth/approvals.js.map +1 -0
- package/dist/lib/oauth/standing.d.ts +152 -0
- package/dist/lib/oauth/standing.d.ts.map +1 -0
- package/dist/lib/oauth/standing.js +299 -0
- package/dist/lib/oauth/standing.js.map +1 -0
- package/dist/lib/oauth/token.d.ts +60 -0
- package/dist/lib/oauth/token.d.ts.map +1 -0
- package/dist/lib/oauth/token.js +129 -0
- package/dist/lib/oauth/token.js.map +1 -0
- package/dist/lib/payments/extend.d.ts +42 -0
- package/dist/lib/payments/extend.d.ts.map +1 -0
- package/dist/lib/payments/extend.js +98 -0
- package/dist/lib/payments/extend.js.map +1 -0
- package/dist/lib/payments/facilitator.d.ts +220 -0
- package/dist/lib/payments/facilitator.d.ts.map +1 -0
- package/dist/lib/payments/facilitator.js +451 -0
- package/dist/lib/payments/facilitator.js.map +1 -0
- package/dist/lib/payments/gate.d.ts +207 -0
- package/dist/lib/payments/gate.d.ts.map +1 -0
- package/dist/lib/payments/gate.js +481 -0
- package/dist/lib/payments/gate.js.map +1 -0
- package/dist/lib/payments/header-seal.d.ts +33 -0
- package/dist/lib/payments/header-seal.d.ts.map +1 -0
- package/dist/lib/payments/header-seal.js +76 -0
- package/dist/lib/payments/header-seal.js.map +1 -0
- package/dist/lib/payments/index.d.ts +12 -0
- package/dist/lib/payments/index.d.ts.map +1 -0
- package/dist/lib/payments/index.js +11 -0
- package/dist/lib/payments/index.js.map +1 -0
- package/dist/lib/payments/price.d.ts +25 -0
- package/dist/lib/payments/price.d.ts.map +1 -0
- package/dist/lib/payments/price.js +43 -0
- package/dist/lib/payments/price.js.map +1 -0
- package/dist/lib/payments/reconcile.d.ts +77 -0
- package/dist/lib/payments/reconcile.d.ts.map +1 -0
- package/dist/lib/payments/reconcile.js +317 -0
- package/dist/lib/payments/reconcile.js.map +1 -0
- package/dist/lib/payments/refund.d.ts +34 -0
- package/dist/lib/payments/refund.d.ts.map +1 -0
- package/dist/lib/payments/refund.js +123 -0
- package/dist/lib/payments/refund.js.map +1 -0
- package/dist/lib/payments/review-billing.d.ts +222 -0
- package/dist/lib/payments/review-billing.d.ts.map +1 -0
- package/dist/lib/payments/review-billing.js +609 -0
- package/dist/lib/payments/review-billing.js.map +1 -0
- package/dist/lib/payments/settle.d.ts +44 -0
- package/dist/lib/payments/settle.d.ts.map +1 -0
- package/dist/lib/payments/settle.js +306 -0
- package/dist/lib/payments/settle.js.map +1 -0
- package/dist/lib/payments/terms.d.ts +27 -0
- package/dist/lib/payments/terms.d.ts.map +1 -0
- package/dist/lib/payments/terms.js +21 -0
- package/dist/lib/payments/terms.js.map +1 -0
- package/dist/lib/payouts.d.ts +20 -0
- package/dist/lib/payouts.d.ts.map +1 -0
- package/dist/lib/payouts.js +30 -0
- package/dist/lib/payouts.js.map +1 -0
- package/dist/lib/readiness.d.ts +42 -0
- package/dist/lib/readiness.d.ts.map +1 -0
- package/dist/lib/readiness.js +130 -0
- package/dist/lib/readiness.js.map +1 -0
- package/dist/lib/redact.d.ts +23 -0
- package/dist/lib/redact.d.ts.map +1 -0
- package/dist/lib/redact.js +67 -0
- package/dist/lib/redact.js.map +1 -0
- package/dist/lib/register.d.ts +85 -0
- package/dist/lib/register.d.ts.map +1 -0
- package/dist/lib/register.js +390 -0
- package/dist/lib/register.js.map +1 -0
- package/dist/lib/review/attestation.d.ts +92 -0
- package/dist/lib/review/attestation.d.ts.map +1 -0
- package/dist/lib/review/attestation.js +264 -0
- package/dist/lib/review/attestation.js.map +1 -0
- package/dist/lib/review/reviewer-grant.d.ts +146 -0
- package/dist/lib/review/reviewer-grant.d.ts.map +1 -0
- package/dist/lib/review/reviewer-grant.js +359 -0
- package/dist/lib/review/reviewer-grant.js.map +1 -0
- package/dist/lib/review/tasks.d.ts +18 -0
- package/dist/lib/review/tasks.d.ts.map +1 -0
- package/dist/lib/review/tasks.js +36 -0
- package/dist/lib/review/tasks.js.map +1 -0
- package/dist/lib/sentry.d.ts +89 -0
- package/dist/lib/sentry.d.ts.map +1 -0
- package/dist/lib/sentry.js +284 -0
- package/dist/lib/sentry.js.map +1 -0
- package/dist/lib/spans.d.ts +14 -0
- package/dist/lib/spans.d.ts.map +1 -0
- package/dist/lib/spans.js +28 -0
- package/dist/lib/spans.js.map +1 -0
- package/dist/lib/tracing.d.ts +31 -0
- package/dist/lib/tracing.d.ts.map +1 -0
- package/dist/lib/tracing.js +66 -0
- package/dist/lib/tracing.js.map +1 -0
- package/dist/lib/ttl-cache.d.ts +26 -0
- package/dist/lib/ttl-cache.d.ts.map +1 -0
- package/dist/lib/ttl-cache.js +61 -0
- package/dist/lib/ttl-cache.js.map +1 -0
- package/dist/lib/validator.d.ts +19 -0
- package/dist/lib/validator.d.ts.map +1 -0
- package/dist/lib/validator.js +32 -0
- package/dist/lib/validator.js.map +1 -0
- package/dist/lib/work-order/form.d.ts +40 -0
- package/dist/lib/work-order/form.d.ts.map +1 -0
- package/dist/lib/work-order/form.js +316 -0
- package/dist/lib/work-order/form.js.map +1 -0
- package/dist/lib/work-order/index.d.ts +20 -0
- package/dist/lib/work-order/index.d.ts.map +1 -0
- package/dist/lib/work-order/index.js +66 -0
- package/dist/lib/work-order/index.js.map +1 -0
- package/dist/middleware/api/audit.d.ts +9 -0
- package/dist/middleware/api/audit.d.ts.map +1 -0
- package/dist/middleware/api/audit.js +38 -0
- package/dist/middleware/api/audit.js.map +1 -0
- package/dist/middleware/api/auth.d.ts +29 -0
- package/dist/middleware/api/auth.d.ts.map +1 -0
- package/dist/middleware/api/auth.js +105 -0
- package/dist/middleware/api/auth.js.map +1 -0
- package/dist/middleware/api/console.d.ts +92 -0
- package/dist/middleware/api/console.d.ts.map +1 -0
- package/dist/middleware/api/console.js +446 -0
- package/dist/middleware/api/console.js.map +1 -0
- package/dist/middleware/api/errors.d.ts +48 -0
- package/dist/middleware/api/errors.d.ts.map +1 -0
- package/dist/middleware/api/errors.js +133 -0
- package/dist/middleware/api/errors.js.map +1 -0
- package/dist/middleware/api/idempotency.d.ts +23 -0
- package/dist/middleware/api/idempotency.d.ts.map +1 -0
- package/dist/middleware/api/idempotency.js +158 -0
- package/dist/middleware/api/idempotency.js.map +1 -0
- package/dist/middleware/api/keys.d.ts +14 -0
- package/dist/middleware/api/keys.d.ts.map +1 -0
- package/dist/middleware/api/keys.js +66 -0
- package/dist/middleware/api/keys.js.map +1 -0
- package/dist/middleware/api/membership.d.ts +32 -0
- package/dist/middleware/api/membership.d.ts.map +1 -0
- package/dist/middleware/api/membership.js +48 -0
- package/dist/middleware/api/membership.js.map +1 -0
- package/dist/middleware/api/oauth.d.ts +28 -0
- package/dist/middleware/api/oauth.d.ts.map +1 -0
- package/dist/middleware/api/oauth.js +109 -0
- package/dist/middleware/api/oauth.js.map +1 -0
- package/dist/middleware/api/rate-limit.d.ts +23 -0
- package/dist/middleware/api/rate-limit.d.ts.map +1 -0
- package/dist/middleware/api/rate-limit.js +70 -0
- package/dist/middleware/api/rate-limit.js.map +1 -0
- package/dist/middleware/api/types.d.ts +92 -0
- package/dist/middleware/api/types.d.ts.map +1 -0
- package/dist/middleware/api/types.js +7 -0
- package/dist/middleware/api/types.js.map +1 -0
- package/dist/middleware/api/wait.d.ts +21 -0
- package/dist/middleware/api/wait.d.ts.map +1 -0
- package/dist/middleware/api/wait.js +85 -0
- package/dist/middleware/api/wait.js.map +1 -0
- package/dist/middleware/capability.d.ts +32 -0
- package/dist/middleware/capability.d.ts.map +1 -0
- package/dist/middleware/capability.js +113 -0
- package/dist/middleware/capability.js.map +1 -0
- package/dist/middleware/database.d.ts +14 -0
- package/dist/middleware/database.d.ts.map +1 -0
- package/dist/middleware/database.js +18 -0
- package/dist/middleware/database.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +13 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +127 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/observability.d.ts +32 -0
- package/dist/middleware/observability.d.ts.map +1 -0
- package/dist/middleware/observability.js +134 -0
- package/dist/middleware/observability.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +16 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +56 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/middleware/ucan-auth.d.ts +39 -0
- package/dist/middleware/ucan-auth.d.ts.map +1 -0
- package/dist/middleware/ucan-auth.js +278 -0
- package/dist/middleware/ucan-auth.js.map +1 -0
- package/dist/networks.d.ts +34 -0
- package/dist/networks.d.ts.map +1 -0
- package/dist/networks.js +49 -0
- package/dist/networks.js.map +1 -0
- package/dist/oracle.d.ts +193 -0
- package/dist/oracle.d.ts.map +1 -0
- package/dist/oracle.js +245 -0
- package/dist/oracle.js.map +1 -0
- package/dist/routes/health.d.ts +16 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +29 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/v1/admin.d.ts +18 -0
- package/dist/routes/v1/admin.d.ts.map +1 -0
- package/dist/routes/v1/admin.js +101 -0
- package/dist/routes/v1/admin.js.map +1 -0
- package/dist/routes/v1/api/admin-claims.d.ts +14 -0
- package/dist/routes/v1/api/admin-claims.d.ts.map +1 -0
- package/dist/routes/v1/api/admin-claims.js +82 -0
- package/dist/routes/v1/api/admin-claims.js.map +1 -0
- package/dist/routes/v1/api/admin-facilitator.d.ts +20 -0
- package/dist/routes/v1/api/admin-facilitator.d.ts.map +1 -0
- package/dist/routes/v1/api/admin-facilitator.js +64 -0
- package/dist/routes/v1/api/admin-facilitator.js.map +1 -0
- package/dist/routes/v1/api/admin.d.ts +9 -0
- package/dist/routes/v1/api/admin.d.ts.map +1 -0
- package/dist/routes/v1/api/admin.js +110 -0
- package/dist/routes/v1/api/admin.js.map +1 -0
- package/dist/routes/v1/api/audit.d.ts +8 -0
- package/dist/routes/v1/api/audit.d.ts.map +1 -0
- package/dist/routes/v1/api/audit.js +56 -0
- package/dist/routes/v1/api/audit.js.map +1 -0
- package/dist/routes/v1/api/batch.d.ts +17 -0
- package/dist/routes/v1/api/batch.d.ts.map +1 -0
- package/dist/routes/v1/api/batch.js +192 -0
- package/dist/routes/v1/api/batch.js.map +1 -0
- package/dist/routes/v1/api/claims-read.d.ts +43 -0
- package/dist/routes/v1/api/claims-read.d.ts.map +1 -0
- package/dist/routes/v1/api/claims-read.js +123 -0
- package/dist/routes/v1/api/claims-read.js.map +1 -0
- package/dist/routes/v1/api/claims.d.ts +131 -0
- package/dist/routes/v1/api/claims.d.ts.map +1 -0
- package/dist/routes/v1/api/claims.js +407 -0
- package/dist/routes/v1/api/claims.js.map +1 -0
- package/dist/routes/v1/api/collections-link.d.ts +14 -0
- package/dist/routes/v1/api/collections-link.d.ts.map +1 -0
- package/dist/routes/v1/api/collections-link.js +97 -0
- package/dist/routes/v1/api/collections-link.js.map +1 -0
- package/dist/routes/v1/api/export.d.ts +48 -0
- package/dist/routes/v1/api/export.d.ts.map +1 -0
- package/dist/routes/v1/api/export.js +251 -0
- package/dist/routes/v1/api/export.js.map +1 -0
- package/dist/routes/v1/api/index.d.ts +16 -0
- package/dist/routes/v1/api/index.d.ts.map +1 -0
- package/dist/routes/v1/api/index.js +68 -0
- package/dist/routes/v1/api/index.js.map +1 -0
- package/dist/routes/v1/api/keys.d.ts +9 -0
- package/dist/routes/v1/api/keys.d.ts.map +1 -0
- package/dist/routes/v1/api/keys.js +95 -0
- package/dist/routes/v1/api/keys.js.map +1 -0
- package/dist/routes/v1/api/me.d.ts +21 -0
- package/dist/routes/v1/api/me.d.ts.map +1 -0
- package/dist/routes/v1/api/me.js +122 -0
- package/dist/routes/v1/api/me.js.map +1 -0
- package/dist/routes/v1/api/members.d.ts +17 -0
- package/dist/routes/v1/api/members.d.ts.map +1 -0
- package/dist/routes/v1/api/members.js +406 -0
- package/dist/routes/v1/api/members.js.map +1 -0
- package/dist/routes/v1/api/meta.d.ts +12 -0
- package/dist/routes/v1/api/meta.d.ts.map +1 -0
- package/dist/routes/v1/api/meta.js +59 -0
- package/dist/routes/v1/api/meta.js.map +1 -0
- package/dist/routes/v1/api/openapi.gen.d.ts +2 -0
- package/dist/routes/v1/api/openapi.gen.d.ts.map +1 -0
- package/dist/routes/v1/api/openapi.gen.js +7 -0
- package/dist/routes/v1/api/openapi.gen.js.map +1 -0
- package/dist/routes/v1/api/protocols.d.ts +22 -0
- package/dist/routes/v1/api/protocols.d.ts.map +1 -0
- package/dist/routes/v1/api/protocols.js +153 -0
- package/dist/routes/v1/api/protocols.js.map +1 -0
- package/dist/routes/v1/api/review-billing.d.ts +18 -0
- package/dist/routes/v1/api/review-billing.d.ts.map +1 -0
- package/dist/routes/v1/api/review-billing.js +196 -0
- package/dist/routes/v1/api/review-billing.js.map +1 -0
- package/dist/routes/v1/api/review.d.ts +30 -0
- package/dist/routes/v1/api/review.d.ts.map +1 -0
- package/dist/routes/v1/api/review.js +302 -0
- package/dist/routes/v1/api/review.js.map +1 -0
- package/dist/routes/v1/api/sources.d.ts +10 -0
- package/dist/routes/v1/api/sources.d.ts.map +1 -0
- package/dist/routes/v1/api/sources.js +293 -0
- package/dist/routes/v1/api/sources.js.map +1 -0
- package/dist/routes/v1/api/uploads.d.ts +37 -0
- package/dist/routes/v1/api/uploads.d.ts.map +1 -0
- package/dist/routes/v1/api/uploads.js +414 -0
- package/dist/routes/v1/api/uploads.js.map +1 -0
- package/dist/routes/v1/api/views.d.ts +18 -0
- package/dist/routes/v1/api/views.d.ts.map +1 -0
- package/dist/routes/v1/api/views.js +95 -0
- package/dist/routes/v1/api/views.js.map +1 -0
- package/dist/routes/v1/api/webhooks.d.ts +14 -0
- package/dist/routes/v1/api/webhooks.d.ts.map +1 -0
- package/dist/routes/v1/api/webhooks.js +282 -0
- package/dist/routes/v1/api/webhooks.js.map +1 -0
- package/dist/routes/v1/api/work-orders.d.ts +45 -0
- package/dist/routes/v1/api/work-orders.d.ts.map +1 -0
- package/dist/routes/v1/api/work-orders.js +171 -0
- package/dist/routes/v1/api/work-orders.js.map +1 -0
- package/dist/routes/v1/claims.d.ts +21 -0
- package/dist/routes/v1/claims.d.ts.map +1 -0
- package/dist/routes/v1/claims.js +153 -0
- package/dist/routes/v1/claims.js.map +1 -0
- package/dist/routes/v1/collections.d.ts +45 -0
- package/dist/routes/v1/collections.d.ts.map +1 -0
- package/dist/routes/v1/collections.js +201 -0
- package/dist/routes/v1/collections.js.map +1 -0
- package/dist/routes/v1/index.d.ts +13 -0
- package/dist/routes/v1/index.d.ts.map +1 -0
- package/dist/routes/v1/index.js +41 -0
- package/dist/routes/v1/index.js.map +1 -0
- package/dist/routes/v1/info.d.ts +14 -0
- package/dist/routes/v1/info.d.ts.map +1 -0
- package/dist/routes/v1/info.js +75 -0
- package/dist/routes/v1/info.js.map +1 -0
- package/dist/routes/v1/mcp/index.d.ts +33 -0
- package/dist/routes/v1/mcp/index.d.ts.map +1 -0
- package/dist/routes/v1/mcp/index.js +252 -0
- package/dist/routes/v1/mcp/index.js.map +1 -0
- package/dist/routes/v1/mcp/oauth.d.ts +27 -0
- package/dist/routes/v1/mcp/oauth.d.ts.map +1 -0
- package/dist/routes/v1/mcp/oauth.js +500 -0
- package/dist/routes/v1/mcp/oauth.js.map +1 -0
- package/dist/routes/v1/mcp/tools.d.ts +71 -0
- package/dist/routes/v1/mcp/tools.d.ts.map +1 -0
- package/dist/routes/v1/mcp/tools.js +432 -0
- package/dist/routes/v1/mcp/tools.js.map +1 -0
- package/dist/routes/v1/mcp/ui.d.ts +45 -0
- package/dist/routes/v1/mcp/ui.d.ts.map +1 -0
- package/dist/routes/v1/mcp/ui.js +454 -0
- package/dist/routes/v1/mcp/ui.js.map +1 -0
- package/dist/routes/v1/oauth.d.ts +29 -0
- package/dist/routes/v1/oauth.d.ts.map +1 -0
- package/dist/routes/v1/oauth.js +256 -0
- package/dist/routes/v1/oauth.js.map +1 -0
- package/dist/routes/v1/reviewers.d.ts +22 -0
- package/dist/routes/v1/reviewers.d.ts.map +1 -0
- package/dist/routes/v1/reviewers.js +165 -0
- package/dist/routes/v1/reviewers.js.map +1 -0
- package/dist/routes/v1/reviews.d.ts +38 -0
- package/dist/routes/v1/reviews.d.ts.map +1 -0
- package/dist/routes/v1/reviews.js +234 -0
- package/dist/routes/v1/reviews.js.map +1 -0
- package/dist/routes/v1/shared.d.ts +586 -0
- package/dist/routes/v1/shared.d.ts.map +1 -0
- package/dist/routes/v1/shared.js +229 -0
- package/dist/routes/v1/shared.js.map +1 -0
- package/dist/routes/well-known.d.ts +15 -0
- package/dist/routes/well-known.d.ts.map +1 -0
- package/dist/routes/well-known.js +35 -0
- package/dist/routes/well-known.js.map +1 -0
- package/dist/runtime.d.ts +100 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +144 -0
- package/dist/runtime.js.map +1 -0
- package/dist/testing/fake-tools.d.ts +104 -0
- package/dist/testing/fake-tools.d.ts.map +1 -0
- package/dist/testing/fake-tools.js +213 -0
- package/dist/testing/fake-tools.js.map +1 -0
- package/dist/testing/index.d.ts +54 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +104 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/samples.d.ts +70 -0
- package/dist/testing/samples.d.ts.map +1 -0
- package/dist/testing/samples.js +92 -0
- package/dist/testing/samples.js.map +1 -0
- package/dist/workflows/claim-ingest.d.ts +250 -0
- package/dist/workflows/claim-ingest.d.ts.map +1 -0
- package/dist/workflows/claim-ingest.js +1020 -0
- package/dist/workflows/claim-ingest.js.map +1 -0
- package/dist/workflows/claim-source.d.ts +25 -0
- package/dist/workflows/claim-source.d.ts.map +1 -0
- package/dist/workflows/claim-source.js +107 -0
- package/dist/workflows/claim-source.js.map +1 -0
- package/dist/workflows/review-complete.d.ts +82 -0
- package/dist/workflows/review-complete.d.ts.map +1 -0
- package/dist/workflows/review-complete.js +455 -0
- package/dist/workflows/review-complete.js.map +1 -0
- package/dist/workflows/steps.d.ts +125 -0
- package/dist/workflows/steps.d.ts.map +1 -0
- package/dist/workflows/steps.js +325 -0
- package/dist/workflows/steps.js.map +1 -0
- package/docs/api.md +2595 -0
- package/docs/guide.md +1525 -0
- package/migrations/0000_init.sql +108 -0
- package/migrations/0001_review_attestation.sql +1 -0
- package/migrations/0002_decisions_facts.sql +1 -0
- package/migrations/0003_api_lane.sql +171 -0
- package/migrations/0004_api_v1_1.sql +19 -0
- package/migrations/0005_member_notify.sql +3 -0
- package/migrations/0006_source_collections.sql +16 -0
- package/migrations/0007_api_settlement.sql +27 -0
- package/migrations/0008_review_extend.sql +1 -0
- package/migrations/0009_card_refunds.sql +4 -0
- package/migrations/0010_even_scorpion.sql +16 -0
- package/migrations/0011_mcp_oauth.sql +27 -0
- package/migrations/0012_mcp_standing.sql +21 -0
- package/migrations/0013_unknown_krista_starr.sql +2 -0
- package/migrations/0014_last_carnage.sql +14 -0
- package/migrations/0015_company_authority.sql +26 -0
- package/migrations/0016_owner_only_links.sql +6 -0
- package/migrations/0017_organisations.sql +35 -0
- package/migrations/0018_remove_app_signed.sql +4 -0
- package/migrations/0019_submitted_via.sql +2 -0
- package/migrations/0020_drop_decision_to_pay.sql +4 -0
- package/migrations/0021_manual_erase.sql +25 -0
- package/migrations/0022_errored_facts.sql +1 -0
- package/migrations/0023_review_billing.sql +20 -0
- package/migrations/0024_pending_task_details.sql +1 -0
- package/migrations/meta/0000_snapshot.json +707 -0
- package/migrations/meta/0001_snapshot.json +714 -0
- package/migrations/meta/0002_snapshot.json +721 -0
- package/migrations/meta/0003_snapshot.json +1845 -0
- package/migrations/meta/0004_snapshot.json +1969 -0
- package/migrations/meta/0005_snapshot.json +1991 -0
- package/migrations/meta/0006_snapshot.json +2097 -0
- package/migrations/meta/0007_snapshot.json +2128 -0
- package/migrations/meta/0008_snapshot.json +2133 -0
- package/migrations/meta/0009_snapshot.json +2161 -0
- package/migrations/meta/0010_snapshot.json +2265 -0
- package/migrations/meta/0011_snapshot.json +2448 -0
- package/migrations/meta/0012_snapshot.json +2577 -0
- package/migrations/meta/0013_snapshot.json +2594 -0
- package/migrations/meta/0014_snapshot.json +2602 -0
- package/migrations/meta/0015_snapshot.json +2778 -0
- package/migrations/meta/0016_snapshot.json +2778 -0
- package/migrations/meta/0017_snapshot.json +2792 -0
- package/migrations/meta/0018_snapshot.json +2778 -0
- package/migrations/meta/0019_snapshot.json +2792 -0
- package/migrations/meta/0020_snapshot.json +2785 -0
- package/migrations/meta/0021_snapshot.json +2762 -0
- package/migrations/meta/0022_snapshot.json +2769 -0
- package/migrations/meta/0023_snapshot.json +2900 -0
- package/migrations/meta/0024_snapshot.json +2907 -0
- package/migrations/meta/_journal.json +181 -0
- package/openapi/decision-api.yaml +12204 -0
- package/package.json +121 -4
- package/skills/README.md +19 -0
- package/skills/add-openhands-support/SKILL.md +113 -0
- package/skills/create-collection/SKILL.md +199 -0
- package/skills/create-collection/reference/claims-stack.md +106 -0
- package/skills/create-collection/reference/collection.md +111 -0
- package/skills/create-oracle/SKILL.md +400 -0
- package/skills/create-rubric/SKILL.md +130 -0
- package/skills/create-rubric/reference/format-cheatsheet.md +186 -0
- package/skills/create-rubric/templates/claim-form.example.json +60 -0
- package/skills/decision-api-client/SKILL.md +236 -0
- package/skills/decision-api-oracle/SKILL.md +336 -0
- package/skills/publish-protocol/SKILL.md +151 -0
- package/skills/publish-protocol/reference/publishing.md +116 -0
- package/skills/reference/engine-contract.md +222 -0
- package/skills/write-facts/SKILL.md +221 -0
- package/skills/write-facts/reference/examples/http-vendor.ts +88 -0
- package/skills/write-facts/reference/examples/price-matches-agreement.ts +67 -0
- package/skills/write-facts/reference/facts-api.md +232 -0
- package/templates/project/.dev.vars.example +93 -0
- package/templates/project/.editorconfig +9 -0
- package/templates/project/CLAUDE.md +45 -0
- package/templates/project/README.md +199 -0
- package/templates/project/biome.json +37 -0
- package/templates/project/gitignore +29 -0
- package/templates/project/package.json +32 -0
- package/templates/project/src/facts/index.ts +19 -0
- package/templates/project/src/index.ts +25 -0
- package/templates/project/test/api-lane.test.ts +57 -0
- package/templates/project/test/facts.test.ts +14 -0
- package/templates/project/tsconfig.json +25 -0
- package/templates/project/vitest.config.ts +13 -0
- package/templates/project/wrangler.jsonc +446 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A claim's PAYMENT plane — the one place that reads the chain's intent/escrow semantics, verified
|
|
3
|
+
* against `ixo-blockchain/x/claims/keeper/msg_server.go`.
|
|
4
|
+
*
|
|
5
|
+
* Two lanes, and the oracle must act differently in each:
|
|
6
|
+
*
|
|
7
|
+
* useIntent = false — an ORDINARY claim. The agent's requested `amount` is a request; the
|
|
8
|
+
* evaluator's `MsgEvaluateClaim.amount` is what actually pays (falling back to the collection's
|
|
9
|
+
* default approval payment when empty), authz-capped by `EvaluateClaimConstraints.MaxCustomAmount`.
|
|
10
|
+
* ⇒ we ECHO the claim's own amount so the agent is paid what they asked for.
|
|
11
|
+
*
|
|
12
|
+
* useIntent = true — an ESCROWED claim. `MsgClaimIntent` moved the payout into the collection's
|
|
13
|
+
* escrow account BEFORE the claim existed; `MsgSubmitClaim{useIntent:true}` copied the intent's
|
|
14
|
+
* terms onto the claim, set `paymentsStatus.approval = GUARANTEED`, and DELETED the intent
|
|
15
|
+
* record (so there is nothing left to query at evaluation time — the claim IS the record).
|
|
16
|
+
* `EvaluateClaim` then OVERWRITES `msg.Amount` with `claim.Amount` (msg_server.go:409-413) and
|
|
17
|
+
* pays the full escrowed sum on approve / refunds it on any other terminal status.
|
|
18
|
+
* ⇒ we send NO amount: the chain ignores it, and a non-empty amount is still checked against
|
|
19
|
+
* `MaxCustomAmount` (authz.go:231), so echoing it can fail the whole MsgExec for zero benefit.
|
|
20
|
+
*
|
|
21
|
+
* The denom is always the CLAIM's — the oracle never picks one.
|
|
22
|
+
*/
|
|
23
|
+
import { AppError } from "../errors.js";
|
|
24
|
+
/** The claim's payment plane, normalized. Missing/legacy fields read as an ordinary unpaid claim. */
|
|
25
|
+
export function claimPayment(claim) {
|
|
26
|
+
return {
|
|
27
|
+
useIntent: claim.useIntent === true,
|
|
28
|
+
guaranteed: claim.paymentsStatus?.approval === "GUARANTEED",
|
|
29
|
+
amount: claim.amount ?? [],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The coins to put on `MsgEvaluateClaim`, or `undefined` to let the chain decide (§payment above).
|
|
34
|
+
* Intent claims ALWAYS get `undefined`.
|
|
35
|
+
*/
|
|
36
|
+
export function evaluationAmount(payment) {
|
|
37
|
+
if (!payment || payment.useIntent)
|
|
38
|
+
return undefined;
|
|
39
|
+
return payment.amount[0];
|
|
40
|
+
}
|
|
41
|
+
/** Any strictly positive coin? Amounts are integer strings; float loss can't flip a > 0 test. */
|
|
42
|
+
function hasCoins(coins) {
|
|
43
|
+
return (coins ?? []).some((coin) => Number(coin.amount) > 0);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Would an on-chain APPROVE actually pay something without the evaluator inventing an amount?
|
|
47
|
+
* True on the escrow lane (the intent priced it), on a claim carrying its own coins, or when the
|
|
48
|
+
* collection's approval lane has a default. False means approval needs a CUSTOM amount — a money
|
|
49
|
+
* judgement that belongs to the owner, not this oracle (the act lane leaves such a claim for the
|
|
50
|
+
* portal rather than signing a zero payout).
|
|
51
|
+
*
|
|
52
|
+
* Deliberately a question about the CHAIN, not about settings: it reports whether money would move,
|
|
53
|
+
* and the caller decides what that means.
|
|
54
|
+
*/
|
|
55
|
+
export function hasApprovalPayout(payment, collectionPayments) {
|
|
56
|
+
if (payment.useIntent)
|
|
57
|
+
return true;
|
|
58
|
+
return hasCoins(payment.amount) || hasCoins(collectionPayments?.approval?.amount);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* What ONE `MsgEvaluateClaim` draws from the collection's admin account, summed per denom — the
|
|
62
|
+
* act lane's `admin-unfunded` notice and the funding cron's resume threshold read the same rule.
|
|
63
|
+
* Proven on chain v8 (S4): the message fails WHOLE ("insufficient funds") unless the admin covers
|
|
64
|
+
* every leg it pays, and a failed one records nothing, so a retry after a top-up succeeds.
|
|
65
|
+
*
|
|
66
|
+
* evaluation — every evaluation, approve or reject: the collection's `payments.evaluation`
|
|
67
|
+
* (all its coins); the watched row's accepted `fee` only when Blocksync has no payments.
|
|
68
|
+
* approval — an ORDINARY claim's payout: `claimAmount` (what step 9 puts on the message), else
|
|
69
|
+
* the collection's approval default. An INTENT claim adds nothing: the escrow pays it.
|
|
70
|
+
* rejection — the collection's rejection payment, whatever the lane.
|
|
71
|
+
*
|
|
72
|
+
* Omit `verdict` for the evaluation leg alone. An empty or absent leg adds nothing, and so does
|
|
73
|
+
* a coin whose amount is not an integer (the chain's coins always are; a ragged jsonb row must
|
|
74
|
+
* not throw a notice or a probe). Zero sums are dropped.
|
|
75
|
+
*/
|
|
76
|
+
export function adminDraw(input) {
|
|
77
|
+
const { payments, fee, verdict } = input;
|
|
78
|
+
const evaluation = payments?.evaluation?.amount ?? [];
|
|
79
|
+
const legs = evaluation.length > 0 ? [...evaluation] : fee ? [fee] : [];
|
|
80
|
+
if (verdict?.approve && !verdict.payment.useIntent) {
|
|
81
|
+
legs.push(...(verdict.claimAmount ? [verdict.claimAmount] : (payments?.approval?.amount ?? [])));
|
|
82
|
+
}
|
|
83
|
+
if (verdict && !verdict.approve)
|
|
84
|
+
legs.push(...(payments?.rejection?.amount ?? []));
|
|
85
|
+
const sums = new Map();
|
|
86
|
+
for (const { denom, amount } of legs) {
|
|
87
|
+
if (!/^\d+$/.test(amount))
|
|
88
|
+
continue;
|
|
89
|
+
sums.set(denom, (sums.get(denom) ?? 0n) + BigInt(amount));
|
|
90
|
+
}
|
|
91
|
+
return [...sums]
|
|
92
|
+
.filter(([, amount]) => amount > 0n)
|
|
93
|
+
.map(([denom, amount]) => ({ denom, amount: amount.toString() }));
|
|
94
|
+
}
|
|
95
|
+
/** The watched row's accepted evaluation fee as a coin, when it carries one. */
|
|
96
|
+
export function rowFee(row) {
|
|
97
|
+
return row?.evaluationDenom && row.evaluationAmount
|
|
98
|
+
? { denom: row.evaluationDenom, amount: row.evaluationAmount }
|
|
99
|
+
: null;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The register-time money gate: the collection's `Payments.evaluation` is the
|
|
103
|
+
* ONLY way this oracle gets paid — the chain splits that coin 80/10/10 on every `MsgEvaluateClaim`
|
|
104
|
+
* — so a collection paying nothing, in another denom, or below the fee is refused (402) rather than
|
|
105
|
+
* evaluated for free. Returns the accepted coin (what the watched row records). The whole coin list
|
|
106
|
+
* is scanned because an evaluation payment may carry several denoms; the message states required
|
|
107
|
+
* vs offered so the commissioner can fix the collection's payments, not guess.
|
|
108
|
+
*/
|
|
109
|
+
export function requireEvaluationPayment(required, payments) {
|
|
110
|
+
const coins = payments?.evaluation?.amount ?? [];
|
|
111
|
+
const offered = coins.find((coin) => coin.denom === required.denom);
|
|
112
|
+
// A zero-price fee (`minAmount: "0"`, e.g. a `pricing.byProtocol` entry — oracle.ts) earns
|
|
113
|
+
// nothing from the chain's evaluation split by design, so an absent/empty/wrong-denom leg is
|
|
114
|
+
// legal, not a refusal — record what was actually offered in the required denom, or "0" when
|
|
115
|
+
// there was none. NEVER echoed onto `MsgEvaluateClaim`: that message's only `amount` field is
|
|
116
|
+
// the claim's own ordinary-lane payout (`evaluationAmount()` in this file, read from
|
|
117
|
+
// `claimPayment()`), which chain-write.ts builds independently of this fee entirely.
|
|
118
|
+
// `offered.amount` is the chain's jsonb as Blocksync relays it — typed a string, never proven an
|
|
119
|
+
// integer. `BigInt("1.5")` throws (an anonymous 500, and once recorded on the watched row, again in
|
|
120
|
+
// the funding cron every tick) and `BigInt("")` is silently 0n. So a malformed amount is refused
|
|
121
|
+
// by name here, before anything compares or records it.
|
|
122
|
+
if (offered && !/^\d+$/.test(offered.amount)) {
|
|
123
|
+
throw AppError.paymentRequired(`The collection's evaluation payment amount "${offered.amount}" is not an integer base-unit amount of ${required.denom}`, { reason: "evaluation_underpaid", required, offered: coins });
|
|
124
|
+
}
|
|
125
|
+
if (BigInt(required.minAmount) === 0n) {
|
|
126
|
+
return { denom: required.denom, amount: offered?.amount ?? "0" };
|
|
127
|
+
}
|
|
128
|
+
if (!offered || BigInt(offered.amount) < BigInt(required.minAmount)) {
|
|
129
|
+
const offers = coins.length > 0
|
|
130
|
+
? coins.map((coin) => `${coin.amount}${coin.denom}`).join(", ")
|
|
131
|
+
: "no evaluation payment";
|
|
132
|
+
throw AppError.paymentRequired(`This oracle requires an evaluation payment of at least ${required.minAmount}${required.denom}; the collection offers ${offers}`, { reason: "evaluation_underpaid", required, offered: coins });
|
|
133
|
+
}
|
|
134
|
+
return { denom: offered.denom, amount: offered.amount };
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=payment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment.js","sourceRoot":"","sources":["../../../src/lib/ixo/payment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The UCAN Store inbox — where the collection owner deposits the owner→oracle delegation (§3.5).
|
|
3
|
+
*
|
|
4
|
+
* We self-sign a `store/get` invocation (acting as ourselves → our inbox) and read the delegations
|
|
5
|
+
* addressed to `ORACLE_DID`. The store has replay ON (single-use), so we MINT A FRESH invocation on
|
|
6
|
+
* every request and NEVER cache it — a retry re-mints. The returned `.token` is the raw base64-CAR
|
|
7
|
+
* delegation, ready to use as the proof for the bot invocation.
|
|
8
|
+
*/
|
|
9
|
+
import type { Config } from "../../config.js";
|
|
10
|
+
import type { Logger } from "../logger.js";
|
|
11
|
+
import type { TraceContext } from "../tracing.js";
|
|
12
|
+
export interface StoreDeps {
|
|
13
|
+
config: Config;
|
|
14
|
+
trace: TraceContext;
|
|
15
|
+
cache: KVNamespace;
|
|
16
|
+
logger: Logger;
|
|
17
|
+
}
|
|
18
|
+
export interface OwnerDelegation {
|
|
19
|
+
/** The raw base64-CAR delegation, ready to use as a proof. */
|
|
20
|
+
car: string;
|
|
21
|
+
/** Unix seconds the delegation expires at, or null if it never expires. */
|
|
22
|
+
expiresAt: number | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Fetch the newest non-expired claim-bot delegation from our store inbox that VERIFIES as
|
|
26
|
+
* `rootIssuerDid`'s (the chain owner's). Returns the delegation + its own expiry, or null if none on
|
|
27
|
+
* deposit does (the caller maps that to a fail-closed `forbidden`).
|
|
28
|
+
*/
|
|
29
|
+
export declare function fetchOwnerDelegation(deps: StoreDeps, rootIssuerDid: string): Promise<OwnerDelegation | null>;
|
|
30
|
+
//# sourceMappingURL=ucan-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ucan-store.d.ts","sourceRoot":"","sources":["../../../src/lib/ixo/ucan-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAU/C,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAaD,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAmHjC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The UCAN Store inbox — where the collection owner deposits the owner→oracle delegation (§3.5).
|
|
3
|
+
*
|
|
4
|
+
* We self-sign a `store/get` invocation (acting as ourselves → our inbox) and read the delegations
|
|
5
|
+
* addressed to `ORACLE_DID`. The store has replay ON (single-use), so we MINT A FRESH invocation on
|
|
6
|
+
* every request and NEVER cache it — a retry re-mints. The returned `.token` is the raw base64-CAR
|
|
7
|
+
* delegation, ready to use as the proof for the bot invocation.
|
|
8
|
+
*/
|
|
9
|
+
import { AppError } from "../errors.js";
|
|
10
|
+
import { fetchClient, readCappedBytes } from "../http/client.js";
|
|
11
|
+
import { resolveIssuerKeys } from "./delegation-verify.js";
|
|
12
|
+
import { resolveServiceDid } from "./did.js";
|
|
13
|
+
import { mintInvocation, verifyOwnerDelegation } from "./ucan.js";
|
|
14
|
+
const STORE_RESOURCE = "ixo:ucan-store";
|
|
15
|
+
const CLAIM_BOT_RESOURCE = "ixo:matrix-claims-bot";
|
|
16
|
+
/** The newest deposits tried per lookup — anyone may deposit a CAR naming the owner. */
|
|
17
|
+
const MAX_CANDIDATES = 10;
|
|
18
|
+
/** One inbox page: 50 deposits × a CAR of tens of KiB is a few MiB at the very most. */
|
|
19
|
+
const MAX_INBOX_BYTES = 8 * 1024 * 1024;
|
|
20
|
+
/**
|
|
21
|
+
* Fetch the newest non-expired claim-bot delegation from our store inbox that VERIFIES as
|
|
22
|
+
* `rootIssuerDid`'s (the chain owner's). Returns the delegation + its own expiry, or null if none on
|
|
23
|
+
* deposit does (the caller maps that to a fail-closed `forbidden`).
|
|
24
|
+
*/
|
|
25
|
+
export async function fetchOwnerDelegation(deps, rootIssuerDid) {
|
|
26
|
+
const { config } = deps;
|
|
27
|
+
if (!config.ORACLE_DID) {
|
|
28
|
+
throw AppError.internal("ORACLE_DID not configured");
|
|
29
|
+
}
|
|
30
|
+
const storeDid = await resolveServiceDid(deps.trace, deps.cache, config.UCAN_STORE_URL);
|
|
31
|
+
const url = `${config.UCAN_STORE_URL}/api/delegations?rootIssuer=${encodeURIComponent(rootIssuerDid)}&resource=${CLAIM_BOT_RESOURCE}&order=desc`;
|
|
32
|
+
// Single-use tokens: re-mint per attempt, never retry the same bearer (replay ON). `unique`
|
|
33
|
+
// guards against concurrent pulls minting byte-identical tokens in the same second — the store's
|
|
34
|
+
// replay protection would reject the twin as a replay.
|
|
35
|
+
let lastError;
|
|
36
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
37
|
+
const { token } = await mintInvocation(config, {
|
|
38
|
+
// The store indexes our inbox by our chain DID (lib/ixo/ucan.ts header).
|
|
39
|
+
issuer: config.ORACLE_DID,
|
|
40
|
+
audience: storeDid,
|
|
41
|
+
capability: { can: "store/get", with: STORE_RESOURCE },
|
|
42
|
+
ttlSec: 120,
|
|
43
|
+
unique: true,
|
|
44
|
+
});
|
|
45
|
+
let res;
|
|
46
|
+
try {
|
|
47
|
+
// Single attempt on purpose (default): the token is single-use (replay ON) — the outer loop
|
|
48
|
+
// re-mints a fresh one rather than ever re-sending this request.
|
|
49
|
+
res = await fetchClient(url, {
|
|
50
|
+
trace: deps.trace,
|
|
51
|
+
headers: {
|
|
52
|
+
accept: "application/json",
|
|
53
|
+
authorization: `Bearer ${token}`,
|
|
54
|
+
"x-auth-type": "ucan",
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
lastError = err;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (!res.ok) {
|
|
63
|
+
// Includes 401/403: a rejection of OUR invocation (replay collision, clock skew) is store
|
|
64
|
+
// contention, NOT "this claim is forbidden" — retry with a FRESH token, and surface as
|
|
65
|
+
// `unavailable` (retryable) if it persists. Deterministic authz denials belong to the claim
|
|
66
|
+
// bot, not here.
|
|
67
|
+
lastError = new Error(`store returned ${res.status}`);
|
|
68
|
+
// Discarded bodies pin one of the isolate's 6 open connections until GC.
|
|
69
|
+
await res.body?.cancel().catch(() => { });
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
// Under a cap: one page is at most 50 deposits of a CAR each (tens of KiB), and anyone can
|
|
73
|
+
// deposit to our inbox — an unbounded read would let a flood of them take the isolate down.
|
|
74
|
+
const bytes = await readCappedBytes(res, MAX_INBOX_BYTES).catch(() => new Uint8Array(0));
|
|
75
|
+
if (!bytes) {
|
|
76
|
+
lastError = new Error(`store answer over ${MAX_INBOX_BYTES} bytes`);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
let body = null;
|
|
80
|
+
try {
|
|
81
|
+
body = JSON.parse(new TextDecoder().decode(bytes));
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
/* not JSON — no deposits we can read, as before */
|
|
85
|
+
}
|
|
86
|
+
const now = Math.floor(Date.now() / 1000);
|
|
87
|
+
const matches = (body?.delegations ?? []).filter((d) => d.audienceDid === config.ORACLE_DID &&
|
|
88
|
+
(d.expiresAt == null || d.expiresAt > now) &&
|
|
89
|
+
d.capabilities?.some((c) => c.with === CLAIM_BOT_RESOURCE));
|
|
90
|
+
// The `rootIssuer=` filter above is the STORE's own claim about what it's returning, and anyone
|
|
91
|
+
// can deposit a CAR naming the owner. So each match is verified exactly as the caller-supplied
|
|
92
|
+
// path is at register time (`verifyOwnerDelegation`: issuer, audience, resource, expiry AND
|
|
93
|
+
// signature), newest first (`order=desc`), and the first that passes is the one — a bad newest
|
|
94
|
+
// deposit must not hide an older good one. A refusal (400) is logged and skipped; anything else
|
|
95
|
+
// (Blocksync down, 503) is thrown, never read as "no delegation". The expiry returned is the
|
|
96
|
+
// verified CAR's own, not the store's metadata.
|
|
97
|
+
// The owner's keys are resolved ONCE for every candidate, and only when one passes the free
|
|
98
|
+
// field checks; the candidates are capped, so a flood of deposits costs at most MAX_CANDIDATES
|
|
99
|
+
// signature checks.
|
|
100
|
+
let keys;
|
|
101
|
+
const issuerKeys = () => {
|
|
102
|
+
keys ??= resolveIssuerKeys(config, rootIssuerDid, deps.trace);
|
|
103
|
+
return keys;
|
|
104
|
+
};
|
|
105
|
+
for (const match of matches.slice(0, MAX_CANDIDATES)) {
|
|
106
|
+
let verified;
|
|
107
|
+
try {
|
|
108
|
+
verified = await verifyOwnerDelegation(config, match.token, rootIssuerDid, issuerKeys);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
if (err instanceof AppError && err.status === 400) {
|
|
112
|
+
deps.logger.warn("ucan-store.delegation-refused", {
|
|
113
|
+
rootIssuerDid,
|
|
114
|
+
reason: err.message,
|
|
115
|
+
code: err.details?.code,
|
|
116
|
+
});
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
deps.logger.debug("ucan-store.delegation-found", {
|
|
122
|
+
rootIssuerDid,
|
|
123
|
+
expiresAt: verified.expiresAt?.toISOString() ?? null,
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
car: verified.car,
|
|
127
|
+
expiresAt: verified.expiresAt ? Math.floor(verified.expiresAt.getTime() / 1000) : null,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
throw AppError.unavailable("UCAN Store inbox unreachable", lastError);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=ucan-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ucan-store.js","sourceRoot":"","sources":["../../../src/lib/ixo/ucan-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minting UCAN invocations as the Evaluation Oracle.
|
|
3
|
+
*
|
|
4
|
+
* ONE key, two DIDs. `signerFromMnemonic(SERVICE_ED25519_MNEMONIC)` derives the same Ed25519 key
|
|
5
|
+
* as identity.ts (SHA256(mnemonic) → seed), so whichever DID is stamped on the signer, the key is
|
|
6
|
+
* the one `/.well-known/did.json` publishes. The DEFAULT issuer is our did:web
|
|
7
|
+
* (`did:web:<ORACLE_HOSTNAME>`, docs/ENGINE-CONTRACT.md): the engine's validator resolves it from
|
|
8
|
+
* that document, so a cloned kit needs no on-chain IID key. `ORACLE_DID` (did:ixo) is the issuer
|
|
9
|
+
* ONLY where the counterparty knows us by our chain identity: the owner→oracle delegation names it
|
|
10
|
+
* as its audience (so the bot invocation that carries it as proof must be issued by that same
|
|
11
|
+
* principal), the UCAN Store indexes our inbox by it, and the VFS matches our evaluate grant by
|
|
12
|
+
* its address. Four invocation shapes are minted (see pull-claim-spec §13, replay differs), plus
|
|
13
|
+
* one delegation:
|
|
14
|
+
*
|
|
15
|
+
* - engine invocations (lib/engine): SELF-SIGNED as did:web, resource `ixo:eval-engine`. Replay
|
|
16
|
+
* is OFF; the client reuses a token until it nears expiry.
|
|
17
|
+
* - store invocations (§3.5): SELF-SIGNED as ORACLE_DID, resource `ixo:ucan-store`. Replay is ON
|
|
18
|
+
* (single-use), so `mintInvocation` is called fresh every store request and NEVER cached.
|
|
19
|
+
* - bot invocations (§3.6): DELEGATION-BACKED (proofs:[owner→oracle]) as ORACLE_DID, resource
|
|
20
|
+
* `ixo:matrix-claims-bot`. Replay is OFF, so `mintBotInvocation` caches the token per
|
|
21
|
+
* (botDid, delegation) until it expires.
|
|
22
|
+
* - VFS claims-lane invocations (vfs.ts): SELF-SIGNED as ORACLE_DID, `fs/read` on
|
|
23
|
+
* `ixo:filesystem/<entity>/.claims/<collection>`. Replay is ON (single-use), so one is minted
|
|
24
|
+
* per request and NEVER cached.
|
|
25
|
+
* - the facilitator delegation (`mintDelegation`, routes/v1/api/admin-facilitator.ts): a
|
|
26
|
+
* DELEGATION, as did:web, to an operator's did:ixo — one `operators/<action>` per requested
|
|
27
|
+
* action on the card facilitator, never `*`. A nonce on every mint, NEVER cached: each one is a fresh short-lived credential.
|
|
28
|
+
*/
|
|
29
|
+
import type { Capability, Delegation } from "@ixo/ucan";
|
|
30
|
+
import type { Config } from "../../config.js";
|
|
31
|
+
import { type IssuerKeys } from "./delegation-verify.js";
|
|
32
|
+
/** `did:web:<ORACLE_HOSTNAME>` — encoded exactly as identity.ts publishes it. */
|
|
33
|
+
export declare function oracleWebDid(config: Pick<Config, "ORACLE_HOSTNAME">): string;
|
|
34
|
+
export interface MintOptions {
|
|
35
|
+
audience: string;
|
|
36
|
+
capability: Capability;
|
|
37
|
+
/** Which of our DIDs signs — default our did:web; `ORACLE_DID` where the counterparty knows us by chain identity (header). */
|
|
38
|
+
issuer?: string;
|
|
39
|
+
/** Empty/omitted => self-signed (act as the oracle). Present => act as the delegation root. */
|
|
40
|
+
proofs?: Delegation[];
|
|
41
|
+
ttlSec?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Make the token unique. Ed25519 signing is deterministic, so two mints in the same second with
|
|
44
|
+
* identical fields produce BYTE-IDENTICAL tokens — a replay-protected service (the UCAN Store)
|
|
45
|
+
* rejects the second as a replay. Set for single-use invocations minted concurrently.
|
|
46
|
+
*/
|
|
47
|
+
unique?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface MintedInvocation {
|
|
50
|
+
token: string;
|
|
51
|
+
/** Unix seconds the invocation expires at. */
|
|
52
|
+
exp: number;
|
|
53
|
+
}
|
|
54
|
+
/** Mint + serialize a single invocation. Callers that are single-use (store) MUST NOT cache this. */
|
|
55
|
+
export declare function mintInvocation(config: Config, opts: MintOptions): Promise<MintedInvocation>;
|
|
56
|
+
export interface MintDelegationOptions {
|
|
57
|
+
audience: string;
|
|
58
|
+
capabilities: Capability[];
|
|
59
|
+
ttlSec: number;
|
|
60
|
+
/** The cap on `exp − nbf` — the lifetime a verifier measures, backdate included. */
|
|
61
|
+
maxLifetimeSec: number;
|
|
62
|
+
}
|
|
63
|
+
export interface MintedDelegation {
|
|
64
|
+
/** The base64 CAR — the same encoding as a console role grant. */
|
|
65
|
+
car: string;
|
|
66
|
+
cid: string;
|
|
67
|
+
/** Unix seconds the delegation expires at. */
|
|
68
|
+
exp: number;
|
|
69
|
+
}
|
|
70
|
+
/** Mint + serialize a delegation from our did:web. Always a nonce (see MintOptions.unique): two
|
|
71
|
+
* mints in one second are two credentials, never one CID. Always an `nbf` — the issue time less
|
|
72
|
+
* NBF_BACKDATE_SEC, from the same clock read as `exp` — and `exp = min(issue + ttl, nbf +
|
|
73
|
+
* maxLifetime)`: the facilitator (S10) refuses a grant without `nbf` or whose `exp − nbf` is
|
|
74
|
+
* longer than an hour. Never cache it. */
|
|
75
|
+
export declare function mintDelegation(config: Config, opts: MintDelegationOptions): Promise<MintedDelegation>;
|
|
76
|
+
/**
|
|
77
|
+
* Verify a caller-supplied owner→oracle delegation CAR before persisting it (§6): parseable, issued
|
|
78
|
+
* by `expectedIssuer` (the chain owner), addressed to OUR oracle, scoped to the claim bot, not
|
|
79
|
+
* expired — and SIGNED by that issuer (delegation-verify.ts: `parseDelegation` checks no signature,
|
|
80
|
+
* so without it any evaluate-grant holder could store a forgery naming the owner). Anything off →
|
|
81
|
+
* 400 — we never store a delegation we couldn't use or didn't get from its rightful owner; only an
|
|
82
|
+
* unreachable Blocksync is a 503. The field checks run first: they are free, and a CAR that fails
|
|
83
|
+
* them never costs a DID resolution. The returned expiry is the verified CAR's own.
|
|
84
|
+
*/
|
|
85
|
+
export declare function verifyOwnerDelegation(config: Config, car: string, expectedIssuer: string,
|
|
86
|
+
/** The issuer's keys, resolved once by a caller verifying several CARs (ucan-store.ts). */
|
|
87
|
+
issuerKeys?: () => Promise<IssuerKeys>): Promise<{
|
|
88
|
+
car: string;
|
|
89
|
+
expiresAt: Date | null;
|
|
90
|
+
}>;
|
|
91
|
+
/**
|
|
92
|
+
* Mint (and cache per (botDid, delegation)) a delegation-backed invocation for the claim bot.
|
|
93
|
+
* The `delegationCar` is the owner→oracle delegation retrieved from the UCAN Store (§3.5).
|
|
94
|
+
*/
|
|
95
|
+
export declare function mintBotInvocation(config: Config, cache: KVNamespace, botDid: string, delegationCar: string): Promise<string>;
|
|
96
|
+
//# sourceMappingURL=ucan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ucan.d.ts","sourceRoot":"","sources":["../../../src/lib/ixo/ucan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAU,MAAM,WAAW,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,OAAO,EAAE,KAAK,UAAU,EAA6B,MAAM,qBAAqB,CAAC;AAGjF,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,MAAM,CAE5E;AAmCD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,8HAA8H;IAC9H,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qGAAqG;AACrG,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkBjG;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;2CAI2C;AAC3C,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAmB3B;AAID;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM;AACtB,2FAA2F;AAC3F,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,GACrC,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,CAAC,CA0ClD;AASD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAgDjB"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minting UCAN invocations as the Evaluation Oracle.
|
|
3
|
+
*
|
|
4
|
+
* ONE key, two DIDs. `signerFromMnemonic(SERVICE_ED25519_MNEMONIC)` derives the same Ed25519 key
|
|
5
|
+
* as identity.ts (SHA256(mnemonic) → seed), so whichever DID is stamped on the signer, the key is
|
|
6
|
+
* the one `/.well-known/did.json` publishes. The DEFAULT issuer is our did:web
|
|
7
|
+
* (`did:web:<ORACLE_HOSTNAME>`, docs/ENGINE-CONTRACT.md): the engine's validator resolves it from
|
|
8
|
+
* that document, so a cloned kit needs no on-chain IID key. `ORACLE_DID` (did:ixo) is the issuer
|
|
9
|
+
* ONLY where the counterparty knows us by our chain identity: the owner→oracle delegation names it
|
|
10
|
+
* as its audience (so the bot invocation that carries it as proof must be issued by that same
|
|
11
|
+
* principal), the UCAN Store indexes our inbox by it, and the VFS matches our evaluate grant by
|
|
12
|
+
* its address. Four invocation shapes are minted (see pull-claim-spec §13, replay differs), plus
|
|
13
|
+
* one delegation:
|
|
14
|
+
*
|
|
15
|
+
* - engine invocations (lib/engine): SELF-SIGNED as did:web, resource `ixo:eval-engine`. Replay
|
|
16
|
+
* is OFF; the client reuses a token until it nears expiry.
|
|
17
|
+
* - store invocations (§3.5): SELF-SIGNED as ORACLE_DID, resource `ixo:ucan-store`. Replay is ON
|
|
18
|
+
* (single-use), so `mintInvocation` is called fresh every store request and NEVER cached.
|
|
19
|
+
* - bot invocations (§3.6): DELEGATION-BACKED (proofs:[owner→oracle]) as ORACLE_DID, resource
|
|
20
|
+
* `ixo:matrix-claims-bot`. Replay is OFF, so `mintBotInvocation` caches the token per
|
|
21
|
+
* (botDid, delegation) until it expires.
|
|
22
|
+
* - VFS claims-lane invocations (vfs.ts): SELF-SIGNED as ORACLE_DID, `fs/read` on
|
|
23
|
+
* `ixo:filesystem/<entity>/.claims/<collection>`. Replay is ON (single-use), so one is minted
|
|
24
|
+
* per request and NEVER cached.
|
|
25
|
+
* - the facilitator delegation (`mintDelegation`, routes/v1/api/admin-facilitator.ts): a
|
|
26
|
+
* DELEGATION, as did:web, to an operator's did:ixo — one `operators/<action>` per requested
|
|
27
|
+
* action on the card facilitator, never `*`. A nonce on every mint, NEVER cached: each one is a fresh short-lived credential.
|
|
28
|
+
*/
|
|
29
|
+
import { AppError } from "../errors.js";
|
|
30
|
+
import { sha256Hex } from "../hash.js";
|
|
31
|
+
import { countCache, readCache } from "../metrics.js";
|
|
32
|
+
import { verifyDelegationSignature } from "./delegation-verify.js";
|
|
33
|
+
import { webDidOf } from "./web-did.js";
|
|
34
|
+
/** `did:web:<ORACLE_HOSTNAME>` — encoded exactly as identity.ts publishes it. */
|
|
35
|
+
export function oracleWebDid(config) {
|
|
36
|
+
return webDidOf(config.ORACLE_HOSTNAME);
|
|
37
|
+
}
|
|
38
|
+
// Memoize the signer per (mnemonic, did) so we derive the Ed25519 key once per isolate per DID.
|
|
39
|
+
const signerCache = new Map();
|
|
40
|
+
function getSigner(config, did) {
|
|
41
|
+
const mnemonic = config.SERVICE_ED25519_MNEMONIC;
|
|
42
|
+
if (!mnemonic) {
|
|
43
|
+
// Loud 500 — an expected failure of config, not of the request (spec §11 row 8).
|
|
44
|
+
throw AppError.internal("Oracle signing identity not configured (SERVICE_ED25519_MNEMONIC)");
|
|
45
|
+
}
|
|
46
|
+
const key = `${did}::${mnemonic}`;
|
|
47
|
+
let signer = signerCache.get(key);
|
|
48
|
+
if (!signer) {
|
|
49
|
+
signer = (async () => {
|
|
50
|
+
const { signerFromMnemonic } = await import("@ixo/ucan");
|
|
51
|
+
// `withDID` stamps any DID on the key at runtime; only the parameter TYPE is narrower.
|
|
52
|
+
const { signer } = await signerFromMnemonic(mnemonic, did);
|
|
53
|
+
return signer;
|
|
54
|
+
})();
|
|
55
|
+
signerCache.set(key, signer);
|
|
56
|
+
// A failed derivation is not memoized: the next mint tries again instead of replaying it.
|
|
57
|
+
const pending = signer;
|
|
58
|
+
pending.catch(() => {
|
|
59
|
+
if (signerCache.get(key) === pending)
|
|
60
|
+
signerCache.delete(key);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return signer;
|
|
64
|
+
}
|
|
65
|
+
const DEFAULT_TTL_SEC = 300;
|
|
66
|
+
/** Mint + serialize a single invocation. Callers that are single-use (store) MUST NOT cache this. */
|
|
67
|
+
export async function mintInvocation(config, opts) {
|
|
68
|
+
const { createInvocation, serializeInvocation } = await import("@ixo/ucan");
|
|
69
|
+
const signer = await getSigner(config, opts.issuer ?? oracleWebDid(config));
|
|
70
|
+
const exp = Math.floor(Date.now() / 1000) + (opts.ttlSec ?? DEFAULT_TTL_SEC);
|
|
71
|
+
try {
|
|
72
|
+
const inv = await createInvocation({
|
|
73
|
+
issuer: signer,
|
|
74
|
+
audience: opts.audience,
|
|
75
|
+
capability: opts.capability,
|
|
76
|
+
proofs: opts.proofs,
|
|
77
|
+
expiration: exp,
|
|
78
|
+
// A random fact (UCAN §3.2.4) guarantees a distinct CID per mint — see MintOptions.unique.
|
|
79
|
+
...(opts.unique ? { facts: [{ nonce: crypto.randomUUID() }] } : {}),
|
|
80
|
+
});
|
|
81
|
+
return { token: await serializeInvocation(inv), exp };
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
throw AppError.internal("Failed to mint UCAN invocation", err);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** How far `nbf` is backdated: ucanto accepts only `now > nbf` (strict), so an `nbf` of the issue
|
|
88
|
+
* time is refused for the rest of that second and under any clock skew. */
|
|
89
|
+
const NBF_BACKDATE_SEC = 60;
|
|
90
|
+
/** Mint + serialize a delegation from our did:web. Always a nonce (see MintOptions.unique): two
|
|
91
|
+
* mints in one second are two credentials, never one CID. Always an `nbf` — the issue time less
|
|
92
|
+
* NBF_BACKDATE_SEC, from the same clock read as `exp` — and `exp = min(issue + ttl, nbf +
|
|
93
|
+
* maxLifetime)`: the facilitator (S10) refuses a grant without `nbf` or whose `exp − nbf` is
|
|
94
|
+
* longer than an hour. Never cache it. */
|
|
95
|
+
export async function mintDelegation(config, opts) {
|
|
96
|
+
const { createDelegation, serializeDelegation } = await import("@ixo/ucan");
|
|
97
|
+
const signer = await getSigner(config, oracleWebDid(config));
|
|
98
|
+
const issued = Math.floor(Date.now() / 1000);
|
|
99
|
+
const nbf = issued - NBF_BACKDATE_SEC;
|
|
100
|
+
const exp = Math.min(issued + opts.ttlSec, nbf + opts.maxLifetimeSec);
|
|
101
|
+
try {
|
|
102
|
+
const d = await createDelegation({
|
|
103
|
+
issuer: signer,
|
|
104
|
+
audience: opts.audience,
|
|
105
|
+
capabilities: opts.capabilities,
|
|
106
|
+
notBefore: nbf,
|
|
107
|
+
expiration: exp,
|
|
108
|
+
facts: [{ nonce: crypto.randomUUID() }],
|
|
109
|
+
});
|
|
110
|
+
return { car: await serializeDelegation(d), cid: d.cid.toString(), exp };
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
throw AppError.internal("Failed to mint UCAN delegation", err);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// --- Owner delegation verification (register-time) ----------------------------------------------
|
|
117
|
+
/**
|
|
118
|
+
* Verify a caller-supplied owner→oracle delegation CAR before persisting it (§6): parseable, issued
|
|
119
|
+
* by `expectedIssuer` (the chain owner), addressed to OUR oracle, scoped to the claim bot, not
|
|
120
|
+
* expired — and SIGNED by that issuer (delegation-verify.ts: `parseDelegation` checks no signature,
|
|
121
|
+
* so without it any evaluate-grant holder could store a forgery naming the owner). Anything off →
|
|
122
|
+
* 400 — we never store a delegation we couldn't use or didn't get from its rightful owner; only an
|
|
123
|
+
* unreachable Blocksync is a 503. The field checks run first: they are free, and a CAR that fails
|
|
124
|
+
* them never costs a DID resolution. The returned expiry is the verified CAR's own.
|
|
125
|
+
*/
|
|
126
|
+
export async function verifyOwnerDelegation(config, car, expectedIssuer,
|
|
127
|
+
/** The issuer's keys, resolved once by a caller verifying several CARs (ucan-store.ts). */
|
|
128
|
+
issuerKeys) {
|
|
129
|
+
const { ORACLE_DID } = config;
|
|
130
|
+
if (!ORACLE_DID)
|
|
131
|
+
throw AppError.internal("ORACLE_DID not configured");
|
|
132
|
+
const { parseDelegation } = await import("@ixo/ucan");
|
|
133
|
+
let d;
|
|
134
|
+
try {
|
|
135
|
+
d = (await parseDelegation(car));
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
throw AppError.badRequest("delegation is not a valid UCAN CAR", { cause: String(err) });
|
|
139
|
+
}
|
|
140
|
+
if (d.issuer?.did() !== expectedIssuer) {
|
|
141
|
+
throw AppError.badRequest("delegation must be issued by the registering wallet");
|
|
142
|
+
}
|
|
143
|
+
// A ROOT: the claim bot reads authority off the chain's root, so a proof inside would make
|
|
144
|
+
// someone other than the owner the root — whoever signed it. The portal and the CLI mint roots.
|
|
145
|
+
if (d.proofs?.length) {
|
|
146
|
+
throw AppError.badRequest("delegation must be the owner's own root delegation (no proofs)");
|
|
147
|
+
}
|
|
148
|
+
if (d.audience?.did() !== ORACLE_DID) {
|
|
149
|
+
throw AppError.badRequest("delegation must be addressed to the evaluation oracle");
|
|
150
|
+
}
|
|
151
|
+
if (!d.capabilities?.some((cap) => cap.with === CLAIM_BOT_RESOURCE)) {
|
|
152
|
+
throw AppError.badRequest(`delegation must grant the ${CLAIM_BOT_RESOURCE} resource`);
|
|
153
|
+
}
|
|
154
|
+
// No `exp` is accepted: the owner chose a delegation that never expires, and it is signed (below).
|
|
155
|
+
// It is never refreshed from the store, but it IS re-verified on use (lib/ixo/index.ts).
|
|
156
|
+
const exp = typeof d.expiration === "number" && Number.isFinite(d.expiration) ? d.expiration : null;
|
|
157
|
+
if (exp !== null && exp <= Math.floor(Date.now() / 1000)) {
|
|
158
|
+
throw AppError.badRequest("delegation is already expired");
|
|
159
|
+
}
|
|
160
|
+
await verifyDelegationSignature(config, car, expectedIssuer, issuerKeys);
|
|
161
|
+
return { car, expiresAt: exp ? new Date(exp * 1000) : null };
|
|
162
|
+
}
|
|
163
|
+
// --- Bot invocation (delegation-backed, reusable → cached) --------------------------------------
|
|
164
|
+
const CLAIM_BOT_RESOURCE = "ixo:matrix-claims-bot";
|
|
165
|
+
// Bot tokens are reusable until expiry; 1h keeps them fresh while surviving a burst of pulls.
|
|
166
|
+
const BOT_TTL_SEC = 3600;
|
|
167
|
+
const l1BotTokens = new Map();
|
|
168
|
+
/**
|
|
169
|
+
* Mint (and cache per (botDid, delegation)) a delegation-backed invocation for the claim bot.
|
|
170
|
+
* The `delegationCar` is the owner→oracle delegation retrieved from the UCAN Store (§3.5).
|
|
171
|
+
*/
|
|
172
|
+
export async function mintBotInvocation(config, cache, botDid, delegationCar) {
|
|
173
|
+
const now = Math.floor(Date.now() / 1000);
|
|
174
|
+
const cacheKey = `bot-inv:${botDid}:${await sha256Hex(delegationCar)}`;
|
|
175
|
+
const l1 = l1BotTokens.get(cacheKey);
|
|
176
|
+
countCache("bot-inv-l1", !!l1 && l1.exp - 30 > now);
|
|
177
|
+
if (l1 && l1.exp - 30 > now)
|
|
178
|
+
return l1.token;
|
|
179
|
+
const l2 = await readCache("bot-inv", () => cache.get(cacheKey, "json"));
|
|
180
|
+
if (l2 && l2.exp - 30 > now) {
|
|
181
|
+
l1BotTokens.set(cacheKey, l2);
|
|
182
|
+
return l2.token;
|
|
183
|
+
}
|
|
184
|
+
const { parseDelegation } = await import("@ixo/ucan");
|
|
185
|
+
let proof;
|
|
186
|
+
try {
|
|
187
|
+
proof = await parseDelegation(delegationCar);
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
throw AppError.internal("Owner delegation is not a valid UCAN CAR", err);
|
|
191
|
+
}
|
|
192
|
+
// An invocation must never outlive its proof: cap the token (and thus the cache) at the
|
|
193
|
+
// delegation's own expiry, so a delegation nearing its end can't leave behind a cached token the
|
|
194
|
+
// bot would reject mid-pull.
|
|
195
|
+
const proofExp = proof.expiration;
|
|
196
|
+
const ttlCap = typeof proofExp === "number" && Number.isFinite(proofExp)
|
|
197
|
+
? Math.min(BOT_TTL_SEC, proofExp - now)
|
|
198
|
+
: BOT_TTL_SEC;
|
|
199
|
+
if (ttlCap <= 30) {
|
|
200
|
+
throw AppError.forbidden("Owner delegation is expired — the owner must re-register");
|
|
201
|
+
}
|
|
202
|
+
const minted = await mintInvocation(config, {
|
|
203
|
+
// The proof's audience is ORACLE_DID — the invocation carrying it must be issued by that principal.
|
|
204
|
+
issuer: config.ORACLE_DID,
|
|
205
|
+
audience: botDid,
|
|
206
|
+
capability: { can: "*", with: CLAIM_BOT_RESOURCE },
|
|
207
|
+
proofs: [proof],
|
|
208
|
+
ttlSec: ttlCap,
|
|
209
|
+
});
|
|
210
|
+
l1BotTokens.set(cacheKey, minted);
|
|
211
|
+
await cache
|
|
212
|
+
.put(cacheKey, JSON.stringify(minted), { expirationTtl: Math.max(minted.exp - now, 60) })
|
|
213
|
+
.catch(() => { });
|
|
214
|
+
return minted.token;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=ucan.js.map
|