@vauban-org/agent-sdk 1.0.0 → 1.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/CONTRACT.md +6401 -813
- package/dist/adapters/llm/anthropic-direct.d.ts +1 -0
- package/dist/adapters/llm/anthropic-direct.d.ts.map +1 -1
- package/dist/adapters/llm/anthropic-direct.js +43 -0
- package/dist/adapters/llm/anthropic-direct.js.map +1 -1
- package/dist/adapters/llm/cascade.d.ts.map +1 -1
- package/dist/adapters/llm/cascade.js +57 -14
- package/dist/adapters/llm/cascade.js.map +1 -1
- package/dist/adapters/llm/litellm.d.ts +2 -0
- package/dist/adapters/llm/litellm.d.ts.map +1 -1
- package/dist/adapters/llm/litellm.js +44 -0
- package/dist/adapters/llm/litellm.js.map +1 -1
- package/dist/compute/difficulty-estimator.d.ts +53 -0
- package/dist/compute/difficulty-estimator.d.ts.map +1 -0
- package/dist/compute/difficulty-estimator.js +82 -0
- package/dist/compute/difficulty-estimator.js.map +1 -0
- package/dist/compute/strategies/mixture-of-agents.d.ts +40 -0
- package/dist/compute/strategies/mixture-of-agents.d.ts.map +1 -0
- package/dist/compute/strategies/mixture-of-agents.js +110 -0
- package/dist/compute/strategies/mixture-of-agents.js.map +1 -0
- package/dist/compute/strategies/tree-of-thoughts.d.ts +48 -0
- package/dist/compute/strategies/tree-of-thoughts.d.ts.map +1 -0
- package/dist/compute/strategies/tree-of-thoughts.js +242 -0
- package/dist/compute/strategies/tree-of-thoughts.js.map +1 -0
- package/dist/compute/strategies/two-phase-orient.d.ts +72 -0
- package/dist/compute/strategies/two-phase-orient.d.ts.map +1 -0
- package/dist/compute/strategies/two-phase-orient.js +85 -0
- package/dist/compute/strategies/two-phase-orient.js.map +1 -0
- package/dist/constitution/types.d.ts +10 -10
- package/dist/container/protocol.d.ts +134 -0
- package/dist/container/protocol.d.ts.map +1 -0
- package/dist/container/protocol.js +157 -0
- package/dist/container/protocol.js.map +1 -0
- package/dist/container/runtime.d.ts +140 -0
- package/dist/container/runtime.d.ts.map +1 -0
- package/dist/container/runtime.js +256 -0
- package/dist/container/runtime.js.map +1 -0
- package/dist/events/catalogue.d.ts +46 -46
- package/dist/events/schemas/agent.completed.v1.d.ts +4 -4
- package/dist/events/schemas/agent.failed.v1.d.ts +2 -2
- package/dist/events/schemas/agent.hitl_resolved.v1.d.ts +2 -2
- package/dist/events/schemas/agent.started.v1.d.ts +2 -2
- package/dist/events/schemas/brain.skill.extracted.v1.d.ts +4 -4
- package/dist/events/schemas/cc.cost.anomaly_detected.v1.d.ts +2 -2
- package/dist/events/schemas/cc.cost.recorded.v1.d.ts +4 -4
- package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts +6 -6
- package/dist/events/schemas/citadel.sprint.closed.v1.d.ts +2 -2
- package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts +6 -6
- package/dist/events/schemas/forge.lead.qualified.v1.d.ts +2 -2
- package/dist/events/schemas/forge.outreach.sent.v1.d.ts +4 -4
- package/dist/events/schemas/incident.detected.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.goal.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.tax.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts +6 -6
- package/dist/identity/agent-persona.d.ts +73 -0
- package/dist/identity/agent-persona.d.ts.map +1 -0
- package/dist/identity/agent-persona.js +165 -0
- package/dist/identity/agent-persona.js.map +1 -0
- package/dist/identity/persona-prompt.d.ts +25 -0
- package/dist/identity/persona-prompt.d.ts.map +1 -0
- package/dist/identity/persona-prompt.js +71 -0
- package/dist/identity/persona-prompt.js.map +1 -0
- package/dist/identity/persona-schema.d.ts +120 -0
- package/dist/identity/persona-schema.d.ts.map +1 -0
- package/dist/identity/persona-schema.js +103 -0
- package/dist/identity/persona-schema.js.map +1 -0
- package/dist/index.d.ts +37 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -1
- package/dist/index.js.map +1 -1
- package/dist/loop/minimal-loop.js +293 -287
- package/dist/memory/episodic-rrf.d.ts +114 -0
- package/dist/memory/episodic-rrf.d.ts.map +1 -0
- package/dist/memory/episodic-rrf.js +148 -0
- package/dist/memory/episodic-rrf.js.map +1 -0
- package/dist/mesh/attenuation.d.ts +78 -0
- package/dist/mesh/attenuation.d.ts.map +1 -0
- package/dist/mesh/attenuation.js +141 -0
- package/dist/mesh/attenuation.js.map +1 -0
- package/dist/mesh/delegate.d.ts +96 -0
- package/dist/mesh/delegate.d.ts.map +1 -0
- package/dist/mesh/delegate.js +172 -0
- package/dist/mesh/delegate.js.map +1 -0
- package/dist/mesh/dispatcher.d.ts +119 -0
- package/dist/mesh/dispatcher.d.ts.map +1 -0
- package/dist/mesh/dispatcher.js +207 -0
- package/dist/mesh/dispatcher.js.map +1 -0
- package/dist/mesh/index.d.ts +12 -0
- package/dist/mesh/index.d.ts.map +1 -0
- package/dist/mesh/index.js +11 -0
- package/dist/mesh/index.js.map +1 -0
- package/dist/mesh/types.d.ts +30 -0
- package/dist/mesh/types.d.ts.map +1 -0
- package/dist/mesh/types.js +11 -0
- package/dist/mesh/types.js.map +1 -0
- package/dist/orchestration/ooda/skills.d.ts +104 -0
- package/dist/orchestration/ooda/skills.d.ts.map +1 -1
- package/dist/orchestration/ooda/skills.js +106 -0
- package/dist/orchestration/ooda/skills.js.map +1 -1
- package/dist/ports/bastion-action.contract.test.d.ts +11 -0
- package/dist/ports/bastion-action.contract.test.d.ts.map +1 -0
- package/dist/ports/bastion-action.contract.test.js +238 -0
- package/dist/ports/bastion-action.contract.test.js.map +1 -0
- package/dist/ports/bastion-action.d.ts +133 -0
- package/dist/ports/bastion-action.d.ts.map +1 -0
- package/dist/ports/bastion-action.js +73 -0
- package/dist/ports/bastion-action.js.map +1 -0
- package/dist/ports/brain.d.ts +31 -0
- package/dist/ports/brain.d.ts.map +1 -1
- package/dist/ports/brain.js +115 -1
- package/dist/ports/brain.js.map +1 -1
- package/dist/ports/citadel-action.contract.test.d.ts +11 -0
- package/dist/ports/citadel-action.contract.test.d.ts.map +1 -0
- package/dist/ports/citadel-action.contract.test.js +317 -0
- package/dist/ports/citadel-action.contract.test.js.map +1 -0
- package/dist/ports/citadel-action.d.ts +111 -0
- package/dist/ports/citadel-action.d.ts.map +1 -0
- package/dist/ports/citadel-action.js +62 -0
- package/dist/ports/citadel-action.js.map +1 -0
- package/dist/ports/compliance-contract.d.ts +123 -0
- package/dist/ports/compliance-contract.d.ts.map +1 -0
- package/dist/ports/compliance-contract.js +35 -0
- package/dist/ports/compliance-contract.js.map +1 -0
- package/dist/ports/db.d.ts +38 -0
- package/dist/ports/db.d.ts.map +1 -1
- package/dist/ports/db.js +88 -1
- package/dist/ports/db.js.map +1 -1
- package/dist/ports/delegation.contract.test.d.ts +9 -0
- package/dist/ports/delegation.contract.test.d.ts.map +1 -0
- package/dist/ports/delegation.contract.test.js +337 -0
- package/dist/ports/delegation.contract.test.js.map +1 -0
- package/dist/ports/delegation.d.ts +134 -0
- package/dist/ports/delegation.d.ts.map +1 -0
- package/dist/ports/delegation.js +105 -0
- package/dist/ports/delegation.js.map +1 -0
- package/dist/ports/event-bus.d.ts +29 -0
- package/dist/ports/event-bus.d.ts.map +1 -1
- package/dist/ports/event-bus.js +106 -1
- package/dist/ports/event-bus.js.map +1 -1
- package/dist/ports/federation.contract.test.d.ts +9 -0
- package/dist/ports/federation.contract.test.d.ts.map +1 -0
- package/dist/ports/federation.contract.test.js +279 -0
- package/dist/ports/federation.contract.test.js.map +1 -0
- package/dist/ports/federation.d.ts +140 -0
- package/dist/ports/federation.d.ts.map +1 -0
- package/dist/ports/federation.js +57 -0
- package/dist/ports/federation.js.map +1 -0
- package/dist/ports/index.d.ts +28 -2
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +17 -2
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/llm-provider.d.ts +37 -0
- package/dist/ports/llm-provider.d.ts.map +1 -1
- package/dist/ports/llm-provider.js +99 -1
- package/dist/ports/llm-provider.js.map +1 -1
- package/dist/ports/logger.d.ts +27 -0
- package/dist/ports/logger.d.ts.map +1 -1
- package/dist/ports/logger.js +87 -0
- package/dist/ports/logger.js.map +1 -1
- package/dist/ports/manifest-registry.contract.test.d.ts +9 -0
- package/dist/ports/manifest-registry.contract.test.d.ts.map +1 -0
- package/dist/ports/manifest-registry.contract.test.js +246 -0
- package/dist/ports/manifest-registry.contract.test.js.map +1 -0
- package/dist/ports/manifest-registry.d.ts +116 -0
- package/dist/ports/manifest-registry.d.ts.map +1 -0
- package/dist/ports/manifest-registry.js +79 -0
- package/dist/ports/manifest-registry.js.map +1 -0
- package/dist/ports/observability.contract.test.d.ts +12 -0
- package/dist/ports/observability.contract.test.d.ts.map +1 -0
- package/dist/ports/observability.contract.test.js +260 -0
- package/dist/ports/observability.contract.test.js.map +1 -0
- package/dist/ports/observability.d.ts +98 -0
- package/dist/ports/observability.d.ts.map +1 -0
- package/dist/ports/observability.js +59 -0
- package/dist/ports/observability.js.map +1 -0
- package/dist/ports/outcome.d.ts +26 -0
- package/dist/ports/outcome.d.ts.map +1 -1
- package/dist/ports/outcome.js +62 -1
- package/dist/ports/outcome.js.map +1 -1
- package/dist/ports/privacy.contract.test.d.ts +12 -0
- package/dist/ports/privacy.contract.test.d.ts.map +1 -0
- package/dist/ports/privacy.contract.test.js +325 -0
- package/dist/ports/privacy.contract.test.js.map +1 -0
- package/dist/ports/privacy.d.ts +132 -0
- package/dist/ports/privacy.d.ts.map +1 -0
- package/dist/ports/privacy.js +83 -0
- package/dist/ports/privacy.js.map +1 -0
- package/dist/ports/tenant-context.contract.test.d.ts +14 -0
- package/dist/ports/tenant-context.contract.test.d.ts.map +1 -0
- package/dist/ports/tenant-context.contract.test.js +352 -0
- package/dist/ports/tenant-context.contract.test.js.map +1 -0
- package/dist/ports/tenant-context.d.ts +103 -0
- package/dist/ports/tenant-context.d.ts.map +1 -0
- package/dist/ports/tenant-context.js +48 -0
- package/dist/ports/tenant-context.js.map +1 -0
- package/dist/ports/vauban-finance-action.contract.test.d.ts +11 -0
- package/dist/ports/vauban-finance-action.contract.test.d.ts.map +1 -0
- package/dist/ports/vauban-finance-action.contract.test.js +260 -0
- package/dist/ports/vauban-finance-action.contract.test.js.map +1 -0
- package/dist/ports/vauban-finance-action.d.ts +106 -0
- package/dist/ports/vauban-finance-action.d.ts.map +1 -0
- package/dist/ports/vauban-finance-action.js +60 -0
- package/dist/ports/vauban-finance-action.js.map +1 -0
- package/dist/ports/workflow-runtime.d.ts +204 -0
- package/dist/ports/workflow-runtime.d.ts.map +1 -0
- package/dist/ports/workflow-runtime.js +72 -0
- package/dist/ports/workflow-runtime.js.map +1 -0
- package/dist/proof/cert-verify.d.ts +80 -0
- package/dist/proof/cert-verify.d.ts.map +1 -0
- package/dist/proof/cert-verify.js +178 -0
- package/dist/proof/cert-verify.js.map +1 -0
- package/dist/replay/replay.d.ts.map +1 -1
- package/dist/replay/replay.js +5 -1
- package/dist/replay/replay.js.map +1 -1
- package/dist/retry/index.d.ts +129 -0
- package/dist/retry/index.d.ts.map +1 -0
- package/dist/retry/index.js +156 -0
- package/dist/retry/index.js.map +1 -0
- package/dist/retry/presets.d.ts +39 -0
- package/dist/retry/presets.d.ts.map +1 -0
- package/dist/retry/presets.js +69 -0
- package/dist/retry/presets.js.map +1 -0
- package/dist/skill-loop/ab-runner.d.ts +67 -0
- package/dist/skill-loop/ab-runner.d.ts.map +1 -0
- package/dist/skill-loop/ab-runner.js +160 -0
- package/dist/skill-loop/ab-runner.js.map +1 -0
- package/dist/skill-loop/adoption.d.ts +67 -0
- package/dist/skill-loop/adoption.d.ts.map +1 -0
- package/dist/skill-loop/adoption.js +126 -0
- package/dist/skill-loop/adoption.js.map +1 -0
- package/dist/skill-loop/candidate.d.ts +45 -0
- package/dist/skill-loop/candidate.d.ts.map +1 -0
- package/dist/skill-loop/candidate.js +43 -0
- package/dist/skill-loop/candidate.js.map +1 -0
- package/dist/skill-loop/evaluator.d.ts +42 -0
- package/dist/skill-loop/evaluator.d.ts.map +1 -0
- package/dist/skill-loop/evaluator.js +184 -0
- package/dist/skill-loop/evaluator.js.map +1 -0
- package/dist/skill-loop/index.d.ts +27 -0
- package/dist/skill-loop/index.d.ts.map +1 -0
- package/dist/skill-loop/index.js +27 -0
- package/dist/skill-loop/index.js.map +1 -0
- package/dist/skill-loop/reflexion-replay.d.ts +87 -0
- package/dist/skill-loop/reflexion-replay.d.ts.map +1 -0
- package/dist/skill-loop/reflexion-replay.js +110 -0
- package/dist/skill-loop/reflexion-replay.js.map +1 -0
- package/dist/skill-loop/sign-off.d.ts +88 -0
- package/dist/skill-loop/sign-off.d.ts.map +1 -0
- package/dist/skill-loop/sign-off.js +146 -0
- package/dist/skill-loop/sign-off.js.map +1 -0
- package/dist/skill-loop/value-metric.d.ts +55 -0
- package/dist/skill-loop/value-metric.d.ts.map +1 -0
- package/dist/skill-loop/value-metric.js +69 -0
- package/dist/skill-loop/value-metric.js.map +1 -0
- package/dist/skill-loop/versioning.d.ts +36 -0
- package/dist/skill-loop/versioning.d.ts.map +1 -0
- package/dist/skill-loop/versioning.js +47 -0
- package/dist/skill-loop/versioning.js.map +1 -0
- package/dist/skill-manifest/anchor.d.ts +91 -0
- package/dist/skill-manifest/anchor.d.ts.map +1 -0
- package/dist/skill-manifest/anchor.js +331 -0
- package/dist/skill-manifest/anchor.js.map +1 -0
- package/dist/skill-manifest/builder.d.ts +47 -0
- package/dist/skill-manifest/builder.d.ts.map +1 -0
- package/dist/skill-manifest/builder.js +93 -0
- package/dist/skill-manifest/builder.js.map +1 -0
- package/dist/skill-manifest/index.d.ts +13 -0
- package/dist/skill-manifest/index.d.ts.map +1 -0
- package/dist/skill-manifest/index.js +9 -0
- package/dist/skill-manifest/index.js.map +1 -0
- package/dist/skill-manifest/types.d.ts +67 -0
- package/dist/skill-manifest/types.d.ts.map +1 -0
- package/dist/skill-manifest/types.js +16 -0
- package/dist/skill-manifest/types.js.map +1 -0
- package/dist/skill-manifest/verifier.d.ts +42 -0
- package/dist/skill-manifest/verifier.d.ts.map +1 -0
- package/dist/skill-manifest/verifier.js +136 -0
- package/dist/skill-manifest/verifier.js.map +1 -0
- package/dist/skills/brain-query.d.ts +4 -4
- package/dist/skills/brain-store.d.ts +6 -6
- package/dist/skills/errors.d.ts +15 -0
- package/dist/skills/errors.d.ts.map +1 -1
- package/dist/skills/errors.js +21 -0
- package/dist/skills/errors.js.map +1 -1
- package/dist/skills/hitl-request.d.ts +2 -2
- package/dist/skills/index.d.ts +3 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +4 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/markdown/loader.d.ts +52 -0
- package/dist/skills/markdown/loader.d.ts.map +1 -0
- package/dist/skills/markdown/loader.js +93 -0
- package/dist/skills/markdown/loader.js.map +1 -0
- package/dist/skills/markdown/schema.d.ts +432 -0
- package/dist/skills/markdown/schema.d.ts.map +1 -0
- package/dist/skills/markdown/schema.js +121 -0
- package/dist/skills/markdown/schema.js.map +1 -0
- package/dist/skills/poc-md-loader/markdown-loader.d.ts +77 -0
- package/dist/skills/poc-md-loader/markdown-loader.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/markdown-loader.js +125 -0
- package/dist/skills/poc-md-loader/markdown-loader.js.map +1 -0
- package/dist/skills/poc-md-loader/runner.d.ts +24 -0
- package/dist/skills/poc-md-loader/runner.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/runner.js +57 -0
- package/dist/skills/poc-md-loader/runner.js.map +1 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.d.ts +3 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.js +13 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.js.map +1 -0
- package/dist/skills/poc-md-loader/web-search/script.d.ts +33 -0
- package/dist/skills/poc-md-loader/web-search/script.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/web-search/script.js +75 -0
- package/dist/skills/poc-md-loader/web-search/script.js.map +1 -0
- package/dist/skills/record-outcome.d.ts +4 -4
- package/dist/skills/send-email.d.ts.map +1 -1
- package/dist/skills/send-email.js +15 -3
- package/dist/skills/send-email.js.map +1 -1
- package/dist/skills/slack-notify.d.ts +4 -4
- package/dist/skills/starknet-balance.d.ts +1 -1
- package/dist/skills/telegram-notify.d.ts +4 -4
- package/dist/skills/web-search.d.ts +1 -1
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/test-brain-port.d.ts +4 -0
- package/dist/testing/test-brain-port.d.ts.map +1 -1
- package/dist/testing/test-brain-port.js +75 -20
- package/dist/testing/test-brain-port.js.map +1 -1
- package/dist/testing/test-event-bus.d.ts.map +1 -1
- package/dist/testing/test-event-bus.js +89 -36
- package/dist/testing/test-event-bus.js.map +1 -1
- package/dist/trace/schema.d.ts +1 -1
- package/dist/trace/schema.d.ts.map +1 -1
- package/dist/trace/schema.js +1 -1
- package/dist/trace/schema.js.map +1 -1
- package/dist/verify/formal/index.d.ts +44 -0
- package/dist/verify/formal/index.d.ts.map +1 -0
- package/dist/verify/formal/index.js +98 -0
- package/dist/verify/formal/index.js.map +1 -0
- package/dist/verify/formal/policy.d.ts +105 -0
- package/dist/verify/formal/policy.d.ts.map +1 -0
- package/dist/verify/formal/policy.js +159 -0
- package/dist/verify/formal/policy.js.map +1 -0
- package/dist/verify/formal/result.d.ts +50 -0
- package/dist/verify/formal/result.d.ts.map +1 -0
- package/dist/verify/formal/result.js +21 -0
- package/dist/verify/formal/result.js.map +1 -0
- package/dist/verify/formal/solver.d.ts +67 -0
- package/dist/verify/formal/solver.d.ts.map +1 -0
- package/dist/verify/formal/solver.js +184 -0
- package/dist/verify/formal/solver.js.map +1 -0
- package/dist/verify/formal/spec-language.d.ts +80 -0
- package/dist/verify/formal/spec-language.d.ts.map +1 -0
- package/dist/verify/formal/spec-language.js +219 -0
- package/dist/verify/formal/spec-language.js.map +1 -0
- package/docs/attestation.md +199 -0
- package/docs/identity.md +193 -0
- package/package.json +34 -17
- package/src/adapters/llm/anthropic-direct.ts +51 -0
- package/src/adapters/llm/cascade.ts +64 -19
- package/src/adapters/llm/litellm.ts +49 -0
- package/src/compute/difficulty-estimator.ts +111 -0
- package/src/compute/strategies/mixture-of-agents.ts +150 -0
- package/src/compute/strategies/tree-of-thoughts.ts +293 -0
- package/src/compute/strategies/two-phase-orient.ts +147 -0
- package/src/container/protocol.ts +243 -0
- package/src/container/runtime.ts +424 -0
- package/src/db/migrations/026_formal_verify_results.sql +30 -0
- package/src/identity/agent-persona.ts +203 -0
- package/src/identity/persona-prompt.ts +84 -0
- package/src/identity/persona-schema.ts +127 -0
- package/src/index.ts +338 -1
- package/src/memory/episodic-rrf.ts +224 -0
- package/src/mesh/attenuation.ts +190 -0
- package/src/mesh/delegate.ts +254 -0
- package/src/mesh/dispatcher.ts +301 -0
- package/src/mesh/index.ts +39 -0
- package/src/mesh/types.ts +31 -0
- package/src/orchestration/ooda/skills.ts +177 -0
- package/src/ports/bastion-action.contract.test.ts +355 -0
- package/src/ports/bastion-action.ts +198 -0
- package/src/ports/brain.ts +177 -15
- package/src/ports/citadel-action.contract.test.ts +430 -0
- package/src/ports/citadel-action.ts +174 -0
- package/src/ports/compliance-contract.ts +191 -0
- package/src/ports/db.ts +98 -0
- package/src/ports/delegation.contract.test.ts +428 -0
- package/src/ports/delegation.ts +211 -0
- package/src/ports/event-bus.ts +133 -0
- package/src/ports/federation.contract.test.ts +355 -0
- package/src/ports/federation.ts +190 -0
- package/src/ports/index.ts +186 -1
- package/src/ports/llm-provider.ts +123 -0
- package/src/ports/logger.ts +104 -0
- package/src/ports/manifest-registry.contract.test.ts +324 -0
- package/src/ports/manifest-registry.ts +188 -0
- package/src/ports/observability.contract.test.ts +315 -0
- package/src/ports/observability.ts +150 -0
- package/src/ports/outcome.ts +69 -0
- package/src/ports/privacy.contract.test.ts +413 -0
- package/src/ports/privacy.ts +207 -0
- package/src/ports/tenant-context.contract.test.ts +454 -0
- package/src/ports/tenant-context.ts +150 -0
- package/src/ports/vauban-finance-action.contract.test.ts +335 -0
- package/src/ports/vauban-finance-action.ts +166 -0
- package/src/ports/workflow-runtime.ts +327 -0
- package/src/proof/cert-verify.ts +249 -0
- package/src/replay/replay.ts +11 -8
- package/src/retry/index.ts +227 -0
- package/src/retry/presets.ts +75 -0
- package/src/skill-loop/ab-runner.ts +196 -0
- package/src/skill-loop/adoption.ts +188 -0
- package/src/skill-loop/candidate.ts +75 -0
- package/src/skill-loop/evaluator.ts +238 -0
- package/src/skill-loop/index.ts +51 -0
- package/src/skill-loop/reflexion-replay.ts +173 -0
- package/src/skill-loop/sign-off.ts +247 -0
- package/src/skill-loop/value-metric.ts +120 -0
- package/src/skill-loop/versioning.ts +75 -0
- package/src/skill-manifest/anchor.ts +401 -0
- package/src/skill-manifest/builder.ts +129 -0
- package/src/skill-manifest/index.ts +18 -0
- package/src/skill-manifest/types.ts +72 -0
- package/src/skill-manifest/verifier.ts +198 -0
- package/src/skills/errors.ts +30 -2
- package/src/skills/index.ts +19 -0
- package/src/skills/markdown/loader.ts +129 -0
- package/src/skills/markdown/schema.ts +144 -0
- package/src/skills/poc-md-loader/e2e-parity.test.ts +237 -0
- package/src/skills/poc-md-loader/markdown-loader.ts +161 -0
- package/src/skills/poc-md-loader/runner.ts +82 -0
- package/src/skills/poc-md-loader/vitest.poc.config.ts +13 -0
- package/src/skills/poc-md-loader/web-search/SKILL.md +42 -0
- package/src/skills/poc-md-loader/web-search/script.ts +109 -0
- package/src/skills/send-email.ts +15 -3
- package/src/testing/test-brain-port.ts +98 -24
- package/src/testing/test-event-bus.ts +104 -43
- package/src/trace/schema.ts +1 -1
- package/src/verify/formal/index.ts +154 -0
- package/src/verify/formal/policy.ts +253 -0
- package/src/verify/formal/result.ts +52 -0
- package/src/verify/formal/solver.ts +235 -0
- package/src/verify/formal/spec-language.ts +274 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-runtime.d.ts","sourceRoot":"","sources":["../../src/ports/workflow-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkflowRuntimePort — durable workflow execution port (S3 spec).
|
|
3
|
+
*
|
|
4
|
+
* Defines: 9-state machine, journal invariants I-S3-1..8, replay determinism,
|
|
5
|
+
* ctx.* primitives, lease takeover pattern, handler versioning.
|
|
6
|
+
*
|
|
7
|
+
* Default adapter: DBOSWorkflowAdapter (DBOS-TS Apache 2.0, Postgres-native).
|
|
8
|
+
* Swap-able to Temporal/Restate via this port + test contract T-S3-1..12.
|
|
9
|
+
*/
|
|
10
|
+
// ─── Typed errors ─────────────────────────────────────────────────────────────
|
|
11
|
+
export class WorkflowNotFoundError extends Error {
|
|
12
|
+
runId;
|
|
13
|
+
constructor(runId) {
|
|
14
|
+
super(`Workflow run not found: ${runId}`);
|
|
15
|
+
this.runId = runId;
|
|
16
|
+
this.name = "WorkflowNotFoundError";
|
|
17
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class WorkflowNonDeterminismError extends Error {
|
|
21
|
+
runId;
|
|
22
|
+
stepIndex;
|
|
23
|
+
expected;
|
|
24
|
+
actual;
|
|
25
|
+
constructor(runId, stepIndex, expected, actual) {
|
|
26
|
+
super(`Non-determinism at step ${stepIndex}: expected ${expected}, got ${actual} (run=${runId})`);
|
|
27
|
+
this.runId = runId;
|
|
28
|
+
this.stepIndex = stepIndex;
|
|
29
|
+
this.expected = expected;
|
|
30
|
+
this.actual = actual;
|
|
31
|
+
this.name = "WorkflowNonDeterminismError";
|
|
32
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class WorkflowSignalTimeoutError extends Error {
|
|
36
|
+
runId;
|
|
37
|
+
signalName;
|
|
38
|
+
timeoutMs;
|
|
39
|
+
constructor(runId, signalName, timeoutMs) {
|
|
40
|
+
super(`Signal '${signalName}' timeout after ${timeoutMs}ms (run=${runId})`);
|
|
41
|
+
this.runId = runId;
|
|
42
|
+
this.signalName = signalName;
|
|
43
|
+
this.timeoutMs = timeoutMs;
|
|
44
|
+
this.name = "WorkflowSignalTimeoutError";
|
|
45
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export class WorkflowLeaseConflictError extends Error {
|
|
49
|
+
runId;
|
|
50
|
+
currentOwner;
|
|
51
|
+
constructor(runId, currentOwner) {
|
|
52
|
+
super(`Cannot acquire lease for run ${runId}: held by ${currentOwner}`);
|
|
53
|
+
this.runId = runId;
|
|
54
|
+
this.currentOwner = currentOwner;
|
|
55
|
+
this.name = "WorkflowLeaseConflictError";
|
|
56
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export class WorkflowVersionMismatchError extends Error {
|
|
60
|
+
runId;
|
|
61
|
+
expected;
|
|
62
|
+
actual;
|
|
63
|
+
constructor(runId, expected, actual) {
|
|
64
|
+
super(`Version mismatch for run ${runId}: expected ${expected}, got ${actual}`);
|
|
65
|
+
this.runId = runId;
|
|
66
|
+
this.expected = expected;
|
|
67
|
+
this.actual = actual;
|
|
68
|
+
this.name = "WorkflowVersionMismatchError";
|
|
69
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=workflow-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-runtime.js","sourceRoot":"","sources":["../../src/ports/workflow-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkQH,iFAAiF;AAEjF,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAClB;IAA5B,YAA4B,KAAa;QACvC,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;QADhB,UAAK,GAAL,KAAK,CAAQ;QAEvC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAElC;IACA;IACA;IACA;IAJlB,YACkB,KAAa,EACb,SAAiB,EACjB,QAAgB,EAChB,MAAc;QAE9B,KAAK,CACH,2BAA2B,SAAS,cAAc,QAAQ,SAAS,MAAM,SAAS,KAAK,GAAG,CAC3F,CAAC;QAPc,UAAK,GAAL,KAAK,CAAQ;QACb,cAAS,GAAT,SAAS,CAAQ;QACjB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;QAK9B,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC1C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAEjC;IACA;IACA;IAHlB,YACkB,KAAa,EACb,UAAkB,EAClB,SAAiB;QAEjC,KAAK,CAAC,WAAW,UAAU,mBAAmB,SAAS,WAAW,KAAK,GAAG,CAAC,CAAC;QAJ5D,UAAK,GAAL,KAAK,CAAQ;QACb,eAAU,GAAV,UAAU,CAAQ;QAClB,cAAS,GAAT,SAAS,CAAQ;QAGjC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAEjC;IACA;IAFlB,YACkB,KAAa,EACb,YAAoB;QAEpC,KAAK,CAAC,gCAAgC,KAAK,aAAa,YAAY,EAAE,CAAC,CAAC;QAHxD,UAAK,GAAL,KAAK,CAAQ;QACb,iBAAY,GAAZ,YAAY,CAAQ;QAGpC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAEnC;IACA;IACA;IAHlB,YACkB,KAAa,EACb,QAAgB,EAChB,MAAc;QAE9B,KAAK,CACH,4BAA4B,KAAK,cAAc,QAAQ,SAAS,MAAM,EAAE,CACzE,CAAC;QANc,UAAK,GAAL,KAAK,CAAQ;QACb,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;QAK9B,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Certificate verifier — standalone surface for external clients (CLI, dashboards).
|
|
3
|
+
*
|
|
4
|
+
* This module is the **single source of truth** for offline verification of a
|
|
5
|
+
* `SignedRunProofCertificate`. The CC server (`src/proof/ed25519-{signer,verifier}.ts`)
|
|
6
|
+
* holds the signing side (DB-coupled assembly + signing); this module holds the
|
|
7
|
+
* verification side, which is intentionally dependency-free (no DB, no MCP).
|
|
8
|
+
*
|
|
9
|
+
* Pipeline (mirrors server signer):
|
|
10
|
+
* 1. Strip embedded `signature` field
|
|
11
|
+
* 2. JCS-canonicalize (RFC 8785 subset: sorted keys, -0 → 0)
|
|
12
|
+
* 3. SHA-256 → first 31 bytes → felt252-safe
|
|
13
|
+
* 4. Poseidon([0x1, sha_felt, CERT_MARKER_FELT]) → cert_hash_felt252
|
|
14
|
+
* 5. Felt → 32-byte buffer → Ed25519 verify
|
|
15
|
+
*
|
|
16
|
+
* Domain separator: `CERT_MARKER_FELT` = UTF-8 "run_cert" felt252 (right-aligned).
|
|
17
|
+
*
|
|
18
|
+
* @see ../../../src/proof/ed25519-signer.ts (signer, CC server)
|
|
19
|
+
* @see docs/ietf/draft-vauban-skill-attestation-00.md (RFC profile)
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
import { type KeyObject } from "node:crypto";
|
|
23
|
+
/**
|
|
24
|
+
* Ed25519 signature payload embedded in `SignedRunProofCertificate`.
|
|
25
|
+
* Mirrors the server-side `SignaturePayload` (single field schema).
|
|
26
|
+
*/
|
|
27
|
+
export interface SignaturePayload {
|
|
28
|
+
alg: "Ed25519";
|
|
29
|
+
kid: string;
|
|
30
|
+
value: string;
|
|
31
|
+
pubkey_spki_b64: string;
|
|
32
|
+
cert_hash_felt252: string;
|
|
33
|
+
signed_at: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A `SignedRunProofCertificate` for verification purposes — only the fields
|
|
37
|
+
* the verifier touches are typed. The cert may carry additional fields
|
|
38
|
+
* (decision_chain, merkle_root, etc.) which the verifier preserves but does
|
|
39
|
+
* not inspect.
|
|
40
|
+
*/
|
|
41
|
+
export interface SignedRunProofCertificateLike {
|
|
42
|
+
signature?: SignaturePayload;
|
|
43
|
+
[key: string]: unknown;
|
|
44
|
+
}
|
|
45
|
+
export type CertVerifyFailReason = "missing_signature" | "wrong_alg" | "hash_mismatch" | "pubkey_unresolvable" | "kid_mismatch" | "signature_invalid" | "malformed_signature";
|
|
46
|
+
export interface CertVerifyResult {
|
|
47
|
+
valid: boolean;
|
|
48
|
+
reason?: CertVerifyFailReason;
|
|
49
|
+
details?: string;
|
|
50
|
+
recomputed_cert_hash_felt252: string;
|
|
51
|
+
}
|
|
52
|
+
export interface CertVerifyOptions {
|
|
53
|
+
expectedPublicKey?: KeyObject;
|
|
54
|
+
expectedKid?: string;
|
|
55
|
+
}
|
|
56
|
+
/** Domain separator: UTF-8 "run_cert" → felt252 right-aligned, zero-padded. */
|
|
57
|
+
export declare const CERT_MARKER_FELT: string;
|
|
58
|
+
/**
|
|
59
|
+
* Compute the felt252 hash that Ed25519 signs over for a Run Certificate.
|
|
60
|
+
* Strips any embedded `signature` field before hashing — verification is
|
|
61
|
+
* idempotent.
|
|
62
|
+
*/
|
|
63
|
+
export declare function computeCertHashFelt252(cert: SignedRunProofCertificateLike): string;
|
|
64
|
+
/**
|
|
65
|
+
* Reconstruct an Ed25519 `KeyObject` from base64 SPKI DER (as embedded in
|
|
66
|
+
* `signature.pubkey_spki_b64`).
|
|
67
|
+
*
|
|
68
|
+
* @throws if base64 is malformed or the key is not Ed25519.
|
|
69
|
+
*/
|
|
70
|
+
export declare function publicKeyFromSpkiB64(pubkeySpkiB64: string): KeyObject;
|
|
71
|
+
/**
|
|
72
|
+
* Verify a signed Run Certificate. Returns a structured result — never throws
|
|
73
|
+
* on verification failure (only on malformed input).
|
|
74
|
+
*
|
|
75
|
+
* The 7 possible failure reasons are typed via `CertVerifyFailReason` so callers
|
|
76
|
+
* can branch precisely. `recomputed_cert_hash_felt252` is always returned for
|
|
77
|
+
* audit trail / debug inspection.
|
|
78
|
+
*/
|
|
79
|
+
export declare function verifyRunCertificate(cert: SignedRunProofCertificateLike, opts?: CertVerifyOptions): CertVerifyResult;
|
|
80
|
+
//# sourceMappingURL=cert-verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cert-verify.d.ts","sourceRoot":"","sources":["../../src/proof/cert-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AAKrB;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,SAAS,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,6BAA6B;IAC5C,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAE7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,oBAAoB,GAC5B,mBAAmB,GACnB,WAAW,GACX,eAAe,GACf,qBAAqB,GACrB,cAAc,GACd,mBAAmB,GACnB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,MAC2C,CAAC;AAiC3E;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,6BAA6B,GAClC,MAAM,CAOR;AAID;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAYrE;AAID;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,6BAA6B,EACnC,IAAI,GAAE,iBAAsB,GAC3B,gBAAgB,CAkFlB"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Certificate verifier — standalone surface for external clients (CLI, dashboards).
|
|
3
|
+
*
|
|
4
|
+
* This module is the **single source of truth** for offline verification of a
|
|
5
|
+
* `SignedRunProofCertificate`. The CC server (`src/proof/ed25519-{signer,verifier}.ts`)
|
|
6
|
+
* holds the signing side (DB-coupled assembly + signing); this module holds the
|
|
7
|
+
* verification side, which is intentionally dependency-free (no DB, no MCP).
|
|
8
|
+
*
|
|
9
|
+
* Pipeline (mirrors server signer):
|
|
10
|
+
* 1. Strip embedded `signature` field
|
|
11
|
+
* 2. JCS-canonicalize (RFC 8785 subset: sorted keys, -0 → 0)
|
|
12
|
+
* 3. SHA-256 → first 31 bytes → felt252-safe
|
|
13
|
+
* 4. Poseidon([0x1, sha_felt, CERT_MARKER_FELT]) → cert_hash_felt252
|
|
14
|
+
* 5. Felt → 32-byte buffer → Ed25519 verify
|
|
15
|
+
*
|
|
16
|
+
* Domain separator: `CERT_MARKER_FELT` = UTF-8 "run_cert" felt252 (right-aligned).
|
|
17
|
+
*
|
|
18
|
+
* @see ../../../src/proof/ed25519-signer.ts (signer, CC server)
|
|
19
|
+
* @see docs/ietf/draft-vauban-skill-attestation-00.md (RFC profile)
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
import { createHash, createPublicKey, verify as cryptoVerify, } from "node:crypto";
|
|
23
|
+
import { hash } from "starknet";
|
|
24
|
+
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
25
|
+
/** Domain separator: UTF-8 "run_cert" → felt252 right-aligned, zero-padded. */
|
|
26
|
+
export const CERT_MARKER_FELT = "0x" + Buffer.from("run_cert", "utf8").toString("hex").padStart(62, "0");
|
|
27
|
+
// ─── JCS canonicalization (RFC 8785 subset) ──────────────────────────────────
|
|
28
|
+
function normalizeValue(value) {
|
|
29
|
+
if (value === null)
|
|
30
|
+
return null;
|
|
31
|
+
if (typeof value === "number") {
|
|
32
|
+
if (Object.is(value, -0))
|
|
33
|
+
return 0;
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
if (Array.isArray(value))
|
|
37
|
+
return value.map(normalizeValue);
|
|
38
|
+
if (typeof value === "object") {
|
|
39
|
+
const obj = value;
|
|
40
|
+
const sorted = {};
|
|
41
|
+
for (const key of Object.keys(obj).sort()) {
|
|
42
|
+
sorted[key] = normalizeValue(obj[key]);
|
|
43
|
+
}
|
|
44
|
+
return sorted;
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
function canonicalizeJcs(data) {
|
|
49
|
+
return JSON.stringify(normalizeValue(data));
|
|
50
|
+
}
|
|
51
|
+
// ─── Felt helpers ─────────────────────────────────────────────────────────────
|
|
52
|
+
function felt252ToBytes(felt) {
|
|
53
|
+
const hex = felt.replace(/^0x/, "").padStart(64, "0");
|
|
54
|
+
return Buffer.from(hex, "hex");
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Compute the felt252 hash that Ed25519 signs over for a Run Certificate.
|
|
58
|
+
* Strips any embedded `signature` field before hashing — verification is
|
|
59
|
+
* idempotent.
|
|
60
|
+
*/
|
|
61
|
+
export function computeCertHashFelt252(cert) {
|
|
62
|
+
const { signature: _stripped, ...unsigned } = cert;
|
|
63
|
+
void _stripped;
|
|
64
|
+
const canonical = canonicalizeJcs(unsigned);
|
|
65
|
+
const sha = createHash("sha256").update(canonical, "utf8").digest("hex");
|
|
66
|
+
const shaFelt = "0x" + sha.substring(0, 62);
|
|
67
|
+
return hash.computePoseidonHashOnElements(["0x1", shaFelt, CERT_MARKER_FELT]);
|
|
68
|
+
}
|
|
69
|
+
// ─── Public-key reconstruction ────────────────────────────────────────────────
|
|
70
|
+
/**
|
|
71
|
+
* Reconstruct an Ed25519 `KeyObject` from base64 SPKI DER (as embedded in
|
|
72
|
+
* `signature.pubkey_spki_b64`).
|
|
73
|
+
*
|
|
74
|
+
* @throws if base64 is malformed or the key is not Ed25519.
|
|
75
|
+
*/
|
|
76
|
+
export function publicKeyFromSpkiB64(pubkeySpkiB64) {
|
|
77
|
+
const der = Buffer.from(pubkeySpkiB64, "base64");
|
|
78
|
+
if (der.length === 0) {
|
|
79
|
+
throw new Error("[cert-verify] empty SPKI buffer");
|
|
80
|
+
}
|
|
81
|
+
const key = createPublicKey({ key: der, format: "der", type: "spki" });
|
|
82
|
+
if (key.asymmetricKeyType !== "ed25519") {
|
|
83
|
+
throw new Error(`[cert-verify] SPKI is not Ed25519 (got ${key.asymmetricKeyType})`);
|
|
84
|
+
}
|
|
85
|
+
return key;
|
|
86
|
+
}
|
|
87
|
+
// ─── Verifier ─────────────────────────────────────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* Verify a signed Run Certificate. Returns a structured result — never throws
|
|
90
|
+
* on verification failure (only on malformed input).
|
|
91
|
+
*
|
|
92
|
+
* The 7 possible failure reasons are typed via `CertVerifyFailReason` so callers
|
|
93
|
+
* can branch precisely. `recomputed_cert_hash_felt252` is always returned for
|
|
94
|
+
* audit trail / debug inspection.
|
|
95
|
+
*/
|
|
96
|
+
export function verifyRunCertificate(cert, opts = {}) {
|
|
97
|
+
const recomputed = computeCertHashFelt252(cert);
|
|
98
|
+
const sig = cert.signature;
|
|
99
|
+
if (!sig) {
|
|
100
|
+
return {
|
|
101
|
+
valid: false,
|
|
102
|
+
reason: "missing_signature",
|
|
103
|
+
recomputed_cert_hash_felt252: recomputed,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (sig.alg !== "Ed25519") {
|
|
107
|
+
return {
|
|
108
|
+
valid: false,
|
|
109
|
+
reason: "wrong_alg",
|
|
110
|
+
details: `expected Ed25519, got ${String(sig.alg)}`,
|
|
111
|
+
recomputed_cert_hash_felt252: recomputed,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (sig.cert_hash_felt252 !== recomputed) {
|
|
115
|
+
return {
|
|
116
|
+
valid: false,
|
|
117
|
+
reason: "hash_mismatch",
|
|
118
|
+
details: `embedded=${sig.cert_hash_felt252} recomputed=${recomputed}`,
|
|
119
|
+
recomputed_cert_hash_felt252: recomputed,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (opts.expectedKid && opts.expectedKid !== sig.kid) {
|
|
123
|
+
return {
|
|
124
|
+
valid: false,
|
|
125
|
+
reason: "kid_mismatch",
|
|
126
|
+
details: `expected kid=${opts.expectedKid}, got ${sig.kid}`,
|
|
127
|
+
recomputed_cert_hash_felt252: recomputed,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
let pubkey;
|
|
131
|
+
if (opts.expectedPublicKey) {
|
|
132
|
+
pubkey = opts.expectedPublicKey;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
try {
|
|
136
|
+
pubkey = publicKeyFromSpkiB64(sig.pubkey_spki_b64);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
return {
|
|
140
|
+
valid: false,
|
|
141
|
+
reason: "pubkey_unresolvable",
|
|
142
|
+
details: err instanceof Error ? err.message : String(err),
|
|
143
|
+
recomputed_cert_hash_felt252: recomputed,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
let sigBytes;
|
|
148
|
+
try {
|
|
149
|
+
sigBytes = Buffer.from(sig.value, "base64");
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return {
|
|
153
|
+
valid: false,
|
|
154
|
+
reason: "malformed_signature",
|
|
155
|
+
details: "signature.value is not valid base64",
|
|
156
|
+
recomputed_cert_hash_felt252: recomputed,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (sigBytes.length !== 64) {
|
|
160
|
+
return {
|
|
161
|
+
valid: false,
|
|
162
|
+
reason: "malformed_signature",
|
|
163
|
+
details: `Ed25519 signature must be 64 bytes (got ${sigBytes.length})`,
|
|
164
|
+
recomputed_cert_hash_felt252: recomputed,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const msgBytes = felt252ToBytes(recomputed);
|
|
168
|
+
const ok = cryptoVerify(null, msgBytes, pubkey, sigBytes);
|
|
169
|
+
if (!ok) {
|
|
170
|
+
return {
|
|
171
|
+
valid: false,
|
|
172
|
+
reason: "signature_invalid",
|
|
173
|
+
recomputed_cert_hash_felt252: recomputed,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
return { valid: true, recomputed_cert_hash_felt252: recomputed };
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=cert-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cert-verify.js","sourceRoot":"","sources":["../../src/proof/cert-verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/replay/replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIvD;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAI/C;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAClC;AAID;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,KAAK,EAAE,KAAK,CAAC;IACb;;;OAGG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,SAAS,CAAC;QACvB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;KACnB,EAAE,CAAC;CACL;AAID;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAEjD;;;;;;OAMG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QACvC,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,KAAK,EAAE,gBAAgB,CAAC;KACzB,CAAC,CAAC;CACJ;AAID;;;;;;;;;;GAUG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;;;;;OAaG;IACH,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CAC/D;AAID;;;;;GAKG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;aAElC,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;gBADd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM;CAKjC;
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/replay/replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIvD;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAI/C;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAClC;AAID;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,KAAK,EAAE,KAAK,CAAC;IACb;;;OAGG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,SAAS,CAAC;QACvB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;KACnB,EAAE,CAAC;CACL;AAID;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAEjD;;;;;;OAMG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QACvC,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,KAAK,EAAE,gBAAgB,CAAC;KACzB,CAAC,CAAC;CACJ;AAID;;;;;;;;;;GAUG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;;;;;OAaG;IACH,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CAC/D;AAID;;;;;GAKG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;aAElC,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;gBADd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM;CAKjC;AAwCD;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,UAAU,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAAC,YAAY,CAAC,CAkDvB"}
|
package/dist/replay/replay.js
CHANGED
|
@@ -81,10 +81,14 @@ function diffTraces(original, replayed) {
|
|
|
81
81
|
export async function replayFrom(runId, loader, runner, opts) {
|
|
82
82
|
const mode = opts?.mode ?? "strict";
|
|
83
83
|
// 1. Load original artifacts
|
|
84
|
-
const [
|
|
84
|
+
const [rawTrace, artifacts] = await Promise.all([
|
|
85
85
|
loader.loadOriginalTrace(runId),
|
|
86
86
|
loader.loadCacheEntries(runId),
|
|
87
87
|
]);
|
|
88
|
+
// Auto-migrate traces recorded under the draft schema to the frozen 1.0.0
|
|
89
|
+
const originalTrace = rawTrace.schemaVersion === "0.1.0-draft"
|
|
90
|
+
? { ...rawTrace, schemaVersion: "1.0.0" }
|
|
91
|
+
: rawTrace;
|
|
88
92
|
// 2. Import concrete implementations lazily to avoid circular references
|
|
89
93
|
const { RecordedClock } = await import("./clock.js");
|
|
90
94
|
const { RecordedRandom } = await import("./random.js");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/replay/replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAoIH,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAElC;IACA;IAFlB,YACkB,SAAiB,EACjB,MAAc;QAE9B,KAAK,CAAC,oCAAoC,SAAS,KAAK,MAAM,EAAE,CAAC,CAAC;QAHlD,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QAG9B,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAED,iFAAiF;AAEjF;;;GAGG;AACH,SAAS,UAAU,
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/replay/replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry primitives with exponential backoff and optional jitter.
|
|
3
|
+
*
|
|
4
|
+
* Provides three usage modes:
|
|
5
|
+
* - `retry(fn, opts)` — wrap an async call.
|
|
6
|
+
* - `RetryContext` — manual control flow for granular retry logic.
|
|
7
|
+
* - {@link ./presets.js} — 4 named configurations for common scenarios.
|
|
8
|
+
*
|
|
9
|
+
* Sleep is injectable via `RetryOptions.sleepFn` for deterministic tests.
|
|
10
|
+
* BaseError.retryable flag is honored by default presets (see ./presets.ts).
|
|
11
|
+
*
|
|
12
|
+
* @public @since 1.2.0
|
|
13
|
+
*/
|
|
14
|
+
export type SleepFn = (ms: number) => Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Retry policy. `jitter: true` adds ±25% randomization to each delay
|
|
17
|
+
* (anti-thundering-herd when multiple callers retry simultaneously).
|
|
18
|
+
*
|
|
19
|
+
* Selection precedence on each error:
|
|
20
|
+
* 1. `retryIf` predicate if provided
|
|
21
|
+
* 2. `retryOn` class membership if provided
|
|
22
|
+
* 3. Default: retry on any error
|
|
23
|
+
*
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
export interface RetryConfig {
|
|
27
|
+
/** Total attempts including the first try. Must be >= 1. */
|
|
28
|
+
readonly maxAttempts: number;
|
|
29
|
+
/** Initial delay before retry 1, in ms. */
|
|
30
|
+
readonly baseDelayMs: number;
|
|
31
|
+
/** Upper bound on any computed delay, in ms. */
|
|
32
|
+
readonly maxDelayMs: number;
|
|
33
|
+
/** Exponent for `baseDelayMs * base^attempt`. Typically 2.0. */
|
|
34
|
+
readonly exponentialBase: number;
|
|
35
|
+
/** Whether to add ±25% random jitter to each delay. */
|
|
36
|
+
readonly jitter: boolean;
|
|
37
|
+
/** If set, only retry when the error is an instance of one of these classes. */
|
|
38
|
+
readonly retryOn?: ReadonlyArray<new (...args: never[]) => Error>;
|
|
39
|
+
/** If set, called per error; return true to retry. Overrides retryOn. */
|
|
40
|
+
readonly retryIf?: (err: unknown) => boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Options to {@link retry}.
|
|
44
|
+
* @public
|
|
45
|
+
*/
|
|
46
|
+
export interface RetryOptions {
|
|
47
|
+
/** Retry policy. Defaults to RETRY_TRANSIENT. */
|
|
48
|
+
config?: RetryConfig;
|
|
49
|
+
/** Called before each retry sleep. Receives the error, the 0-indexed attempt that failed, and the upcoming delay. */
|
|
50
|
+
onRetry?: (err: unknown, attempt: number, delayMs: number) => void;
|
|
51
|
+
/** Sleep injection — defaults to setTimeout. Tests pass a zero-delay or mock. */
|
|
52
|
+
sleepFn?: SleepFn;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Thrown after all retry attempts have been exhausted.
|
|
56
|
+
* @public
|
|
57
|
+
*/
|
|
58
|
+
export declare class RetryExhaustedError extends Error {
|
|
59
|
+
readonly attempts: number;
|
|
60
|
+
readonly lastError: unknown;
|
|
61
|
+
constructor(attempts: number, lastError: unknown);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Compute the delay before retry `attempt` (0-indexed). Caps at `maxDelayMs`.
|
|
65
|
+
* Jitter, when enabled, adds a uniform-random ±25% offset.
|
|
66
|
+
*
|
|
67
|
+
* Visible for tests and for callers that need to inspect timing.
|
|
68
|
+
* @public
|
|
69
|
+
*/
|
|
70
|
+
export declare function calculateDelay(config: RetryConfig, attempt: number): number;
|
|
71
|
+
/**
|
|
72
|
+
* Decide whether to retry after `err` at 0-indexed `attempt`.
|
|
73
|
+
*
|
|
74
|
+
* Returns false on the final attempt (caller should throw exhaustion).
|
|
75
|
+
*
|
|
76
|
+
* @public
|
|
77
|
+
*/
|
|
78
|
+
export declare function shouldRetry(config: RetryConfig, err: unknown, attempt: number): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Execute `fn` with retry and exponential backoff.
|
|
81
|
+
*
|
|
82
|
+
* @throws The non-retryable error as-is if `shouldRetry` returns false mid-loop.
|
|
83
|
+
* @throws {@link RetryExhaustedError} when all attempts have failed.
|
|
84
|
+
*
|
|
85
|
+
* @public
|
|
86
|
+
*/
|
|
87
|
+
export declare function retry<T>(fn: () => Promise<T>, opts?: RetryOptions): Promise<T>;
|
|
88
|
+
/**
|
|
89
|
+
* Manual retry control. Use when the operation doesn't fit a single `fn()` —
|
|
90
|
+
* e.g. when multiple endpoints are tried per attempt, or when partial state
|
|
91
|
+
* must be reset between tries.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* const ctx = new RetryContext({ config: RETRY_AGGRESSIVE });
|
|
96
|
+
* while (ctx.shouldContinue) {
|
|
97
|
+
* try {
|
|
98
|
+
* return await op();
|
|
99
|
+
* } catch (err) {
|
|
100
|
+
* await ctx.handleError(err);
|
|
101
|
+
* }
|
|
102
|
+
* }
|
|
103
|
+
* ```
|
|
104
|
+
*
|
|
105
|
+
* @public
|
|
106
|
+
*/
|
|
107
|
+
export declare class RetryContext {
|
|
108
|
+
private readonly config;
|
|
109
|
+
private readonly sleep;
|
|
110
|
+
private readonly onRetry?;
|
|
111
|
+
private attemptCount;
|
|
112
|
+
private exhausted;
|
|
113
|
+
constructor(opts: RetryOptions & {
|
|
114
|
+
config: RetryConfig;
|
|
115
|
+
});
|
|
116
|
+
/** True while attempts remain and no non-retryable error has been thrown. */
|
|
117
|
+
get shouldContinue(): boolean;
|
|
118
|
+
/** 0-indexed count of completed (failed) attempts. */
|
|
119
|
+
get attempt(): number;
|
|
120
|
+
/**
|
|
121
|
+
* Record an error and sleep before the next try.
|
|
122
|
+
*
|
|
123
|
+
* @throws The non-retryable error as-is.
|
|
124
|
+
* @throws {@link RetryExhaustedError} if attempts are exhausted.
|
|
125
|
+
*/
|
|
126
|
+
handleError(err: unknown): Promise<void>;
|
|
127
|
+
}
|
|
128
|
+
export { RETRY_TRANSIENT, RETRY_AGGRESSIVE, RETRY_PATIENT, NO_RETRY, } from "./presets.js";
|
|
129
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/retry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,MAAM,OAAO,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,gFAAgF;IAChF,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,CAAC;IAClE,yEAAyE;IACzE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qHAAqH;IACrH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,iFAAiF;IACjF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAChB,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO;CAQjD;AAKD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO3E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAOT;AAED;;;;;;;GAOG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,CAAC,CAAC,CAwBZ;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAIf;IACV,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,YAAY,GAAG;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE;IAMxD,6EAA6E;IAC7E,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,sDAAsD;IACtD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;;;;OAKG;IACG,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAe/C;AAED,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,QAAQ,GACT,MAAM,cAAc,CAAC"}
|