@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,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PrivacyPort contract tests — validate V0 noop stub interface compliance.
|
|
3
|
+
*
|
|
4
|
+
* Tests verify:
|
|
5
|
+
* - applyMask returns input unchanged (identity function V0)
|
|
6
|
+
* - verifyZkProof always returns {valid: false, reason: 'noop_v0'}
|
|
7
|
+
* - commitToSmt returns deterministic mock root with correct structure
|
|
8
|
+
* - NoopPrivacyAdapter satisfies the PrivacyPort interface
|
|
9
|
+
* - All operations handle various context and commitment types
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, expect } from "vitest";
|
|
12
|
+
import { NoopPrivacyAdapter, } from "./privacy";
|
|
13
|
+
describe("PrivacyPort contract", () => {
|
|
14
|
+
describe("applyMask", () => {
|
|
15
|
+
it("returns input payload unchanged (V0 identity function)", async () => {
|
|
16
|
+
const adapter = new NoopPrivacyAdapter();
|
|
17
|
+
const payload = { secret: "hidden", public: "visible", count: 42 };
|
|
18
|
+
const mask = {
|
|
19
|
+
public_fields: ["public"],
|
|
20
|
+
private_fields: ["secret"],
|
|
21
|
+
};
|
|
22
|
+
const ctx = { user_id: "user-1", tenant_id: "tenant-a" };
|
|
23
|
+
const result = await adapter.applyMask(payload, mask, ctx);
|
|
24
|
+
expect(result).toEqual(payload);
|
|
25
|
+
expect(result).toBe(payload); // same reference (identity)
|
|
26
|
+
});
|
|
27
|
+
it("handles complex nested objects unchanged", async () => {
|
|
28
|
+
const adapter = new NoopPrivacyAdapter();
|
|
29
|
+
const payload = {
|
|
30
|
+
user: {
|
|
31
|
+
id: "u1",
|
|
32
|
+
nested: {
|
|
33
|
+
secret: "data",
|
|
34
|
+
array: [1, 2, 3],
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const mask = {
|
|
39
|
+
public_fields: ["user.id"],
|
|
40
|
+
private_fields: ["user.nested.secret"],
|
|
41
|
+
};
|
|
42
|
+
const ctx = {};
|
|
43
|
+
const result = await adapter.applyMask(payload, mask, ctx);
|
|
44
|
+
expect(result).toEqual(payload);
|
|
45
|
+
});
|
|
46
|
+
it("accepts conditional revelation masks", async () => {
|
|
47
|
+
const adapter = new NoopPrivacyAdapter();
|
|
48
|
+
const payload = { data: "value" };
|
|
49
|
+
const mask = {
|
|
50
|
+
public_fields: ["id"],
|
|
51
|
+
private_fields: ["secret"],
|
|
52
|
+
conditional: [
|
|
53
|
+
{
|
|
54
|
+
field: "email",
|
|
55
|
+
condition: "user_role == 'admin'",
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
const ctx = { role: "admin" };
|
|
60
|
+
const result = await adapter.applyMask(payload, mask, ctx);
|
|
61
|
+
expect(result).toEqual(payload);
|
|
62
|
+
});
|
|
63
|
+
it("handles various payload types (string, number, array, null)", async () => {
|
|
64
|
+
const adapter = new NoopPrivacyAdapter();
|
|
65
|
+
const mask = {
|
|
66
|
+
public_fields: [],
|
|
67
|
+
private_fields: [],
|
|
68
|
+
};
|
|
69
|
+
const ctx = {};
|
|
70
|
+
const testCases = [
|
|
71
|
+
"string payload",
|
|
72
|
+
42,
|
|
73
|
+
3.14,
|
|
74
|
+
true,
|
|
75
|
+
[1, 2, 3],
|
|
76
|
+
null,
|
|
77
|
+
undefined,
|
|
78
|
+
];
|
|
79
|
+
for (const payload of testCases) {
|
|
80
|
+
const result = await adapter.applyMask(payload, mask, ctx);
|
|
81
|
+
expect(result).toEqual(payload);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
it("context parameters are accepted and ignored (V0)", async () => {
|
|
85
|
+
const adapter = new NoopPrivacyAdapter();
|
|
86
|
+
const payload = { data: "test" };
|
|
87
|
+
const mask = {
|
|
88
|
+
public_fields: [],
|
|
89
|
+
private_fields: [],
|
|
90
|
+
};
|
|
91
|
+
const contexts = [
|
|
92
|
+
{ user_id: "u1" },
|
|
93
|
+
{ tenant_id: "t1", jurisdiction: "FR.v1" },
|
|
94
|
+
{ role: "admin", user_id: "u2", metadata: { custom: "value" } },
|
|
95
|
+
{},
|
|
96
|
+
];
|
|
97
|
+
for (const ctx of contexts) {
|
|
98
|
+
const result = await adapter.applyMask(payload, mask, ctx);
|
|
99
|
+
expect(result).toEqual(payload);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe("verifyZkProof", () => {
|
|
104
|
+
it("always returns invalid with 'noop_v0' reason", async () => {
|
|
105
|
+
const adapter = new NoopPrivacyAdapter();
|
|
106
|
+
const proof = {
|
|
107
|
+
proof_data: { some: "proof" },
|
|
108
|
+
public_inputs: { value: 42 },
|
|
109
|
+
};
|
|
110
|
+
const ctx = {};
|
|
111
|
+
const result = await adapter.verifyZkProof(proof, ctx);
|
|
112
|
+
expect(result.valid).toBe(false);
|
|
113
|
+
expect(result.reason).toBe("noop_v0");
|
|
114
|
+
expect(result.confidence).toBe(0);
|
|
115
|
+
});
|
|
116
|
+
it("handles various proof schemes (V0 ignores)", async () => {
|
|
117
|
+
const adapter = new NoopPrivacyAdapter();
|
|
118
|
+
const schemes = ["stwo", "starknet_stone", "groth16", "plonk"];
|
|
119
|
+
for (const scheme of schemes) {
|
|
120
|
+
const proof = {
|
|
121
|
+
proof_data: { scheme_data: "test" },
|
|
122
|
+
public_inputs: {},
|
|
123
|
+
scheme,
|
|
124
|
+
};
|
|
125
|
+
const result = await adapter.verifyZkProof(proof, {});
|
|
126
|
+
expect(result.valid).toBe(false);
|
|
127
|
+
expect(result.reason).toBe("noop_v0");
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
it("accepts empty public inputs", async () => {
|
|
131
|
+
const adapter = new NoopPrivacyAdapter();
|
|
132
|
+
const proof = {
|
|
133
|
+
proof_data: "opaque_bytes",
|
|
134
|
+
public_inputs: {},
|
|
135
|
+
};
|
|
136
|
+
const result = await adapter.verifyZkProof(proof, {});
|
|
137
|
+
expect(result.valid).toBe(false);
|
|
138
|
+
expect(result.reason).toBe("noop_v0");
|
|
139
|
+
});
|
|
140
|
+
it("context parameters are accepted and ignored (V0)", async () => {
|
|
141
|
+
const adapter = new NoopPrivacyAdapter();
|
|
142
|
+
const proof = {
|
|
143
|
+
proof_data: "test",
|
|
144
|
+
public_inputs: { x: 1 },
|
|
145
|
+
};
|
|
146
|
+
const contexts = [
|
|
147
|
+
{ user_id: "u1" },
|
|
148
|
+
{ tenant_id: "t1", jurisdiction: "EU.v1" },
|
|
149
|
+
{ role: "operator" },
|
|
150
|
+
];
|
|
151
|
+
for (const ctx of contexts) {
|
|
152
|
+
const result = await adapter.verifyZkProof(proof, ctx);
|
|
153
|
+
expect(result.valid).toBe(false);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe("commitToSmt", () => {
|
|
158
|
+
it("returns mock SMT root with correct structure", async () => {
|
|
159
|
+
const adapter = new NoopPrivacyAdapter();
|
|
160
|
+
const commitment = { value: "test_value" };
|
|
161
|
+
const ctx = {};
|
|
162
|
+
const result = await adapter.commitToSmt(commitment, ctx);
|
|
163
|
+
expect(result.smt_root).toBeDefined();
|
|
164
|
+
expect(result.smt_root).toMatch(/^0x[0-9a-f]+$/);
|
|
165
|
+
expect(result.leaf_index).toBe(0);
|
|
166
|
+
expect(result.version).toBe(0);
|
|
167
|
+
});
|
|
168
|
+
it("returns deterministic root for same commitment", async () => {
|
|
169
|
+
const adapter = new NoopPrivacyAdapter();
|
|
170
|
+
const commitment = { value: "deterministic" };
|
|
171
|
+
const ctx = {};
|
|
172
|
+
const result1 = await adapter.commitToSmt(commitment, ctx);
|
|
173
|
+
const result2 = await adapter.commitToSmt(commitment, ctx);
|
|
174
|
+
expect(result1.smt_root).toBe(result2.smt_root);
|
|
175
|
+
});
|
|
176
|
+
it("returns different root for different commitments", async () => {
|
|
177
|
+
const adapter = new NoopPrivacyAdapter();
|
|
178
|
+
const ctx = {};
|
|
179
|
+
const result1 = await adapter.commitToSmt({ value: "value1" }, ctx);
|
|
180
|
+
const result2 = await adapter.commitToSmt({ value: "value2" }, ctx);
|
|
181
|
+
expect(result1.smt_root).not.toBe(result2.smt_root);
|
|
182
|
+
});
|
|
183
|
+
it("respects explicit leaf_index from commitment", async () => {
|
|
184
|
+
const adapter = new NoopPrivacyAdapter();
|
|
185
|
+
const commitment = { value: "test", index: 42 };
|
|
186
|
+
const ctx = {};
|
|
187
|
+
const result = await adapter.commitToSmt(commitment, ctx);
|
|
188
|
+
expect(result.leaf_index).toBe(42);
|
|
189
|
+
});
|
|
190
|
+
it("defaults leaf_index to 0 when not specified", async () => {
|
|
191
|
+
const adapter = new NoopPrivacyAdapter();
|
|
192
|
+
const commitment = { value: "test" };
|
|
193
|
+
const ctx = {};
|
|
194
|
+
const result = await adapter.commitToSmt(commitment, ctx);
|
|
195
|
+
expect(result.leaf_index).toBe(0);
|
|
196
|
+
});
|
|
197
|
+
it("accepts optional salt in commitment", async () => {
|
|
198
|
+
const adapter = new NoopPrivacyAdapter();
|
|
199
|
+
const commitment = {
|
|
200
|
+
value: "secret",
|
|
201
|
+
salt: "random_salt_123",
|
|
202
|
+
index: 5,
|
|
203
|
+
};
|
|
204
|
+
const ctx = {};
|
|
205
|
+
const result = await adapter.commitToSmt(commitment, ctx);
|
|
206
|
+
expect(result.smt_root).toBeDefined();
|
|
207
|
+
expect(result.leaf_index).toBe(5);
|
|
208
|
+
expect(result.version).toBe(0);
|
|
209
|
+
});
|
|
210
|
+
it("handles various commitment value types", async () => {
|
|
211
|
+
const adapter = new NoopPrivacyAdapter();
|
|
212
|
+
const ctx = {};
|
|
213
|
+
const values = [
|
|
214
|
+
"string value",
|
|
215
|
+
42,
|
|
216
|
+
3.14,
|
|
217
|
+
true,
|
|
218
|
+
{ nested: "object" },
|
|
219
|
+
[1, 2, 3],
|
|
220
|
+
];
|
|
221
|
+
for (const value of values) {
|
|
222
|
+
const result = await adapter.commitToSmt({ value }, ctx);
|
|
223
|
+
expect(result.smt_root).toBeDefined();
|
|
224
|
+
expect(result.version).toBe(0);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
it("context parameters are accepted and ignored (V0)", async () => {
|
|
228
|
+
const adapter = new NoopPrivacyAdapter();
|
|
229
|
+
const commitment = { value: "test" };
|
|
230
|
+
const contexts = [
|
|
231
|
+
{ user_id: "u1", tenant_id: "t1" },
|
|
232
|
+
{ jurisdiction: "CH.v1" },
|
|
233
|
+
{ metadata: { custom: true } },
|
|
234
|
+
];
|
|
235
|
+
for (const ctx of contexts) {
|
|
236
|
+
const result = await adapter.commitToSmt(commitment, ctx);
|
|
237
|
+
expect(result.smt_root).toBeDefined();
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
describe("NoopPrivacyAdapter interface compliance", () => {
|
|
242
|
+
it("satisfies PrivacyPort contract", () => {
|
|
243
|
+
const adapter = new NoopPrivacyAdapter();
|
|
244
|
+
expect(typeof adapter.applyMask).toBe("function");
|
|
245
|
+
expect(typeof adapter.verifyZkProof).toBe("function");
|
|
246
|
+
expect(typeof adapter.commitToSmt).toBe("function");
|
|
247
|
+
});
|
|
248
|
+
it("all async methods return Promise", async () => {
|
|
249
|
+
const adapter = new NoopPrivacyAdapter();
|
|
250
|
+
const maskResult = adapter.applyMask({}, { public_fields: [], private_fields: [] }, {});
|
|
251
|
+
const proofResult = adapter.verifyZkProof({ proof_data: "x", public_inputs: {} }, {});
|
|
252
|
+
const smtResult = adapter.commitToSmt({ value: "x" }, {});
|
|
253
|
+
expect(maskResult).toBeInstanceOf(Promise);
|
|
254
|
+
expect(proofResult).toBeInstanceOf(Promise);
|
|
255
|
+
expect(smtResult).toBeInstanceOf(Promise);
|
|
256
|
+
await maskResult;
|
|
257
|
+
await proofResult;
|
|
258
|
+
await smtResult;
|
|
259
|
+
});
|
|
260
|
+
it("methods work together in realistic flow", async () => {
|
|
261
|
+
const adapter = new NoopPrivacyAdapter();
|
|
262
|
+
const ctx = { user_id: "user-1", role: "admin" };
|
|
263
|
+
// Simulate a privacy-respecting workflow (V0: all no-ops)
|
|
264
|
+
const payload = { secret: "data", public: "info" };
|
|
265
|
+
const mask = {
|
|
266
|
+
public_fields: ["public"],
|
|
267
|
+
private_fields: ["secret"],
|
|
268
|
+
};
|
|
269
|
+
const masked = await adapter.applyMask(payload, mask, ctx);
|
|
270
|
+
expect(masked).toEqual(payload);
|
|
271
|
+
const commitment = { value: masked };
|
|
272
|
+
const smtResult = await adapter.commitToSmt(commitment, ctx);
|
|
273
|
+
expect(smtResult.smt_root).toBeDefined();
|
|
274
|
+
expect(smtResult.version).toBe(0);
|
|
275
|
+
const proof = {
|
|
276
|
+
proof_data: { root: smtResult.smt_root },
|
|
277
|
+
public_inputs: { commitment_hash: "hash" },
|
|
278
|
+
};
|
|
279
|
+
const verified = await adapter.verifyZkProof(proof, ctx);
|
|
280
|
+
expect(verified.valid).toBe(false);
|
|
281
|
+
expect(verified.reason).toBe("noop_v0");
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
describe("V0 noop semantics validation", () => {
|
|
285
|
+
it("demonstrates V0 identity semantics: applyMask is identity", async () => {
|
|
286
|
+
const adapter = new NoopPrivacyAdapter();
|
|
287
|
+
// V0 guarantee: f(x) = x for any x
|
|
288
|
+
const testValues = [
|
|
289
|
+
{ a: 1, b: "secret" },
|
|
290
|
+
"plain text",
|
|
291
|
+
[1, 2, 3, "secret"],
|
|
292
|
+
{ deeply: { nested: { secret: "data" } } },
|
|
293
|
+
];
|
|
294
|
+
for (const value of testValues) {
|
|
295
|
+
const result = await adapter.applyMask(value, { public_fields: ["a"], private_fields: ["secret"] }, {});
|
|
296
|
+
expect(result).toBe(value); // exact same object
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
it("demonstrates V0 proof rejection: verifyZkProof always fails", async () => {
|
|
300
|
+
const adapter = new NoopPrivacyAdapter();
|
|
301
|
+
// V0 guarantee: verifyZkProof always returns invalid
|
|
302
|
+
const proofs = [
|
|
303
|
+
{ proof_data: "valid_proof", public_inputs: {} },
|
|
304
|
+
{ proof_data: null, public_inputs: { x: 1 } },
|
|
305
|
+
{ proof_data: { complex: "structure" }, public_inputs: [] },
|
|
306
|
+
];
|
|
307
|
+
for (const proof of proofs) {
|
|
308
|
+
const result = await adapter.verifyZkProof(proof, {});
|
|
309
|
+
expect(result.valid).toBe(false);
|
|
310
|
+
expect(result.reason).toBe("noop_v0");
|
|
311
|
+
expect(result.confidence).toBe(0);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
it("demonstrates V0 mock SMT: deterministic but no crypto", async () => {
|
|
315
|
+
const adapter = new NoopPrivacyAdapter();
|
|
316
|
+
// V0 guarantee: deterministic + version 0
|
|
317
|
+
const c1 = await adapter.commitToSmt({ value: "test" }, {});
|
|
318
|
+
const c2 = await adapter.commitToSmt({ value: "test" }, {});
|
|
319
|
+
expect(c1.smt_root).toBe(c2.smt_root);
|
|
320
|
+
expect(c1.version).toBe(0);
|
|
321
|
+
expect(c2.version).toBe(0);
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
//# sourceMappingURL=privacy.contract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy.contract.test.js","sourceRoot":"","sources":["../../src/ports/privacy.contract.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PrivacyPort — V0 noop stub for Vauban Privacy Protocol (VPP) integration.
|
|
3
|
+
*
|
|
4
|
+
* Implements S0 port #10 (PrivacyPort): placeholder interface for privacy-preserving
|
|
5
|
+
* operations. Phase 2+ will implement full Stwo+ML-KEM+viewing-key+SMT+cross-domain
|
|
6
|
+
* functionality per draft-vauban-privacy-protocol-00 (target IETF submission 2026-06-29,
|
|
7
|
+
* sprint-490 active 78%).
|
|
8
|
+
*
|
|
9
|
+
* V0 design: all operations return identity or noop stubs. Enables code to pass type
|
|
10
|
+
* checks while VPP integration is deferred. No Side effects, no cryptographic guarantees.
|
|
11
|
+
*
|
|
12
|
+
* Reference: S0 § cross-spec invariants X-1 (isolation), X-3 (crypto-shredding);
|
|
13
|
+
* VPP Phase roadmap: draft-vauban-privacy-protocol-00 + integration plan TBD.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* RevelationMask — declarative specification of which fields should be exposed
|
|
17
|
+
* during a privacy-respecting operation.
|
|
18
|
+
*/
|
|
19
|
+
export interface RevelationMask {
|
|
20
|
+
readonly public_fields: string[];
|
|
21
|
+
readonly private_fields: string[];
|
|
22
|
+
readonly conditional?: Array<{
|
|
23
|
+
readonly field: string;
|
|
24
|
+
readonly condition: string;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
export interface ZkProofInput {
|
|
28
|
+
readonly proof_data: unknown;
|
|
29
|
+
readonly public_inputs: unknown;
|
|
30
|
+
readonly scheme?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface VerifyResult {
|
|
33
|
+
readonly valid: boolean;
|
|
34
|
+
readonly reason?: string;
|
|
35
|
+
readonly confidence?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface Commitment {
|
|
38
|
+
readonly value: unknown;
|
|
39
|
+
readonly salt?: string;
|
|
40
|
+
readonly index?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface SmtResult {
|
|
43
|
+
readonly smt_root: string;
|
|
44
|
+
readonly leaf_index: number;
|
|
45
|
+
readonly version: number;
|
|
46
|
+
readonly proof?: unknown;
|
|
47
|
+
}
|
|
48
|
+
export interface PrivacyContext {
|
|
49
|
+
readonly user_id?: string;
|
|
50
|
+
readonly tenant_id?: string;
|
|
51
|
+
readonly role?: string;
|
|
52
|
+
readonly jurisdiction?: string;
|
|
53
|
+
readonly metadata?: Record<string, unknown>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* PrivacyPort — V0 noop stub.
|
|
57
|
+
*
|
|
58
|
+
* All methods return identity values or noop results. Replaced by full VPP
|
|
59
|
+
* implementation in Phase 2 (Stwo+ML-KEM+viewing-key+SMT+cross-domain).
|
|
60
|
+
*
|
|
61
|
+
* Usage:
|
|
62
|
+
* const priv = new NoopPrivacyAdapter();
|
|
63
|
+
* const revealed = await priv.applyMask(data, mask, ctx); // data unchanged V0
|
|
64
|
+
* const vk = await priv.verifyZkProof(proof, ctx); // {valid: false, reason: 'noop_v0'}
|
|
65
|
+
*/
|
|
66
|
+
export interface PrivacyPort {
|
|
67
|
+
/**
|
|
68
|
+
* Apply a revelation mask to payload (V0: returns payload unchanged).
|
|
69
|
+
*
|
|
70
|
+
* Phase 2+: will implement field-level hiding via ZK commitments or viewing keys.
|
|
71
|
+
*
|
|
72
|
+
* @param payload input object or data structure
|
|
73
|
+
* @param mask specification of which fields are public/private/conditional
|
|
74
|
+
* @param ctx privacy context (user, tenant, role, jurisdiction)
|
|
75
|
+
* @returns masked payload (V0: unchanged)
|
|
76
|
+
*/
|
|
77
|
+
applyMask(payload: unknown, mask: RevelationMask, ctx: PrivacyContext): Promise<unknown>;
|
|
78
|
+
/**
|
|
79
|
+
* Verify a zero-knowledge proof (V0: always returns invalid with 'noop_v0' reason).
|
|
80
|
+
*
|
|
81
|
+
* Phase 2+: will implement Stwo proof verification against public inputs.
|
|
82
|
+
*
|
|
83
|
+
* @param proof ZK proof object (scheme TBD, likely Stwo)
|
|
84
|
+
* @param ctx privacy context
|
|
85
|
+
* @returns { valid: false, reason: 'noop_v0' } in V0
|
|
86
|
+
*/
|
|
87
|
+
verifyZkProof(proof: ZkProofInput, ctx: PrivacyContext): Promise<VerifyResult>;
|
|
88
|
+
/**
|
|
89
|
+
* Commit value to sparse merkle tree (V0: returns deterministic mock root).
|
|
90
|
+
*
|
|
91
|
+
* Phase 2+: will implement full SMT with Poseidon hashing and viewing keys.
|
|
92
|
+
*
|
|
93
|
+
* @param commitment value or hash to commit
|
|
94
|
+
* @param ctx privacy context
|
|
95
|
+
* @returns mock SMT root (V0: deterministic, no cryptographic guarantee)
|
|
96
|
+
*/
|
|
97
|
+
commitToSmt(commitment: Commitment, ctx: PrivacyContext): Promise<SmtResult>;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* NoopPrivacyAdapter — V0 stub implementation of PrivacyPort.
|
|
101
|
+
*
|
|
102
|
+
* All methods return identity values or noop results. Enables type-safe code
|
|
103
|
+
* while VPP integration is deferred to Phase 2.
|
|
104
|
+
*
|
|
105
|
+
* Documentation: "V0 stub — replaced by VPP integration in Phase 2
|
|
106
|
+
* (Stwo+ML-KEM+viewing key+SMT+cross-domain)."
|
|
107
|
+
*
|
|
108
|
+
* Usage:
|
|
109
|
+
* const adapter = new NoopPrivacyAdapter();
|
|
110
|
+
* const data = { secret: 'hidden', public: 'visible' };
|
|
111
|
+
* const masked = await adapter.applyMask(data, mask, ctx);
|
|
112
|
+
* // masked === data (unchanged in V0)
|
|
113
|
+
*/
|
|
114
|
+
export declare class NoopPrivacyAdapter implements PrivacyPort {
|
|
115
|
+
applyMask(payload: unknown, _mask: RevelationMask, _ctx: PrivacyContext): Promise<unknown>;
|
|
116
|
+
verifyZkProof(_proof: ZkProofInput, _ctx: PrivacyContext): Promise<VerifyResult>;
|
|
117
|
+
commitToSmt(commitment: Commitment, _ctx: PrivacyContext): Promise<SmtResult>;
|
|
118
|
+
/**
|
|
119
|
+
* Compute a deterministic mock SMT root (V0 only).
|
|
120
|
+
* Purely for testing — no cryptographic guarantee.
|
|
121
|
+
*/
|
|
122
|
+
private computeMockRoot;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* PrivacyNoopWarning — logged when V0 noop operations are used.
|
|
126
|
+
* Not thrown as an exception (non-blocking), but logged for observability.
|
|
127
|
+
*/
|
|
128
|
+
export declare class PrivacyNoopWarning extends Error {
|
|
129
|
+
readonly operation: string;
|
|
130
|
+
constructor(message: string, operation: string);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=privacy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy.d.ts","sourceRoot":"","sources":["../../src/ports/privacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC5B,CAAC,CAAC;CACJ;AAID,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAID,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAID,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAID;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;OASG;IACH,SAAS,CACP,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;;;;;;;OAQG;IACH,aAAa,CACX,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB;;;;;;;;OAQG;IACH,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CAC9E;AAID;;;;;;;;;;;;;;GAcG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IAC9C,SAAS,CACb,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,OAAO,CAAC;IAKb,aAAa,CACjB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,YAAY,CAAC;IASlB,WAAW,CACf,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,SAAS,CAAC;IAWrB;;;OAGG;IACH,OAAO,CAAC,eAAe;CAUxB;AAID;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aACE,SAAS,EAAE,MAAM;gBAAlD,OAAO,EAAE,MAAM,EAAkB,SAAS,EAAE,MAAM;CAK/D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PrivacyPort — V0 noop stub for Vauban Privacy Protocol (VPP) integration.
|
|
3
|
+
*
|
|
4
|
+
* Implements S0 port #10 (PrivacyPort): placeholder interface for privacy-preserving
|
|
5
|
+
* operations. Phase 2+ will implement full Stwo+ML-KEM+viewing-key+SMT+cross-domain
|
|
6
|
+
* functionality per draft-vauban-privacy-protocol-00 (target IETF submission 2026-06-29,
|
|
7
|
+
* sprint-490 active 78%).
|
|
8
|
+
*
|
|
9
|
+
* V0 design: all operations return identity or noop stubs. Enables code to pass type
|
|
10
|
+
* checks while VPP integration is deferred. No Side effects, no cryptographic guarantees.
|
|
11
|
+
*
|
|
12
|
+
* Reference: S0 § cross-spec invariants X-1 (isolation), X-3 (crypto-shredding);
|
|
13
|
+
* VPP Phase roadmap: draft-vauban-privacy-protocol-00 + integration plan TBD.
|
|
14
|
+
*/
|
|
15
|
+
// ─── Noop implementation (V0 stub) ────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* NoopPrivacyAdapter — V0 stub implementation of PrivacyPort.
|
|
18
|
+
*
|
|
19
|
+
* All methods return identity values or noop results. Enables type-safe code
|
|
20
|
+
* while VPP integration is deferred to Phase 2.
|
|
21
|
+
*
|
|
22
|
+
* Documentation: "V0 stub — replaced by VPP integration in Phase 2
|
|
23
|
+
* (Stwo+ML-KEM+viewing key+SMT+cross-domain)."
|
|
24
|
+
*
|
|
25
|
+
* Usage:
|
|
26
|
+
* const adapter = new NoopPrivacyAdapter();
|
|
27
|
+
* const data = { secret: 'hidden', public: 'visible' };
|
|
28
|
+
* const masked = await adapter.applyMask(data, mask, ctx);
|
|
29
|
+
* // masked === data (unchanged in V0)
|
|
30
|
+
*/
|
|
31
|
+
export class NoopPrivacyAdapter {
|
|
32
|
+
async applyMask(payload, _mask, _ctx) {
|
|
33
|
+
// V0: identity function — return input unchanged
|
|
34
|
+
return payload;
|
|
35
|
+
}
|
|
36
|
+
async verifyZkProof(_proof, _ctx) {
|
|
37
|
+
// V0: always invalid with noop marker
|
|
38
|
+
return {
|
|
39
|
+
valid: false,
|
|
40
|
+
reason: "noop_v0",
|
|
41
|
+
confidence: 0,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async commitToSmt(commitment, _ctx) {
|
|
45
|
+
// V0: return deterministic mock root based on commitment value
|
|
46
|
+
// In real Phase 2+, would compute Poseidon hash and maintain SMT state
|
|
47
|
+
const mockRoot = this.computeMockRoot(commitment);
|
|
48
|
+
return {
|
|
49
|
+
smt_root: mockRoot,
|
|
50
|
+
leaf_index: commitment.index ?? 0,
|
|
51
|
+
version: 0, // V0 version
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Compute a deterministic mock SMT root (V0 only).
|
|
56
|
+
* Purely for testing — no cryptographic guarantee.
|
|
57
|
+
*/
|
|
58
|
+
computeMockRoot(commitment) {
|
|
59
|
+
// Simple deterministic hash for V0: stringify commitment and hash
|
|
60
|
+
const str = JSON.stringify(commitment);
|
|
61
|
+
let hash = 0;
|
|
62
|
+
for (let i = 0; i < str.length; i++) {
|
|
63
|
+
hash = (hash << 5) - hash + str.charCodeAt(i);
|
|
64
|
+
hash = hash & hash; // keep it as 32-bit int
|
|
65
|
+
}
|
|
66
|
+
return "0x" + Math.abs(hash).toString(16).padStart(64, "0");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// ─── Informational warning (not thrown) ─────────────────────────────────────
|
|
70
|
+
/**
|
|
71
|
+
* PrivacyNoopWarning — logged when V0 noop operations are used.
|
|
72
|
+
* Not thrown as an exception (non-blocking), but logged for observability.
|
|
73
|
+
*/
|
|
74
|
+
export class PrivacyNoopWarning extends Error {
|
|
75
|
+
operation;
|
|
76
|
+
constructor(message, operation) {
|
|
77
|
+
super(message);
|
|
78
|
+
this.operation = operation;
|
|
79
|
+
this.name = "PrivacyNoopWarning";
|
|
80
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=privacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy.js","sourceRoot":"","sources":["../../src/ports/privacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAgHH,iFAAiF;AAEjF;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,kBAAkB;IAC7B,KAAK,CAAC,SAAS,CACb,OAAgB,EAChB,KAAqB,EACrB,IAAoB;QAEpB,iDAAiD;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,MAAoB,EACpB,IAAoB;QAEpB,sCAAsC;QACtC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,CAAC;SACd,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,UAAsB,EACtB,IAAoB;QAEpB,+DAA+D;QAC/D,uEAAuE;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAClD,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;YACjC,OAAO,EAAE,CAAC,EAAE,aAAa;SAC1B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,UAAsB;QAC5C,kEAAkE;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,wBAAwB;QAC9C,CAAC;QACD,OAAO,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC;CACF;AAED,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACE;IAA7C,YAAY,OAAe,EAAkB,SAAiB;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,cAAS,GAAT,SAAS,CAAQ;QAE5D,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TenantContextPort contract tests.
|
|
3
|
+
*
|
|
4
|
+
* Applied to any TenantContextPort implementation.
|
|
5
|
+
* Tests verify: isolation, degraded mode transitions, §5.4 cap enforcement,
|
|
6
|
+
* and cumulative metric computation per S2 spec.
|
|
7
|
+
*/
|
|
8
|
+
import { type TenantContextPort } from "./tenant-context.js";
|
|
9
|
+
/**
|
|
10
|
+
* Factory function — tests accept any TenantContextPort implementation.
|
|
11
|
+
* Example: factory = () => new MemoryTenantContextStore()
|
|
12
|
+
*/
|
|
13
|
+
export declare const tenantContextPortContract: (factory: () => TenantContextPort) => void;
|
|
14
|
+
//# sourceMappingURL=tenant-context.contract.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-context.contract.test.d.ts","sourceRoot":"","sources":["../../src/ports/tenant-context.contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,KAAK,iBAAiB,EAKvB,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GAAI,SAAS,MAAM,iBAAiB,SAuRzE,CAAC"}
|