@vauban-org/agent-sdk 1.0.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRACT.md +6918 -742
- package/dist/adapters/llm/anthropic-direct.d.ts +1 -0
- package/dist/adapters/llm/anthropic-direct.d.ts.map +1 -1
- package/dist/adapters/llm/anthropic-direct.js +43 -0
- package/dist/adapters/llm/anthropic-direct.js.map +1 -1
- package/dist/adapters/llm/cascade.d.ts.map +1 -1
- package/dist/adapters/llm/cascade.js +57 -14
- package/dist/adapters/llm/cascade.js.map +1 -1
- package/dist/adapters/llm/litellm.d.ts +2 -0
- package/dist/adapters/llm/litellm.d.ts.map +1 -1
- package/dist/adapters/llm/litellm.js +44 -0
- package/dist/adapters/llm/litellm.js.map +1 -1
- package/dist/compute/difficulty-estimator.d.ts +53 -0
- package/dist/compute/difficulty-estimator.d.ts.map +1 -0
- package/dist/compute/difficulty-estimator.js +82 -0
- package/dist/compute/difficulty-estimator.js.map +1 -0
- package/dist/compute/strategies/mixture-of-agents.d.ts +40 -0
- package/dist/compute/strategies/mixture-of-agents.d.ts.map +1 -0
- package/dist/compute/strategies/mixture-of-agents.js +110 -0
- package/dist/compute/strategies/mixture-of-agents.js.map +1 -0
- package/dist/compute/strategies/tree-of-thoughts.d.ts +48 -0
- package/dist/compute/strategies/tree-of-thoughts.d.ts.map +1 -0
- package/dist/compute/strategies/tree-of-thoughts.js +242 -0
- package/dist/compute/strategies/tree-of-thoughts.js.map +1 -0
- package/dist/compute/strategies/two-phase-orient.d.ts +72 -0
- package/dist/compute/strategies/two-phase-orient.d.ts.map +1 -0
- package/dist/compute/strategies/two-phase-orient.js +85 -0
- package/dist/compute/strategies/two-phase-orient.js.map +1 -0
- package/dist/constitution/types.d.ts +10 -10
- package/dist/container/protocol.d.ts +134 -0
- package/dist/container/protocol.d.ts.map +1 -0
- package/dist/container/protocol.js +157 -0
- package/dist/container/protocol.js.map +1 -0
- package/dist/container/runtime.d.ts +140 -0
- package/dist/container/runtime.d.ts.map +1 -0
- package/dist/container/runtime.js +256 -0
- package/dist/container/runtime.js.map +1 -0
- package/dist/events/catalogue.d.ts +46 -46
- package/dist/events/schemas/agent.completed.v1.d.ts +4 -4
- package/dist/events/schemas/agent.failed.v1.d.ts +2 -2
- package/dist/events/schemas/agent.hitl_resolved.v1.d.ts +2 -2
- package/dist/events/schemas/agent.started.v1.d.ts +2 -2
- package/dist/events/schemas/brain.skill.extracted.v1.d.ts +4 -4
- package/dist/events/schemas/cc.cost.anomaly_detected.v1.d.ts +2 -2
- package/dist/events/schemas/cc.cost.recorded.v1.d.ts +4 -4
- package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts +6 -6
- package/dist/events/schemas/citadel.sprint.closed.v1.d.ts +2 -2
- package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts +6 -6
- package/dist/events/schemas/forge.lead.qualified.v1.d.ts +2 -2
- package/dist/events/schemas/forge.outreach.sent.v1.d.ts +4 -4
- package/dist/events/schemas/incident.detected.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.goal.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.tax.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts +6 -6
- package/dist/identity/agent-persona.d.ts +73 -0
- package/dist/identity/agent-persona.d.ts.map +1 -0
- package/dist/identity/agent-persona.js +165 -0
- package/dist/identity/agent-persona.js.map +1 -0
- package/dist/identity/persona-prompt.d.ts +25 -0
- package/dist/identity/persona-prompt.d.ts.map +1 -0
- package/dist/identity/persona-prompt.js +71 -0
- package/dist/identity/persona-prompt.js.map +1 -0
- package/dist/identity/persona-schema.d.ts +120 -0
- package/dist/identity/persona-schema.d.ts.map +1 -0
- package/dist/identity/persona-schema.js +103 -0
- package/dist/identity/persona-schema.js.map +1 -0
- package/dist/index.d.ts +41 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -1
- package/dist/index.js.map +1 -1
- package/dist/loop/minimal-loop.js +293 -287
- package/dist/memory/episodic-rrf.d.ts +114 -0
- package/dist/memory/episodic-rrf.d.ts.map +1 -0
- package/dist/memory/episodic-rrf.js +148 -0
- package/dist/memory/episodic-rrf.js.map +1 -0
- package/dist/mesh/attenuation.d.ts +78 -0
- package/dist/mesh/attenuation.d.ts.map +1 -0
- package/dist/mesh/attenuation.js +141 -0
- package/dist/mesh/attenuation.js.map +1 -0
- package/dist/mesh/delegate.d.ts +96 -0
- package/dist/mesh/delegate.d.ts.map +1 -0
- package/dist/mesh/delegate.js +172 -0
- package/dist/mesh/delegate.js.map +1 -0
- package/dist/mesh/dispatcher.d.ts +119 -0
- package/dist/mesh/dispatcher.d.ts.map +1 -0
- package/dist/mesh/dispatcher.js +207 -0
- package/dist/mesh/dispatcher.js.map +1 -0
- package/dist/mesh/index.d.ts +12 -0
- package/dist/mesh/index.d.ts.map +1 -0
- package/dist/mesh/index.js +11 -0
- package/dist/mesh/index.js.map +1 -0
- package/dist/mesh/types.d.ts +30 -0
- package/dist/mesh/types.d.ts.map +1 -0
- package/dist/mesh/types.js +11 -0
- package/dist/mesh/types.js.map +1 -0
- package/dist/orchestration/ooda/agent.d.ts.map +1 -1
- package/dist/orchestration/ooda/agent.js +36 -0
- package/dist/orchestration/ooda/agent.js.map +1 -1
- package/dist/orchestration/ooda/skills.d.ts +104 -0
- package/dist/orchestration/ooda/skills.d.ts.map +1 -1
- package/dist/orchestration/ooda/skills.js +106 -0
- package/dist/orchestration/ooda/skills.js.map +1 -1
- package/dist/orchestration/ooda/types.d.ts +11 -0
- package/dist/orchestration/ooda/types.d.ts.map +1 -1
- package/dist/ports/bastion-action.contract.test.d.ts +11 -0
- package/dist/ports/bastion-action.contract.test.d.ts.map +1 -0
- package/dist/ports/bastion-action.contract.test.js +238 -0
- package/dist/ports/bastion-action.contract.test.js.map +1 -0
- package/dist/ports/bastion-action.d.ts +133 -0
- package/dist/ports/bastion-action.d.ts.map +1 -0
- package/dist/ports/bastion-action.js +73 -0
- package/dist/ports/bastion-action.js.map +1 -0
- package/dist/ports/brain.d.ts +31 -0
- package/dist/ports/brain.d.ts.map +1 -1
- package/dist/ports/brain.js +115 -1
- package/dist/ports/brain.js.map +1 -1
- package/dist/ports/citadel-action.contract.test.d.ts +11 -0
- package/dist/ports/citadel-action.contract.test.d.ts.map +1 -0
- package/dist/ports/citadel-action.contract.test.js +317 -0
- package/dist/ports/citadel-action.contract.test.js.map +1 -0
- package/dist/ports/citadel-action.d.ts +111 -0
- package/dist/ports/citadel-action.d.ts.map +1 -0
- package/dist/ports/citadel-action.js +62 -0
- package/dist/ports/citadel-action.js.map +1 -0
- package/dist/ports/compliance-contract.d.ts +123 -0
- package/dist/ports/compliance-contract.d.ts.map +1 -0
- package/dist/ports/compliance-contract.js +35 -0
- package/dist/ports/compliance-contract.js.map +1 -0
- package/dist/ports/db.d.ts +38 -0
- package/dist/ports/db.d.ts.map +1 -1
- package/dist/ports/db.js +88 -1
- package/dist/ports/db.js.map +1 -1
- package/dist/ports/delegation.contract.test.d.ts +9 -0
- package/dist/ports/delegation.contract.test.d.ts.map +1 -0
- package/dist/ports/delegation.contract.test.js +337 -0
- package/dist/ports/delegation.contract.test.js.map +1 -0
- package/dist/ports/delegation.d.ts +134 -0
- package/dist/ports/delegation.d.ts.map +1 -0
- package/dist/ports/delegation.js +105 -0
- package/dist/ports/delegation.js.map +1 -0
- package/dist/ports/event-bus.d.ts +29 -0
- package/dist/ports/event-bus.d.ts.map +1 -1
- package/dist/ports/event-bus.js +106 -1
- package/dist/ports/event-bus.js.map +1 -1
- package/dist/ports/federation.contract.test.d.ts +9 -0
- package/dist/ports/federation.contract.test.d.ts.map +1 -0
- package/dist/ports/federation.contract.test.js +279 -0
- package/dist/ports/federation.contract.test.js.map +1 -0
- package/dist/ports/federation.d.ts +140 -0
- package/dist/ports/federation.d.ts.map +1 -0
- package/dist/ports/federation.js +57 -0
- package/dist/ports/federation.js.map +1 -0
- package/dist/ports/index.d.ts +28 -2
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +17 -2
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/llm-provider.d.ts +37 -0
- package/dist/ports/llm-provider.d.ts.map +1 -1
- package/dist/ports/llm-provider.js +99 -1
- package/dist/ports/llm-provider.js.map +1 -1
- package/dist/ports/logger.d.ts +27 -0
- package/dist/ports/logger.d.ts.map +1 -1
- package/dist/ports/logger.js +87 -0
- package/dist/ports/logger.js.map +1 -1
- package/dist/ports/manifest-registry.contract.test.d.ts +9 -0
- package/dist/ports/manifest-registry.contract.test.d.ts.map +1 -0
- package/dist/ports/manifest-registry.contract.test.js +246 -0
- package/dist/ports/manifest-registry.contract.test.js.map +1 -0
- package/dist/ports/manifest-registry.d.ts +116 -0
- package/dist/ports/manifest-registry.d.ts.map +1 -0
- package/dist/ports/manifest-registry.js +79 -0
- package/dist/ports/manifest-registry.js.map +1 -0
- package/dist/ports/observability.contract.test.d.ts +12 -0
- package/dist/ports/observability.contract.test.d.ts.map +1 -0
- package/dist/ports/observability.contract.test.js +260 -0
- package/dist/ports/observability.contract.test.js.map +1 -0
- package/dist/ports/observability.d.ts +98 -0
- package/dist/ports/observability.d.ts.map +1 -0
- package/dist/ports/observability.js +59 -0
- package/dist/ports/observability.js.map +1 -0
- package/dist/ports/outcome.d.ts +26 -0
- package/dist/ports/outcome.d.ts.map +1 -1
- package/dist/ports/outcome.js +62 -1
- package/dist/ports/outcome.js.map +1 -1
- package/dist/ports/privacy.contract.test.d.ts +12 -0
- package/dist/ports/privacy.contract.test.d.ts.map +1 -0
- package/dist/ports/privacy.contract.test.js +325 -0
- package/dist/ports/privacy.contract.test.js.map +1 -0
- package/dist/ports/privacy.d.ts +132 -0
- package/dist/ports/privacy.d.ts.map +1 -0
- package/dist/ports/privacy.js +83 -0
- package/dist/ports/privacy.js.map +1 -0
- package/dist/ports/tenant-context.contract.test.d.ts +14 -0
- package/dist/ports/tenant-context.contract.test.d.ts.map +1 -0
- package/dist/ports/tenant-context.contract.test.js +352 -0
- package/dist/ports/tenant-context.contract.test.js.map +1 -0
- package/dist/ports/tenant-context.d.ts +103 -0
- package/dist/ports/tenant-context.d.ts.map +1 -0
- package/dist/ports/tenant-context.js +48 -0
- package/dist/ports/tenant-context.js.map +1 -0
- package/dist/ports/vauban-finance-action.contract.test.d.ts +11 -0
- package/dist/ports/vauban-finance-action.contract.test.d.ts.map +1 -0
- package/dist/ports/vauban-finance-action.contract.test.js +260 -0
- package/dist/ports/vauban-finance-action.contract.test.js.map +1 -0
- package/dist/ports/vauban-finance-action.d.ts +106 -0
- package/dist/ports/vauban-finance-action.d.ts.map +1 -0
- package/dist/ports/vauban-finance-action.js +60 -0
- package/dist/ports/vauban-finance-action.js.map +1 -0
- package/dist/ports/workflow-runtime.d.ts +204 -0
- package/dist/ports/workflow-runtime.d.ts.map +1 -0
- package/dist/ports/workflow-runtime.js +72 -0
- package/dist/ports/workflow-runtime.js.map +1 -0
- package/dist/proof/cert-verify.d.ts +80 -0
- package/dist/proof/cert-verify.d.ts.map +1 -0
- package/dist/proof/cert-verify.js +178 -0
- package/dist/proof/cert-verify.js.map +1 -0
- package/dist/replay/replay.d.ts.map +1 -1
- package/dist/replay/replay.js +5 -1
- package/dist/replay/replay.js.map +1 -1
- package/dist/retry/index.d.ts +129 -0
- package/dist/retry/index.d.ts.map +1 -0
- package/dist/retry/index.js +156 -0
- package/dist/retry/index.js.map +1 -0
- package/dist/retry/presets.d.ts +39 -0
- package/dist/retry/presets.d.ts.map +1 -0
- package/dist/retry/presets.js +69 -0
- package/dist/retry/presets.js.map +1 -0
- package/dist/skill-loop/ab-runner.d.ts +67 -0
- package/dist/skill-loop/ab-runner.d.ts.map +1 -0
- package/dist/skill-loop/ab-runner.js +160 -0
- package/dist/skill-loop/ab-runner.js.map +1 -0
- package/dist/skill-loop/adoption.d.ts +67 -0
- package/dist/skill-loop/adoption.d.ts.map +1 -0
- package/dist/skill-loop/adoption.js +126 -0
- package/dist/skill-loop/adoption.js.map +1 -0
- package/dist/skill-loop/candidate.d.ts +45 -0
- package/dist/skill-loop/candidate.d.ts.map +1 -0
- package/dist/skill-loop/candidate.js +43 -0
- package/dist/skill-loop/candidate.js.map +1 -0
- package/dist/skill-loop/evaluator.d.ts +42 -0
- package/dist/skill-loop/evaluator.d.ts.map +1 -0
- package/dist/skill-loop/evaluator.js +184 -0
- package/dist/skill-loop/evaluator.js.map +1 -0
- package/dist/skill-loop/index.d.ts +27 -0
- package/dist/skill-loop/index.d.ts.map +1 -0
- package/dist/skill-loop/index.js +27 -0
- package/dist/skill-loop/index.js.map +1 -0
- package/dist/skill-loop/reflexion-replay.d.ts +87 -0
- package/dist/skill-loop/reflexion-replay.d.ts.map +1 -0
- package/dist/skill-loop/reflexion-replay.js +110 -0
- package/dist/skill-loop/reflexion-replay.js.map +1 -0
- package/dist/skill-loop/sign-off.d.ts +88 -0
- package/dist/skill-loop/sign-off.d.ts.map +1 -0
- package/dist/skill-loop/sign-off.js +146 -0
- package/dist/skill-loop/sign-off.js.map +1 -0
- package/dist/skill-loop/value-metric.d.ts +55 -0
- package/dist/skill-loop/value-metric.d.ts.map +1 -0
- package/dist/skill-loop/value-metric.js +69 -0
- package/dist/skill-loop/value-metric.js.map +1 -0
- package/dist/skill-loop/versioning.d.ts +36 -0
- package/dist/skill-loop/versioning.d.ts.map +1 -0
- package/dist/skill-loop/versioning.js +47 -0
- package/dist/skill-loop/versioning.js.map +1 -0
- package/dist/skill-manifest/anchor.d.ts +91 -0
- package/dist/skill-manifest/anchor.d.ts.map +1 -0
- package/dist/skill-manifest/anchor.js +331 -0
- package/dist/skill-manifest/anchor.js.map +1 -0
- package/dist/skill-manifest/builder.d.ts +47 -0
- package/dist/skill-manifest/builder.d.ts.map +1 -0
- package/dist/skill-manifest/builder.js +93 -0
- package/dist/skill-manifest/builder.js.map +1 -0
- package/dist/skill-manifest/index.d.ts +13 -0
- package/dist/skill-manifest/index.d.ts.map +1 -0
- package/dist/skill-manifest/index.js +9 -0
- package/dist/skill-manifest/index.js.map +1 -0
- package/dist/skill-manifest/types.d.ts +67 -0
- package/dist/skill-manifest/types.d.ts.map +1 -0
- package/dist/skill-manifest/types.js +16 -0
- package/dist/skill-manifest/types.js.map +1 -0
- package/dist/skill-manifest/verifier.d.ts +42 -0
- package/dist/skill-manifest/verifier.d.ts.map +1 -0
- package/dist/skill-manifest/verifier.js +136 -0
- package/dist/skill-manifest/verifier.js.map +1 -0
- package/dist/skills/_secrets.d.ts +16 -0
- package/dist/skills/_secrets.d.ts.map +1 -0
- package/dist/skills/_secrets.js +20 -0
- package/dist/skills/_secrets.js.map +1 -0
- package/dist/skills/alpaca-quote.d.ts +2 -2
- package/dist/skills/alpaca-quote.d.ts.map +1 -1
- package/dist/skills/alpaca-quote.js +51 -20
- package/dist/skills/alpaca-quote.js.map +1 -1
- package/dist/skills/brain-query.d.ts +4 -4
- package/dist/skills/brain-store.d.ts +6 -6
- package/dist/skills/errors.d.ts +15 -0
- package/dist/skills/errors.d.ts.map +1 -1
- package/dist/skills/errors.js +21 -0
- package/dist/skills/errors.js.map +1 -1
- package/dist/skills/hitl-request.d.ts +2 -2
- package/dist/skills/index.d.ts +3 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +4 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/markdown/loader.d.ts +52 -0
- package/dist/skills/markdown/loader.d.ts.map +1 -0
- package/dist/skills/markdown/loader.js +93 -0
- package/dist/skills/markdown/loader.js.map +1 -0
- package/dist/skills/markdown/schema.d.ts +432 -0
- package/dist/skills/markdown/schema.d.ts.map +1 -0
- package/dist/skills/markdown/schema.js +121 -0
- package/dist/skills/markdown/schema.js.map +1 -0
- package/dist/skills/poc-md-loader/markdown-loader.d.ts +77 -0
- package/dist/skills/poc-md-loader/markdown-loader.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/markdown-loader.js +125 -0
- package/dist/skills/poc-md-loader/markdown-loader.js.map +1 -0
- package/dist/skills/poc-md-loader/runner.d.ts +24 -0
- package/dist/skills/poc-md-loader/runner.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/runner.js +57 -0
- package/dist/skills/poc-md-loader/runner.js.map +1 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.d.ts +3 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.js +13 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.js.map +1 -0
- package/dist/skills/poc-md-loader/web-search/script.d.ts +33 -0
- package/dist/skills/poc-md-loader/web-search/script.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/web-search/script.js +75 -0
- package/dist/skills/poc-md-loader/web-search/script.js.map +1 -0
- package/dist/skills/record-outcome.d.ts +4 -4
- package/dist/skills/send-email.d.ts +2 -2
- package/dist/skills/send-email.d.ts.map +1 -1
- package/dist/skills/send-email.js +4 -3
- package/dist/skills/send-email.js.map +1 -1
- package/dist/skills/slack-notify.d.ts +4 -4
- package/dist/skills/slack-notify.d.ts.map +1 -1
- package/dist/skills/slack-notify.js +52 -21
- package/dist/skills/slack-notify.js.map +1 -1
- package/dist/skills/starknet-balance.d.ts +1 -1
- package/dist/skills/telegram-notify.d.ts +4 -4
- package/dist/skills/telegram-notify.d.ts.map +1 -1
- package/dist/skills/telegram-notify.js +48 -19
- package/dist/skills/telegram-notify.js.map +1 -1
- package/dist/skills/web-search.d.ts +1 -1
- package/dist/skills/web-search.d.ts.map +1 -1
- package/dist/skills/web-search.js +85 -40
- package/dist/skills/web-search.js.map +1 -1
- package/dist/telemetry/bus.d.ts +54 -0
- package/dist/telemetry/bus.d.ts.map +1 -0
- package/dist/telemetry/bus.js +159 -0
- package/dist/telemetry/bus.js.map +1 -0
- package/dist/telemetry/index.d.ts +35 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +30 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/port.d.ts +121 -0
- package/dist/telemetry/port.d.ts.map +1 -0
- package/dist/telemetry/port.js +48 -0
- package/dist/telemetry/port.js.map +1 -0
- package/dist/telemetry/sinks/otlp.d.ts +45 -0
- package/dist/telemetry/sinks/otlp.d.ts.map +1 -0
- package/dist/telemetry/sinks/otlp.js +195 -0
- package/dist/telemetry/sinks/otlp.js.map +1 -0
- package/dist/telemetry/sinks/sqlite.d.ts +32 -0
- package/dist/telemetry/sinks/sqlite.d.ts.map +1 -0
- package/dist/telemetry/sinks/sqlite.js +170 -0
- package/dist/telemetry/sinks/sqlite.js.map +1 -0
- package/dist/telemetry/sinks/stdout.d.ts +22 -0
- package/dist/telemetry/sinks/stdout.d.ts.map +1 -0
- package/dist/telemetry/sinks/stdout.js +38 -0
- package/dist/telemetry/sinks/stdout.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/test-brain-port.d.ts +4 -0
- package/dist/testing/test-brain-port.d.ts.map +1 -1
- package/dist/testing/test-brain-port.js +75 -20
- package/dist/testing/test-brain-port.js.map +1 -1
- package/dist/testing/test-event-bus.d.ts.map +1 -1
- package/dist/testing/test-event-bus.js +89 -36
- package/dist/testing/test-event-bus.js.map +1 -1
- package/dist/trace/schema.d.ts +1 -1
- package/dist/trace/schema.d.ts.map +1 -1
- package/dist/trace/schema.js +1 -1
- package/dist/trace/schema.js.map +1 -1
- package/dist/verify/formal/index.d.ts +44 -0
- package/dist/verify/formal/index.d.ts.map +1 -0
- package/dist/verify/formal/index.js +98 -0
- package/dist/verify/formal/index.js.map +1 -0
- package/dist/verify/formal/policy.d.ts +105 -0
- package/dist/verify/formal/policy.d.ts.map +1 -0
- package/dist/verify/formal/policy.js +159 -0
- package/dist/verify/formal/policy.js.map +1 -0
- package/dist/verify/formal/result.d.ts +50 -0
- package/dist/verify/formal/result.d.ts.map +1 -0
- package/dist/verify/formal/result.js +21 -0
- package/dist/verify/formal/result.js.map +1 -0
- package/dist/verify/formal/solver.d.ts +67 -0
- package/dist/verify/formal/solver.d.ts.map +1 -0
- package/dist/verify/formal/solver.js +184 -0
- package/dist/verify/formal/solver.js.map +1 -0
- package/dist/verify/formal/spec-language.d.ts +80 -0
- package/dist/verify/formal/spec-language.d.ts.map +1 -0
- package/dist/verify/formal/spec-language.js +219 -0
- package/dist/verify/formal/spec-language.js.map +1 -0
- package/docs/attestation.md +199 -0
- package/docs/identity.md +193 -0
- package/docs/telemetry/migration.md +155 -0
- package/docs/telemetry/overview.md +154 -0
- package/docs/telemetry/privacy.md +127 -0
- package/docs/telemetry/sinks/cc.md +155 -0
- package/docs/telemetry/sinks/otlp.md +146 -0
- package/docs/telemetry/sinks/sqlite.md +126 -0
- package/docs/telemetry/sinks/stdout.md +82 -0
- package/package.json +18 -2
- package/src/adapters/llm/anthropic-direct.ts +51 -0
- package/src/adapters/llm/cascade.ts +64 -19
- package/src/adapters/llm/litellm.ts +49 -0
- package/src/compute/difficulty-estimator.ts +111 -0
- package/src/compute/strategies/mixture-of-agents.ts +150 -0
- package/src/compute/strategies/tree-of-thoughts.ts +293 -0
- package/src/compute/strategies/two-phase-orient.ts +147 -0
- package/src/container/protocol.ts +243 -0
- package/src/container/runtime.ts +424 -0
- package/src/db/migrations/026_formal_verify_results.sql +30 -0
- package/src/identity/agent-persona.ts +203 -0
- package/src/identity/persona-prompt.ts +84 -0
- package/src/identity/persona-schema.ts +127 -0
- package/src/index.ts +368 -2
- package/src/memory/episodic-rrf.ts +224 -0
- package/src/mesh/attenuation.ts +190 -0
- package/src/mesh/delegate.ts +254 -0
- package/src/mesh/dispatcher.ts +301 -0
- package/src/mesh/index.ts +39 -0
- package/src/mesh/types.ts +31 -0
- package/src/orchestration/ooda/agent.ts +50 -0
- package/src/orchestration/ooda/skills.ts +177 -0
- package/src/orchestration/ooda/types.ts +12 -0
- package/src/ports/bastion-action.contract.test.ts +355 -0
- package/src/ports/bastion-action.ts +198 -0
- package/src/ports/brain.ts +177 -15
- package/src/ports/citadel-action.contract.test.ts +430 -0
- package/src/ports/citadel-action.ts +174 -0
- package/src/ports/compliance-contract.ts +191 -0
- package/src/ports/db.ts +98 -0
- package/src/ports/delegation.contract.test.ts +428 -0
- package/src/ports/delegation.ts +211 -0
- package/src/ports/event-bus.ts +133 -0
- package/src/ports/federation.contract.test.ts +355 -0
- package/src/ports/federation.ts +190 -0
- package/src/ports/index.ts +186 -1
- package/src/ports/llm-provider.ts +123 -0
- package/src/ports/logger.ts +104 -0
- package/src/ports/manifest-registry.contract.test.ts +324 -0
- package/src/ports/manifest-registry.ts +188 -0
- package/src/ports/observability.contract.test.ts +315 -0
- package/src/ports/observability.ts +150 -0
- package/src/ports/outcome.ts +69 -0
- package/src/ports/privacy.contract.test.ts +413 -0
- package/src/ports/privacy.ts +207 -0
- package/src/ports/tenant-context.contract.test.ts +454 -0
- package/src/ports/tenant-context.ts +150 -0
- package/src/ports/vauban-finance-action.contract.test.ts +335 -0
- package/src/ports/vauban-finance-action.ts +166 -0
- package/src/ports/workflow-runtime.ts +327 -0
- package/src/proof/cert-verify.ts +249 -0
- package/src/replay/replay.ts +11 -8
- package/src/retry/index.ts +227 -0
- package/src/retry/presets.ts +75 -0
- package/src/skill-loop/ab-runner.ts +196 -0
- package/src/skill-loop/adoption.ts +188 -0
- package/src/skill-loop/candidate.ts +75 -0
- package/src/skill-loop/evaluator.ts +238 -0
- package/src/skill-loop/index.ts +51 -0
- package/src/skill-loop/reflexion-replay.ts +173 -0
- package/src/skill-loop/sign-off.ts +247 -0
- package/src/skill-loop/value-metric.ts +120 -0
- package/src/skill-loop/versioning.ts +75 -0
- package/src/skill-manifest/anchor.ts +401 -0
- package/src/skill-manifest/builder.ts +129 -0
- package/src/skill-manifest/index.ts +18 -0
- package/src/skill-manifest/types.ts +72 -0
- package/src/skill-manifest/verifier.ts +198 -0
- package/src/skills/_secrets.ts +25 -0
- package/src/skills/alpaca-quote.ts +68 -23
- package/src/skills/errors.ts +30 -2
- package/src/skills/index.ts +19 -0
- package/src/skills/markdown/loader.ts +129 -0
- package/src/skills/markdown/schema.ts +144 -0
- package/src/skills/poc-md-loader/e2e-parity.test.ts +237 -0
- package/src/skills/poc-md-loader/markdown-loader.ts +161 -0
- package/src/skills/poc-md-loader/runner.ts +82 -0
- package/src/skills/poc-md-loader/vitest.poc.config.ts +13 -0
- package/src/skills/poc-md-loader/web-search/SKILL.md +42 -0
- package/src/skills/poc-md-loader/web-search/script.ts +109 -0
- package/src/skills/send-email.ts +4 -3
- package/src/skills/slack-notify.ts +73 -30
- package/src/skills/telegram-notify.ts +70 -24
- package/src/skills/web-search.ts +132 -50
- package/src/telemetry/bus.test.ts +231 -0
- package/src/telemetry/bus.ts +241 -0
- package/src/telemetry/index.ts +49 -0
- package/src/telemetry/port.ts +160 -0
- package/src/telemetry/sinks/otlp.test.ts +146 -0
- package/src/telemetry/sinks/otlp.ts +250 -0
- package/src/telemetry/sinks/sqlite.test.ts +121 -0
- package/src/telemetry/sinks/sqlite.ts +260 -0
- package/src/telemetry/sinks/stdout.test.ts +109 -0
- package/src/telemetry/sinks/stdout.ts +59 -0
- package/src/testing/test-brain-port.ts +98 -24
- package/src/testing/test-event-bus.ts +104 -43
- package/src/trace/schema.ts +1 -1
- package/src/verify/formal/index.ts +154 -0
- package/src/verify/formal/policy.ts +253 -0
- package/src/verify/formal/result.ts +52 -0
- package/src/verify/formal/solver.ts +235 -0
- package/src/verify/formal/spec-language.ts +274 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObservabilityPort contract tests — validate port interface compliance.
|
|
3
|
+
*
|
|
4
|
+
* Tests verify:
|
|
5
|
+
* - startSpan returns a valid Span with all methods
|
|
6
|
+
* - recordEvent accepts all 5 severity levels
|
|
7
|
+
* - recordMetric accepts gauge, counter, histogram types
|
|
8
|
+
* - flush() resolves successfully
|
|
9
|
+
* - NoopObservabilityPort satisfies the interface
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { describe, it, expect } from "vitest";
|
|
13
|
+
import {
|
|
14
|
+
NoopObservabilityPort,
|
|
15
|
+
type ObservabilityEvent,
|
|
16
|
+
} from "./observability";
|
|
17
|
+
|
|
18
|
+
describe("ObservabilityPort contract", () => {
|
|
19
|
+
describe("startSpan", () => {
|
|
20
|
+
it("returns a Span with all required methods", () => {
|
|
21
|
+
const port = new NoopObservabilityPort();
|
|
22
|
+
const span = port.startSpan("test.span", {
|
|
23
|
+
service: "test",
|
|
24
|
+
version: 1,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
expect(span).toBeDefined();
|
|
28
|
+
expect(typeof span.setAttribute).toBe("function");
|
|
29
|
+
expect(typeof span.recordException).toBe("function");
|
|
30
|
+
expect(typeof span.setStatus).toBe("function");
|
|
31
|
+
expect(typeof span.end).toBe("function");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("accepts span name and optional attributes", () => {
|
|
35
|
+
const port = new NoopObservabilityPort();
|
|
36
|
+
const span1 = port.startSpan("workflow.execute");
|
|
37
|
+
const span2 = port.startSpan("brain.query", {
|
|
38
|
+
query: "test",
|
|
39
|
+
category: "semantic",
|
|
40
|
+
limit: 10,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
expect(span1).toBeDefined();
|
|
44
|
+
expect(span2).toBeDefined();
|
|
45
|
+
span1.end();
|
|
46
|
+
span2.end();
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("span.setAttribute accepts string, number, boolean, and arrays", () => {
|
|
50
|
+
const port = new NoopObservabilityPort();
|
|
51
|
+
const span = port.startSpan("test");
|
|
52
|
+
|
|
53
|
+
span.setAttribute("string_attr", "hello");
|
|
54
|
+
span.setAttribute("number_attr", 42);
|
|
55
|
+
span.setAttribute("bool_attr", true);
|
|
56
|
+
span.setAttribute("string_array_attr", ["a", "b", "c"]);
|
|
57
|
+
span.setAttribute("number_array_attr", [1, 2, 3]);
|
|
58
|
+
|
|
59
|
+
expect(true).toBe(true); // noop implementation succeeds silently
|
|
60
|
+
span.end();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("span.recordException accepts Error or unknown", () => {
|
|
64
|
+
const port = new NoopObservabilityPort();
|
|
65
|
+
const span = port.startSpan("test");
|
|
66
|
+
|
|
67
|
+
span.recordException(new Error("test error"));
|
|
68
|
+
span.recordException({ message: "unknown error" });
|
|
69
|
+
span.recordException("string error");
|
|
70
|
+
|
|
71
|
+
expect(true).toBe(true);
|
|
72
|
+
span.end();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("span.setStatus accepts code and optional message", () => {
|
|
76
|
+
const port = new NoopObservabilityPort();
|
|
77
|
+
const span = port.startSpan("test");
|
|
78
|
+
|
|
79
|
+
span.setStatus({ code: "OK" });
|
|
80
|
+
span.setStatus({ code: "ERROR", message: "something went wrong" });
|
|
81
|
+
|
|
82
|
+
expect(true).toBe(true);
|
|
83
|
+
span.end();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("span.end completes the span", () => {
|
|
87
|
+
const port = new NoopObservabilityPort();
|
|
88
|
+
const span = port.startSpan("test");
|
|
89
|
+
|
|
90
|
+
expect(() => span.end()).not.toThrow();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe("recordEvent", () => {
|
|
95
|
+
it("accepts events with all 5 severity levels", () => {
|
|
96
|
+
const port = new NoopObservabilityPort();
|
|
97
|
+
const severities = ["debug", "info", "warn", "error", "fatal"] as const;
|
|
98
|
+
|
|
99
|
+
for (const severity of severities) {
|
|
100
|
+
const event: ObservabilityEvent = {
|
|
101
|
+
name: `event.${severity}`,
|
|
102
|
+
severity,
|
|
103
|
+
};
|
|
104
|
+
expect(() => port.recordEvent(event)).not.toThrow();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("accepts optional attributes, timestamp, traceId, spanId", () => {
|
|
109
|
+
const port = new NoopObservabilityPort();
|
|
110
|
+
const event: ObservabilityEvent = {
|
|
111
|
+
name: "test.event",
|
|
112
|
+
severity: "info",
|
|
113
|
+
attributes: {
|
|
114
|
+
user_id: "user-123",
|
|
115
|
+
action: "created",
|
|
116
|
+
resource_count: 5,
|
|
117
|
+
},
|
|
118
|
+
timestamp: Date.now(),
|
|
119
|
+
traceId: "4bf92f3577b34da6a3ce929d0e0e4736",
|
|
120
|
+
spanId: "00f067aa0ba902b7",
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
expect(() => port.recordEvent(event)).not.toThrow();
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("attributes can contain strings, numbers, booleans, and arrays", () => {
|
|
127
|
+
const port = new NoopObservabilityPort();
|
|
128
|
+
const event: ObservabilityEvent = {
|
|
129
|
+
name: "complex.event",
|
|
130
|
+
severity: "warn",
|
|
131
|
+
attributes: {
|
|
132
|
+
message: "test warning",
|
|
133
|
+
count: 42,
|
|
134
|
+
enabled: true,
|
|
135
|
+
tags: ["tag1", "tag2"],
|
|
136
|
+
scores: [9.5, 8.7, 9.2],
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
expect(() => port.recordEvent(event)).not.toThrow();
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
describe("recordMetric", () => {
|
|
145
|
+
it("accepts gauge type metrics", () => {
|
|
146
|
+
const port = new NoopObservabilityPort();
|
|
147
|
+
port.recordMetric({
|
|
148
|
+
name: "memory.usage",
|
|
149
|
+
type: "gauge",
|
|
150
|
+
value: 512,
|
|
151
|
+
labels: { instance: "worker-1" },
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
expect(true).toBe(true);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("accepts counter type metrics", () => {
|
|
158
|
+
const port = new NoopObservabilityPort();
|
|
159
|
+
port.recordMetric({
|
|
160
|
+
name: "requests.total",
|
|
161
|
+
type: "counter",
|
|
162
|
+
value: 1,
|
|
163
|
+
labels: { endpoint: "/api/query" },
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
expect(true).toBe(true);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it("accepts histogram type metrics", () => {
|
|
170
|
+
const port = new NoopObservabilityPort();
|
|
171
|
+
port.recordMetric({
|
|
172
|
+
name: "request.duration",
|
|
173
|
+
type: "histogram",
|
|
174
|
+
value: 125,
|
|
175
|
+
labels: { method: "POST" },
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
expect(true).toBe(true);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it("optional timestamp defaults to Date.now()", () => {
|
|
182
|
+
const port = new NoopObservabilityPort();
|
|
183
|
+
const before = Date.now();
|
|
184
|
+
port.recordMetric({
|
|
185
|
+
name: "test.metric",
|
|
186
|
+
type: "gauge",
|
|
187
|
+
value: 100,
|
|
188
|
+
});
|
|
189
|
+
const after = Date.now();
|
|
190
|
+
|
|
191
|
+
expect(after).toBeGreaterThanOrEqual(before);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it("accepts metrics without labels", () => {
|
|
195
|
+
const port = new NoopObservabilityPort();
|
|
196
|
+
port.recordMetric({
|
|
197
|
+
name: "simple.metric",
|
|
198
|
+
type: "gauge",
|
|
199
|
+
value: 42,
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
expect(true).toBe(true);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
describe("flush", () => {
|
|
207
|
+
it("resolves successfully", async () => {
|
|
208
|
+
const port = new NoopObservabilityPort();
|
|
209
|
+
const result = port.flush();
|
|
210
|
+
|
|
211
|
+
expect(result).toBeInstanceOf(Promise);
|
|
212
|
+
await expect(result).resolves.toBeUndefined();
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it("can be called multiple times", async () => {
|
|
216
|
+
const port = new NoopObservabilityPort();
|
|
217
|
+
|
|
218
|
+
await expect(port.flush()).resolves.toBeUndefined();
|
|
219
|
+
await expect(port.flush()).resolves.toBeUndefined();
|
|
220
|
+
await expect(port.flush()).resolves.toBeUndefined();
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
describe("NoopObservabilityPort interface compliance", () => {
|
|
225
|
+
it("satisfies ObservabilityPort contract", () => {
|
|
226
|
+
const port = new NoopObservabilityPort();
|
|
227
|
+
|
|
228
|
+
// All methods required by ObservabilityPort are present
|
|
229
|
+
expect(typeof port.startSpan).toBe("function");
|
|
230
|
+
expect(typeof port.recordEvent).toBe("function");
|
|
231
|
+
expect(typeof port.recordMetric).toBe("function");
|
|
232
|
+
expect(typeof port.flush).toBe("function");
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it("startSpan, recordEvent, recordMetric work together", () => {
|
|
236
|
+
const port = new NoopObservabilityPort();
|
|
237
|
+
|
|
238
|
+
const span = port.startSpan("integration.test", { phase: "setup" });
|
|
239
|
+
port.recordEvent({
|
|
240
|
+
name: "span.created",
|
|
241
|
+
severity: "info",
|
|
242
|
+
});
|
|
243
|
+
port.recordMetric({
|
|
244
|
+
name: "span.count",
|
|
245
|
+
type: "counter",
|
|
246
|
+
value: 1,
|
|
247
|
+
});
|
|
248
|
+
span.setAttribute("status", "active");
|
|
249
|
+
port.recordEvent({
|
|
250
|
+
name: "span.attribute.set",
|
|
251
|
+
severity: "debug",
|
|
252
|
+
});
|
|
253
|
+
span.setStatus({ code: "OK" });
|
|
254
|
+
span.end();
|
|
255
|
+
|
|
256
|
+
expect(true).toBe(true); // all calls succeed
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
describe("error paths", () => {
|
|
261
|
+
it("recordException handles various error types gracefully", () => {
|
|
262
|
+
const port = new NoopObservabilityPort();
|
|
263
|
+
const span = port.startSpan("error.test");
|
|
264
|
+
|
|
265
|
+
const testCases = [
|
|
266
|
+
new Error("standard error"),
|
|
267
|
+
new TypeError("type error"),
|
|
268
|
+
new RangeError("range error"),
|
|
269
|
+
{ code: "CUSTOM_ERROR", message: "custom error object" },
|
|
270
|
+
"string error",
|
|
271
|
+
null,
|
|
272
|
+
undefined,
|
|
273
|
+
];
|
|
274
|
+
|
|
275
|
+
for (const testCase of testCases) {
|
|
276
|
+
expect(() => span.recordException(testCase)).not.toThrow();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
span.end();
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
it("setStatus accepts various code strings", () => {
|
|
283
|
+
const port = new NoopObservabilityPort();
|
|
284
|
+
const span = port.startSpan("status.test");
|
|
285
|
+
|
|
286
|
+
const codes = ["OK", "ERROR", "UNSET", "PENDING"];
|
|
287
|
+
for (const code of codes) {
|
|
288
|
+
expect(() => span.setStatus({ code })).not.toThrow();
|
|
289
|
+
expect(() =>
|
|
290
|
+
span.setStatus({ code, message: "optional message" })
|
|
291
|
+
).not.toThrow();
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
span.end();
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
describe("attribute value types", () => {
|
|
299
|
+
it("setAttribute validates AttrValue union", () => {
|
|
300
|
+
const port = new NoopObservabilityPort();
|
|
301
|
+
const span = port.startSpan("types.test");
|
|
302
|
+
|
|
303
|
+
// All valid AttrValue types
|
|
304
|
+
span.setAttribute("string", "value");
|
|
305
|
+
span.setAttribute("number", 123);
|
|
306
|
+
span.setAttribute("float", 3.14);
|
|
307
|
+
span.setAttribute("bool", false);
|
|
308
|
+
span.setAttribute("array_strings", ["a", "b"]);
|
|
309
|
+
span.setAttribute("array_numbers", [1, 2, 3]);
|
|
310
|
+
|
|
311
|
+
expect(true).toBe(true);
|
|
312
|
+
span.end();
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
});
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObservabilityPort — cross-cutting telemetry for Vauban Integration Spine.
|
|
3
|
+
*
|
|
4
|
+
* Implements S0 §6 (ObservabilityPort, port #14): OpenTelemetry-compatible spans,
|
|
5
|
+
* structured event logging, metrics, and graceful shutdown. Adapters emit to
|
|
6
|
+
* Prometheus, Sentry, audit logs, or custom backends.
|
|
7
|
+
*
|
|
8
|
+
* Design: structured types only — no hard dependency on @opentelemetry/api.
|
|
9
|
+
* Real OTel Spans satisfy the structural Span interface.
|
|
10
|
+
*
|
|
11
|
+
* Reference: S0 §6 type definition + createTracedBrainPort pattern in brain.ts
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
// ─── Attribute value types ────────────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
export type AttrValue = string | number | boolean | (string | number)[];
|
|
17
|
+
|
|
18
|
+
export interface SpanAttributes {
|
|
19
|
+
readonly [key: string]: AttrValue;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// ─── Span interface (structural — compatible with OTel Span) ─────────────────
|
|
23
|
+
|
|
24
|
+
export interface Span {
|
|
25
|
+
/** Record a key-value attribute on this span. */
|
|
26
|
+
setAttribute(key: string, value: AttrValue): void;
|
|
27
|
+
|
|
28
|
+
/** Record an exception / error on this span. */
|
|
29
|
+
recordException(error: Error | unknown): void;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Set the final status of this span.
|
|
33
|
+
* @param code 'OK', 'ERROR', or other OTel SpanStatusCode equivalent
|
|
34
|
+
* @param message optional message (used when code is 'ERROR')
|
|
35
|
+
*/
|
|
36
|
+
setStatus(opts: { code: string; message?: string }): void;
|
|
37
|
+
|
|
38
|
+
/** Mark the span as complete. */
|
|
39
|
+
end(): void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// ─── Observability event types ────────────────────────────────────────────────
|
|
43
|
+
|
|
44
|
+
export type EventSeverity = "debug" | "info" | "warn" | "error" | "fatal";
|
|
45
|
+
|
|
46
|
+
export interface ObservabilityEvent {
|
|
47
|
+
readonly name: string;
|
|
48
|
+
readonly severity: EventSeverity;
|
|
49
|
+
readonly attributes?: Record<string, AttrValue>;
|
|
50
|
+
readonly timestamp?: number; // unix ms, default = Date.now()
|
|
51
|
+
readonly traceId?: string; // OTel W3C trace ID
|
|
52
|
+
readonly spanId?: string; // OTel span ID
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ─── Metric types ────────────────────────────────────────────────────────────
|
|
56
|
+
|
|
57
|
+
export type MetricType = "gauge" | "counter" | "histogram";
|
|
58
|
+
|
|
59
|
+
export interface MetricInput {
|
|
60
|
+
readonly name: string;
|
|
61
|
+
readonly type: MetricType;
|
|
62
|
+
readonly value: number;
|
|
63
|
+
readonly labels?: Record<string, string>;
|
|
64
|
+
readonly timestamp?: number; // unix ms, default = Date.now()
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// ─── ObservabilityPort interface ─────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
export interface ObservabilityPort {
|
|
70
|
+
/**
|
|
71
|
+
* Start a new OTel-compatible span.
|
|
72
|
+
*
|
|
73
|
+
* @param name span name (e.g., "workflow.execute", "brain.query")
|
|
74
|
+
* @param attrs optional span attributes
|
|
75
|
+
* @returns Span handle for setAttribute, recordException, setStatus, end calls
|
|
76
|
+
*/
|
|
77
|
+
startSpan(name: string, attrs?: SpanAttributes): Span;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Record a structured observability event (log, audit, compliance event).
|
|
81
|
+
*
|
|
82
|
+
* @param event event with name, severity, attributes, optional trace/span IDs
|
|
83
|
+
*/
|
|
84
|
+
recordEvent(event: ObservabilityEvent): void;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Record a metric (gauge, counter, histogram).
|
|
88
|
+
*
|
|
89
|
+
* @param metric metric name, type, value, optional labels and timestamp
|
|
90
|
+
*/
|
|
91
|
+
recordMetric(metric: MetricInput): void;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Graceful shutdown — flush all pending telemetry.
|
|
95
|
+
* Called at process exit or service shutdown.
|
|
96
|
+
*/
|
|
97
|
+
flush(): Promise<void>;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// ─── Noop implementation (for tests, fallback, or offline mode) ──────────────
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* NoopObservabilityPort — no-op implementation for tests or offline mode.
|
|
104
|
+
* All calls are discarded; span operations succeed silently.
|
|
105
|
+
*/
|
|
106
|
+
export class NoopObservabilityPort implements ObservabilityPort {
|
|
107
|
+
private readonly noopSpan: Span = {
|
|
108
|
+
setAttribute: () => {},
|
|
109
|
+
recordException: () => {},
|
|
110
|
+
setStatus: () => {},
|
|
111
|
+
end: () => {},
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
startSpan(_name: string, _attrs?: SpanAttributes): Span {
|
|
115
|
+
return this.noopSpan;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
recordEvent(_event: ObservabilityEvent): void {
|
|
119
|
+
// no-op
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
recordMetric(_metric: MetricInput): void {
|
|
123
|
+
// no-op
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async flush(): Promise<void> {
|
|
127
|
+
// no-op
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ─── Typed errors ────────────────────────────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
export class ObservabilityError extends Error {
|
|
134
|
+
constructor(message: string, public readonly cause?: unknown) {
|
|
135
|
+
super(message);
|
|
136
|
+
this.name = "ObservabilityError";
|
|
137
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export class ObservabilityFlushTimeoutError extends Error {
|
|
142
|
+
constructor(
|
|
143
|
+
public readonly timeoutMs: number,
|
|
144
|
+
public readonly cause?: unknown
|
|
145
|
+
) {
|
|
146
|
+
super(`Observability flush timed out after ${timeoutMs}ms`);
|
|
147
|
+
this.name = "ObservabilityFlushTimeoutError";
|
|
148
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
149
|
+
}
|
|
150
|
+
}
|
package/src/ports/outcome.ts
CHANGED
|
@@ -4,8 +4,17 @@
|
|
|
4
4
|
* Host attributes a monetary value to each agent run via its
|
|
5
5
|
* domain-specific rules (config/outcomes.yaml in CC). The agent simply
|
|
6
6
|
* calls recordOutcomeAsync after its tracker.finish() — fire-and-forget.
|
|
7
|
+
*
|
|
8
|
+
* OTel instrumentation: import { createTracedOutcomePort } to wrap any
|
|
9
|
+
* OutcomePort implementation with OpenTelemetry spans. Gracefully degrades
|
|
10
|
+
* to noop spans when no OTel SDK is installed.
|
|
7
11
|
*/
|
|
8
12
|
|
|
13
|
+
import type { Span } from "@opentelemetry/api";
|
|
14
|
+
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
15
|
+
|
|
16
|
+
const PORT_TRACER = trace.getTracer("vauban-agent-sdk.ports", "0.1.0");
|
|
17
|
+
|
|
9
18
|
export interface AgentRunRef {
|
|
10
19
|
/** agent_run.id (UUID) produced by AgentRunTracker. */
|
|
11
20
|
id: string;
|
|
@@ -17,6 +26,25 @@ export interface AgentRunRef {
|
|
|
17
26
|
outcome_id?: string | null;
|
|
18
27
|
}
|
|
19
28
|
|
|
29
|
+
// ─── Typed errors ─────────────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Thrown when the outcome store write fails (DB connection lost, serialization
|
|
33
|
+
* error, or queue full). Since recordOutcomeAsync is fire-and-forget, this
|
|
34
|
+
* error is surfaced only when the implementation chooses to throw synchronously
|
|
35
|
+
* (e.g., during validation or when the write queue is persistently full).
|
|
36
|
+
*/
|
|
37
|
+
export class OutcomeWriteError extends Error {
|
|
38
|
+
readonly runId: string;
|
|
39
|
+
|
|
40
|
+
constructor(message: string, runId: string, public readonly cause?: unknown) {
|
|
41
|
+
super(message);
|
|
42
|
+
this.name = "OutcomeWriteError";
|
|
43
|
+
this.runId = runId;
|
|
44
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
20
48
|
export interface OutcomePort {
|
|
21
49
|
/**
|
|
22
50
|
* Enqueue outcome attribution. Fire-and-forget: never throws,
|
|
@@ -24,3 +52,44 @@ export interface OutcomePort {
|
|
|
24
52
|
*/
|
|
25
53
|
recordOutcomeAsync(run: AgentRunRef): void;
|
|
26
54
|
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Wrap any OutcomePort implementation with OTel spans.
|
|
58
|
+
* The span captures the run id and agent_id as attributes.
|
|
59
|
+
* Gracefully degrades to noop spans when no OTel SDK is installed.
|
|
60
|
+
*
|
|
61
|
+
* Usage:
|
|
62
|
+
* const raw: OutcomePort = buildPostgresOutcome(...);
|
|
63
|
+
* const traced = createTracedOutcomePort(raw);
|
|
64
|
+
* traced.recordOutcomeAsync({...}) // emits "outcome.recordOutcomeAsync" span
|
|
65
|
+
*/
|
|
66
|
+
export function createTracedOutcomePort(impl: OutcomePort): OutcomePort {
|
|
67
|
+
return {
|
|
68
|
+
recordOutcomeAsync(run: AgentRunRef): void {
|
|
69
|
+
PORT_TRACER.startActiveSpan(
|
|
70
|
+
"outcome.recordOutcomeAsync",
|
|
71
|
+
{
|
|
72
|
+
attributes: {
|
|
73
|
+
"outcome.run_id": run.id,
|
|
74
|
+
"outcome.agent_id": run.agent_id,
|
|
75
|
+
"vauban.port.name": "outcome",
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
(span: Span) => {
|
|
79
|
+
try {
|
|
80
|
+
impl.recordOutcomeAsync(run);
|
|
81
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
82
|
+
} catch (err) {
|
|
83
|
+
span.setStatus({
|
|
84
|
+
code: SpanStatusCode.ERROR,
|
|
85
|
+
message: err instanceof Error ? err.message : String(err),
|
|
86
|
+
});
|
|
87
|
+
span.recordException(err as Error);
|
|
88
|
+
} finally {
|
|
89
|
+
span.end();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|