@vauban-org/agent-sdk 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRACT.md +6401 -813
- package/dist/adapters/llm/anthropic-direct.d.ts +1 -0
- package/dist/adapters/llm/anthropic-direct.d.ts.map +1 -1
- package/dist/adapters/llm/anthropic-direct.js +43 -0
- package/dist/adapters/llm/anthropic-direct.js.map +1 -1
- package/dist/adapters/llm/cascade.d.ts.map +1 -1
- package/dist/adapters/llm/cascade.js +57 -14
- package/dist/adapters/llm/cascade.js.map +1 -1
- package/dist/adapters/llm/litellm.d.ts +2 -0
- package/dist/adapters/llm/litellm.d.ts.map +1 -1
- package/dist/adapters/llm/litellm.js +44 -0
- package/dist/adapters/llm/litellm.js.map +1 -1
- package/dist/compute/difficulty-estimator.d.ts +53 -0
- package/dist/compute/difficulty-estimator.d.ts.map +1 -0
- package/dist/compute/difficulty-estimator.js +82 -0
- package/dist/compute/difficulty-estimator.js.map +1 -0
- package/dist/compute/strategies/mixture-of-agents.d.ts +40 -0
- package/dist/compute/strategies/mixture-of-agents.d.ts.map +1 -0
- package/dist/compute/strategies/mixture-of-agents.js +110 -0
- package/dist/compute/strategies/mixture-of-agents.js.map +1 -0
- package/dist/compute/strategies/tree-of-thoughts.d.ts +48 -0
- package/dist/compute/strategies/tree-of-thoughts.d.ts.map +1 -0
- package/dist/compute/strategies/tree-of-thoughts.js +242 -0
- package/dist/compute/strategies/tree-of-thoughts.js.map +1 -0
- package/dist/compute/strategies/two-phase-orient.d.ts +72 -0
- package/dist/compute/strategies/two-phase-orient.d.ts.map +1 -0
- package/dist/compute/strategies/two-phase-orient.js +85 -0
- package/dist/compute/strategies/two-phase-orient.js.map +1 -0
- package/dist/constitution/types.d.ts +10 -10
- package/dist/container/protocol.d.ts +134 -0
- package/dist/container/protocol.d.ts.map +1 -0
- package/dist/container/protocol.js +157 -0
- package/dist/container/protocol.js.map +1 -0
- package/dist/container/runtime.d.ts +140 -0
- package/dist/container/runtime.d.ts.map +1 -0
- package/dist/container/runtime.js +256 -0
- package/dist/container/runtime.js.map +1 -0
- package/dist/events/catalogue.d.ts +46 -46
- package/dist/events/schemas/agent.completed.v1.d.ts +4 -4
- package/dist/events/schemas/agent.failed.v1.d.ts +2 -2
- package/dist/events/schemas/agent.hitl_resolved.v1.d.ts +2 -2
- package/dist/events/schemas/agent.started.v1.d.ts +2 -2
- package/dist/events/schemas/brain.skill.extracted.v1.d.ts +4 -4
- package/dist/events/schemas/cc.cost.anomaly_detected.v1.d.ts +2 -2
- package/dist/events/schemas/cc.cost.recorded.v1.d.ts +4 -4
- package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts +6 -6
- package/dist/events/schemas/citadel.sprint.closed.v1.d.ts +2 -2
- package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts +6 -6
- package/dist/events/schemas/forge.lead.qualified.v1.d.ts +2 -2
- package/dist/events/schemas/forge.outreach.sent.v1.d.ts +4 -4
- package/dist/events/schemas/incident.detected.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.goal.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.tax.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts +6 -6
- package/dist/identity/agent-persona.d.ts +73 -0
- package/dist/identity/agent-persona.d.ts.map +1 -0
- package/dist/identity/agent-persona.js +165 -0
- package/dist/identity/agent-persona.js.map +1 -0
- package/dist/identity/persona-prompt.d.ts +25 -0
- package/dist/identity/persona-prompt.d.ts.map +1 -0
- package/dist/identity/persona-prompt.js +71 -0
- package/dist/identity/persona-prompt.js.map +1 -0
- package/dist/identity/persona-schema.d.ts +120 -0
- package/dist/identity/persona-schema.d.ts.map +1 -0
- package/dist/identity/persona-schema.js +103 -0
- package/dist/identity/persona-schema.js.map +1 -0
- package/dist/index.d.ts +37 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -1
- package/dist/index.js.map +1 -1
- package/dist/loop/minimal-loop.js +293 -287
- package/dist/memory/episodic-rrf.d.ts +114 -0
- package/dist/memory/episodic-rrf.d.ts.map +1 -0
- package/dist/memory/episodic-rrf.js +148 -0
- package/dist/memory/episodic-rrf.js.map +1 -0
- package/dist/mesh/attenuation.d.ts +78 -0
- package/dist/mesh/attenuation.d.ts.map +1 -0
- package/dist/mesh/attenuation.js +141 -0
- package/dist/mesh/attenuation.js.map +1 -0
- package/dist/mesh/delegate.d.ts +96 -0
- package/dist/mesh/delegate.d.ts.map +1 -0
- package/dist/mesh/delegate.js +172 -0
- package/dist/mesh/delegate.js.map +1 -0
- package/dist/mesh/dispatcher.d.ts +119 -0
- package/dist/mesh/dispatcher.d.ts.map +1 -0
- package/dist/mesh/dispatcher.js +207 -0
- package/dist/mesh/dispatcher.js.map +1 -0
- package/dist/mesh/index.d.ts +12 -0
- package/dist/mesh/index.d.ts.map +1 -0
- package/dist/mesh/index.js +11 -0
- package/dist/mesh/index.js.map +1 -0
- package/dist/mesh/types.d.ts +30 -0
- package/dist/mesh/types.d.ts.map +1 -0
- package/dist/mesh/types.js +11 -0
- package/dist/mesh/types.js.map +1 -0
- package/dist/orchestration/ooda/skills.d.ts +104 -0
- package/dist/orchestration/ooda/skills.d.ts.map +1 -1
- package/dist/orchestration/ooda/skills.js +106 -0
- package/dist/orchestration/ooda/skills.js.map +1 -1
- package/dist/ports/bastion-action.contract.test.d.ts +11 -0
- package/dist/ports/bastion-action.contract.test.d.ts.map +1 -0
- package/dist/ports/bastion-action.contract.test.js +238 -0
- package/dist/ports/bastion-action.contract.test.js.map +1 -0
- package/dist/ports/bastion-action.d.ts +133 -0
- package/dist/ports/bastion-action.d.ts.map +1 -0
- package/dist/ports/bastion-action.js +73 -0
- package/dist/ports/bastion-action.js.map +1 -0
- package/dist/ports/brain.d.ts +31 -0
- package/dist/ports/brain.d.ts.map +1 -1
- package/dist/ports/brain.js +115 -1
- package/dist/ports/brain.js.map +1 -1
- package/dist/ports/citadel-action.contract.test.d.ts +11 -0
- package/dist/ports/citadel-action.contract.test.d.ts.map +1 -0
- package/dist/ports/citadel-action.contract.test.js +317 -0
- package/dist/ports/citadel-action.contract.test.js.map +1 -0
- package/dist/ports/citadel-action.d.ts +111 -0
- package/dist/ports/citadel-action.d.ts.map +1 -0
- package/dist/ports/citadel-action.js +62 -0
- package/dist/ports/citadel-action.js.map +1 -0
- package/dist/ports/compliance-contract.d.ts +123 -0
- package/dist/ports/compliance-contract.d.ts.map +1 -0
- package/dist/ports/compliance-contract.js +35 -0
- package/dist/ports/compliance-contract.js.map +1 -0
- package/dist/ports/db.d.ts +38 -0
- package/dist/ports/db.d.ts.map +1 -1
- package/dist/ports/db.js +88 -1
- package/dist/ports/db.js.map +1 -1
- package/dist/ports/delegation.contract.test.d.ts +9 -0
- package/dist/ports/delegation.contract.test.d.ts.map +1 -0
- package/dist/ports/delegation.contract.test.js +337 -0
- package/dist/ports/delegation.contract.test.js.map +1 -0
- package/dist/ports/delegation.d.ts +134 -0
- package/dist/ports/delegation.d.ts.map +1 -0
- package/dist/ports/delegation.js +105 -0
- package/dist/ports/delegation.js.map +1 -0
- package/dist/ports/event-bus.d.ts +29 -0
- package/dist/ports/event-bus.d.ts.map +1 -1
- package/dist/ports/event-bus.js +106 -1
- package/dist/ports/event-bus.js.map +1 -1
- package/dist/ports/federation.contract.test.d.ts +9 -0
- package/dist/ports/federation.contract.test.d.ts.map +1 -0
- package/dist/ports/federation.contract.test.js +279 -0
- package/dist/ports/federation.contract.test.js.map +1 -0
- package/dist/ports/federation.d.ts +140 -0
- package/dist/ports/federation.d.ts.map +1 -0
- package/dist/ports/federation.js +57 -0
- package/dist/ports/federation.js.map +1 -0
- package/dist/ports/index.d.ts +28 -2
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +17 -2
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/llm-provider.d.ts +37 -0
- package/dist/ports/llm-provider.d.ts.map +1 -1
- package/dist/ports/llm-provider.js +99 -1
- package/dist/ports/llm-provider.js.map +1 -1
- package/dist/ports/logger.d.ts +27 -0
- package/dist/ports/logger.d.ts.map +1 -1
- package/dist/ports/logger.js +87 -0
- package/dist/ports/logger.js.map +1 -1
- package/dist/ports/manifest-registry.contract.test.d.ts +9 -0
- package/dist/ports/manifest-registry.contract.test.d.ts.map +1 -0
- package/dist/ports/manifest-registry.contract.test.js +246 -0
- package/dist/ports/manifest-registry.contract.test.js.map +1 -0
- package/dist/ports/manifest-registry.d.ts +116 -0
- package/dist/ports/manifest-registry.d.ts.map +1 -0
- package/dist/ports/manifest-registry.js +79 -0
- package/dist/ports/manifest-registry.js.map +1 -0
- package/dist/ports/observability.contract.test.d.ts +12 -0
- package/dist/ports/observability.contract.test.d.ts.map +1 -0
- package/dist/ports/observability.contract.test.js +260 -0
- package/dist/ports/observability.contract.test.js.map +1 -0
- package/dist/ports/observability.d.ts +98 -0
- package/dist/ports/observability.d.ts.map +1 -0
- package/dist/ports/observability.js +59 -0
- package/dist/ports/observability.js.map +1 -0
- package/dist/ports/outcome.d.ts +26 -0
- package/dist/ports/outcome.d.ts.map +1 -1
- package/dist/ports/outcome.js +62 -1
- package/dist/ports/outcome.js.map +1 -1
- package/dist/ports/privacy.contract.test.d.ts +12 -0
- package/dist/ports/privacy.contract.test.d.ts.map +1 -0
- package/dist/ports/privacy.contract.test.js +325 -0
- package/dist/ports/privacy.contract.test.js.map +1 -0
- package/dist/ports/privacy.d.ts +132 -0
- package/dist/ports/privacy.d.ts.map +1 -0
- package/dist/ports/privacy.js +83 -0
- package/dist/ports/privacy.js.map +1 -0
- package/dist/ports/tenant-context.contract.test.d.ts +14 -0
- package/dist/ports/tenant-context.contract.test.d.ts.map +1 -0
- package/dist/ports/tenant-context.contract.test.js +352 -0
- package/dist/ports/tenant-context.contract.test.js.map +1 -0
- package/dist/ports/tenant-context.d.ts +103 -0
- package/dist/ports/tenant-context.d.ts.map +1 -0
- package/dist/ports/tenant-context.js +48 -0
- package/dist/ports/tenant-context.js.map +1 -0
- package/dist/ports/vauban-finance-action.contract.test.d.ts +11 -0
- package/dist/ports/vauban-finance-action.contract.test.d.ts.map +1 -0
- package/dist/ports/vauban-finance-action.contract.test.js +260 -0
- package/dist/ports/vauban-finance-action.contract.test.js.map +1 -0
- package/dist/ports/vauban-finance-action.d.ts +106 -0
- package/dist/ports/vauban-finance-action.d.ts.map +1 -0
- package/dist/ports/vauban-finance-action.js +60 -0
- package/dist/ports/vauban-finance-action.js.map +1 -0
- package/dist/ports/workflow-runtime.d.ts +204 -0
- package/dist/ports/workflow-runtime.d.ts.map +1 -0
- package/dist/ports/workflow-runtime.js +72 -0
- package/dist/ports/workflow-runtime.js.map +1 -0
- package/dist/proof/cert-verify.d.ts +80 -0
- package/dist/proof/cert-verify.d.ts.map +1 -0
- package/dist/proof/cert-verify.js +178 -0
- package/dist/proof/cert-verify.js.map +1 -0
- package/dist/replay/replay.d.ts.map +1 -1
- package/dist/replay/replay.js +5 -1
- package/dist/replay/replay.js.map +1 -1
- package/dist/retry/index.d.ts +129 -0
- package/dist/retry/index.d.ts.map +1 -0
- package/dist/retry/index.js +156 -0
- package/dist/retry/index.js.map +1 -0
- package/dist/retry/presets.d.ts +39 -0
- package/dist/retry/presets.d.ts.map +1 -0
- package/dist/retry/presets.js +69 -0
- package/dist/retry/presets.js.map +1 -0
- package/dist/skill-loop/ab-runner.d.ts +67 -0
- package/dist/skill-loop/ab-runner.d.ts.map +1 -0
- package/dist/skill-loop/ab-runner.js +160 -0
- package/dist/skill-loop/ab-runner.js.map +1 -0
- package/dist/skill-loop/adoption.d.ts +67 -0
- package/dist/skill-loop/adoption.d.ts.map +1 -0
- package/dist/skill-loop/adoption.js +126 -0
- package/dist/skill-loop/adoption.js.map +1 -0
- package/dist/skill-loop/candidate.d.ts +45 -0
- package/dist/skill-loop/candidate.d.ts.map +1 -0
- package/dist/skill-loop/candidate.js +43 -0
- package/dist/skill-loop/candidate.js.map +1 -0
- package/dist/skill-loop/evaluator.d.ts +42 -0
- package/dist/skill-loop/evaluator.d.ts.map +1 -0
- package/dist/skill-loop/evaluator.js +184 -0
- package/dist/skill-loop/evaluator.js.map +1 -0
- package/dist/skill-loop/index.d.ts +27 -0
- package/dist/skill-loop/index.d.ts.map +1 -0
- package/dist/skill-loop/index.js +27 -0
- package/dist/skill-loop/index.js.map +1 -0
- package/dist/skill-loop/reflexion-replay.d.ts +87 -0
- package/dist/skill-loop/reflexion-replay.d.ts.map +1 -0
- package/dist/skill-loop/reflexion-replay.js +110 -0
- package/dist/skill-loop/reflexion-replay.js.map +1 -0
- package/dist/skill-loop/sign-off.d.ts +88 -0
- package/dist/skill-loop/sign-off.d.ts.map +1 -0
- package/dist/skill-loop/sign-off.js +146 -0
- package/dist/skill-loop/sign-off.js.map +1 -0
- package/dist/skill-loop/value-metric.d.ts +55 -0
- package/dist/skill-loop/value-metric.d.ts.map +1 -0
- package/dist/skill-loop/value-metric.js +69 -0
- package/dist/skill-loop/value-metric.js.map +1 -0
- package/dist/skill-loop/versioning.d.ts +36 -0
- package/dist/skill-loop/versioning.d.ts.map +1 -0
- package/dist/skill-loop/versioning.js +47 -0
- package/dist/skill-loop/versioning.js.map +1 -0
- package/dist/skill-manifest/anchor.d.ts +91 -0
- package/dist/skill-manifest/anchor.d.ts.map +1 -0
- package/dist/skill-manifest/anchor.js +331 -0
- package/dist/skill-manifest/anchor.js.map +1 -0
- package/dist/skill-manifest/builder.d.ts +47 -0
- package/dist/skill-manifest/builder.d.ts.map +1 -0
- package/dist/skill-manifest/builder.js +93 -0
- package/dist/skill-manifest/builder.js.map +1 -0
- package/dist/skill-manifest/index.d.ts +13 -0
- package/dist/skill-manifest/index.d.ts.map +1 -0
- package/dist/skill-manifest/index.js +9 -0
- package/dist/skill-manifest/index.js.map +1 -0
- package/dist/skill-manifest/types.d.ts +67 -0
- package/dist/skill-manifest/types.d.ts.map +1 -0
- package/dist/skill-manifest/types.js +16 -0
- package/dist/skill-manifest/types.js.map +1 -0
- package/dist/skill-manifest/verifier.d.ts +42 -0
- package/dist/skill-manifest/verifier.d.ts.map +1 -0
- package/dist/skill-manifest/verifier.js +136 -0
- package/dist/skill-manifest/verifier.js.map +1 -0
- package/dist/skills/brain-query.d.ts +4 -4
- package/dist/skills/brain-store.d.ts +6 -6
- package/dist/skills/errors.d.ts +15 -0
- package/dist/skills/errors.d.ts.map +1 -1
- package/dist/skills/errors.js +21 -0
- package/dist/skills/errors.js.map +1 -1
- package/dist/skills/hitl-request.d.ts +2 -2
- package/dist/skills/index.d.ts +3 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +4 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/markdown/loader.d.ts +52 -0
- package/dist/skills/markdown/loader.d.ts.map +1 -0
- package/dist/skills/markdown/loader.js +93 -0
- package/dist/skills/markdown/loader.js.map +1 -0
- package/dist/skills/markdown/schema.d.ts +432 -0
- package/dist/skills/markdown/schema.d.ts.map +1 -0
- package/dist/skills/markdown/schema.js +121 -0
- package/dist/skills/markdown/schema.js.map +1 -0
- package/dist/skills/poc-md-loader/markdown-loader.d.ts +77 -0
- package/dist/skills/poc-md-loader/markdown-loader.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/markdown-loader.js +125 -0
- package/dist/skills/poc-md-loader/markdown-loader.js.map +1 -0
- package/dist/skills/poc-md-loader/runner.d.ts +24 -0
- package/dist/skills/poc-md-loader/runner.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/runner.js +57 -0
- package/dist/skills/poc-md-loader/runner.js.map +1 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.d.ts +3 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.js +13 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.js.map +1 -0
- package/dist/skills/poc-md-loader/web-search/script.d.ts +33 -0
- package/dist/skills/poc-md-loader/web-search/script.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/web-search/script.js +75 -0
- package/dist/skills/poc-md-loader/web-search/script.js.map +1 -0
- package/dist/skills/record-outcome.d.ts +4 -4
- package/dist/skills/send-email.d.ts.map +1 -1
- package/dist/skills/send-email.js +15 -3
- package/dist/skills/send-email.js.map +1 -1
- package/dist/skills/slack-notify.d.ts +4 -4
- package/dist/skills/starknet-balance.d.ts +1 -1
- package/dist/skills/telegram-notify.d.ts +4 -4
- package/dist/skills/web-search.d.ts +1 -1
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/test-brain-port.d.ts +4 -0
- package/dist/testing/test-brain-port.d.ts.map +1 -1
- package/dist/testing/test-brain-port.js +75 -20
- package/dist/testing/test-brain-port.js.map +1 -1
- package/dist/testing/test-event-bus.d.ts.map +1 -1
- package/dist/testing/test-event-bus.js +89 -36
- package/dist/testing/test-event-bus.js.map +1 -1
- package/dist/trace/schema.d.ts +1 -1
- package/dist/trace/schema.d.ts.map +1 -1
- package/dist/trace/schema.js +1 -1
- package/dist/trace/schema.js.map +1 -1
- package/dist/verify/formal/index.d.ts +44 -0
- package/dist/verify/formal/index.d.ts.map +1 -0
- package/dist/verify/formal/index.js +98 -0
- package/dist/verify/formal/index.js.map +1 -0
- package/dist/verify/formal/policy.d.ts +105 -0
- package/dist/verify/formal/policy.d.ts.map +1 -0
- package/dist/verify/formal/policy.js +159 -0
- package/dist/verify/formal/policy.js.map +1 -0
- package/dist/verify/formal/result.d.ts +50 -0
- package/dist/verify/formal/result.d.ts.map +1 -0
- package/dist/verify/formal/result.js +21 -0
- package/dist/verify/formal/result.js.map +1 -0
- package/dist/verify/formal/solver.d.ts +67 -0
- package/dist/verify/formal/solver.d.ts.map +1 -0
- package/dist/verify/formal/solver.js +184 -0
- package/dist/verify/formal/solver.js.map +1 -0
- package/dist/verify/formal/spec-language.d.ts +80 -0
- package/dist/verify/formal/spec-language.d.ts.map +1 -0
- package/dist/verify/formal/spec-language.js +219 -0
- package/dist/verify/formal/spec-language.js.map +1 -0
- package/docs/attestation.md +199 -0
- package/docs/identity.md +193 -0
- package/package.json +34 -17
- package/src/adapters/llm/anthropic-direct.ts +51 -0
- package/src/adapters/llm/cascade.ts +64 -19
- package/src/adapters/llm/litellm.ts +49 -0
- package/src/compute/difficulty-estimator.ts +111 -0
- package/src/compute/strategies/mixture-of-agents.ts +150 -0
- package/src/compute/strategies/tree-of-thoughts.ts +293 -0
- package/src/compute/strategies/two-phase-orient.ts +147 -0
- package/src/container/protocol.ts +243 -0
- package/src/container/runtime.ts +424 -0
- package/src/db/migrations/026_formal_verify_results.sql +30 -0
- package/src/identity/agent-persona.ts +203 -0
- package/src/identity/persona-prompt.ts +84 -0
- package/src/identity/persona-schema.ts +127 -0
- package/src/index.ts +338 -1
- package/src/memory/episodic-rrf.ts +224 -0
- package/src/mesh/attenuation.ts +190 -0
- package/src/mesh/delegate.ts +254 -0
- package/src/mesh/dispatcher.ts +301 -0
- package/src/mesh/index.ts +39 -0
- package/src/mesh/types.ts +31 -0
- package/src/orchestration/ooda/skills.ts +177 -0
- package/src/ports/bastion-action.contract.test.ts +355 -0
- package/src/ports/bastion-action.ts +198 -0
- package/src/ports/brain.ts +177 -15
- package/src/ports/citadel-action.contract.test.ts +430 -0
- package/src/ports/citadel-action.ts +174 -0
- package/src/ports/compliance-contract.ts +191 -0
- package/src/ports/db.ts +98 -0
- package/src/ports/delegation.contract.test.ts +428 -0
- package/src/ports/delegation.ts +211 -0
- package/src/ports/event-bus.ts +133 -0
- package/src/ports/federation.contract.test.ts +355 -0
- package/src/ports/federation.ts +190 -0
- package/src/ports/index.ts +186 -1
- package/src/ports/llm-provider.ts +123 -0
- package/src/ports/logger.ts +104 -0
- package/src/ports/manifest-registry.contract.test.ts +324 -0
- package/src/ports/manifest-registry.ts +188 -0
- package/src/ports/observability.contract.test.ts +315 -0
- package/src/ports/observability.ts +150 -0
- package/src/ports/outcome.ts +69 -0
- package/src/ports/privacy.contract.test.ts +413 -0
- package/src/ports/privacy.ts +207 -0
- package/src/ports/tenant-context.contract.test.ts +454 -0
- package/src/ports/tenant-context.ts +150 -0
- package/src/ports/vauban-finance-action.contract.test.ts +335 -0
- package/src/ports/vauban-finance-action.ts +166 -0
- package/src/ports/workflow-runtime.ts +327 -0
- package/src/proof/cert-verify.ts +249 -0
- package/src/replay/replay.ts +11 -8
- package/src/retry/index.ts +227 -0
- package/src/retry/presets.ts +75 -0
- package/src/skill-loop/ab-runner.ts +196 -0
- package/src/skill-loop/adoption.ts +188 -0
- package/src/skill-loop/candidate.ts +75 -0
- package/src/skill-loop/evaluator.ts +238 -0
- package/src/skill-loop/index.ts +51 -0
- package/src/skill-loop/reflexion-replay.ts +173 -0
- package/src/skill-loop/sign-off.ts +247 -0
- package/src/skill-loop/value-metric.ts +120 -0
- package/src/skill-loop/versioning.ts +75 -0
- package/src/skill-manifest/anchor.ts +401 -0
- package/src/skill-manifest/builder.ts +129 -0
- package/src/skill-manifest/index.ts +18 -0
- package/src/skill-manifest/types.ts +72 -0
- package/src/skill-manifest/verifier.ts +198 -0
- package/src/skills/errors.ts +30 -2
- package/src/skills/index.ts +19 -0
- package/src/skills/markdown/loader.ts +129 -0
- package/src/skills/markdown/schema.ts +144 -0
- package/src/skills/poc-md-loader/e2e-parity.test.ts +237 -0
- package/src/skills/poc-md-loader/markdown-loader.ts +161 -0
- package/src/skills/poc-md-loader/runner.ts +82 -0
- package/src/skills/poc-md-loader/vitest.poc.config.ts +13 -0
- package/src/skills/poc-md-loader/web-search/SKILL.md +42 -0
- package/src/skills/poc-md-loader/web-search/script.ts +109 -0
- package/src/skills/send-email.ts +15 -3
- package/src/testing/test-brain-port.ts +98 -24
- package/src/testing/test-event-bus.ts +104 -43
- package/src/trace/schema.ts +1 -1
- package/src/verify/formal/index.ts +154 -0
- package/src/verify/formal/policy.ts +253 -0
- package/src/verify/formal/result.ts +52 -0
- package/src/verify/formal/solver.ts +235 -0
- package/src/verify/formal/spec-language.ts +274 -0
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
// ─── Typed errors ─────────────────────────────────────────────────────────
|
|
10
|
+
export class BastionPolicyViolationError extends Error {
|
|
11
|
+
action;
|
|
12
|
+
tenantId;
|
|
13
|
+
cause;
|
|
14
|
+
constructor(message, action, tenantId, cause) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.action = action;
|
|
17
|
+
this.tenantId = tenantId;
|
|
18
|
+
this.cause = cause;
|
|
19
|
+
this.name = "BastionPolicyViolationError";
|
|
20
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class BastionInsufficientFundsError extends Error {
|
|
24
|
+
required;
|
|
25
|
+
available;
|
|
26
|
+
cause;
|
|
27
|
+
constructor(required, available, cause) {
|
|
28
|
+
super(`Insufficient funds: required ${required}, available ${available}`);
|
|
29
|
+
this.required = required;
|
|
30
|
+
this.available = available;
|
|
31
|
+
this.cause = cause;
|
|
32
|
+
this.name = "BastionInsufficientFundsError";
|
|
33
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class BastionSlippageExceededError extends Error {
|
|
37
|
+
max_slippage_bps;
|
|
38
|
+
actual_slippage_bps;
|
|
39
|
+
cause;
|
|
40
|
+
constructor(max_slippage_bps, actual_slippage_bps, cause) {
|
|
41
|
+
super(`Slippage exceeded: max ${max_slippage_bps} bps, actual ${actual_slippage_bps} bps`);
|
|
42
|
+
this.max_slippage_bps = max_slippage_bps;
|
|
43
|
+
this.actual_slippage_bps = actual_slippage_bps;
|
|
44
|
+
this.cause = cause;
|
|
45
|
+
this.name = "BastionSlippageExceededError";
|
|
46
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export class BastionContractError extends Error {
|
|
50
|
+
contract_call;
|
|
51
|
+
contract_error;
|
|
52
|
+
cause;
|
|
53
|
+
constructor(contract_call, contract_error, cause) {
|
|
54
|
+
super(`Contract error on ${contract_call}: ${contract_error}`);
|
|
55
|
+
this.contract_call = contract_call;
|
|
56
|
+
this.contract_error = contract_error;
|
|
57
|
+
this.cause = cause;
|
|
58
|
+
this.name = "BastionContractError";
|
|
59
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class BastionTransferUnauthorizedError extends Error {
|
|
63
|
+
reason;
|
|
64
|
+
cause;
|
|
65
|
+
constructor(message, reason, cause) {
|
|
66
|
+
super(message);
|
|
67
|
+
this.reason = reason;
|
|
68
|
+
this.cause = cause;
|
|
69
|
+
this.name = "BastionTransferUnauthorizedError";
|
|
70
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=bastion-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bastion-action.js","sourceRoot":"","sources":["../../src/ports/bastion-action.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA+HH,6EAA6E;AAE7E,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAGlC;IACA;IACA;IAJlB,YACE,OAAe,EACC,MAAc,EACd,QAAkB,EAClB,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAU;QAClB,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC1C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IAEpC;IACA;IACA;IAHlB,YACkB,QAAgB,EAChB,SAAiB,EACjB,KAAe;QAE/B,KAAK,CAAC,gCAAgC,QAAQ,eAAe,SAAS,EAAE,CAAC,CAAC;QAJ1D,aAAQ,GAAR,QAAQ,CAAQ;QAChB,cAAS,GAAT,SAAS,CAAQ;QACjB,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAEnC;IACA;IACA;IAHlB,YACkB,gBAAwB,EACxB,mBAA2B,EAC3B,KAAe;QAE/B,KAAK,CACH,0BAA0B,gBAAgB,gBAAgB,mBAAmB,MAAM,CACpF,CAAC;QANc,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,wBAAmB,GAAnB,mBAAmB,CAAQ;QAC3B,UAAK,GAAL,KAAK,CAAU;QAK/B,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAE3B;IACA;IACA;IAHlB,YACkB,aAAqB,EACrB,cAAsB,EACtB,KAAe;QAE/B,KAAK,CAAC,qBAAqB,aAAa,KAAK,cAAc,EAAE,CAAC,CAAC;QAJ/C,kBAAa,GAAb,aAAa,CAAQ;QACrB,mBAAc,GAAd,cAAc,CAAQ;QACtB,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,gCAAiC,SAAQ,KAAK;IAGvC;IACA;IAHlB,YACE,OAAe,EACC,MAAsD,EACtD,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,WAAM,GAAN,MAAM,CAAgD;QACtD,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF"}
|
package/dist/ports/brain.d.ts
CHANGED
|
@@ -136,6 +136,25 @@ export declare class InMemoryProceduralMemory implements ProceduralMemoryPort {
|
|
|
136
136
|
registerSkill(agentId: string, skill: ProceduralSkill): Promise<void>;
|
|
137
137
|
shareSkill(skillName: string, fromAgentId: string, toAgentIds: string[]): Promise<void>;
|
|
138
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Thrown when the Brain API is unreachable (connection refused, DNS failure,
|
|
141
|
+
* timeout on connect). Callers can retry with backoff or fall back to a local cache.
|
|
142
|
+
*/
|
|
143
|
+
export declare class BrainUnavailableError extends Error {
|
|
144
|
+
readonly cause?: unknown | undefined;
|
|
145
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Thrown when the Brain API returns 429 (rate limit exceeded).
|
|
149
|
+
* Callers should retry after the delay indicated in the `retryAfterMs` field
|
|
150
|
+
* (extracted from the Retry-After header) or use exponential backoff.
|
|
151
|
+
*/
|
|
152
|
+
export declare class BrainRateLimitError extends Error {
|
|
153
|
+
readonly cause?: unknown | undefined;
|
|
154
|
+
/** Retry-After delay in milliseconds. Derived from the HTTP Retry-After header. */
|
|
155
|
+
readonly retryAfterMs: number;
|
|
156
|
+
constructor(message: string, retryAfterMs: number, cause?: unknown | undefined);
|
|
157
|
+
}
|
|
139
158
|
export interface BrainPort {
|
|
140
159
|
archiveKnowledge(entry: BrainEntryInput): Promise<BrainEntry | null>;
|
|
141
160
|
queryKnowledge?(query: string, filters?: BrainQueryFilters): Promise<BrainEntry[]>;
|
|
@@ -144,4 +163,16 @@ export interface BrainPort {
|
|
|
144
163
|
semantic?: SemanticMemoryPort;
|
|
145
164
|
procedural?: ProceduralMemoryPort;
|
|
146
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Wrap any BrainPort implementation with OTel spans.
|
|
168
|
+
* archiveKnowledge and queryKnowledge calls each get a span with the category
|
|
169
|
+
* and content preview. Gracefully degrades to noop spans when no OTel SDK
|
|
170
|
+
* is installed.
|
|
171
|
+
*
|
|
172
|
+
* Usage:
|
|
173
|
+
* const raw: BrainPort = buildHttpBrain(...);
|
|
174
|
+
* const traced = createTracedBrainPort(raw);
|
|
175
|
+
* await traced.archiveKnowledge({ content: "..." }) // emits "brain.archiveKnowledge" span
|
|
176
|
+
*/
|
|
177
|
+
export declare function createTracedBrainPort(impl: BrainPort): BrainPort;
|
|
147
178
|
//# sourceMappingURL=brain.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/ports/brain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID,MAAM,WAAW,iBAAiB;IAChC,GAAG,
|
|
1
|
+
{"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/ports/brain.ts"],"names":[],"mappings":"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"}
|
package/dist/ports/brain.js
CHANGED
|
@@ -9,7 +9,10 @@
|
|
|
9
9
|
export class InMemoryWorkingMemory {
|
|
10
10
|
store = new Map();
|
|
11
11
|
async set(runId, key, value, opts) {
|
|
12
|
-
this.store.set(`${runId}:${key}`, {
|
|
12
|
+
this.store.set(`${runId}:${key}`, {
|
|
13
|
+
value,
|
|
14
|
+
expiresAt: Date.now() + (opts?.ttlMs ?? 300_000),
|
|
15
|
+
});
|
|
13
16
|
}
|
|
14
17
|
async get(runId, key) {
|
|
15
18
|
const entry = this.store.get(`${runId}:${key}`);
|
|
@@ -102,4 +105,115 @@ export class InMemoryProceduralMemory {
|
|
|
102
105
|
}
|
|
103
106
|
}
|
|
104
107
|
}
|
|
108
|
+
// ─── Typed errors ─────────────────────────────────────────────────────────────
|
|
109
|
+
/**
|
|
110
|
+
* Thrown when the Brain API is unreachable (connection refused, DNS failure,
|
|
111
|
+
* timeout on connect). Callers can retry with backoff or fall back to a local cache.
|
|
112
|
+
*/
|
|
113
|
+
export class BrainUnavailableError extends Error {
|
|
114
|
+
cause;
|
|
115
|
+
constructor(message, cause) {
|
|
116
|
+
super(message);
|
|
117
|
+
this.cause = cause;
|
|
118
|
+
this.name = "BrainUnavailableError";
|
|
119
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Thrown when the Brain API returns 429 (rate limit exceeded).
|
|
124
|
+
* Callers should retry after the delay indicated in the `retryAfterMs` field
|
|
125
|
+
* (extracted from the Retry-After header) or use exponential backoff.
|
|
126
|
+
*/
|
|
127
|
+
export class BrainRateLimitError extends Error {
|
|
128
|
+
cause;
|
|
129
|
+
/** Retry-After delay in milliseconds. Derived from the HTTP Retry-After header. */
|
|
130
|
+
retryAfterMs;
|
|
131
|
+
constructor(message, retryAfterMs, cause) {
|
|
132
|
+
super(message);
|
|
133
|
+
this.cause = cause;
|
|
134
|
+
this.name = "BrainRateLimitError";
|
|
135
|
+
this.retryAfterMs = retryAfterMs;
|
|
136
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
140
|
+
const PORT_TRACER = trace.getTracer("vauban-agent-sdk.ports", "0.1.0");
|
|
141
|
+
/**
|
|
142
|
+
* Wrap any BrainPort implementation with OTel spans.
|
|
143
|
+
* archiveKnowledge and queryKnowledge calls each get a span with the category
|
|
144
|
+
* and content preview. Gracefully degrades to noop spans when no OTel SDK
|
|
145
|
+
* is installed.
|
|
146
|
+
*
|
|
147
|
+
* Usage:
|
|
148
|
+
* const raw: BrainPort = buildHttpBrain(...);
|
|
149
|
+
* const traced = createTracedBrainPort(raw);
|
|
150
|
+
* await traced.archiveKnowledge({ content: "..." }) // emits "brain.archiveKnowledge" span
|
|
151
|
+
*/
|
|
152
|
+
export function createTracedBrainPort(impl) {
|
|
153
|
+
return {
|
|
154
|
+
working: impl.working,
|
|
155
|
+
episodic: impl.episodic,
|
|
156
|
+
semantic: impl.semantic,
|
|
157
|
+
procedural: impl.procedural,
|
|
158
|
+
async archiveKnowledge(entry) {
|
|
159
|
+
return PORT_TRACER.startActiveSpan("brain.archiveKnowledge", {
|
|
160
|
+
attributes: {
|
|
161
|
+
"brain.entry.category": entry.category ?? "unknown",
|
|
162
|
+
"brain.entry.content_preview": entry.content.slice(0, 200),
|
|
163
|
+
"brain.entry.tags": entry.tags?.join(",") ?? "",
|
|
164
|
+
"vauban.port.name": "brain",
|
|
165
|
+
},
|
|
166
|
+
}, async (span) => {
|
|
167
|
+
try {
|
|
168
|
+
const result = await impl.archiveKnowledge(entry);
|
|
169
|
+
if (result) {
|
|
170
|
+
span.setAttribute("brain.entry.id", result.id);
|
|
171
|
+
}
|
|
172
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
177
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message });
|
|
178
|
+
if (err instanceof Error)
|
|
179
|
+
span.recordException(err);
|
|
180
|
+
throw err;
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
span.end();
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
},
|
|
187
|
+
async queryKnowledge(query, filters) {
|
|
188
|
+
if (!impl.queryKnowledge)
|
|
189
|
+
return [];
|
|
190
|
+
const qk = impl.queryKnowledge.bind(impl);
|
|
191
|
+
return PORT_TRACER.startActiveSpan("brain.queryKnowledge", {
|
|
192
|
+
attributes: {
|
|
193
|
+
"brain.query.preview": query.slice(0, 200),
|
|
194
|
+
"brain.query.category": filters?.category ?? "none",
|
|
195
|
+
"brain.query.limit": filters?.limit ?? -1,
|
|
196
|
+
"vauban.port.name": "brain",
|
|
197
|
+
},
|
|
198
|
+
}, async (span) => {
|
|
199
|
+
try {
|
|
200
|
+
const result = await qk(query, filters);
|
|
201
|
+
span.setAttribute("brain.query.result_count", result.length);
|
|
202
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
207
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message });
|
|
208
|
+
if (err instanceof Error)
|
|
209
|
+
span.recordException(err);
|
|
210
|
+
throw err;
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
span.end();
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
105
219
|
//# sourceMappingURL=brain.js.map
|
package/dist/ports/brain.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain.js","sourceRoot":"","sources":["../../src/ports/brain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"brain.js","sourceRoot":"","sources":["../../src/ports/brain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA0CH,MAAM,OAAO,qBAAqB;IACxB,KAAK,GAAG,IAAI,GAAG,EAAiD,CAAC;IAEzE,KAAK,CAAC,GAAG,CACP,KAAa,EACb,GAAW,EACX,KAAc,EACd,IAAyB;QAEzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,GAAG,EAAE,EAAE;YAChC,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,OAAO,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAa,EAAE,GAAW;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,GAAW;QACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IACvC,CAAC;CACF;AA2DD,MAAM,OAAO,sBAAsB;IACzB,MAAM,GAA0B,EAAE,CAAC;IAE3C,KAAK,CAAC,MAAM,CACV,OAAe,EACf,KAAa,EACb,KAAa,EACb,QAAkC,EAClC,IAA2B;QAE3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,OAAO;YACP,KAAK;YACL,KAAK;YACL,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,IAAI,EAAE,OAAO;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CACT,OAAe,EACf,OAAe,EACf,IAAyB;QAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC;aAC9D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,OAAe,EACf,IAAyB;QAEzB,qFAAqF;QACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QAClE,OAAO,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChE,CAAC;CACF;AAWD,MAAM,OAAO,sBAAsB;IACzB,OAAO,GAAiB,EAAE,CAAC;IAEnC,KAAK,CAAC,KAAK,CAAC,CAAS,EAAE,OAA2B;QAChD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACtC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAClD,CAAC;QACF,IAAI,OAAO,EAAE,QAAQ;YACnB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnE,IAAI,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAC/C,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAsB;QAClC,MAAM,OAAO,GAAe;YAC1B,EAAE,EAAE,YAAY,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAA+C;YAC/D,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAyBD,MAAM,OAAO,wBAAwB;IAC3B,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC9C,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE7C,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAsB,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACpD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBACtD,IAAI,KAAK;oBAAE,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,QAAiB,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,KAAsB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU,CACd,SAAiB,EACjB,WAAmB,EACnB,UAAoB;QAEpB,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACD;IAA7C,YAAY,OAAe,EAAkB,KAAe;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,UAAK,GAAL,KAAK,CAAU;QAE1D,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAO1B;IANlB,mFAAmF;IAC1E,YAAY,CAAS;IAE9B,YACE,OAAe,EACf,YAAoB,EACJ,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAoBD,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;AAEvE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAe;IACnD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;QAE3B,KAAK,CAAC,gBAAgB,CAAC,KAAsB;YAC3C,OAAO,WAAW,CAAC,eAAe,CAChC,wBAAwB,EACxB;gBACE,UAAU,EAAE;oBACV,sBAAsB,EAAE,KAAK,CAAC,QAAQ,IAAI,SAAS;oBACnD,6BAA6B,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBAC1D,kBAAkB,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;oBAC/C,kBAAkB,EAAE,OAAO;iBAC5B;aACF,EACD,KAAK,EAAE,IAAU,EAAE,EAAE;gBACnB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBAClD,IAAI,MAAM,EAAE,CAAC;wBACX,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;oBACjD,CAAC;oBACD,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC5C,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;oBACxD,IAAI,GAAG,YAAY,KAAK;wBAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;oBACpD,MAAM,GAAG,CAAC;gBACZ,CAAC;wBAAS,CAAC;oBACT,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,CAAC;YACH,CAAC,CACF,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,cAAc,CAClB,KAAa,EACb,OAA2B;YAE3B,IAAI,CAAC,IAAI,CAAC,cAAc;gBAAE,OAAO,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,WAAW,CAAC,eAAe,CAChC,sBAAsB,EACtB;gBACE,UAAU,EAAE;oBACV,qBAAqB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBAC1C,sBAAsB,EAAE,OAAO,EAAE,QAAQ,IAAI,MAAM;oBACnD,mBAAmB,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;oBACzC,kBAAkB,EAAE,OAAO;iBAC5B;aACF,EACD,KAAK,EAAE,IAAU,EAAE,EAAE;gBACnB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBACxC,IAAI,CAAC,YAAY,CAAC,0BAA0B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC7D,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC5C,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;oBACxD,IAAI,GAAG,YAAY,KAAK;wBAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;oBACpD,MAAM,GAAG,CAAC;gBACZ,CAAC;wBAAS,CAAC;oBACT,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,CAAC;YACH,CAAC,CACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CitadelActionPort contract tests.
|
|
3
|
+
*
|
|
4
|
+
* Applied to any CitadelActionPort implementation. Tests tiered access control,
|
|
5
|
+
* state transitions, and governance claim emission.
|
|
6
|
+
*
|
|
7
|
+
* Source: vauban-gouvernance/rules/ai/tiered-gates.md + MASTER-PLAN-v5.md §1.3
|
|
8
|
+
*/
|
|
9
|
+
import { type CitadelActionPort } from "./citadel-action.js";
|
|
10
|
+
export declare const citadelActionPortContract: (factory: () => CitadelActionPort) => void;
|
|
11
|
+
//# sourceMappingURL=citadel-action.contract.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"citadel-action.contract.test.d.ts","sourceRoot":"","sources":["../../src/ports/citadel-action.contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAKL,KAAK,iBAAiB,EAMvB,MAAM,qBAAqB,CAAC;AA0D7B,eAAO,MAAM,yBAAyB,GAAI,SAAS,MAAM,iBAAiB,SAwMzE,CAAC"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CitadelActionPort contract tests.
|
|
3
|
+
*
|
|
4
|
+
* Applied to any CitadelActionPort implementation. Tests tiered access control,
|
|
5
|
+
* state transitions, and governance claim emission.
|
|
6
|
+
*
|
|
7
|
+
* Source: vauban-gouvernance/rules/ai/tiered-gates.md + MASTER-PLAN-v5.md §1.3
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, test } from "vitest";
|
|
10
|
+
import { CitadelTierViolationError, CitadelTaskRefNotFoundError, CitadelSprintNotActiveError, CitadelInvalidStateTransitionError, } from "./citadel-action.js";
|
|
11
|
+
function makeActionContext(overrides = {}) {
|
|
12
|
+
return {
|
|
13
|
+
agentId: "test-agent-001",
|
|
14
|
+
agentTier: "T3",
|
|
15
|
+
runId: crypto.randomUUID(),
|
|
16
|
+
...overrides,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function makeSprintInput(overrides = {}) {
|
|
20
|
+
return {
|
|
21
|
+
name: "Sprint Test",
|
|
22
|
+
goal: "Test sprint",
|
|
23
|
+
project_slug: "test-project",
|
|
24
|
+
start_date: new Date().toISOString(),
|
|
25
|
+
end_date: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),
|
|
26
|
+
...overrides,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function makeTaskRef(overrides = {}) {
|
|
30
|
+
return {
|
|
31
|
+
ref: "test-project:sprint-1:task-001",
|
|
32
|
+
project: "test-project",
|
|
33
|
+
sprint: "sprint-1",
|
|
34
|
+
task_id: "task-001",
|
|
35
|
+
...overrides,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function makeVerificationEvidence(overrides = {}) {
|
|
39
|
+
return {
|
|
40
|
+
passed: true,
|
|
41
|
+
evidence_text: "Verification scenario executed successfully",
|
|
42
|
+
evidence_hash: "abcd1234efgh5678ijkl9012mnop3456",
|
|
43
|
+
...overrides,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function makeDecisionInput(overrides = {}) {
|
|
47
|
+
return {
|
|
48
|
+
decision: "Adopt new architecture",
|
|
49
|
+
context: "Performance issues in current stack",
|
|
50
|
+
options: ["Refactor current", "Migrate to new stack", "Hybrid approach"],
|
|
51
|
+
chosen: "Hybrid approach",
|
|
52
|
+
rationale: "Balance performance and migration cost",
|
|
53
|
+
...overrides,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export const citadelActionPortContract = (factory) => {
|
|
57
|
+
describe("CitadelActionPort contract", () => {
|
|
58
|
+
test("createSprint requires T2+ tier", async () => {
|
|
59
|
+
const port = factory();
|
|
60
|
+
const input = makeSprintInput();
|
|
61
|
+
const ctx = makeActionContext({ agentTier: "T1" });
|
|
62
|
+
await expect(port.createSprint(input, ctx)).rejects.toThrow(CitadelTierViolationError);
|
|
63
|
+
});
|
|
64
|
+
test("createSprint succeeds for T2+ agents", async () => {
|
|
65
|
+
const port = factory();
|
|
66
|
+
const input = makeSprintInput();
|
|
67
|
+
const ctx = makeActionContext({ agentTier: "T2" });
|
|
68
|
+
const sprintRef = await port.createSprint(input, ctx);
|
|
69
|
+
expect(sprintRef.sprint_id).toBeDefined();
|
|
70
|
+
expect(sprintRef.project_slug).toBe(input.project_slug);
|
|
71
|
+
expect(sprintRef.name).toBe(input.name);
|
|
72
|
+
});
|
|
73
|
+
test("updateTaskStatus transitions task state", async () => {
|
|
74
|
+
const port = factory();
|
|
75
|
+
const taskRef = makeTaskRef();
|
|
76
|
+
const ctx = makeActionContext({ agentTier: "T2" });
|
|
77
|
+
// Transition todo → in_progress
|
|
78
|
+
await port.updateTaskStatus(taskRef, "in_progress", ctx);
|
|
79
|
+
// No throw = success
|
|
80
|
+
// Transition in_progress → done
|
|
81
|
+
await port.updateTaskStatus(taskRef, "done", ctx);
|
|
82
|
+
// No throw = success
|
|
83
|
+
});
|
|
84
|
+
test("updateTaskStatus blocks invalid transitions", async () => {
|
|
85
|
+
const port = factory();
|
|
86
|
+
const taskRef = makeTaskRef();
|
|
87
|
+
const ctx = makeActionContext({ agentTier: "T2" });
|
|
88
|
+
// Walk valid path: todo → in_progress → done
|
|
89
|
+
await port.updateTaskStatus(taskRef, "in_progress", ctx);
|
|
90
|
+
await port.updateTaskStatus(taskRef, "done", ctx);
|
|
91
|
+
// Now try invalid: done → in_progress (must throw)
|
|
92
|
+
await expect(port.updateTaskStatus(taskRef, "in_progress", ctx)).rejects.toMatchObject({
|
|
93
|
+
name: "CitadelInvalidStateTransitionError",
|
|
94
|
+
current_status: "done",
|
|
95
|
+
requested_status: "in_progress",
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
test("sealSprint requires T3+ tier", async () => {
|
|
99
|
+
const port = factory();
|
|
100
|
+
const evidence = makeVerificationEvidence();
|
|
101
|
+
const ctx = makeActionContext({ agentTier: "T2" });
|
|
102
|
+
await expect(port.sealSprint("sprint-1", evidence, ctx)).rejects.toThrow(CitadelTierViolationError);
|
|
103
|
+
});
|
|
104
|
+
test("sealSprint succeeds for T3+ agents with evidence", async () => {
|
|
105
|
+
const port = factory();
|
|
106
|
+
const evidence = makeVerificationEvidence({ passed: true });
|
|
107
|
+
const ctx = makeActionContext({ agentTier: "T3" });
|
|
108
|
+
const claim = await port.sealSprint("sprint-1", evidence, ctx);
|
|
109
|
+
expect(claim.sprint_id).toBe("sprint-1");
|
|
110
|
+
expect(claim.sealed_at).toBeDefined();
|
|
111
|
+
expect(claim.sealed_by_agent).toBe(ctx.agentId);
|
|
112
|
+
expect(claim.verification_evidence_hash).toBe(evidence.evidence_hash);
|
|
113
|
+
});
|
|
114
|
+
test("sealSprint fails if sprint not active", async () => {
|
|
115
|
+
const port = factory();
|
|
116
|
+
const evidence = makeVerificationEvidence();
|
|
117
|
+
const ctx = makeActionContext({ agentTier: "T3" });
|
|
118
|
+
try {
|
|
119
|
+
// Attempting to seal a sprint that is not in active status
|
|
120
|
+
await port.sealSprint("sprint-999", evidence, ctx);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
if (err instanceof CitadelSprintNotActiveError) {
|
|
124
|
+
expect(err.sprint_id).toBe("sprint-999");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
test("sealSprint emits SealedSprintClaim with anchor_id", async () => {
|
|
129
|
+
const port = factory();
|
|
130
|
+
const evidence = makeVerificationEvidence();
|
|
131
|
+
const ctx = makeActionContext({ agentTier: "T3" });
|
|
132
|
+
const claim = await port.sealSprint("sprint-1", evidence, ctx);
|
|
133
|
+
// anchor_id is optional (Phase 1+ deferred), but test should verify if present
|
|
134
|
+
if (claim.anchor_id) {
|
|
135
|
+
expect(claim.anchor_id.length).toBeGreaterThan(0);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
test("recordDecision requires T2+ tier", async () => {
|
|
139
|
+
const port = factory();
|
|
140
|
+
const decision = makeDecisionInput();
|
|
141
|
+
const ctx = makeActionContext({ agentTier: "T1" });
|
|
142
|
+
await expect(port.recordDecision(decision, ctx)).rejects.toThrow(CitadelTierViolationError);
|
|
143
|
+
});
|
|
144
|
+
test("recordDecision succeeds for T2+ agents", async () => {
|
|
145
|
+
const port = factory();
|
|
146
|
+
const decision = makeDecisionInput();
|
|
147
|
+
const ctx = makeActionContext({ agentTier: "T2" });
|
|
148
|
+
const claim = await port.recordDecision(decision, ctx);
|
|
149
|
+
expect(claim.decision_id).toBeDefined();
|
|
150
|
+
expect(claim.created_at).toBeDefined();
|
|
151
|
+
expect(claim.archived_to_brain).toBeDefined();
|
|
152
|
+
});
|
|
153
|
+
test("recordDecision T3+ triggers cascade hook", async () => {
|
|
154
|
+
const port = factory();
|
|
155
|
+
const decision = makeDecisionInput({
|
|
156
|
+
decision: "ADR-ECO-NNN: Architectural Decision",
|
|
157
|
+
});
|
|
158
|
+
const ctx = makeActionContext({ agentTier: "T3" });
|
|
159
|
+
const claim = await port.recordDecision(decision, ctx);
|
|
160
|
+
// T3+ should trigger cascade (optional, implementation-specific)
|
|
161
|
+
// Just verify claim is returned
|
|
162
|
+
expect(claim.decision_id).toBeDefined();
|
|
163
|
+
});
|
|
164
|
+
test("tier violation error includes required and actual tier", async () => {
|
|
165
|
+
const port = factory();
|
|
166
|
+
const input = makeSprintInput();
|
|
167
|
+
const ctx = makeActionContext({ agentTier: "T1" });
|
|
168
|
+
try {
|
|
169
|
+
await port.createSprint(input, ctx);
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
if (err instanceof CitadelTierViolationError) {
|
|
173
|
+
expect(err.required_tier).toBe("T2");
|
|
174
|
+
expect(err.actual_tier).toBe("T1");
|
|
175
|
+
expect(err.operation).toBeDefined();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
test("task not found error includes task ref", async () => {
|
|
180
|
+
const port = factory();
|
|
181
|
+
const taskRef = makeTaskRef({ ref: "nonexistent:sprint-1:task-999" });
|
|
182
|
+
const ctx = makeActionContext({ agentTier: "T2" });
|
|
183
|
+
try {
|
|
184
|
+
await port.updateTaskStatus(taskRef, "done", ctx);
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
if (err instanceof CitadelTaskRefNotFoundError) {
|
|
188
|
+
expect(err.task_ref).toContain("nonexistent");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
test("sprint not active error includes current status", async () => {
|
|
193
|
+
const port = factory();
|
|
194
|
+
const evidence = makeVerificationEvidence();
|
|
195
|
+
const ctx = makeActionContext({ agentTier: "T3" });
|
|
196
|
+
try {
|
|
197
|
+
await port.sealSprint("completed-sprint", evidence, ctx);
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
if (err instanceof CitadelSprintNotActiveError) {
|
|
201
|
+
expect(err.sprint_id).toBe("completed-sprint");
|
|
202
|
+
expect(err.current_status).toBeDefined();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
test("T4 agents can seal sprints", async () => {
|
|
207
|
+
const port = factory();
|
|
208
|
+
const evidence = makeVerificationEvidence();
|
|
209
|
+
const ctx = makeActionContext({ agentTier: "T4" });
|
|
210
|
+
try {
|
|
211
|
+
const claim = await port.sealSprint("sprint-1", evidence, ctx);
|
|
212
|
+
expect(claim.sealed_by_agent).toBe(ctx.agentId);
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
// May fail for other reasons (sprint not found), but not tier violation
|
|
216
|
+
if (err instanceof CitadelTierViolationError) {
|
|
217
|
+
throw new Error("T4 should not have tier violation");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
};
|
|
223
|
+
// ─── Mock implementation ──────────────────────────────────────────────────
|
|
224
|
+
class MockCitadelActionPort {
|
|
225
|
+
sprintStates = new Map();
|
|
226
|
+
taskStates = new Map();
|
|
227
|
+
constructor() {
|
|
228
|
+
// Pre-populate some sprint states
|
|
229
|
+
this.sprintStates.set("sprint-1", {
|
|
230
|
+
status: "active",
|
|
231
|
+
tasks: new Map([
|
|
232
|
+
["test-project:sprint-1:task-001", "todo"],
|
|
233
|
+
["test-project:sprint-1:task-002", "in_progress"],
|
|
234
|
+
]),
|
|
235
|
+
});
|
|
236
|
+
this.sprintStates.set("completed-sprint", {
|
|
237
|
+
status: "completed",
|
|
238
|
+
tasks: new Map(),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
async createSprint(input, ctx) {
|
|
242
|
+
// T2+ only
|
|
243
|
+
if (ctx.agentTier === "T1") {
|
|
244
|
+
throw new CitadelTierViolationError(`T1 agents cannot create sprints`, "T2", ctx.agentTier, "createSprint");
|
|
245
|
+
}
|
|
246
|
+
const sprintId = `sprint-${Math.floor(Math.random() * 10000)}`;
|
|
247
|
+
this.sprintStates.set(sprintId, {
|
|
248
|
+
status: "planned",
|
|
249
|
+
tasks: new Map(),
|
|
250
|
+
});
|
|
251
|
+
return {
|
|
252
|
+
sprint_id: sprintId,
|
|
253
|
+
project_slug: input.project_slug,
|
|
254
|
+
name: input.name,
|
|
255
|
+
created_at: new Date(),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
async updateTaskStatus(ref, status, ctx) {
|
|
259
|
+
// Check if task exists
|
|
260
|
+
if (!this.taskStates.has(ref.ref) && !ref.ref.startsWith("test-project")) {
|
|
261
|
+
throw new CitadelTaskRefNotFoundError(ref.ref);
|
|
262
|
+
}
|
|
263
|
+
// Get current status
|
|
264
|
+
const currentStatus = this.taskStates.get(ref.ref) || "todo";
|
|
265
|
+
// Validate state transitions
|
|
266
|
+
const validTransitions = {
|
|
267
|
+
todo: ["in_progress", "blocked", "rejected"],
|
|
268
|
+
in_progress: ["done", "blocked", "rejected"],
|
|
269
|
+
done: ["blocked", "rejected"],
|
|
270
|
+
blocked: ["in_progress", "rejected"],
|
|
271
|
+
rejected: [],
|
|
272
|
+
};
|
|
273
|
+
if (!validTransitions[currentStatus]?.includes(status)) {
|
|
274
|
+
throw new CitadelInvalidStateTransitionError(currentStatus, status);
|
|
275
|
+
}
|
|
276
|
+
this.taskStates.set(ref.ref, status);
|
|
277
|
+
}
|
|
278
|
+
async sealSprint(sprintId, evidence, ctx) {
|
|
279
|
+
// T3+ only
|
|
280
|
+
if (ctx.agentTier !== "T3" && ctx.agentTier !== "T4") {
|
|
281
|
+
throw new CitadelTierViolationError(`${ctx.agentTier} agents cannot seal sprints`, "T3", ctx.agentTier, "sealSprint");
|
|
282
|
+
}
|
|
283
|
+
// Check if sprint exists and is active
|
|
284
|
+
const sprintState = this.sprintStates.get(sprintId);
|
|
285
|
+
if (!sprintState) {
|
|
286
|
+
throw new CitadelSprintNotActiveError(sprintId, "not_found");
|
|
287
|
+
}
|
|
288
|
+
if (sprintState.status !== "active") {
|
|
289
|
+
throw new CitadelSprintNotActiveError(sprintId, sprintState.status);
|
|
290
|
+
}
|
|
291
|
+
// Update sprint status to completed
|
|
292
|
+
sprintState.status = "completed";
|
|
293
|
+
return {
|
|
294
|
+
sprint_id: sprintId,
|
|
295
|
+
sealed_at: new Date(),
|
|
296
|
+
verification_evidence_hash: evidence.evidence_hash,
|
|
297
|
+
sealed_by_agent: ctx.agentId,
|
|
298
|
+
anchor_id: `anchor-${crypto.randomUUID()}`,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
async recordDecision(decision, ctx) {
|
|
302
|
+
// T2+ only
|
|
303
|
+
if (ctx.agentTier === "T1") {
|
|
304
|
+
throw new CitadelTierViolationError(`T1 agents cannot record decisions`, "T2", ctx.agentTier, "recordDecision");
|
|
305
|
+
}
|
|
306
|
+
const cascade = ctx.agentTier === "T3" || ctx.agentTier === "T4";
|
|
307
|
+
return {
|
|
308
|
+
decision_id: `decision-${crypto.randomUUID()}`,
|
|
309
|
+
created_at: new Date(),
|
|
310
|
+
archived_to_brain: true,
|
|
311
|
+
cascade_triggered: cascade,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// ─── Default contract application ──────────────────────────────────────────
|
|
316
|
+
citadelActionPortContract(() => new MockCitadelActionPort());
|
|
317
|
+
//# sourceMappingURL=citadel-action.contract.test.js.map
|