@vauban-org/agent-sdk 1.0.0 → 1.3.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 +6918 -742
- 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 +41 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -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/agent.d.ts.map +1 -1
- package/dist/orchestration/ooda/agent.js +36 -0
- package/dist/orchestration/ooda/agent.js.map +1 -1
- 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/orchestration/ooda/types.d.ts +11 -0
- package/dist/orchestration/ooda/types.d.ts.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/_secrets.d.ts +16 -0
- package/dist/skills/_secrets.d.ts.map +1 -0
- package/dist/skills/_secrets.js +20 -0
- package/dist/skills/_secrets.js.map +1 -0
- package/dist/skills/alpaca-quote.d.ts +2 -2
- package/dist/skills/alpaca-quote.d.ts.map +1 -1
- package/dist/skills/alpaca-quote.js +51 -20
- package/dist/skills/alpaca-quote.js.map +1 -1
- 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 +2 -2
- package/dist/skills/send-email.d.ts.map +1 -1
- package/dist/skills/send-email.js +4 -3
- package/dist/skills/send-email.js.map +1 -1
- package/dist/skills/slack-notify.d.ts +4 -4
- package/dist/skills/slack-notify.d.ts.map +1 -1
- package/dist/skills/slack-notify.js +52 -21
- package/dist/skills/slack-notify.js.map +1 -1
- package/dist/skills/starknet-balance.d.ts +1 -1
- package/dist/skills/telegram-notify.d.ts +4 -4
- package/dist/skills/telegram-notify.d.ts.map +1 -1
- package/dist/skills/telegram-notify.js +48 -19
- package/dist/skills/telegram-notify.js.map +1 -1
- package/dist/skills/web-search.d.ts +1 -1
- package/dist/skills/web-search.d.ts.map +1 -1
- package/dist/skills/web-search.js +85 -40
- package/dist/skills/web-search.js.map +1 -1
- package/dist/telemetry/bus.d.ts +54 -0
- package/dist/telemetry/bus.d.ts.map +1 -0
- package/dist/telemetry/bus.js +159 -0
- package/dist/telemetry/bus.js.map +1 -0
- package/dist/telemetry/index.d.ts +35 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +30 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/port.d.ts +121 -0
- package/dist/telemetry/port.d.ts.map +1 -0
- package/dist/telemetry/port.js +48 -0
- package/dist/telemetry/port.js.map +1 -0
- package/dist/telemetry/sinks/otlp.d.ts +45 -0
- package/dist/telemetry/sinks/otlp.d.ts.map +1 -0
- package/dist/telemetry/sinks/otlp.js +195 -0
- package/dist/telemetry/sinks/otlp.js.map +1 -0
- package/dist/telemetry/sinks/sqlite.d.ts +32 -0
- package/dist/telemetry/sinks/sqlite.d.ts.map +1 -0
- package/dist/telemetry/sinks/sqlite.js +170 -0
- package/dist/telemetry/sinks/sqlite.js.map +1 -0
- package/dist/telemetry/sinks/stdout.d.ts +22 -0
- package/dist/telemetry/sinks/stdout.d.ts.map +1 -0
- package/dist/telemetry/sinks/stdout.js +38 -0
- package/dist/telemetry/sinks/stdout.js.map +1 -0
- 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/docs/telemetry/migration.md +155 -0
- package/docs/telemetry/overview.md +154 -0
- package/docs/telemetry/privacy.md +127 -0
- package/docs/telemetry/sinks/cc.md +155 -0
- package/docs/telemetry/sinks/otlp.md +146 -0
- package/docs/telemetry/sinks/sqlite.md +126 -0
- package/docs/telemetry/sinks/stdout.md +82 -0
- package/package.json +18 -2
- 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 +368 -2
- 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/agent.ts +50 -0
- package/src/orchestration/ooda/skills.ts +177 -0
- package/src/orchestration/ooda/types.ts +12 -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/_secrets.ts +25 -0
- package/src/skills/alpaca-quote.ts +68 -23
- 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 +4 -3
- package/src/skills/slack-notify.ts +73 -30
- package/src/skills/telegram-notify.ts +70 -24
- package/src/skills/web-search.ts +132 -50
- package/src/telemetry/bus.test.ts +231 -0
- package/src/telemetry/bus.ts +241 -0
- package/src/telemetry/index.ts +49 -0
- package/src/telemetry/port.ts +160 -0
- package/src/telemetry/sinks/otlp.test.ts +146 -0
- package/src/telemetry/sinks/otlp.ts +250 -0
- package/src/telemetry/sinks/sqlite.test.ts +121 -0
- package/src/telemetry/sinks/sqlite.ts +260 -0
- package/src/telemetry/sinks/stdout.test.ts +109 -0
- package/src/telemetry/sinks/stdout.ts +59 -0
- 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,355 @@
|
|
|
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
|
+
|
|
10
|
+
import { describe, expect, test } from "vitest";
|
|
11
|
+
import {
|
|
12
|
+
BastionPolicyViolationError,
|
|
13
|
+
BastionSlippageExceededError,
|
|
14
|
+
BastionTransferUnauthorizedError,
|
|
15
|
+
type BastionActionPort,
|
|
16
|
+
type ActionContext,
|
|
17
|
+
type SwapParams,
|
|
18
|
+
type TransferParams,
|
|
19
|
+
type ClientPolicy,
|
|
20
|
+
type PolicyValidation,
|
|
21
|
+
type TenantId,
|
|
22
|
+
type DepositParams,
|
|
23
|
+
type SwapResult,
|
|
24
|
+
type DepositResult,
|
|
25
|
+
type WithdrawParams,
|
|
26
|
+
type WithdrawResult,
|
|
27
|
+
type TransferResult,
|
|
28
|
+
type TokenAddress,
|
|
29
|
+
} from "./bastion-action.js";
|
|
30
|
+
|
|
31
|
+
function makeActionContext(
|
|
32
|
+
overrides: Partial<ActionContext> = {}
|
|
33
|
+
): ActionContext {
|
|
34
|
+
return {
|
|
35
|
+
tenantId: "tenant-001",
|
|
36
|
+
manifestHash: "abc123def456",
|
|
37
|
+
runId: crypto.randomUUID(),
|
|
38
|
+
...overrides,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function makeSwapParams(overrides: Partial<SwapParams> = {}): SwapParams {
|
|
43
|
+
return {
|
|
44
|
+
token_in: "0xdeadbeef" as any,
|
|
45
|
+
token_out: "0xcafebabe" as any,
|
|
46
|
+
amount: "1000000000000000000", // 1e18
|
|
47
|
+
max_slippage_bps: 50, // 0.5%
|
|
48
|
+
deadline: Math.floor(Date.now() / 1000) + 3600,
|
|
49
|
+
...overrides,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function makeTransferParams(
|
|
54
|
+
overrides: Partial<TransferParams> = {}
|
|
55
|
+
): TransferParams {
|
|
56
|
+
return {
|
|
57
|
+
recipient: "0x1234567890abcdef",
|
|
58
|
+
amount: "1000000",
|
|
59
|
+
token: "0xdeadbeef" as any,
|
|
60
|
+
...overrides,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const bastionActionPortContract = (factory: () => BastionActionPort) => {
|
|
65
|
+
describe("BastionActionPort contract", () => {
|
|
66
|
+
test("swap succeeds within slippage tolerance", async () => {
|
|
67
|
+
const port = factory();
|
|
68
|
+
const params = makeSwapParams({ max_slippage_bps: 100 });
|
|
69
|
+
const ctx = makeActionContext();
|
|
70
|
+
|
|
71
|
+
// Validate passes first
|
|
72
|
+
const validation = await port.validateAgainstClientPolicies(
|
|
73
|
+
"swap",
|
|
74
|
+
ctx.tenantId
|
|
75
|
+
);
|
|
76
|
+
expect(validation.valid).toBe(true);
|
|
77
|
+
|
|
78
|
+
// Mock successful swap — implementation should not throw
|
|
79
|
+
const result = await port.swap(params, ctx);
|
|
80
|
+
expect(result.tx_hash).toBeDefined();
|
|
81
|
+
expect(result.actual_slippage_bps).toBeLessThanOrEqual(
|
|
82
|
+
params.max_slippage_bps
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("swap throws BastionSlippageExceededError when actual > max", async () => {
|
|
87
|
+
const port = factory();
|
|
88
|
+
const params = makeSwapParams({ max_slippage_bps: 10 }); // 0.1% max, will exceed
|
|
89
|
+
const ctx = makeActionContext();
|
|
90
|
+
|
|
91
|
+
await expect(port.swap(params, ctx)).rejects.toThrow(
|
|
92
|
+
BastionSlippageExceededError
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("transfer requires legalBasis in ctx", async () => {
|
|
97
|
+
const port = factory();
|
|
98
|
+
const params = makeTransferParams();
|
|
99
|
+
const ctx = makeActionContext({ legalBasis: undefined });
|
|
100
|
+
|
|
101
|
+
// Validate passes, but execution should fail without legalBasis
|
|
102
|
+
await expect(port.transfer(params, ctx)).rejects.toThrow(
|
|
103
|
+
BastionTransferUnauthorizedError
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test("transfer succeeds with legalBasis (TFR Art 4)", async () => {
|
|
108
|
+
const port = factory();
|
|
109
|
+
const params = makeTransferParams();
|
|
110
|
+
const ctx = makeActionContext({ legalBasis: "tfr.art4" });
|
|
111
|
+
|
|
112
|
+
const result = await port.transfer(params, ctx);
|
|
113
|
+
expect(result.tx_hash).toBeDefined();
|
|
114
|
+
expect(result.recipient).toBe(params.recipient);
|
|
115
|
+
expect(result.amount).toBe(params.amount);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("validateAgainstClientPolicies returns valid=false for out-of-scope actions", async () => {
|
|
119
|
+
const port = factory();
|
|
120
|
+
const tenantId = "restricted-tenant";
|
|
121
|
+
|
|
122
|
+
// Validate should block an action that's not in tenant's allowed_actions
|
|
123
|
+
const validation = await port.validateAgainstClientPolicies(
|
|
124
|
+
"swap",
|
|
125
|
+
tenantId
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
if (!validation.valid) {
|
|
129
|
+
expect(validation.violations.length).toBeGreaterThan(0);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test("validateAgainstClientPolicies enforces max_slippage_bps constraint", async () => {
|
|
134
|
+
const port = factory();
|
|
135
|
+
const tenantId = "tenant-001";
|
|
136
|
+
|
|
137
|
+
// Validate with slippage params that exceed policy
|
|
138
|
+
const params = makeSwapParams({ max_slippage_bps: 5000 }); // 50% (extreme)
|
|
139
|
+
const validation = await port.validateAgainstClientPolicies(
|
|
140
|
+
"swap",
|
|
141
|
+
tenantId,
|
|
142
|
+
params
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
// Expected: violation if policy max < 5000 bps
|
|
146
|
+
if (!validation.valid) {
|
|
147
|
+
expect(validation.violations.some((v) => v.includes("slippage"))).toBe(
|
|
148
|
+
true
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test("validateAgainstClientPolicies caches client_policies (TTL 60s)", async () => {
|
|
154
|
+
const port = factory();
|
|
155
|
+
const tenantId = "tenant-001";
|
|
156
|
+
|
|
157
|
+
// First call — cache miss, fetches policy
|
|
158
|
+
const validation1 = await port.validateAgainstClientPolicies(
|
|
159
|
+
"deposit",
|
|
160
|
+
tenantId
|
|
161
|
+
);
|
|
162
|
+
expect(validation1).toBeDefined();
|
|
163
|
+
|
|
164
|
+
// Second call immediately — should use cache, same policy_hash
|
|
165
|
+
const validation2 = await port.validateAgainstClientPolicies(
|
|
166
|
+
"deposit",
|
|
167
|
+
tenantId
|
|
168
|
+
);
|
|
169
|
+
if (validation1.policy_hash && validation2.policy_hash) {
|
|
170
|
+
expect(validation2.policy_hash).toBe(validation1.policy_hash);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test("deposit succeeds with valid params", async () => {
|
|
175
|
+
const port = factory();
|
|
176
|
+
const params = {
|
|
177
|
+
vault_address: "0xvault001" as any,
|
|
178
|
+
amount: "1000000000000000000",
|
|
179
|
+
token: "0xdeadbeef" as any,
|
|
180
|
+
};
|
|
181
|
+
const ctx = makeActionContext();
|
|
182
|
+
|
|
183
|
+
const validation = await port.validateAgainstClientPolicies(
|
|
184
|
+
"deposit",
|
|
185
|
+
ctx.tenantId
|
|
186
|
+
);
|
|
187
|
+
if (validation.valid) {
|
|
188
|
+
const result = await port.deposit(params, ctx);
|
|
189
|
+
expect(result.tx_hash).toBeDefined();
|
|
190
|
+
expect(result.shares_minted).toBeDefined();
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test("withdraw succeeds with valid params", async () => {
|
|
195
|
+
const port = factory();
|
|
196
|
+
const params = {
|
|
197
|
+
vault_address: "0xvault001" as any,
|
|
198
|
+
shares: "500000000000000000",
|
|
199
|
+
};
|
|
200
|
+
const ctx = makeActionContext();
|
|
201
|
+
|
|
202
|
+
const result = await port.withdraw(params, ctx);
|
|
203
|
+
expect(result.tx_hash).toBeDefined();
|
|
204
|
+
expect(result.amount_withdrawn).toBeDefined();
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
test("policy violation includes action and tenantId in error", async () => {
|
|
208
|
+
const port = factory();
|
|
209
|
+
const tenantId = "restricted-tenant";
|
|
210
|
+
|
|
211
|
+
try {
|
|
212
|
+
await port.validateAgainstClientPolicies("swap", tenantId);
|
|
213
|
+
} catch (err) {
|
|
214
|
+
if (err instanceof BastionPolicyViolationError) {
|
|
215
|
+
expect(err.action).toBe("swap");
|
|
216
|
+
expect(err.tenantId).toBe(tenantId);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
// ─── Mock implementation ──────────────────────────────────────────────────
|
|
224
|
+
|
|
225
|
+
class MockBastionActionPort implements BastionActionPort {
|
|
226
|
+
private policyCache = new Map<string, { policy: ClientPolicy; ts: number }>();
|
|
227
|
+
|
|
228
|
+
async validateAgainstClientPolicies(
|
|
229
|
+
action: "swap" | "deposit" | "withdraw" | "transfer",
|
|
230
|
+
tenantId: TenantId,
|
|
231
|
+
params?: Partial<SwapParams & DepositParams>
|
|
232
|
+
): Promise<PolicyValidation> {
|
|
233
|
+
// Simulate policy fetch with cache
|
|
234
|
+
const cached = this.policyCache.get(tenantId);
|
|
235
|
+
const now = Date.now();
|
|
236
|
+
const policy =
|
|
237
|
+
cached && now - cached.ts < 60000
|
|
238
|
+
? cached.policy
|
|
239
|
+
: this.getDefaultPolicy(tenantId);
|
|
240
|
+
|
|
241
|
+
if (policy) {
|
|
242
|
+
this.policyCache.set(tenantId, { policy, ts: now });
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const violations: string[] = [];
|
|
246
|
+
|
|
247
|
+
// Check if action is allowed
|
|
248
|
+
if (!policy.allowed_actions.includes(action)) {
|
|
249
|
+
violations.push(`action '${action}' not in allowed_actions`);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Check slippage constraint if params provided
|
|
253
|
+
if (
|
|
254
|
+
params &&
|
|
255
|
+
"max_slippage_bps" in params &&
|
|
256
|
+
((params as SwapParams).max_slippage_bps ?? 0) > policy.max_slippage_bps
|
|
257
|
+
) {
|
|
258
|
+
violations.push(
|
|
259
|
+
`slippage ${params.max_slippage_bps} bps exceeds policy max ${policy.max_slippage_bps} bps`
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const valid = violations.length === 0;
|
|
264
|
+
return {
|
|
265
|
+
valid,
|
|
266
|
+
violations,
|
|
267
|
+
policy_hash: `hash-${tenantId}-${action}`,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
private getDefaultPolicy(tenantId: TenantId): ClientPolicy {
|
|
272
|
+
if (tenantId === "restricted-tenant") {
|
|
273
|
+
return {
|
|
274
|
+
max_slippage_bps: 100,
|
|
275
|
+
allowed_pairs: [],
|
|
276
|
+
daily_volume_cap: "0",
|
|
277
|
+
deposit_cap: "0",
|
|
278
|
+
allowed_actions: [],
|
|
279
|
+
cache_ttl_seconds: 60,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
max_slippage_bps: 500,
|
|
284
|
+
allowed_pairs: [
|
|
285
|
+
["0xdeadbeef" as TokenAddress, "0xcafebabe" as TokenAddress],
|
|
286
|
+
],
|
|
287
|
+
daily_volume_cap: "1000000000000000000000",
|
|
288
|
+
deposit_cap: "500000000000000000000",
|
|
289
|
+
allowed_actions: ["swap", "deposit", "withdraw", "transfer"],
|
|
290
|
+
cache_ttl_seconds: 60,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
async swap(params: SwapParams, _ctx: ActionContext): Promise<SwapResult> {
|
|
295
|
+
// Simulate slippage calculation: if max_slippage_bps is very low, exceed it
|
|
296
|
+
const actualSlippageBps = params.max_slippage_bps < 20 ? 50 : 10;
|
|
297
|
+
|
|
298
|
+
if (actualSlippageBps > params.max_slippage_bps) {
|
|
299
|
+
throw new BastionSlippageExceededError(
|
|
300
|
+
params.max_slippage_bps,
|
|
301
|
+
actualSlippageBps
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return {
|
|
306
|
+
tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
|
|
307
|
+
amount_out: (BigInt(params.amount) * BigInt(99)) / BigInt(100),
|
|
308
|
+
actual_slippage_bps: actualSlippageBps,
|
|
309
|
+
executed_at: new Date(),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
async deposit(
|
|
314
|
+
params: DepositParams,
|
|
315
|
+
_ctx: ActionContext
|
|
316
|
+
): Promise<DepositResult> {
|
|
317
|
+
return {
|
|
318
|
+
tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
|
|
319
|
+
shares_minted: (BigInt(params.amount) * BigInt(95)) / BigInt(100),
|
|
320
|
+
deposit_amount: params.amount,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
async withdraw(
|
|
325
|
+
params: WithdrawParams,
|
|
326
|
+
_ctx: ActionContext
|
|
327
|
+
): Promise<WithdrawResult> {
|
|
328
|
+
return {
|
|
329
|
+
tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
|
|
330
|
+
amount_withdrawn: (BigInt(params.shares) * BigInt(98)) / BigInt(100),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
async transfer(
|
|
335
|
+
params: TransferParams,
|
|
336
|
+
ctx: ActionContext
|
|
337
|
+
): Promise<TransferResult> {
|
|
338
|
+
if (!ctx.legalBasis) {
|
|
339
|
+
throw new BastionTransferUnauthorizedError(
|
|
340
|
+
"Transfer requires legalBasis (TFR Art 4)",
|
|
341
|
+
"missing_legal_basis"
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
return {
|
|
346
|
+
tx_hash: `0x${crypto.randomUUID().replace(/-/g, "")}`,
|
|
347
|
+
recipient: params.recipient,
|
|
348
|
+
amount: params.amount,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// ─── Default contract application ──────────────────────────────────────────
|
|
354
|
+
|
|
355
|
+
bastionActionPortContract(() => new MockBastionActionPort());
|
|
@@ -0,0 +1,198 @@
|
|
|
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
|
+
|
|
10
|
+
// ─── Types ─────────────────────────────────────────────────────────────────
|
|
11
|
+
|
|
12
|
+
export type TokenAddress = string & { readonly __brand: "TokenAddress" };
|
|
13
|
+
export type VaultAddress = string & { readonly __brand: "VaultAddress" };
|
|
14
|
+
export type TenantId = string;
|
|
15
|
+
|
|
16
|
+
export interface SwapParams {
|
|
17
|
+
readonly token_in: TokenAddress;
|
|
18
|
+
readonly token_out: TokenAddress;
|
|
19
|
+
readonly amount: string; // wei/felt252 numeric string
|
|
20
|
+
readonly max_slippage_bps: number; // basis points [0, 10000]
|
|
21
|
+
readonly deadline: number; // Unix timestamp
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface DepositParams {
|
|
25
|
+
readonly vault_address: VaultAddress;
|
|
26
|
+
readonly amount: string;
|
|
27
|
+
readonly token: TokenAddress;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface WithdrawParams {
|
|
31
|
+
readonly vault_address: VaultAddress;
|
|
32
|
+
readonly shares: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface TransferParams {
|
|
36
|
+
readonly recipient: string;
|
|
37
|
+
readonly amount: string;
|
|
38
|
+
readonly token: TokenAddress;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ActionContext {
|
|
42
|
+
readonly tenantId: TenantId;
|
|
43
|
+
readonly manifestHash: string; // sha256 hex
|
|
44
|
+
readonly runId: string; // workflow run id
|
|
45
|
+
readonly legalBasis?: string; // TFR Art 4 or equivalent
|
|
46
|
+
readonly jurisdictionsContext?: string[];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ─── Results ─────────────────────────────────────────────────────────────────
|
|
50
|
+
|
|
51
|
+
export interface SwapResult {
|
|
52
|
+
readonly tx_hash: string;
|
|
53
|
+
readonly amount_out: string;
|
|
54
|
+
readonly actual_slippage_bps: number;
|
|
55
|
+
readonly executed_at: Date;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface DepositResult {
|
|
59
|
+
readonly tx_hash: string;
|
|
60
|
+
readonly shares_minted: string;
|
|
61
|
+
readonly deposit_amount: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface WithdrawResult {
|
|
65
|
+
readonly tx_hash: string;
|
|
66
|
+
readonly amount_withdrawn: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface TransferResult {
|
|
70
|
+
readonly tx_hash: string;
|
|
71
|
+
readonly recipient: string;
|
|
72
|
+
readonly amount: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ─── Client policies (runtime constraints) ────────────────────────────────
|
|
76
|
+
|
|
77
|
+
export interface ClientPolicy {
|
|
78
|
+
readonly max_slippage_bps: number;
|
|
79
|
+
readonly allowed_pairs: readonly [TokenAddress, TokenAddress][];
|
|
80
|
+
readonly daily_volume_cap: string; // wei
|
|
81
|
+
readonly deposit_cap: string; // wei
|
|
82
|
+
readonly allowed_actions: readonly (
|
|
83
|
+
| "swap"
|
|
84
|
+
| "deposit"
|
|
85
|
+
| "withdraw"
|
|
86
|
+
| "transfer"
|
|
87
|
+
)[];
|
|
88
|
+
readonly cache_ttl_seconds: number;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface PolicyValidation {
|
|
92
|
+
readonly valid: boolean;
|
|
93
|
+
readonly violations: readonly string[];
|
|
94
|
+
readonly policy_hash?: string;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// ─── Port interface ────────────────────────────────────────────────────────
|
|
98
|
+
|
|
99
|
+
export interface BastionActionPort {
|
|
100
|
+
/**
|
|
101
|
+
* Swap tokens on Bastion CoW intents.
|
|
102
|
+
* Throws BastionSlippageExceededError if actual slippage > max_slippage_bps.
|
|
103
|
+
*/
|
|
104
|
+
swap(params: SwapParams, ctx: ActionContext): Promise<SwapResult>;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Deposit into a Bastion vault.
|
|
108
|
+
* Throws BastionInsufficientFundsError if user balance < amount.
|
|
109
|
+
*/
|
|
110
|
+
deposit(params: DepositParams, ctx: ActionContext): Promise<DepositResult>;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Withdraw shares from a Bastion vault.
|
|
114
|
+
*/
|
|
115
|
+
withdraw(params: WithdrawParams, ctx: ActionContext): Promise<WithdrawResult>;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Transfer tokens. Requires legalBasis in ctx per TFR Art 4.
|
|
119
|
+
* Throws BastionTransferUnauthorizedError if legalBasis absent.
|
|
120
|
+
*/
|
|
121
|
+
transfer(params: TransferParams, ctx: ActionContext): Promise<TransferResult>;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Validate action against manifest ∩ client_policies intersection (T-E invariant).
|
|
125
|
+
* Caches client_policies for tenant TTL 60s; invalidation event-driven.
|
|
126
|
+
* Throws BastionPolicyViolationError if action ∉ intersection.
|
|
127
|
+
*/
|
|
128
|
+
validateAgainstClientPolicies(
|
|
129
|
+
action: "swap" | "deposit" | "withdraw" | "transfer",
|
|
130
|
+
tenantId: TenantId,
|
|
131
|
+
params?: Partial<SwapParams & DepositParams>
|
|
132
|
+
): Promise<PolicyValidation>;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// ─── Typed errors ─────────────────────────────────────────────────────────
|
|
136
|
+
|
|
137
|
+
export class BastionPolicyViolationError extends Error {
|
|
138
|
+
constructor(
|
|
139
|
+
message: string,
|
|
140
|
+
public readonly action: string,
|
|
141
|
+
public readonly tenantId: TenantId,
|
|
142
|
+
public readonly cause?: unknown
|
|
143
|
+
) {
|
|
144
|
+
super(message);
|
|
145
|
+
this.name = "BastionPolicyViolationError";
|
|
146
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export class BastionInsufficientFundsError extends Error {
|
|
151
|
+
constructor(
|
|
152
|
+
public readonly required: string,
|
|
153
|
+
public readonly available: string,
|
|
154
|
+
public readonly cause?: unknown
|
|
155
|
+
) {
|
|
156
|
+
super(`Insufficient funds: required ${required}, available ${available}`);
|
|
157
|
+
this.name = "BastionInsufficientFundsError";
|
|
158
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export class BastionSlippageExceededError extends Error {
|
|
163
|
+
constructor(
|
|
164
|
+
public readonly max_slippage_bps: number,
|
|
165
|
+
public readonly actual_slippage_bps: number,
|
|
166
|
+
public readonly cause?: unknown
|
|
167
|
+
) {
|
|
168
|
+
super(
|
|
169
|
+
`Slippage exceeded: max ${max_slippage_bps} bps, actual ${actual_slippage_bps} bps`
|
|
170
|
+
);
|
|
171
|
+
this.name = "BastionSlippageExceededError";
|
|
172
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export class BastionContractError extends Error {
|
|
177
|
+
constructor(
|
|
178
|
+
public readonly contract_call: string,
|
|
179
|
+
public readonly contract_error: string,
|
|
180
|
+
public readonly cause?: unknown
|
|
181
|
+
) {
|
|
182
|
+
super(`Contract error on ${contract_call}: ${contract_error}`);
|
|
183
|
+
this.name = "BastionContractError";
|
|
184
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export class BastionTransferUnauthorizedError extends Error {
|
|
189
|
+
constructor(
|
|
190
|
+
message: string,
|
|
191
|
+
public readonly reason: "missing_legal_basis" | "jurisdiction_blocked",
|
|
192
|
+
public readonly cause?: unknown
|
|
193
|
+
) {
|
|
194
|
+
super(message);
|
|
195
|
+
this.name = "BastionTransferUnauthorizedError";
|
|
196
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
197
|
+
}
|
|
198
|
+
}
|