@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
|
@@ -14,6 +14,66 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import type { DbClient } from "../../tracking/agent-run-tracker.js";
|
|
16
16
|
import type { LoggerPort } from "../../ports/logger.js";
|
|
17
|
+
/**
|
|
18
|
+
* Secrets access surface handed to skills. Implementations MUST track every
|
|
19
|
+
* lookup in `accessedSecrets` so callers can audit which secrets a skill
|
|
20
|
+
* actually consumed (required for ADR-ECO-027 proof-grade tripartite and
|
|
21
|
+
* future VPSF skill attestations).
|
|
22
|
+
*
|
|
23
|
+
* @public @since 1.2.0
|
|
24
|
+
*/
|
|
25
|
+
export interface SecretsAccessor {
|
|
26
|
+
/**
|
|
27
|
+
* Get a secret by name. Returns `defaultValue` if missing and provided;
|
|
28
|
+
* otherwise throws when `defaultValue` is undefined and the secret is
|
|
29
|
+
* not configured. Implementations MUST record the lookup in
|
|
30
|
+
* {@link accessedSecrets} regardless of outcome.
|
|
31
|
+
*/
|
|
32
|
+
get(name: string, defaultValue?: string): string;
|
|
33
|
+
/** Whether a secret with this name is available. Counts as access. */
|
|
34
|
+
has(name: string): boolean;
|
|
35
|
+
/** Set of secret names the skill actually consulted during this invocation. */
|
|
36
|
+
readonly accessedSecrets: ReadonlySet<string>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Error thrown by {@link InMemorySecretsAccessor} when a secret is requested
|
|
40
|
+
* without a default value and is not configured.
|
|
41
|
+
*
|
|
42
|
+
* @public @since 1.2.0
|
|
43
|
+
*/
|
|
44
|
+
export declare class SecretNotFoundError extends Error {
|
|
45
|
+
readonly secretName: string;
|
|
46
|
+
constructor(secretName: string);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* In-memory {@link SecretsAccessor} suitable for tests and ephemeral
|
|
50
|
+
* runtimes. Production hosts can implement their own accessor backed by
|
|
51
|
+
* Vault, SOPS, or k8s SealedSecrets while preserving the audit semantics.
|
|
52
|
+
*
|
|
53
|
+
* @public @since 1.2.0
|
|
54
|
+
*/
|
|
55
|
+
export declare class InMemorySecretsAccessor implements SecretsAccessor {
|
|
56
|
+
private readonly store;
|
|
57
|
+
private readonly accessed;
|
|
58
|
+
constructor(secrets?: Readonly<Record<string, string>>);
|
|
59
|
+
get(name: string, defaultValue?: string): string;
|
|
60
|
+
has(name: string): boolean;
|
|
61
|
+
get accessedSecrets(): ReadonlySet<string>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Noop accessor — used as default for skills that declare no secrets.
|
|
65
|
+
* Always returns `defaultValue` when provided, otherwise throws.
|
|
66
|
+
*
|
|
67
|
+
* @public @since 1.2.0
|
|
68
|
+
*/
|
|
69
|
+
export declare const NOOP_SECRETS: SecretsAccessor;
|
|
70
|
+
/**
|
|
71
|
+
* Progress callback invoked by skills via `ctx.progress(value, message?)`.
|
|
72
|
+
* `value` is clamped into `[0, 1]` by implementations.
|
|
73
|
+
*
|
|
74
|
+
* @public @since 1.2.0
|
|
75
|
+
*/
|
|
76
|
+
export type ProgressCallback = (value: number, message?: string) => void;
|
|
17
77
|
/**
|
|
18
78
|
* Context handed to each skill invocation.
|
|
19
79
|
*
|
|
@@ -21,13 +81,57 @@ import type { LoggerPort } from "../../ports/logger.js";
|
|
|
21
81
|
* the skill must short-circuit and emit no observable mutation (no LLM
|
|
22
82
|
* call, no HTTP, no DB INSERT). This guarantees replay safety for the
|
|
23
83
|
* OODA cycle log.
|
|
84
|
+
*
|
|
85
|
+
* Fields added in SDK v1.2.0 (executionId, secrets, progress,
|
|
86
|
+
* elapsedSeconds, remainingSeconds) are OPTIONAL by design — existing
|
|
87
|
+
* skills compile unchanged. New skills can opt in via the
|
|
88
|
+
* {@link createSkillContext} factory.
|
|
24
89
|
*/
|
|
25
90
|
export interface SkillContext {
|
|
26
91
|
readonly isReplay: boolean;
|
|
27
92
|
readonly dryRunMocks: Record<string, (input: unknown) => unknown>;
|
|
28
93
|
readonly db: DbClient;
|
|
29
94
|
readonly logger: LoggerPort;
|
|
95
|
+
/** Unique invocation identifier. Optional for backwards compatibility. */
|
|
96
|
+
readonly executionId?: string;
|
|
97
|
+
/** Audit-trail-bearing secret access. Defaults to {@link NOOP_SECRETS}. */
|
|
98
|
+
readonly secrets?: SecretsAccessor;
|
|
99
|
+
/** Report execution progress in [0, 1]. Noop when absent. */
|
|
100
|
+
readonly progress?: ProgressCallback;
|
|
101
|
+
/** Seconds since invocation began. Returns 0 when not tracked. */
|
|
102
|
+
readonly elapsedSeconds?: number;
|
|
103
|
+
/** Seconds remaining until timeout. Returns +Infinity when not tracked. */
|
|
104
|
+
readonly remainingSeconds?: number;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Options for {@link createSkillContext}.
|
|
108
|
+
*
|
|
109
|
+
* @public @since 1.2.0
|
|
110
|
+
*/
|
|
111
|
+
export interface CreateSkillContextOptions {
|
|
112
|
+
isReplay?: boolean;
|
|
113
|
+
dryRunMocks?: Record<string, (input: unknown) => unknown>;
|
|
114
|
+
db: DbClient;
|
|
115
|
+
logger: LoggerPort;
|
|
116
|
+
executionId?: string;
|
|
117
|
+
secrets?: SecretsAccessor;
|
|
118
|
+
progress?: ProgressCallback;
|
|
119
|
+
/** Absolute timeout in seconds; used to compute remainingSeconds. Default: +Infinity. */
|
|
120
|
+
timeoutSeconds?: number;
|
|
121
|
+
/** Reference Date for elapsed/remaining computation. Default: new Date(). */
|
|
122
|
+
startedAt?: Date;
|
|
30
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Build a {@link SkillContext} with sane defaults for the optional fields.
|
|
126
|
+
* Useful for hosts that want a uniform context without writing the boilerplate.
|
|
127
|
+
*
|
|
128
|
+
* Time accessors are LIVE — `elapsedSeconds` and `remainingSeconds` are
|
|
129
|
+
* recomputed on each property read, so a skill that loops can observe them
|
|
130
|
+
* decreasing without rebuilding the context.
|
|
131
|
+
*
|
|
132
|
+
* @public @since 1.2.0
|
|
133
|
+
*/
|
|
134
|
+
export declare function createSkillContext(opts: CreateSkillContextOptions): SkillContext;
|
|
31
135
|
/**
|
|
32
136
|
* Skill — single named callable unit invoked from an OODA phase.
|
|
33
137
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/orchestration/ooda/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;IAClE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/orchestration/ooda/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,112 @@
|
|
|
12
12
|
*
|
|
13
13
|
* @public
|
|
14
14
|
*/
|
|
15
|
+
/**
|
|
16
|
+
* Error thrown by {@link InMemorySecretsAccessor} when a secret is requested
|
|
17
|
+
* without a default value and is not configured.
|
|
18
|
+
*
|
|
19
|
+
* @public @since 1.2.0
|
|
20
|
+
*/
|
|
21
|
+
export class SecretNotFoundError extends Error {
|
|
22
|
+
secretName;
|
|
23
|
+
constructor(secretName) {
|
|
24
|
+
super(`secret '${secretName}' is not configured`);
|
|
25
|
+
this.name = "SecretNotFoundError";
|
|
26
|
+
this.secretName = secretName;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* In-memory {@link SecretsAccessor} suitable for tests and ephemeral
|
|
31
|
+
* runtimes. Production hosts can implement their own accessor backed by
|
|
32
|
+
* Vault, SOPS, or k8s SealedSecrets while preserving the audit semantics.
|
|
33
|
+
*
|
|
34
|
+
* @public @since 1.2.0
|
|
35
|
+
*/
|
|
36
|
+
export class InMemorySecretsAccessor {
|
|
37
|
+
store;
|
|
38
|
+
accessed = new Set();
|
|
39
|
+
constructor(secrets = {}) {
|
|
40
|
+
this.store = new Map(Object.entries(secrets));
|
|
41
|
+
}
|
|
42
|
+
get(name, defaultValue) {
|
|
43
|
+
this.accessed.add(name);
|
|
44
|
+
const value = this.store.get(name);
|
|
45
|
+
if (value !== undefined)
|
|
46
|
+
return value;
|
|
47
|
+
if (defaultValue !== undefined)
|
|
48
|
+
return defaultValue;
|
|
49
|
+
throw new SecretNotFoundError(name);
|
|
50
|
+
}
|
|
51
|
+
has(name) {
|
|
52
|
+
this.accessed.add(name);
|
|
53
|
+
return this.store.has(name);
|
|
54
|
+
}
|
|
55
|
+
get accessedSecrets() {
|
|
56
|
+
return this.accessed;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Noop accessor — used as default for skills that declare no secrets.
|
|
61
|
+
* Always returns `defaultValue` when provided, otherwise throws.
|
|
62
|
+
*
|
|
63
|
+
* @public @since 1.2.0
|
|
64
|
+
*/
|
|
65
|
+
export const NOOP_SECRETS = new InMemorySecretsAccessor();
|
|
66
|
+
/**
|
|
67
|
+
* Build a {@link SkillContext} with sane defaults for the optional fields.
|
|
68
|
+
* Useful for hosts that want a uniform context without writing the boilerplate.
|
|
69
|
+
*
|
|
70
|
+
* Time accessors are LIVE — `elapsedSeconds` and `remainingSeconds` are
|
|
71
|
+
* recomputed on each property read, so a skill that loops can observe them
|
|
72
|
+
* decreasing without rebuilding the context.
|
|
73
|
+
*
|
|
74
|
+
* @public @since 1.2.0
|
|
75
|
+
*/
|
|
76
|
+
export function createSkillContext(opts) {
|
|
77
|
+
const startedAt = opts.startedAt ?? new Date();
|
|
78
|
+
const timeoutSeconds = opts.timeoutSeconds ?? Number.POSITIVE_INFINITY;
|
|
79
|
+
const secrets = opts.secrets ?? NOOP_SECRETS;
|
|
80
|
+
const progressFn = opts.progress ?? noopProgress;
|
|
81
|
+
const ctx = {
|
|
82
|
+
isReplay: opts.isReplay ?? false,
|
|
83
|
+
dryRunMocks: opts.dryRunMocks ?? {},
|
|
84
|
+
db: opts.db,
|
|
85
|
+
logger: opts.logger,
|
|
86
|
+
secrets,
|
|
87
|
+
progress: (value, message) => {
|
|
88
|
+
const clamped = clampProgress(value);
|
|
89
|
+
progressFn(clamped, message);
|
|
90
|
+
},
|
|
91
|
+
get elapsedSeconds() {
|
|
92
|
+
return Math.max(0, (Date.now() - startedAt.getTime()) / 1000);
|
|
93
|
+
},
|
|
94
|
+
get remainingSeconds() {
|
|
95
|
+
if (!Number.isFinite(timeoutSeconds))
|
|
96
|
+
return Number.POSITIVE_INFINITY;
|
|
97
|
+
const elapsed = (Date.now() - startedAt.getTime()) / 1000;
|
|
98
|
+
return Math.max(0, timeoutSeconds - elapsed);
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
if (opts.executionId !== undefined) {
|
|
102
|
+
Object.defineProperty(ctx, "executionId", {
|
|
103
|
+
value: opts.executionId,
|
|
104
|
+
writable: false,
|
|
105
|
+
enumerable: true,
|
|
106
|
+
configurable: false,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return ctx;
|
|
110
|
+
}
|
|
111
|
+
function clampProgress(value) {
|
|
112
|
+
if (!Number.isFinite(value))
|
|
113
|
+
return 0;
|
|
114
|
+
if (value < 0)
|
|
115
|
+
return 0;
|
|
116
|
+
if (value > 1)
|
|
117
|
+
return 1;
|
|
118
|
+
return value;
|
|
119
|
+
}
|
|
120
|
+
const noopProgress = () => { };
|
|
15
121
|
/**
|
|
16
122
|
* Empty registry — convenience for tests and minimal agents.
|
|
17
123
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/orchestration/ooda/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/orchestration/ooda/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BastionActionPort contract tests.
|
|
3
|
+
*
|
|
4
|
+
* Applied to any BastionActionPort implementation. Tests T-E invariant validation,
|
|
5
|
+
* error handling, and policy constraint enforcement.
|
|
6
|
+
*
|
|
7
|
+
* Source: MASTER-PLAN-v5.md §1.3.1 (T-E manifest ∩ client_policies)
|
|
8
|
+
*/
|
|
9
|
+
import { type BastionActionPort } from "./bastion-action.js";
|
|
10
|
+
export declare const bastionActionPortContract: (factory: () => BastionActionPort) => void;
|
|
11
|
+
//# sourceMappingURL=bastion-action.contract.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bastion-action.contract.test.d.ts","sourceRoot":"","sources":["../../src/ports/bastion-action.contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAIL,KAAK,iBAAiB,EAcvB,MAAM,qBAAqB,CAAC;AAmC7B,eAAO,MAAM,yBAAyB,GAAI,SAAS,MAAM,iBAAiB,SA6JzE,CAAC"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BastionActionPort contract tests.
|
|
3
|
+
*
|
|
4
|
+
* Applied to any BastionActionPort implementation. Tests T-E invariant validation,
|
|
5
|
+
* error handling, and policy constraint enforcement.
|
|
6
|
+
*
|
|
7
|
+
* Source: MASTER-PLAN-v5.md §1.3.1 (T-E manifest ∩ client_policies)
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, test } from "vitest";
|
|
10
|
+
import { BastionPolicyViolationError, BastionSlippageExceededError, BastionTransferUnauthorizedError, } from "./bastion-action.js";
|
|
11
|
+
function makeActionContext(overrides = {}) {
|
|
12
|
+
return {
|
|
13
|
+
tenantId: "tenant-001",
|
|
14
|
+
manifestHash: "abc123def456",
|
|
15
|
+
runId: crypto.randomUUID(),
|
|
16
|
+
...overrides,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function makeSwapParams(overrides = {}) {
|
|
20
|
+
return {
|
|
21
|
+
token_in: "0xdeadbeef",
|
|
22
|
+
token_out: "0xcafebabe",
|
|
23
|
+
amount: "1000000000000000000", // 1e18
|
|
24
|
+
max_slippage_bps: 50, // 0.5%
|
|
25
|
+
deadline: Math.floor(Date.now() / 1000) + 3600,
|
|
26
|
+
...overrides,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function makeTransferParams(overrides = {}) {
|
|
30
|
+
return {
|
|
31
|
+
recipient: "0x1234567890abcdef",
|
|
32
|
+
amount: "1000000",
|
|
33
|
+
token: "0xdeadbeef",
|
|
34
|
+
...overrides,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export const bastionActionPortContract = (factory) => {
|
|
38
|
+
describe("BastionActionPort contract", () => {
|
|
39
|
+
test("swap succeeds within slippage tolerance", async () => {
|
|
40
|
+
const port = factory();
|
|
41
|
+
const params = makeSwapParams({ max_slippage_bps: 100 });
|
|
42
|
+
const ctx = makeActionContext();
|
|
43
|
+
// Validate passes first
|
|
44
|
+
const validation = await port.validateAgainstClientPolicies("swap", ctx.tenantId);
|
|
45
|
+
expect(validation.valid).toBe(true);
|
|
46
|
+
// Mock successful swap — implementation should not throw
|
|
47
|
+
const result = await port.swap(params, ctx);
|
|
48
|
+
expect(result.tx_hash).toBeDefined();
|
|
49
|
+
expect(result.actual_slippage_bps).toBeLessThanOrEqual(params.max_slippage_bps);
|
|
50
|
+
});
|
|
51
|
+
test("swap throws BastionSlippageExceededError when actual > max", async () => {
|
|
52
|
+
const port = factory();
|
|
53
|
+
const params = makeSwapParams({ max_slippage_bps: 10 }); // 0.1% max, will exceed
|
|
54
|
+
const ctx = makeActionContext();
|
|
55
|
+
await expect(port.swap(params, ctx)).rejects.toThrow(BastionSlippageExceededError);
|
|
56
|
+
});
|
|
57
|
+
test("transfer requires legalBasis in ctx", async () => {
|
|
58
|
+
const port = factory();
|
|
59
|
+
const params = makeTransferParams();
|
|
60
|
+
const ctx = makeActionContext({ legalBasis: undefined });
|
|
61
|
+
// Validate passes, but execution should fail without legalBasis
|
|
62
|
+
await expect(port.transfer(params, ctx)).rejects.toThrow(BastionTransferUnauthorizedError);
|
|
63
|
+
});
|
|
64
|
+
test("transfer succeeds with legalBasis (TFR Art 4)", async () => {
|
|
65
|
+
const port = factory();
|
|
66
|
+
const params = makeTransferParams();
|
|
67
|
+
const ctx = makeActionContext({ legalBasis: "tfr.art4" });
|
|
68
|
+
const result = await port.transfer(params, ctx);
|
|
69
|
+
expect(result.tx_hash).toBeDefined();
|
|
70
|
+
expect(result.recipient).toBe(params.recipient);
|
|
71
|
+
expect(result.amount).toBe(params.amount);
|
|
72
|
+
});
|
|
73
|
+
test("validateAgainstClientPolicies returns valid=false for out-of-scope actions", async () => {
|
|
74
|
+
const port = factory();
|
|
75
|
+
const tenantId = "restricted-tenant";
|
|
76
|
+
// Validate should block an action that's not in tenant's allowed_actions
|
|
77
|
+
const validation = await port.validateAgainstClientPolicies("swap", tenantId);
|
|
78
|
+
if (!validation.valid) {
|
|
79
|
+
expect(validation.violations.length).toBeGreaterThan(0);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
test("validateAgainstClientPolicies enforces max_slippage_bps constraint", async () => {
|
|
83
|
+
const port = factory();
|
|
84
|
+
const tenantId = "tenant-001";
|
|
85
|
+
// Validate with slippage params that exceed policy
|
|
86
|
+
const params = makeSwapParams({ max_slippage_bps: 5000 }); // 50% (extreme)
|
|
87
|
+
const validation = await port.validateAgainstClientPolicies("swap", tenantId, params);
|
|
88
|
+
// Expected: violation if policy max < 5000 bps
|
|
89
|
+
if (!validation.valid) {
|
|
90
|
+
expect(validation.violations.some((v) => v.includes("slippage"))).toBe(true);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
test("validateAgainstClientPolicies caches client_policies (TTL 60s)", async () => {
|
|
94
|
+
const port = factory();
|
|
95
|
+
const tenantId = "tenant-001";
|
|
96
|
+
// First call — cache miss, fetches policy
|
|
97
|
+
const validation1 = await port.validateAgainstClientPolicies("deposit", tenantId);
|
|
98
|
+
expect(validation1).toBeDefined();
|
|
99
|
+
// Second call immediately — should use cache, same policy_hash
|
|
100
|
+
const validation2 = await port.validateAgainstClientPolicies("deposit", tenantId);
|
|
101
|
+
if (validation1.policy_hash && validation2.policy_hash) {
|
|
102
|
+
expect(validation2.policy_hash).toBe(validation1.policy_hash);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
test("deposit succeeds with valid params", async () => {
|
|
106
|
+
const port = factory();
|
|
107
|
+
const params = {
|
|
108
|
+
vault_address: "0xvault001",
|
|
109
|
+
amount: "1000000000000000000",
|
|
110
|
+
token: "0xdeadbeef",
|
|
111
|
+
};
|
|
112
|
+
const ctx = makeActionContext();
|
|
113
|
+
const validation = await port.validateAgainstClientPolicies("deposit", ctx.tenantId);
|
|
114
|
+
if (validation.valid) {
|
|
115
|
+
const result = await port.deposit(params, ctx);
|
|
116
|
+
expect(result.tx_hash).toBeDefined();
|
|
117
|
+
expect(result.shares_minted).toBeDefined();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
test("withdraw succeeds with valid params", async () => {
|
|
121
|
+
const port = factory();
|
|
122
|
+
const params = {
|
|
123
|
+
vault_address: "0xvault001",
|
|
124
|
+
shares: "500000000000000000",
|
|
125
|
+
};
|
|
126
|
+
const ctx = makeActionContext();
|
|
127
|
+
const result = await port.withdraw(params, ctx);
|
|
128
|
+
expect(result.tx_hash).toBeDefined();
|
|
129
|
+
expect(result.amount_withdrawn).toBeDefined();
|
|
130
|
+
});
|
|
131
|
+
test("policy violation includes action and tenantId in error", async () => {
|
|
132
|
+
const port = factory();
|
|
133
|
+
const tenantId = "restricted-tenant";
|
|
134
|
+
try {
|
|
135
|
+
await port.validateAgainstClientPolicies("swap", tenantId);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
if (err instanceof BastionPolicyViolationError) {
|
|
139
|
+
expect(err.action).toBe("swap");
|
|
140
|
+
expect(err.tenantId).toBe(tenantId);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
// ─── Mock implementation ──────────────────────────────────────────────────
|
|
147
|
+
class MockBastionActionPort {
|
|
148
|
+
policyCache = new Map();
|
|
149
|
+
async validateAgainstClientPolicies(action, tenantId, params) {
|
|
150
|
+
// Simulate policy fetch with cache
|
|
151
|
+
const cached = this.policyCache.get(tenantId);
|
|
152
|
+
const now = Date.now();
|
|
153
|
+
const policy = cached && now - cached.ts < 60000
|
|
154
|
+
? cached.policy
|
|
155
|
+
: this.getDefaultPolicy(tenantId);
|
|
156
|
+
if (policy) {
|
|
157
|
+
this.policyCache.set(tenantId, { policy, ts: now });
|
|
158
|
+
}
|
|
159
|
+
const violations = [];
|
|
160
|
+
// Check if action is allowed
|
|
161
|
+
if (!policy.allowed_actions.includes(action)) {
|
|
162
|
+
violations.push(`action '${action}' not in allowed_actions`);
|
|
163
|
+
}
|
|
164
|
+
// Check slippage constraint if params provided
|
|
165
|
+
if (params &&
|
|
166
|
+
"max_slippage_bps" in params &&
|
|
167
|
+
(params.max_slippage_bps ?? 0) > policy.max_slippage_bps) {
|
|
168
|
+
violations.push(`slippage ${params.max_slippage_bps} bps exceeds policy max ${policy.max_slippage_bps} bps`);
|
|
169
|
+
}
|
|
170
|
+
const valid = violations.length === 0;
|
|
171
|
+
return {
|
|
172
|
+
valid,
|
|
173
|
+
violations,
|
|
174
|
+
policy_hash: `hash-${tenantId}-${action}`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
getDefaultPolicy(tenantId) {
|
|
178
|
+
if (tenantId === "restricted-tenant") {
|
|
179
|
+
return {
|
|
180
|
+
max_slippage_bps: 100,
|
|
181
|
+
allowed_pairs: [],
|
|
182
|
+
daily_volume_cap: "0",
|
|
183
|
+
deposit_cap: "0",
|
|
184
|
+
allowed_actions: [],
|
|
185
|
+
cache_ttl_seconds: 60,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
max_slippage_bps: 500,
|
|
190
|
+
allowed_pairs: [
|
|
191
|
+
["0xdeadbeef", "0xcafebabe"],
|
|
192
|
+
],
|
|
193
|
+
daily_volume_cap: "1000000000000000000000",
|
|
194
|
+
deposit_cap: "500000000000000000000",
|
|
195
|
+
allowed_actions: ["swap", "deposit", "withdraw", "transfer"],
|
|
196
|
+
cache_ttl_seconds: 60,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
async swap(params, _ctx) {
|
|
200
|
+
// Simulate slippage calculation: if max_slippage_bps is very low, exceed it
|
|
201
|
+
const actualSlippageBps = params.max_slippage_bps < 20 ? 50 : 10;
|
|
202
|
+
if (actualSlippageBps > params.max_slippage_bps) {
|
|
203
|
+
throw new BastionSlippageExceededError(params.max_slippage_bps, actualSlippageBps);
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
|
|
207
|
+
amount_out: (BigInt(params.amount) * BigInt(99)) / BigInt(100),
|
|
208
|
+
actual_slippage_bps: actualSlippageBps,
|
|
209
|
+
executed_at: new Date(),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
async deposit(params, _ctx) {
|
|
213
|
+
return {
|
|
214
|
+
tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
|
|
215
|
+
shares_minted: (BigInt(params.amount) * BigInt(95)) / BigInt(100),
|
|
216
|
+
deposit_amount: params.amount,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
async withdraw(params, _ctx) {
|
|
220
|
+
return {
|
|
221
|
+
tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
|
|
222
|
+
amount_withdrawn: (BigInt(params.shares) * BigInt(98)) / BigInt(100),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
async transfer(params, ctx) {
|
|
226
|
+
if (!ctx.legalBasis) {
|
|
227
|
+
throw new BastionTransferUnauthorizedError("Transfer requires legalBasis (TFR Art 4)", "missing_legal_basis");
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
|
|
231
|
+
recipient: params.recipient,
|
|
232
|
+
amount: params.amount,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// ─── Default contract application ──────────────────────────────────────────
|
|
237
|
+
bastionActionPortContract(() => new MockBastionActionPort());
|
|
238
|
+
//# sourceMappingURL=bastion-action.contract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bastion-action.contract.test.js","sourceRoot":"","sources":["../../src/ports/bastion-action.contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,gCAAgC,GAejC,MAAM,qBAAqB,CAAC;AAE7B,SAAS,iBAAiB,CACxB,YAAoC,EAAE;IAEtC,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,YAAY,EAAE,cAAc;QAC5B,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE;QAC1B,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,YAAiC,EAAE;IACzD,OAAO;QACL,QAAQ,EAAE,YAAmB;QAC7B,SAAS,EAAE,YAAmB;QAC9B,MAAM,EAAE,qBAAqB,EAAE,OAAO;QACtC,gBAAgB,EAAE,EAAE,EAAE,OAAO;QAC7B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI;QAC9C,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,YAAqC,EAAE;IAEvC,OAAO;QACL,SAAS,EAAE,oBAAoB;QAC/B,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,YAAmB;QAC1B,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,OAAgC,EAAE,EAAE;IAC5E,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;YACzD,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;YAEhC,wBAAwB;YACxB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,6BAA6B,CACzD,MAAM,EACN,GAAG,CAAC,QAAQ,CACb,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEpC,yDAAyD;YACzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,mBAAmB,CACpD,MAAM,CAAC,gBAAgB,CACxB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;YACjF,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;YAEhC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAClD,4BAA4B,CAC7B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,iBAAiB,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;YAEzD,gEAAgE;YAChE,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACtD,gCAAgC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,iBAAiB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;YAE1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC5F,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,mBAAmB,CAAC;YAErC,yEAAyE;YACzE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,6BAA6B,CACzD,MAAM,EACN,QAAQ,CACT,CAAC;YAEF,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,YAAY,CAAC;YAE9B,mDAAmD;YACnD,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,gBAAgB;YAC3E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,6BAA6B,CACzD,MAAM,EACN,QAAQ,EACR,MAAM,CACP,CAAC;YAEF,+CAA+C;YAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CACpE,IAAI,CACL,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAChF,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,YAAY,CAAC;YAE9B,0CAA0C;YAC1C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAC1D,SAAS,EACT,QAAQ,CACT,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;YAElC,+DAA+D;YAC/D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAC1D,SAAS,EACT,QAAQ,CACT,CAAC;YACF,IAAI,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;gBACvD,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAChE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG;gBACb,aAAa,EAAE,YAAmB;gBAClC,MAAM,EAAE,qBAAqB;gBAC7B,KAAK,EAAE,YAAmB;aAC3B,CAAC;YACF,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;YAEhC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,6BAA6B,CACzD,SAAS,EACT,GAAG,CAAC,QAAQ,CACb,CAAC;YACF,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG;gBACb,aAAa,EAAE,YAAmB;gBAClC,MAAM,EAAE,oBAAoB;aAC7B,CAAC;YACF,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;YAEhC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,mBAAmB,CAAC;YAErC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,2BAA2B,EAAE,CAAC;oBAC/C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAChC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,6EAA6E;AAE7E,MAAM,qBAAqB;IACjB,WAAW,GAAG,IAAI,GAAG,EAAgD,CAAC;IAE9E,KAAK,CAAC,6BAA6B,CACjC,MAAoD,EACpD,QAAkB,EAClB,MAA4C;QAE5C,mCAAmC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GACV,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,KAAK;YAC/B,CAAC,CAAC,MAAM,CAAC,MAAM;YACf,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEtC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,6BAA6B;QAC7B,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,UAAU,CAAC,IAAI,CAAC,WAAW,MAAM,0BAA0B,CAAC,CAAC;QAC/D,CAAC;QAED,+CAA+C;QAC/C,IACE,MAAM;YACN,kBAAkB,IAAI,MAAM;YAC5B,CAAE,MAAqB,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,gBAAgB,EACxE,CAAC;YACD,UAAU,CAAC,IAAI,CACb,YAAY,MAAM,CAAC,gBAAgB,2BAA2B,MAAM,CAAC,gBAAgB,MAAM,CAC5F,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;QACtC,OAAO;YACL,KAAK;YACL,UAAU;YACV,WAAW,EAAE,QAAQ,QAAQ,IAAI,MAAM,EAAE;SAC1C,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,QAAkB;QACzC,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;YACrC,OAAO;gBACL,gBAAgB,EAAE,GAAG;gBACrB,aAAa,EAAE,EAAE;gBACjB,gBAAgB,EAAE,GAAG;gBACrB,WAAW,EAAE,GAAG;gBAChB,eAAe,EAAE,EAAE;gBACnB,iBAAiB,EAAE,EAAE;aACtB,CAAC;QACJ,CAAC;QACD,OAAO;YACL,gBAAgB,EAAE,GAAG;YACrB,aAAa,EAAE;gBACb,CAAC,YAA4B,EAAE,YAA4B,CAAC;aAC7D;YACD,gBAAgB,EAAE,wBAAwB;YAC1C,WAAW,EAAE,uBAAuB;YACpC,eAAe,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC;YAC5D,iBAAiB,EAAE,EAAE;SACtB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAkB,EAAE,IAAmB;QAChD,4EAA4E;QAC5E,MAAM,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjE,IAAI,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAChD,MAAM,IAAI,4BAA4B,CACpC,MAAM,CAAC,gBAAgB,EACvB,iBAAiB,CAClB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;YACrD,UAAU,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;YAC9D,mBAAmB,EAAE,iBAAiB;YACtC,WAAW,EAAE,IAAI,IAAI,EAAE;SACxB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CACX,MAAqB,EACrB,IAAmB;QAEnB,OAAO;YACL,OAAO,EAAE,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;YACrD,aAAa,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;YACjE,cAAc,EAAE,MAAM,CAAC,MAAM;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,MAAsB,EACtB,IAAmB;QAEnB,OAAO;YACL,OAAO,EAAE,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;YACrD,gBAAgB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;SACrE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,MAAsB,EACtB,GAAkB;QAElB,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,gCAAgC,CACxC,0CAA0C,EAC1C,qBAAqB,CACtB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;YACrD,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;CACF;AAED,8EAA8E;AAE9E,yBAAyB,CAAC,GAAG,EAAE,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BastionActionPort — host adapter for Bastion DeFi capabilities.
|
|
3
|
+
*
|
|
4
|
+
* Implements the manifest ∩ client_policies validation gate (T-E invariant).
|
|
5
|
+
* All actions must pass through validateAgainstClientPolicies before HTTP execution.
|
|
6
|
+
*
|
|
7
|
+
* Source: MASTER-PLAN-v5.md §1.3.1, §2.3 (Q-Bastion-1..4)
|
|
8
|
+
*/
|
|
9
|
+
export type TokenAddress = string & {
|
|
10
|
+
readonly __brand: "TokenAddress";
|
|
11
|
+
};
|
|
12
|
+
export type VaultAddress = string & {
|
|
13
|
+
readonly __brand: "VaultAddress";
|
|
14
|
+
};
|
|
15
|
+
export type TenantId = string;
|
|
16
|
+
export interface SwapParams {
|
|
17
|
+
readonly token_in: TokenAddress;
|
|
18
|
+
readonly token_out: TokenAddress;
|
|
19
|
+
readonly amount: string;
|
|
20
|
+
readonly max_slippage_bps: number;
|
|
21
|
+
readonly deadline: number;
|
|
22
|
+
}
|
|
23
|
+
export interface DepositParams {
|
|
24
|
+
readonly vault_address: VaultAddress;
|
|
25
|
+
readonly amount: string;
|
|
26
|
+
readonly token: TokenAddress;
|
|
27
|
+
}
|
|
28
|
+
export interface WithdrawParams {
|
|
29
|
+
readonly vault_address: VaultAddress;
|
|
30
|
+
readonly shares: string;
|
|
31
|
+
}
|
|
32
|
+
export interface TransferParams {
|
|
33
|
+
readonly recipient: string;
|
|
34
|
+
readonly amount: string;
|
|
35
|
+
readonly token: TokenAddress;
|
|
36
|
+
}
|
|
37
|
+
export interface ActionContext {
|
|
38
|
+
readonly tenantId: TenantId;
|
|
39
|
+
readonly manifestHash: string;
|
|
40
|
+
readonly runId: string;
|
|
41
|
+
readonly legalBasis?: string;
|
|
42
|
+
readonly jurisdictionsContext?: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface SwapResult {
|
|
45
|
+
readonly tx_hash: string;
|
|
46
|
+
readonly amount_out: string;
|
|
47
|
+
readonly actual_slippage_bps: number;
|
|
48
|
+
readonly executed_at: Date;
|
|
49
|
+
}
|
|
50
|
+
export interface DepositResult {
|
|
51
|
+
readonly tx_hash: string;
|
|
52
|
+
readonly shares_minted: string;
|
|
53
|
+
readonly deposit_amount: string;
|
|
54
|
+
}
|
|
55
|
+
export interface WithdrawResult {
|
|
56
|
+
readonly tx_hash: string;
|
|
57
|
+
readonly amount_withdrawn: string;
|
|
58
|
+
}
|
|
59
|
+
export interface TransferResult {
|
|
60
|
+
readonly tx_hash: string;
|
|
61
|
+
readonly recipient: string;
|
|
62
|
+
readonly amount: string;
|
|
63
|
+
}
|
|
64
|
+
export interface ClientPolicy {
|
|
65
|
+
readonly max_slippage_bps: number;
|
|
66
|
+
readonly allowed_pairs: readonly [TokenAddress, TokenAddress][];
|
|
67
|
+
readonly daily_volume_cap: string;
|
|
68
|
+
readonly deposit_cap: string;
|
|
69
|
+
readonly allowed_actions: readonly ("swap" | "deposit" | "withdraw" | "transfer")[];
|
|
70
|
+
readonly cache_ttl_seconds: number;
|
|
71
|
+
}
|
|
72
|
+
export interface PolicyValidation {
|
|
73
|
+
readonly valid: boolean;
|
|
74
|
+
readonly violations: readonly string[];
|
|
75
|
+
readonly policy_hash?: string;
|
|
76
|
+
}
|
|
77
|
+
export interface BastionActionPort {
|
|
78
|
+
/**
|
|
79
|
+
* Swap tokens on Bastion CoW intents.
|
|
80
|
+
* Throws BastionSlippageExceededError if actual slippage > max_slippage_bps.
|
|
81
|
+
*/
|
|
82
|
+
swap(params: SwapParams, ctx: ActionContext): Promise<SwapResult>;
|
|
83
|
+
/**
|
|
84
|
+
* Deposit into a Bastion vault.
|
|
85
|
+
* Throws BastionInsufficientFundsError if user balance < amount.
|
|
86
|
+
*/
|
|
87
|
+
deposit(params: DepositParams, ctx: ActionContext): Promise<DepositResult>;
|
|
88
|
+
/**
|
|
89
|
+
* Withdraw shares from a Bastion vault.
|
|
90
|
+
*/
|
|
91
|
+
withdraw(params: WithdrawParams, ctx: ActionContext): Promise<WithdrawResult>;
|
|
92
|
+
/**
|
|
93
|
+
* Transfer tokens. Requires legalBasis in ctx per TFR Art 4.
|
|
94
|
+
* Throws BastionTransferUnauthorizedError if legalBasis absent.
|
|
95
|
+
*/
|
|
96
|
+
transfer(params: TransferParams, ctx: ActionContext): Promise<TransferResult>;
|
|
97
|
+
/**
|
|
98
|
+
* Validate action against manifest ∩ client_policies intersection (T-E invariant).
|
|
99
|
+
* Caches client_policies for tenant TTL 60s; invalidation event-driven.
|
|
100
|
+
* Throws BastionPolicyViolationError if action ∉ intersection.
|
|
101
|
+
*/
|
|
102
|
+
validateAgainstClientPolicies(action: "swap" | "deposit" | "withdraw" | "transfer", tenantId: TenantId, params?: Partial<SwapParams & DepositParams>): Promise<PolicyValidation>;
|
|
103
|
+
}
|
|
104
|
+
export declare class BastionPolicyViolationError extends Error {
|
|
105
|
+
readonly action: string;
|
|
106
|
+
readonly tenantId: TenantId;
|
|
107
|
+
readonly cause?: unknown | undefined;
|
|
108
|
+
constructor(message: string, action: string, tenantId: TenantId, cause?: unknown | undefined);
|
|
109
|
+
}
|
|
110
|
+
export declare class BastionInsufficientFundsError extends Error {
|
|
111
|
+
readonly required: string;
|
|
112
|
+
readonly available: string;
|
|
113
|
+
readonly cause?: unknown | undefined;
|
|
114
|
+
constructor(required: string, available: string, cause?: unknown | undefined);
|
|
115
|
+
}
|
|
116
|
+
export declare class BastionSlippageExceededError extends Error {
|
|
117
|
+
readonly max_slippage_bps: number;
|
|
118
|
+
readonly actual_slippage_bps: number;
|
|
119
|
+
readonly cause?: unknown | undefined;
|
|
120
|
+
constructor(max_slippage_bps: number, actual_slippage_bps: number, cause?: unknown | undefined);
|
|
121
|
+
}
|
|
122
|
+
export declare class BastionContractError extends Error {
|
|
123
|
+
readonly contract_call: string;
|
|
124
|
+
readonly contract_error: string;
|
|
125
|
+
readonly cause?: unknown | undefined;
|
|
126
|
+
constructor(contract_call: string, contract_error: string, cause?: unknown | undefined);
|
|
127
|
+
}
|
|
128
|
+
export declare class BastionTransferUnauthorizedError extends Error {
|
|
129
|
+
readonly reason: "missing_legal_basis" | "jurisdiction_blocked";
|
|
130
|
+
readonly cause?: unknown | undefined;
|
|
131
|
+
constructor(message: string, reason: "missing_legal_basis" | "jurisdiction_blocked", cause?: unknown | undefined);
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=bastion-action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bastion-action.d.ts","sourceRoot":"","sources":["../../src/ports/bastion-action.ts"],"names":[],"mappings":"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"}
|