limen-ai 1.0.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/CHANGELOG.md +47 -0
- package/LICENSE +190 -0
- package/README.md +546 -0
- package/dist/api/agents/agent_api.d.ts +126 -0
- package/dist/api/agents/agent_api.d.ts.map +1 -0
- package/dist/api/agents/agent_api.js +467 -0
- package/dist/api/agents/agent_api.js.map +1 -0
- package/dist/api/agents/trust_progression.d.ts +78 -0
- package/dist/api/agents/trust_progression.d.ts.map +1 -0
- package/dist/api/agents/trust_progression.js +124 -0
- package/dist/api/agents/trust_progression.js.map +1 -0
- package/dist/api/chat/chat_pipeline.d.ts +91 -0
- package/dist/api/chat/chat_pipeline.d.ts.map +1 -0
- package/dist/api/chat/chat_pipeline.js +630 -0
- package/dist/api/chat/chat_pipeline.js.map +1 -0
- package/dist/api/chat/technique_injector.d.ts +86 -0
- package/dist/api/chat/technique_injector.d.ts.map +1 -0
- package/dist/api/chat/technique_injector.js +125 -0
- package/dist/api/chat/technique_injector.js.map +1 -0
- package/dist/api/data/data_api.d.ts +91 -0
- package/dist/api/data/data_api.d.ts.map +1 -0
- package/dist/api/data/data_api.js +306 -0
- package/dist/api/data/data_api.js.map +1 -0
- package/dist/api/enforcement/cost_tracker.d.ts +105 -0
- package/dist/api/enforcement/cost_tracker.d.ts.map +1 -0
- package/dist/api/enforcement/cost_tracker.js +227 -0
- package/dist/api/enforcement/cost_tracker.js.map +1 -0
- package/dist/api/enforcement/latency_harness.d.ts +94 -0
- package/dist/api/enforcement/latency_harness.d.ts.map +1 -0
- package/dist/api/enforcement/latency_harness.js +120 -0
- package/dist/api/enforcement/latency_harness.js.map +1 -0
- package/dist/api/enforcement/rate_guard.d.ts +52 -0
- package/dist/api/enforcement/rate_guard.d.ts.map +1 -0
- package/dist/api/enforcement/rate_guard.js +79 -0
- package/dist/api/enforcement/rate_guard.js.map +1 -0
- package/dist/api/enforcement/rbac_guard.d.ts +55 -0
- package/dist/api/enforcement/rbac_guard.d.ts.map +1 -0
- package/dist/api/enforcement/rbac_guard.js +77 -0
- package/dist/api/enforcement/rbac_guard.js.map +1 -0
- package/dist/api/errors/limen_error.d.ts +81 -0
- package/dist/api/errors/limen_error.d.ts.map +1 -0
- package/dist/api/errors/limen_error.js +324 -0
- package/dist/api/errors/limen_error.js.map +1 -0
- package/dist/api/facades/claim_facade.d.ts +47 -0
- package/dist/api/facades/claim_facade.d.ts.map +1 -0
- package/dist/api/facades/claim_facade.js +67 -0
- package/dist/api/facades/claim_facade.js.map +1 -0
- package/dist/api/facades/working_memory_facade.d.ts +47 -0
- package/dist/api/facades/working_memory_facade.d.ts.map +1 -0
- package/dist/api/facades/working_memory_facade.js +74 -0
- package/dist/api/facades/working_memory_facade.js.map +1 -0
- package/dist/api/governance/governed_orchestration.d.ts +76 -0
- package/dist/api/governance/governed_orchestration.d.ts.map +1 -0
- package/dist/api/governance/governed_orchestration.js +413 -0
- package/dist/api/governance/governed_orchestration.js.map +1 -0
- package/dist/api/index.d.ts +84 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +847 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/infer/infer_pipeline.d.ts +51 -0
- package/dist/api/infer/infer_pipeline.d.ts.map +1 -0
- package/dist/api/infer/infer_pipeline.js +291 -0
- package/dist/api/infer/infer_pipeline.js.map +1 -0
- package/dist/api/interfaces/api.d.ts +940 -0
- package/dist/api/interfaces/api.d.ts.map +1 -0
- package/dist/api/interfaces/api.js +21 -0
- package/dist/api/interfaces/api.js.map +1 -0
- package/dist/api/knowledge/knowledge_api.d.ts +55 -0
- package/dist/api/knowledge/knowledge_api.d.ts.map +1 -0
- package/dist/api/knowledge/knowledge_api.js +89 -0
- package/dist/api/knowledge/knowledge_api.js.map +1 -0
- package/dist/api/migration/023_agent_persistence.d.ts +32 -0
- package/dist/api/migration/023_agent_persistence.d.ts.map +1 -0
- package/dist/api/migration/023_agent_persistence.js +158 -0
- package/dist/api/migration/023_agent_persistence.js.map +1 -0
- package/dist/api/migration/024_trust_learning.d.ts +36 -0
- package/dist/api/migration/024_trust_learning.d.ts.map +1 -0
- package/dist/api/migration/024_trust_learning.js +194 -0
- package/dist/api/migration/024_trust_learning.js.map +1 -0
- package/dist/api/migration/025_knowledge_graph.d.ts +29 -0
- package/dist/api/migration/025_knowledge_graph.d.ts.map +1 -0
- package/dist/api/migration/025_knowledge_graph.js +97 -0
- package/dist/api/migration/025_knowledge_graph.js.map +1 -0
- package/dist/api/migration/026_replay_pipeline.d.ts +30 -0
- package/dist/api/migration/026_replay_pipeline.d.ts.map +1 -0
- package/dist/api/migration/026_replay_pipeline.js +118 -0
- package/dist/api/migration/026_replay_pipeline.js.map +1 -0
- package/dist/api/missions/mission_api.d.ts +74 -0
- package/dist/api/missions/mission_api.d.ts.map +1 -0
- package/dist/api/missions/mission_api.js +408 -0
- package/dist/api/missions/mission_api.js.map +1 -0
- package/dist/api/observability/health.d.ts +36 -0
- package/dist/api/observability/health.d.ts.map +1 -0
- package/dist/api/observability/health.js +92 -0
- package/dist/api/observability/health.js.map +1 -0
- package/dist/api/observability/metrics.d.ts +95 -0
- package/dist/api/observability/metrics.d.ts.map +1 -0
- package/dist/api/observability/metrics.js +260 -0
- package/dist/api/observability/metrics.js.map +1 -0
- package/dist/api/roles/roles_api.d.ts +45 -0
- package/dist/api/roles/roles_api.d.ts.map +1 -0
- package/dist/api/roles/roles_api.js +77 -0
- package/dist/api/roles/roles_api.js.map +1 -0
- package/dist/api/sessions/session_manager.d.ts +110 -0
- package/dist/api/sessions/session_manager.d.ts.map +1 -0
- package/dist/api/sessions/session_manager.js +278 -0
- package/dist/api/sessions/session_manager.js.map +1 -0
- package/dist/budget/harness/dba_harness.d.ts +36 -0
- package/dist/budget/harness/dba_harness.d.ts.map +1 -0
- package/dist/budget/harness/dba_harness.js +58 -0
- package/dist/budget/harness/dba_harness.js.map +1 -0
- package/dist/budget/impl/dba_impl.d.ts +47 -0
- package/dist/budget/impl/dba_impl.d.ts.map +1 -0
- package/dist/budget/impl/dba_impl.js +402 -0
- package/dist/budget/impl/dba_impl.js.map +1 -0
- package/dist/budget/interfaces/dba_types.d.ts +708 -0
- package/dist/budget/interfaces/dba_types.d.ts.map +1 -0
- package/dist/budget/interfaces/dba_types.js +124 -0
- package/dist/budget/interfaces/dba_types.js.map +1 -0
- package/dist/claims/evidence/capability_scope_validator.d.ts +32 -0
- package/dist/claims/evidence/capability_scope_validator.d.ts.map +1 -0
- package/dist/claims/evidence/capability_scope_validator.js +72 -0
- package/dist/claims/evidence/capability_scope_validator.js.map +1 -0
- package/dist/claims/evidence/evidence_validator.d.ts +35 -0
- package/dist/claims/evidence/evidence_validator.d.ts.map +1 -0
- package/dist/claims/evidence/evidence_validator.js +118 -0
- package/dist/claims/evidence/evidence_validator.js.map +1 -0
- package/dist/claims/harness/claim_harness.d.ts +22 -0
- package/dist/claims/harness/claim_harness.d.ts.map +1 -0
- package/dist/claims/harness/claim_harness.js +26 -0
- package/dist/claims/harness/claim_harness.js.map +1 -0
- package/dist/claims/interfaces/claim_types.d.ts +858 -0
- package/dist/claims/interfaces/claim_types.d.ts.map +1 -0
- package/dist/claims/interfaces/claim_types.js +201 -0
- package/dist/claims/interfaces/claim_types.js.map +1 -0
- package/dist/claims/migration/019_ccp_claims.d.ts +23 -0
- package/dist/claims/migration/019_ccp_claims.d.ts.map +1 -0
- package/dist/claims/migration/019_ccp_claims.js +196 -0
- package/dist/claims/migration/019_ccp_claims.js.map +1 -0
- package/dist/claims/store/claim_stores.d.ts +27 -0
- package/dist/claims/store/claim_stores.d.ts.map +1 -0
- package/dist/claims/store/claim_stores.js +1352 -0
- package/dist/claims/store/claim_stores.js.map +1 -0
- package/dist/context/harness/cgp_harness.d.ts +32 -0
- package/dist/context/harness/cgp_harness.d.ts.map +1 -0
- package/dist/context/harness/cgp_harness.js +295 -0
- package/dist/context/harness/cgp_harness.js.map +1 -0
- package/dist/context/interfaces/cgp_types.d.ts +905 -0
- package/dist/context/interfaces/cgp_types.d.ts.map +1 -0
- package/dist/context/interfaces/cgp_types.js +112 -0
- package/dist/context/interfaces/cgp_types.js.map +1 -0
- package/dist/context/stores/cgp_stores.d.ts +42 -0
- package/dist/context/stores/cgp_stores.d.ts.map +1 -0
- package/dist/context/stores/cgp_stores.js +856 -0
- package/dist/context/stores/cgp_stores.js.map +1 -0
- package/dist/execution/harness/egp_harness.d.ts +43 -0
- package/dist/execution/harness/egp_harness.d.ts.map +1 -0
- package/dist/execution/harness/egp_harness.js +54 -0
- package/dist/execution/harness/egp_harness.js.map +1 -0
- package/dist/execution/interfaces/egp_types.d.ts +1042 -0
- package/dist/execution/interfaces/egp_types.d.ts.map +1 -0
- package/dist/execution/interfaces/egp_types.js +195 -0
- package/dist/execution/interfaces/egp_types.js.map +1 -0
- package/dist/execution/stores/egp_stores.d.ts +29 -0
- package/dist/execution/stores/egp_stores.d.ts.map +1 -0
- package/dist/execution/stores/egp_stores.js +1250 -0
- package/dist/execution/stores/egp_stores.js.map +1 -0
- package/dist/execution/wiring/execution_gate.d.ts +56 -0
- package/dist/execution/wiring/execution_gate.d.ts.map +1 -0
- package/dist/execution/wiring/execution_gate.js +77 -0
- package/dist/execution/wiring/execution_gate.js.map +1 -0
- package/dist/execution/wiring/floor_enforcer.d.ts +68 -0
- package/dist/execution/wiring/floor_enforcer.d.ts.map +1 -0
- package/dist/execution/wiring/floor_enforcer.js +96 -0
- package/dist/execution/wiring/floor_enforcer.js.map +1 -0
- package/dist/execution/wiring/invocation_gate.d.ts +58 -0
- package/dist/execution/wiring/invocation_gate.d.ts.map +1 -0
- package/dist/execution/wiring/invocation_gate.js +69 -0
- package/dist/execution/wiring/invocation_gate.js.map +1 -0
- package/dist/execution/wiring/terminal_release.d.ts +56 -0
- package/dist/execution/wiring/terminal_release.d.ts.map +1 -0
- package/dist/execution/wiring/terminal_release.js +85 -0
- package/dist/execution/wiring/terminal_release.js.map +1 -0
- package/dist/governance/harness/governance_harness.d.ts +54 -0
- package/dist/governance/harness/governance_harness.d.ts.map +1 -0
- package/dist/governance/harness/governance_harness.js +60 -0
- package/dist/governance/harness/governance_harness.js.map +1 -0
- package/dist/governance/migration/012_governance_runs_traces.d.ts +21 -0
- package/dist/governance/migration/012_governance_runs_traces.d.ts.map +1 -0
- package/dist/governance/migration/012_governance_runs_traces.js +115 -0
- package/dist/governance/migration/012_governance_runs_traces.js.map +1 -0
- package/dist/governance/migration/013_governance_contracts.d.ts +18 -0
- package/dist/governance/migration/013_governance_contracts.d.ts.map +1 -0
- package/dist/governance/migration/013_governance_contracts.js +59 -0
- package/dist/governance/migration/013_governance_contracts.js.map +1 -0
- package/dist/governance/migration/014_governance_supervisor.d.ts +16 -0
- package/dist/governance/migration/014_governance_supervisor.d.ts.map +1 -0
- package/dist/governance/migration/014_governance_supervisor.js +75 -0
- package/dist/governance/migration/014_governance_supervisor.js.map +1 -0
- package/dist/governance/migration/015_governance_eval.d.ts +18 -0
- package/dist/governance/migration/015_governance_eval.d.ts.map +1 -0
- package/dist/governance/migration/015_governance_eval.js +65 -0
- package/dist/governance/migration/015_governance_eval.js.map +1 -0
- package/dist/governance/migration/016_governance_capabilities.d.ts +16 -0
- package/dist/governance/migration/016_governance_capabilities.d.ts.map +1 -0
- package/dist/governance/migration/016_governance_capabilities.js +60 -0
- package/dist/governance/migration/016_governance_capabilities.js.map +1 -0
- package/dist/governance/migration/017_governance_handoffs_idempotency.d.ts +20 -0
- package/dist/governance/migration/017_governance_handoffs_idempotency.d.ts.map +1 -0
- package/dist/governance/migration/017_governance_handoffs_idempotency.js +103 -0
- package/dist/governance/migration/017_governance_handoffs_idempotency.js.map +1 -0
- package/dist/governance/migration/018_supervisor_decision_delete_trigger.d.ts +17 -0
- package/dist/governance/migration/018_supervisor_decision_delete_trigger.d.ts.map +1 -0
- package/dist/governance/migration/018_supervisor_decision_delete_trigger.js +37 -0
- package/dist/governance/migration/018_supervisor_decision_delete_trigger.js.map +1 -0
- package/dist/governance/stores/governance_stores.d.ts +78 -0
- package/dist/governance/stores/governance_stores.d.ts.map +1 -0
- package/dist/governance/stores/governance_stores.js +1117 -0
- package/dist/governance/stores/governance_stores.js.map +1 -0
- package/dist/kernel/audit/audit_trail.d.ts +24 -0
- package/dist/kernel/audit/audit_trail.d.ts.map +1 -0
- package/dist/kernel/audit/audit_trail.js +569 -0
- package/dist/kernel/audit/audit_trail.js.map +1 -0
- package/dist/kernel/crypto/crypto_engine.d.ts +49 -0
- package/dist/kernel/crypto/crypto_engine.d.ts.map +1 -0
- package/dist/kernel/crypto/crypto_engine.js +350 -0
- package/dist/kernel/crypto/crypto_engine.js.map +1 -0
- package/dist/kernel/database/database_lifecycle.d.ts +24 -0
- package/dist/kernel/database/database_lifecycle.d.ts.map +1 -0
- package/dist/kernel/database/database_lifecycle.js +404 -0
- package/dist/kernel/database/database_lifecycle.js.map +1 -0
- package/dist/kernel/database/migrations.d.ts +21 -0
- package/dist/kernel/database/migrations.d.ts.map +1 -0
- package/dist/kernel/database/migrations.js +407 -0
- package/dist/kernel/database/migrations.js.map +1 -0
- package/dist/kernel/events/event_bus.d.ts +25 -0
- package/dist/kernel/events/event_bus.d.ts.map +1 -0
- package/dist/kernel/events/event_bus.js +302 -0
- package/dist/kernel/events/event_bus.js.map +1 -0
- package/dist/kernel/events/webhook_delivery.d.ts +90 -0
- package/dist/kernel/events/webhook_delivery.d.ts.map +1 -0
- package/dist/kernel/events/webhook_delivery.js +324 -0
- package/dist/kernel/events/webhook_delivery.js.map +1 -0
- package/dist/kernel/index.d.ts +39 -0
- package/dist/kernel/index.d.ts.map +1 -0
- package/dist/kernel/index.js +263 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/interfaces/audit.d.ts +146 -0
- package/dist/kernel/interfaces/audit.d.ts.map +1 -0
- package/dist/kernel/interfaces/audit.js +15 -0
- package/dist/kernel/interfaces/audit.js.map +1 -0
- package/dist/kernel/interfaces/capability_manifest.d.ts +104 -0
- package/dist/kernel/interfaces/capability_manifest.d.ts.map +1 -0
- package/dist/kernel/interfaces/capability_manifest.js +44 -0
- package/dist/kernel/interfaces/capability_manifest.js.map +1 -0
- package/dist/kernel/interfaces/common.d.ts +91 -0
- package/dist/kernel/interfaces/common.d.ts.map +1 -0
- package/dist/kernel/interfaces/common.js +10 -0
- package/dist/kernel/interfaces/common.js.map +1 -0
- package/dist/kernel/interfaces/crypto.d.ts +95 -0
- package/dist/kernel/interfaces/crypto.d.ts.map +1 -0
- package/dist/kernel/interfaces/crypto.js +14 -0
- package/dist/kernel/interfaces/crypto.js.map +1 -0
- package/dist/kernel/interfaces/database.d.ts +157 -0
- package/dist/kernel/interfaces/database.d.ts.map +1 -0
- package/dist/kernel/interfaces/database.js +10 -0
- package/dist/kernel/interfaces/database.js.map +1 -0
- package/dist/kernel/interfaces/eval.d.ts +93 -0
- package/dist/kernel/interfaces/eval.d.ts.map +1 -0
- package/dist/kernel/interfaces/eval.js +17 -0
- package/dist/kernel/interfaces/eval.js.map +1 -0
- package/dist/kernel/interfaces/events.d.ts +73 -0
- package/dist/kernel/interfaces/events.d.ts.map +1 -0
- package/dist/kernel/interfaces/events.js +13 -0
- package/dist/kernel/interfaces/events.js.map +1 -0
- package/dist/kernel/interfaces/governance_ids.d.ts +93 -0
- package/dist/kernel/interfaces/governance_ids.d.ts.map +1 -0
- package/dist/kernel/interfaces/governance_ids.js +18 -0
- package/dist/kernel/interfaces/governance_ids.js.map +1 -0
- package/dist/kernel/interfaces/idempotency.d.ts +143 -0
- package/dist/kernel/interfaces/idempotency.d.ts.map +1 -0
- package/dist/kernel/interfaces/idempotency.js +22 -0
- package/dist/kernel/interfaces/idempotency.js.map +1 -0
- package/dist/kernel/interfaces/index.d.ts +29 -0
- package/dist/kernel/interfaces/index.d.ts.map +1 -0
- package/dist/kernel/interfaces/index.js +9 -0
- package/dist/kernel/interfaces/index.js.map +1 -0
- package/dist/kernel/interfaces/kernel.d.ts +79 -0
- package/dist/kernel/interfaces/kernel.d.ts.map +1 -0
- package/dist/kernel/interfaces/kernel.js +13 -0
- package/dist/kernel/interfaces/kernel.js.map +1 -0
- package/dist/kernel/interfaces/lifecycle.d.ts +115 -0
- package/dist/kernel/interfaces/lifecycle.d.ts.map +1 -0
- package/dist/kernel/interfaces/lifecycle.js +53 -0
- package/dist/kernel/interfaces/lifecycle.js.map +1 -0
- package/dist/kernel/interfaces/mission_contract.d.ts +106 -0
- package/dist/kernel/interfaces/mission_contract.d.ts.map +1 -0
- package/dist/kernel/interfaces/mission_contract.js +20 -0
- package/dist/kernel/interfaces/mission_contract.js.map +1 -0
- package/dist/kernel/interfaces/namespace.d.ts +30 -0
- package/dist/kernel/interfaces/namespace.d.ts.map +1 -0
- package/dist/kernel/interfaces/namespace.js +12 -0
- package/dist/kernel/interfaces/namespace.js.map +1 -0
- package/dist/kernel/interfaces/rate_limiter.d.ts +42 -0
- package/dist/kernel/interfaces/rate_limiter.d.ts.map +1 -0
- package/dist/kernel/interfaces/rate_limiter.js +12 -0
- package/dist/kernel/interfaces/rate_limiter.js.map +1 -0
- package/dist/kernel/interfaces/rbac.d.ts +58 -0
- package/dist/kernel/interfaces/rbac.d.ts.map +1 -0
- package/dist/kernel/interfaces/rbac.js +13 -0
- package/dist/kernel/interfaces/rbac.js.map +1 -0
- package/dist/kernel/interfaces/retention.d.ts +58 -0
- package/dist/kernel/interfaces/retention.d.ts.map +1 -0
- package/dist/kernel/interfaces/retention.js +13 -0
- package/dist/kernel/interfaces/retention.js.map +1 -0
- package/dist/kernel/interfaces/run_identity.d.ts +132 -0
- package/dist/kernel/interfaces/run_identity.d.ts.map +1 -0
- package/dist/kernel/interfaces/run_identity.js +16 -0
- package/dist/kernel/interfaces/run_identity.js.map +1 -0
- package/dist/kernel/interfaces/supervisor.d.ts +175 -0
- package/dist/kernel/interfaces/supervisor.d.ts.map +1 -0
- package/dist/kernel/interfaces/supervisor.js +25 -0
- package/dist/kernel/interfaces/supervisor.js.map +1 -0
- package/dist/kernel/interfaces/tenant.d.ts +34 -0
- package/dist/kernel/interfaces/tenant.d.ts.map +1 -0
- package/dist/kernel/interfaces/tenant.js +12 -0
- package/dist/kernel/interfaces/tenant.js.map +1 -0
- package/dist/kernel/interfaces/time.d.ts +29 -0
- package/dist/kernel/interfaces/time.d.ts.map +1 -0
- package/dist/kernel/interfaces/time.js +13 -0
- package/dist/kernel/interfaces/time.js.map +1 -0
- package/dist/kernel/interfaces/trace.d.ts +264 -0
- package/dist/kernel/interfaces/trace.d.ts.map +1 -0
- package/dist/kernel/interfaces/trace.js +17 -0
- package/dist/kernel/interfaces/trace.js.map +1 -0
- package/dist/kernel/namespace/namespace_enforcer.d.ts +20 -0
- package/dist/kernel/namespace/namespace_enforcer.d.ts.map +1 -0
- package/dist/kernel/namespace/namespace_enforcer.js +91 -0
- package/dist/kernel/namespace/namespace_enforcer.js.map +1 -0
- package/dist/kernel/rate_limiter/rate_limiter.d.ts +23 -0
- package/dist/kernel/rate_limiter/rate_limiter.d.ts.map +1 -0
- package/dist/kernel/rate_limiter/rate_limiter.js +146 -0
- package/dist/kernel/rate_limiter/rate_limiter.js.map +1 -0
- package/dist/kernel/rbac/rbac_engine.d.ts +20 -0
- package/dist/kernel/rbac/rbac_engine.d.ts.map +1 -0
- package/dist/kernel/rbac/rbac_engine.js +257 -0
- package/dist/kernel/rbac/rbac_engine.js.map +1 -0
- package/dist/kernel/retention/retention_scheduler.d.ts +41 -0
- package/dist/kernel/retention/retention_scheduler.d.ts.map +1 -0
- package/dist/kernel/retention/retention_scheduler.js +218 -0
- package/dist/kernel/retention/retention_scheduler.js.map +1 -0
- package/dist/kernel/tenant/tenant_context.d.ts +22 -0
- package/dist/kernel/tenant/tenant_context.d.ts.map +1 -0
- package/dist/kernel/tenant/tenant_context.js +107 -0
- package/dist/kernel/tenant/tenant_context.js.map +1 -0
- package/dist/kernel/tenant/tenant_scope.d.ts +81 -0
- package/dist/kernel/tenant/tenant_scope.d.ts.map +1 -0
- package/dist/kernel/tenant/tenant_scope.js +168 -0
- package/dist/kernel/tenant/tenant_scope.js.map +1 -0
- package/dist/kernel/time/time_provider.d.ts +39 -0
- package/dist/kernel/time/time_provider.d.ts.map +1 -0
- package/dist/kernel/time/time_provider.js +58 -0
- package/dist/kernel/time/time_provider.js.map +1 -0
- package/dist/learning/applicator/technique_applicator.d.ts +41 -0
- package/dist/learning/applicator/technique_applicator.d.ts.map +1 -0
- package/dist/learning/applicator/technique_applicator.js +200 -0
- package/dist/learning/applicator/technique_applicator.js.map +1 -0
- package/dist/learning/cold_start/cold_start_manager.d.ts +35 -0
- package/dist/learning/cold_start/cold_start_manager.d.ts.map +1 -0
- package/dist/learning/cold_start/cold_start_manager.js +146 -0
- package/dist/learning/cold_start/cold_start_manager.js.map +1 -0
- package/dist/learning/cycle/learning_cycle_orchestrator.d.ts +45 -0
- package/dist/learning/cycle/learning_cycle_orchestrator.d.ts.map +1 -0
- package/dist/learning/cycle/learning_cycle_orchestrator.js +165 -0
- package/dist/learning/cycle/learning_cycle_orchestrator.js.map +1 -0
- package/dist/learning/extractor/technique_extractor.d.ts +48 -0
- package/dist/learning/extractor/technique_extractor.d.ts.map +1 -0
- package/dist/learning/extractor/technique_extractor.js +357 -0
- package/dist/learning/extractor/technique_extractor.js.map +1 -0
- package/dist/learning/harness/learning_harness.d.ts +26 -0
- package/dist/learning/harness/learning_harness.d.ts.map +1 -0
- package/dist/learning/harness/learning_harness.js +58 -0
- package/dist/learning/harness/learning_harness.js.map +1 -0
- package/dist/learning/interfaces/index.d.ts +7 -0
- package/dist/learning/interfaces/index.d.ts.map +1 -0
- package/dist/learning/interfaces/index.js +10 -0
- package/dist/learning/interfaces/index.js.map +1 -0
- package/dist/learning/interfaces/learning_types.d.ts +398 -0
- package/dist/learning/interfaces/learning_types.d.ts.map +1 -0
- package/dist/learning/interfaces/learning_types.js +69 -0
- package/dist/learning/interfaces/learning_types.js.map +1 -0
- package/dist/learning/migration/007_learning_techniques.d.ts +23 -0
- package/dist/learning/migration/007_learning_techniques.d.ts.map +1 -0
- package/dist/learning/migration/007_learning_techniques.js +86 -0
- package/dist/learning/migration/007_learning_techniques.js.map +1 -0
- package/dist/learning/migration/008_learning_outcomes.d.ts +23 -0
- package/dist/learning/migration/008_learning_outcomes.d.ts.map +1 -0
- package/dist/learning/migration/008_learning_outcomes.js +79 -0
- package/dist/learning/migration/008_learning_outcomes.js.map +1 -0
- package/dist/learning/migration/009_learning_applications.d.ts +25 -0
- package/dist/learning/migration/009_learning_applications.d.ts.map +1 -0
- package/dist/learning/migration/009_learning_applications.js +82 -0
- package/dist/learning/migration/009_learning_applications.js.map +1 -0
- package/dist/learning/migration/010_learning_quarantine.d.ts +22 -0
- package/dist/learning/migration/010_learning_quarantine.d.ts.map +1 -0
- package/dist/learning/migration/010_learning_quarantine.js +78 -0
- package/dist/learning/migration/010_learning_quarantine.js.map +1 -0
- package/dist/learning/migration/011_learning_transfers.d.ts +22 -0
- package/dist/learning/migration/011_learning_transfers.d.ts.map +1 -0
- package/dist/learning/migration/011_learning_transfers.js +77 -0
- package/dist/learning/migration/011_learning_transfers.js.map +1 -0
- package/dist/learning/quarantine/quarantine_manager.d.ts +34 -0
- package/dist/learning/quarantine/quarantine_manager.d.ts.map +1 -0
- package/dist/learning/quarantine/quarantine_manager.js +200 -0
- package/dist/learning/quarantine/quarantine_manager.js.map +1 -0
- package/dist/learning/retirement/retirement_evaluator.d.ts +35 -0
- package/dist/learning/retirement/retirement_evaluator.d.ts.map +1 -0
- package/dist/learning/retirement/retirement_evaluator.js +131 -0
- package/dist/learning/retirement/retirement_evaluator.js.map +1 -0
- package/dist/learning/specialization/over_specialization_detector.d.ts +32 -0
- package/dist/learning/specialization/over_specialization_detector.d.ts.map +1 -0
- package/dist/learning/specialization/over_specialization_detector.js +105 -0
- package/dist/learning/specialization/over_specialization_detector.js.map +1 -0
- package/dist/learning/store/technique_store.d.ts +22 -0
- package/dist/learning/store/technique_store.d.ts.map +1 -0
- package/dist/learning/store/technique_store.js +369 -0
- package/dist/learning/store/technique_store.js.map +1 -0
- package/dist/learning/tracker/effectiveness_tracker.d.ts +26 -0
- package/dist/learning/tracker/effectiveness_tracker.d.ts.map +1 -0
- package/dist/learning/tracker/effectiveness_tracker.js +158 -0
- package/dist/learning/tracker/effectiveness_tracker.js.map +1 -0
- package/dist/learning/transfer/cross_agent_transfer.d.ts +35 -0
- package/dist/learning/transfer/cross_agent_transfer.d.ts.map +1 -0
- package/dist/learning/transfer/cross_agent_transfer.js +245 -0
- package/dist/learning/transfer/cross_agent_transfer.js.map +1 -0
- package/dist/orchestration/artifacts/artifact_store.d.ts +19 -0
- package/dist/orchestration/artifacts/artifact_store.d.ts.map +1 -0
- package/dist/orchestration/artifacts/artifact_store.js +213 -0
- package/dist/orchestration/artifacts/artifact_store.js.map +1 -0
- package/dist/orchestration/artifacts/cascade_walker.d.ts +39 -0
- package/dist/orchestration/artifacts/cascade_walker.d.ts.map +1 -0
- package/dist/orchestration/artifacts/cascade_walker.js +107 -0
- package/dist/orchestration/artifacts/cascade_walker.js.map +1 -0
- package/dist/orchestration/budget/budget_governance.d.ts +20 -0
- package/dist/orchestration/budget/budget_governance.d.ts.map +1 -0
- package/dist/orchestration/budget/budget_governance.js +182 -0
- package/dist/orchestration/budget/budget_governance.js.map +1 -0
- package/dist/orchestration/checkpoints/checkpoint_coordinator.d.ts +22 -0
- package/dist/orchestration/checkpoints/checkpoint_coordinator.d.ts.map +1 -0
- package/dist/orchestration/checkpoints/checkpoint_coordinator.js +252 -0
- package/dist/orchestration/checkpoints/checkpoint_coordinator.js.map +1 -0
- package/dist/orchestration/checkpoints/drift_engine.d.ts +52 -0
- package/dist/orchestration/checkpoints/drift_engine.d.ts.map +1 -0
- package/dist/orchestration/checkpoints/drift_engine.js +126 -0
- package/dist/orchestration/checkpoints/drift_engine.js.map +1 -0
- package/dist/orchestration/compaction/bounded_cognition.d.ts +22 -0
- package/dist/orchestration/compaction/bounded_cognition.d.ts.map +1 -0
- package/dist/orchestration/compaction/bounded_cognition.js +124 -0
- package/dist/orchestration/compaction/bounded_cognition.js.map +1 -0
- package/dist/orchestration/conversation/conversation_manager.d.ts +25 -0
- package/dist/orchestration/conversation/conversation_manager.d.ts.map +1 -0
- package/dist/orchestration/conversation/conversation_manager.js +260 -0
- package/dist/orchestration/conversation/conversation_manager.js.map +1 -0
- package/dist/orchestration/events/event_propagation.d.ts +20 -0
- package/dist/orchestration/events/event_propagation.d.ts.map +1 -0
- package/dist/orchestration/events/event_propagation.js +160 -0
- package/dist/orchestration/events/event_propagation.js.map +1 -0
- package/dist/orchestration/index.d.ts +28 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +147 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/interfaces/orchestration.d.ts +494 -0
- package/dist/orchestration/interfaces/orchestration.d.ts.map +1 -0
- package/dist/orchestration/interfaces/orchestration.js +64 -0
- package/dist/orchestration/interfaces/orchestration.js.map +1 -0
- package/dist/orchestration/migration/003_orchestration.d.ts +27 -0
- package/dist/orchestration/migration/003_orchestration.d.ts.map +1 -0
- package/dist/orchestration/migration/003_orchestration.js +336 -0
- package/dist/orchestration/migration/003_orchestration.js.map +1 -0
- package/dist/orchestration/migration/004_tenant_isolation.d.ts +22 -0
- package/dist/orchestration/migration/004_tenant_isolation.d.ts.map +1 -0
- package/dist/orchestration/migration/004_tenant_isolation.js +179 -0
- package/dist/orchestration/migration/004_tenant_isolation.js.map +1 -0
- package/dist/orchestration/migration/005_immutability_triggers.d.ts +30 -0
- package/dist/orchestration/migration/005_immutability_triggers.d.ts.map +1 -0
- package/dist/orchestration/migration/005_immutability_triggers.js +93 -0
- package/dist/orchestration/migration/005_immutability_triggers.js.map +1 -0
- package/dist/orchestration/migration/006_audit_tombstone.d.ts +26 -0
- package/dist/orchestration/migration/006_audit_tombstone.d.ts.map +1 -0
- package/dist/orchestration/migration/006_audit_tombstone.js +71 -0
- package/dist/orchestration/migration/006_audit_tombstone.js.map +1 -0
- package/dist/orchestration/missions/mission_recovery.d.ts +60 -0
- package/dist/orchestration/missions/mission_recovery.d.ts.map +1 -0
- package/dist/orchestration/missions/mission_recovery.js +251 -0
- package/dist/orchestration/missions/mission_recovery.js.map +1 -0
- package/dist/orchestration/missions/mission_store.d.ts +16 -0
- package/dist/orchestration/missions/mission_store.d.ts.map +1 -0
- package/dist/orchestration/missions/mission_store.js +280 -0
- package/dist/orchestration/missions/mission_store.js.map +1 -0
- package/dist/orchestration/syscalls/create_artifact.d.ts +13 -0
- package/dist/orchestration/syscalls/create_artifact.d.ts.map +1 -0
- package/dist/orchestration/syscalls/create_artifact.js +23 -0
- package/dist/orchestration/syscalls/create_artifact.js.map +1 -0
- package/dist/orchestration/syscalls/emit_event.d.ts +13 -0
- package/dist/orchestration/syscalls/emit_event.d.ts.map +1 -0
- package/dist/orchestration/syscalls/emit_event.js +13 -0
- package/dist/orchestration/syscalls/emit_event.js.map +1 -0
- package/dist/orchestration/syscalls/propose_mission.d.ts +14 -0
- package/dist/orchestration/syscalls/propose_mission.d.ts.map +1 -0
- package/dist/orchestration/syscalls/propose_mission.js +27 -0
- package/dist/orchestration/syscalls/propose_mission.js.map +1 -0
- package/dist/orchestration/syscalls/propose_task_execution.d.ts +13 -0
- package/dist/orchestration/syscalls/propose_task_execution.d.ts.map +1 -0
- package/dist/orchestration/syscalls/propose_task_execution.js +84 -0
- package/dist/orchestration/syscalls/propose_task_execution.js.map +1 -0
- package/dist/orchestration/syscalls/propose_task_graph.d.ts +13 -0
- package/dist/orchestration/syscalls/propose_task_graph.d.ts.map +1 -0
- package/dist/orchestration/syscalls/propose_task_graph.js +22 -0
- package/dist/orchestration/syscalls/propose_task_graph.js.map +1 -0
- package/dist/orchestration/syscalls/read_artifact.d.ts +14 -0
- package/dist/orchestration/syscalls/read_artifact.d.ts.map +1 -0
- package/dist/orchestration/syscalls/read_artifact.js +31 -0
- package/dist/orchestration/syscalls/read_artifact.js.map +1 -0
- package/dist/orchestration/syscalls/request_budget.d.ts +14 -0
- package/dist/orchestration/syscalls/request_budget.d.ts.map +1 -0
- package/dist/orchestration/syscalls/request_budget.js +46 -0
- package/dist/orchestration/syscalls/request_budget.js.map +1 -0
- package/dist/orchestration/syscalls/request_capability.d.ts +13 -0
- package/dist/orchestration/syscalls/request_capability.d.ts.map +1 -0
- package/dist/orchestration/syscalls/request_capability.js +136 -0
- package/dist/orchestration/syscalls/request_capability.js.map +1 -0
- package/dist/orchestration/syscalls/respond_checkpoint.d.ts +12 -0
- package/dist/orchestration/syscalls/respond_checkpoint.d.ts.map +1 -0
- package/dist/orchestration/syscalls/respond_checkpoint.js +12 -0
- package/dist/orchestration/syscalls/respond_checkpoint.js.map +1 -0
- package/dist/orchestration/syscalls/submit_result.d.ts +15 -0
- package/dist/orchestration/syscalls/submit_result.d.ts.map +1 -0
- package/dist/orchestration/syscalls/submit_result.js +97 -0
- package/dist/orchestration/syscalls/submit_result.js.map +1 -0
- package/dist/orchestration/tasks/task_graph.d.ts +26 -0
- package/dist/orchestration/tasks/task_graph.d.ts.map +1 -0
- package/dist/orchestration/tasks/task_graph.js +204 -0
- package/dist/orchestration/tasks/task_graph.js.map +1 -0
- package/dist/orchestration/tasks/task_store.d.ts +18 -0
- package/dist/orchestration/tasks/task_store.d.ts.map +1 -0
- package/dist/orchestration/tasks/task_store.js +99 -0
- package/dist/orchestration/tasks/task_store.js.map +1 -0
- package/dist/reference-agent/artifact_manager.d.ts +119 -0
- package/dist/reference-agent/artifact_manager.d.ts.map +1 -0
- package/dist/reference-agent/artifact_manager.js +149 -0
- package/dist/reference-agent/artifact_manager.js.map +1 -0
- package/dist/reference-agent/checkpoint_handler.d.ts +186 -0
- package/dist/reference-agent/checkpoint_handler.d.ts.map +1 -0
- package/dist/reference-agent/checkpoint_handler.js +423 -0
- package/dist/reference-agent/checkpoint_handler.js.map +1 -0
- package/dist/reference-agent/index.d.ts +43 -0
- package/dist/reference-agent/index.d.ts.map +1 -0
- package/dist/reference-agent/index.js +53 -0
- package/dist/reference-agent/index.js.map +1 -0
- package/dist/reference-agent/mission_planner.d.ts +163 -0
- package/dist/reference-agent/mission_planner.d.ts.map +1 -0
- package/dist/reference-agent/mission_planner.js +375 -0
- package/dist/reference-agent/mission_planner.js.map +1 -0
- package/dist/reference-agent/reference_agent.d.ts +130 -0
- package/dist/reference-agent/reference_agent.d.ts.map +1 -0
- package/dist/reference-agent/reference_agent.js +360 -0
- package/dist/reference-agent/reference_agent.js.map +1 -0
- package/dist/reference-agent/reference_agent.types.d.ts +199 -0
- package/dist/reference-agent/reference_agent.types.d.ts.map +1 -0
- package/dist/reference-agent/reference_agent.types.js +59 -0
- package/dist/reference-agent/reference_agent.types.js.map +1 -0
- package/dist/reference-agent/result_aggregator.d.ts +107 -0
- package/dist/reference-agent/result_aggregator.d.ts.map +1 -0
- package/dist/reference-agent/result_aggregator.js +219 -0
- package/dist/reference-agent/result_aggregator.js.map +1 -0
- package/dist/reference-agent/system_call_client.d.ts +106 -0
- package/dist/reference-agent/system_call_client.d.ts.map +1 -0
- package/dist/reference-agent/system_call_client.js +231 -0
- package/dist/reference-agent/system_call_client.js.map +1 -0
- package/dist/reference-agent/task_executor.d.ts +108 -0
- package/dist/reference-agent/task_executor.d.ts.map +1 -0
- package/dist/reference-agent/task_executor.js +249 -0
- package/dist/reference-agent/task_executor.js.map +1 -0
- package/dist/substrate/accounting/resource_accounting.d.ts +52 -0
- package/dist/substrate/accounting/resource_accounting.d.ts.map +1 -0
- package/dist/substrate/accounting/resource_accounting.js +200 -0
- package/dist/substrate/accounting/resource_accounting.js.map +1 -0
- package/dist/substrate/adapters/capability_registry.d.ts +28 -0
- package/dist/substrate/adapters/capability_registry.d.ts.map +1 -0
- package/dist/substrate/adapters/capability_registry.js +196 -0
- package/dist/substrate/adapters/capability_registry.js.map +1 -0
- package/dist/substrate/gateway/llm_gateway.d.ts +68 -0
- package/dist/substrate/gateway/llm_gateway.d.ts.map +1 -0
- package/dist/substrate/gateway/llm_gateway.js +442 -0
- package/dist/substrate/gateway/llm_gateway.js.map +1 -0
- package/dist/substrate/heartbeat/heartbeat_monitor.d.ts +40 -0
- package/dist/substrate/heartbeat/heartbeat_monitor.d.ts.map +1 -0
- package/dist/substrate/heartbeat/heartbeat_monitor.js +170 -0
- package/dist/substrate/heartbeat/heartbeat_monitor.js.map +1 -0
- package/dist/substrate/index.d.ts +59 -0
- package/dist/substrate/index.d.ts.map +1 -0
- package/dist/substrate/index.js +143 -0
- package/dist/substrate/index.js.map +1 -0
- package/dist/substrate/interfaces/substrate.d.ts +486 -0
- package/dist/substrate/interfaces/substrate.d.ts.map +1 -0
- package/dist/substrate/interfaces/substrate.js +14 -0
- package/dist/substrate/interfaces/substrate.js.map +1 -0
- package/dist/substrate/migration/002_substrate.d.ts +24 -0
- package/dist/substrate/migration/002_substrate.d.ts.map +1 -0
- package/dist/substrate/migration/002_substrate.js +188 -0
- package/dist/substrate/migration/002_substrate.js.map +1 -0
- package/dist/substrate/migration/022_transport_deliberation.d.ts +31 -0
- package/dist/substrate/migration/022_transport_deliberation.d.ts.map +1 -0
- package/dist/substrate/migration/022_transport_deliberation.js +77 -0
- package/dist/substrate/migration/022_transport_deliberation.js.map +1 -0
- package/dist/substrate/replay/replay_engine.d.ts +65 -0
- package/dist/substrate/replay/replay_engine.d.ts.map +1 -0
- package/dist/substrate/replay/replay_engine.js +316 -0
- package/dist/substrate/replay/replay_engine.js.map +1 -0
- package/dist/substrate/scheduler/task_scheduler.d.ts +38 -0
- package/dist/substrate/scheduler/task_scheduler.d.ts.map +1 -0
- package/dist/substrate/scheduler/task_scheduler.js +486 -0
- package/dist/substrate/scheduler/task_scheduler.js.map +1 -0
- package/dist/substrate/transport/adapters/anthropic_adapter.d.ts +57 -0
- package/dist/substrate/transport/adapters/anthropic_adapter.d.ts.map +1 -0
- package/dist/substrate/transport/adapters/anthropic_adapter.js +455 -0
- package/dist/substrate/transport/adapters/anthropic_adapter.js.map +1 -0
- package/dist/substrate/transport/adapters/gemini_adapter.d.ts +86 -0
- package/dist/substrate/transport/adapters/gemini_adapter.d.ts.map +1 -0
- package/dist/substrate/transport/adapters/gemini_adapter.js +456 -0
- package/dist/substrate/transport/adapters/gemini_adapter.js.map +1 -0
- package/dist/substrate/transport/adapters/groq_adapter.d.ts +50 -0
- package/dist/substrate/transport/adapters/groq_adapter.d.ts.map +1 -0
- package/dist/substrate/transport/adapters/groq_adapter.js +179 -0
- package/dist/substrate/transport/adapters/groq_adapter.js.map +1 -0
- package/dist/substrate/transport/adapters/mistral_adapter.d.ts +50 -0
- package/dist/substrate/transport/adapters/mistral_adapter.d.ts.map +1 -0
- package/dist/substrate/transport/adapters/mistral_adapter.js +179 -0
- package/dist/substrate/transport/adapters/mistral_adapter.js.map +1 -0
- package/dist/substrate/transport/adapters/ollama_adapter.d.ts +66 -0
- package/dist/substrate/transport/adapters/ollama_adapter.d.ts.map +1 -0
- package/dist/substrate/transport/adapters/ollama_adapter.js +347 -0
- package/dist/substrate/transport/adapters/ollama_adapter.js.map +1 -0
- package/dist/substrate/transport/adapters/openai_adapter.d.ts +68 -0
- package/dist/substrate/transport/adapters/openai_adapter.d.ts.map +1 -0
- package/dist/substrate/transport/adapters/openai_adapter.js +439 -0
- package/dist/substrate/transport/adapters/openai_adapter.js.map +1 -0
- package/dist/substrate/transport/adapters/openai_compat.d.ts +64 -0
- package/dist/substrate/transport/adapters/openai_compat.d.ts.map +1 -0
- package/dist/substrate/transport/adapters/openai_compat.js +326 -0
- package/dist/substrate/transport/adapters/openai_compat.js.map +1 -0
- package/dist/substrate/transport/index.d.ts +17 -0
- package/dist/substrate/transport/index.d.ts.map +1 -0
- package/dist/substrate/transport/index.js +25 -0
- package/dist/substrate/transport/index.js.map +1 -0
- package/dist/substrate/transport/stream_parser.d.ts +69 -0
- package/dist/substrate/transport/stream_parser.d.ts.map +1 -0
- package/dist/substrate/transport/stream_parser.js +280 -0
- package/dist/substrate/transport/stream_parser.js.map +1 -0
- package/dist/substrate/transport/transport_engine.d.ts +53 -0
- package/dist/substrate/transport/transport_engine.d.ts.map +1 -0
- package/dist/substrate/transport/transport_engine.js +444 -0
- package/dist/substrate/transport/transport_engine.js.map +1 -0
- package/dist/substrate/transport/transport_types.d.ts +207 -0
- package/dist/substrate/transport/transport_types.d.ts.map +1 -0
- package/dist/substrate/transport/transport_types.js +13 -0
- package/dist/substrate/transport/transport_types.js.map +1 -0
- package/dist/substrate/workers/worker_runtime.d.ts +40 -0
- package/dist/substrate/workers/worker_runtime.d.ts.map +1 -0
- package/dist/substrate/workers/worker_runtime.js +294 -0
- package/dist/substrate/workers/worker_runtime.js.map +1 -0
- package/dist/techniques/harness/tgp_harness.d.ts +39 -0
- package/dist/techniques/harness/tgp_harness.d.ts.map +1 -0
- package/dist/techniques/harness/tgp_harness.js +49 -0
- package/dist/techniques/harness/tgp_harness.js.map +1 -0
- package/dist/techniques/interfaces/tgp_types.d.ts +646 -0
- package/dist/techniques/interfaces/tgp_types.d.ts.map +1 -0
- package/dist/techniques/interfaces/tgp_types.js +160 -0
- package/dist/techniques/interfaces/tgp_types.js.map +1 -0
- package/dist/techniques/migration/020_tgp_governance.d.ts +36 -0
- package/dist/techniques/migration/020_tgp_governance.d.ts.map +1 -0
- package/dist/techniques/migration/020_tgp_governance.js +249 -0
- package/dist/techniques/migration/020_tgp_governance.js.map +1 -0
- package/dist/techniques/store/tgp_stores.d.ts +36 -0
- package/dist/techniques/store/tgp_stores.d.ts.map +1 -0
- package/dist/techniques/store/tgp_stores.js +854 -0
- package/dist/techniques/store/tgp_stores.js.map +1 -0
- package/dist/working-memory/harness/wmp_harness.d.ts +43 -0
- package/dist/working-memory/harness/wmp_harness.d.ts.map +1 -0
- package/dist/working-memory/harness/wmp_harness.js +81 -0
- package/dist/working-memory/harness/wmp_harness.js.map +1 -0
- package/dist/working-memory/interfaces/wmp_types.d.ts +635 -0
- package/dist/working-memory/interfaces/wmp_types.d.ts.map +1 -0
- package/dist/working-memory/interfaces/wmp_types.js +144 -0
- package/dist/working-memory/interfaces/wmp_types.js.map +1 -0
- package/dist/working-memory/migration/021_wmp.d.ts +21 -0
- package/dist/working-memory/migration/021_wmp.d.ts.map +1 -0
- package/dist/working-memory/migration/021_wmp.js +139 -0
- package/dist/working-memory/migration/021_wmp.js.map +1 -0
- package/dist/working-memory/stores/wmp_stores.d.ts +28 -0
- package/dist/working-memory/stores/wmp_stores.d.ts.map +1 -0
- package/dist/working-memory/stores/wmp_stores.js +754 -0
- package/dist/working-memory/stores/wmp_stores.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,1117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 0A Governance Store Implementations — SQLite-backed.
|
|
3
|
+
* Replaces NotImplementedError stubs in governance_harness.ts.
|
|
4
|
+
*
|
|
5
|
+
* Phase: 0A (Foundation)
|
|
6
|
+
* Implements: All 15 governance system components.
|
|
7
|
+
*
|
|
8
|
+
* Schema mismatch strategy (migrations are frozen, cannot modify DDL):
|
|
9
|
+
* - gov_supervisor_decisions.conditions: JSON({targetType, targetId, precedence, origin})
|
|
10
|
+
* - gov_suspension_records.reason: JSON({creatingDecisionId, origin})
|
|
11
|
+
* - gov_mission_contracts.criteria: JSON({objective, constraints, criteria})
|
|
12
|
+
* - gov_handoffs: state mapping 'revoked'↔'failed', 'expired'↔'completed'
|
|
13
|
+
*/
|
|
14
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
15
|
+
import { MISSION_STATE_BACKFILL_MAP, TASK_STATE_BACKFILL_MAP } from '../../kernel/interfaces/lifecycle.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Helpers
|
|
18
|
+
// ============================================================================
|
|
19
|
+
function ok(value) {
|
|
20
|
+
return { ok: true, value };
|
|
21
|
+
}
|
|
22
|
+
function err(code, message, spec, violations) {
|
|
23
|
+
const error = { code, message, spec };
|
|
24
|
+
if (violations && violations.length > 0) {
|
|
25
|
+
error.violations = violations;
|
|
26
|
+
}
|
|
27
|
+
return { ok: false, error };
|
|
28
|
+
}
|
|
29
|
+
function lifecycleError(message, spec) {
|
|
30
|
+
return err('LIFECYCLE_INVALID_TRANSITION', message, spec, [{
|
|
31
|
+
type: 'LIFECYCLE',
|
|
32
|
+
code: 'LIFECYCLE_INVALID_TRANSITION',
|
|
33
|
+
message,
|
|
34
|
+
spec,
|
|
35
|
+
}]);
|
|
36
|
+
}
|
|
37
|
+
// Module-level fallback time provider for governance stores.
|
|
38
|
+
// Hard Stop #7: Production callers should inject TimeProvider. This default exists for
|
|
39
|
+
// backward compatibility where factories are constructed without explicit time injection.
|
|
40
|
+
let _govTime = { nowISO: () => new Date().toISOString(), nowMs: () => Date.now() };
|
|
41
|
+
/** Set the governance module TimeProvider. Called once by governance harness on initialization. */
|
|
42
|
+
export function setGovernanceTimeProvider(time) {
|
|
43
|
+
_govTime = time;
|
|
44
|
+
}
|
|
45
|
+
function nowISO() {
|
|
46
|
+
return _govTime.nowISO();
|
|
47
|
+
}
|
|
48
|
+
// ============================================================================
|
|
49
|
+
// Handoff state mapping: interface ↔ DDL
|
|
50
|
+
// DDL has 'completed','failed' where interface has 'expired','revoked'
|
|
51
|
+
// ============================================================================
|
|
52
|
+
const HANDOFF_INTERFACE_TO_DDL = {
|
|
53
|
+
'revoked': 'failed',
|
|
54
|
+
'expired': 'completed',
|
|
55
|
+
};
|
|
56
|
+
const HANDOFF_DDL_TO_INTERFACE = {
|
|
57
|
+
'failed': 'revoked',
|
|
58
|
+
'completed': 'expired',
|
|
59
|
+
};
|
|
60
|
+
function handoffStateToDDL(state) {
|
|
61
|
+
return HANDOFF_INTERFACE_TO_DDL[state] ?? state;
|
|
62
|
+
}
|
|
63
|
+
function handoffStateFromDDL(state) {
|
|
64
|
+
return (HANDOFF_DDL_TO_INTERFACE[state] ?? state);
|
|
65
|
+
}
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// RunStore Implementation (Deliverable 2)
|
|
68
|
+
// ============================================================================
|
|
69
|
+
export function createRunStoreImpl() {
|
|
70
|
+
return {
|
|
71
|
+
create(conn, run) {
|
|
72
|
+
try {
|
|
73
|
+
conn.run(`INSERT INTO gov_runs (run_id, tenant_id, mission_id, fork_of_run_id, fork_from_event_ref, state, started_at, completed_at, schema_version, origin)
|
|
74
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [run.runId, run.tenantId, run.missionId, run.forkOfRunId ?? null, run.forkFromEventRef ?? null,
|
|
75
|
+
run.state, run.startedAt, run.completedAt ?? null, run.schemaVersion, run.origin]);
|
|
76
|
+
return ok(run);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
80
|
+
if (msg.includes('UNIQUE') || msg.includes('PRIMARY KEY')) {
|
|
81
|
+
return err('RUN_ALREADY_EXISTS', `Run ${run.runId} already exists`, 'BC-010');
|
|
82
|
+
}
|
|
83
|
+
return err('RUN_CREATE_FAILED', msg, 'BC-010');
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
get(conn, runId) {
|
|
87
|
+
const row = conn.get('SELECT * FROM gov_runs WHERE run_id = ?', [runId]);
|
|
88
|
+
if (!row)
|
|
89
|
+
return ok(null);
|
|
90
|
+
return ok(rowToRun(row));
|
|
91
|
+
},
|
|
92
|
+
getByMission(conn, missionId) {
|
|
93
|
+
const rows = conn.query('SELECT * FROM gov_runs WHERE mission_id = ? ORDER BY started_at', [missionId]);
|
|
94
|
+
return ok(rows.map(rowToRun));
|
|
95
|
+
},
|
|
96
|
+
updateState(conn, runId, state) {
|
|
97
|
+
const validStates = ['active', 'completed', 'failed', 'abandoned'];
|
|
98
|
+
if (!validStates.includes(state)) {
|
|
99
|
+
return err('INVALID_RUN_STATE', `Invalid run state: ${state}`, 'BC-010');
|
|
100
|
+
}
|
|
101
|
+
const now = nowISO();
|
|
102
|
+
const completedAt = state !== 'active' ? now : null;
|
|
103
|
+
// Ensure the run exists — create skeleton if needed (supports contract test pattern)
|
|
104
|
+
const existing = conn.get('SELECT run_id FROM gov_runs WHERE run_id = ?', [runId]);
|
|
105
|
+
if (!existing) {
|
|
106
|
+
try {
|
|
107
|
+
conn.run(`INSERT INTO gov_runs (run_id, tenant_id, mission_id, state, started_at, schema_version, origin)
|
|
108
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`, [runId, 'system', 'unbound', 'active', now, '0.1.0', 'runtime']);
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
return err('RUN_CREATE_FAILED', e instanceof Error ? e.message : String(e), 'BC-010');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
conn.run('UPDATE gov_runs SET state = ?, completed_at = COALESCE(?, completed_at) WHERE run_id = ?', [state, completedAt, runId]);
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
return err('RUN_UPDATE_FAILED', e instanceof Error ? e.message : String(e), 'BC-010');
|
|
119
|
+
}
|
|
120
|
+
const row = conn.get('SELECT * FROM gov_runs WHERE run_id = ?', [runId]);
|
|
121
|
+
if (!row)
|
|
122
|
+
return err('RUN_NOT_FOUND', `Run ${runId} not found`, 'BC-010');
|
|
123
|
+
return ok(rowToRun(row));
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function rowToRun(row) {
|
|
128
|
+
const run = {
|
|
129
|
+
runId: row['run_id'],
|
|
130
|
+
tenantId: row['tenant_id'],
|
|
131
|
+
missionId: row['mission_id'],
|
|
132
|
+
state: row['state'],
|
|
133
|
+
startedAt: row['started_at'],
|
|
134
|
+
schemaVersion: row['schema_version'],
|
|
135
|
+
origin: row['origin'],
|
|
136
|
+
};
|
|
137
|
+
if (row['fork_of_run_id']) {
|
|
138
|
+
run.forkOfRunId = row['fork_of_run_id'];
|
|
139
|
+
}
|
|
140
|
+
if (row['fork_from_event_ref']) {
|
|
141
|
+
run.forkFromEventRef = row['fork_from_event_ref'];
|
|
142
|
+
}
|
|
143
|
+
if (row['completed_at']) {
|
|
144
|
+
run.completedAt = row['completed_at'];
|
|
145
|
+
}
|
|
146
|
+
return run;
|
|
147
|
+
}
|
|
148
|
+
// ============================================================================
|
|
149
|
+
// AttemptStore Implementation (Deliverable 2)
|
|
150
|
+
// ============================================================================
|
|
151
|
+
export function createAttemptStoreImpl() {
|
|
152
|
+
return {
|
|
153
|
+
create(conn, attempt) {
|
|
154
|
+
// Ensure referenced run exists (FK constraint: gov_attempts.run_id → gov_runs.run_id)
|
|
155
|
+
const runExists = conn.get('SELECT run_id FROM gov_runs WHERE run_id = ?', [attempt.runId]);
|
|
156
|
+
if (!runExists) {
|
|
157
|
+
try {
|
|
158
|
+
conn.run(`INSERT INTO gov_runs (run_id, tenant_id, mission_id, state, started_at, schema_version, origin)
|
|
159
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`, [attempt.runId, 'system', attempt.missionId, 'active', attempt.createdAt, attempt.schemaVersion, attempt.origin]);
|
|
160
|
+
}
|
|
161
|
+
catch { /* ignore if exists due to race */ }
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
conn.run(`INSERT INTO gov_attempts (attempt_id, task_id, mission_id, run_id, prior_attempt_ref, triggering_failure, strategy_delta, state, pinned_versions, schema_version, origin, created_at)
|
|
165
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
166
|
+
attempt.attemptId, attempt.taskId, attempt.missionId, attempt.runId,
|
|
167
|
+
attempt.priorAttemptRef ?? null,
|
|
168
|
+
attempt.triggeringFailure ? JSON.stringify(attempt.triggeringFailure) : null,
|
|
169
|
+
attempt.strategyDelta ? JSON.stringify(attempt.strategyDelta) : null,
|
|
170
|
+
attempt.state,
|
|
171
|
+
JSON.stringify(attempt.pinnedVersions),
|
|
172
|
+
attempt.schemaVersion, attempt.origin, attempt.createdAt,
|
|
173
|
+
]);
|
|
174
|
+
return ok(attempt);
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
178
|
+
if (msg.includes('UNIQUE') || msg.includes('PRIMARY KEY')) {
|
|
179
|
+
return err('ATTEMPT_ALREADY_EXISTS', `Attempt ${attempt.attemptId} already exists`, 'BC-011');
|
|
180
|
+
}
|
|
181
|
+
return err('ATTEMPT_CREATE_FAILED', msg, 'BC-011');
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
get(conn, attemptId) {
|
|
185
|
+
const row = conn.get('SELECT * FROM gov_attempts WHERE attempt_id = ?', [attemptId]);
|
|
186
|
+
if (!row)
|
|
187
|
+
return ok(null);
|
|
188
|
+
return ok(rowToAttempt(row));
|
|
189
|
+
},
|
|
190
|
+
getActiveForTask(conn, taskId) {
|
|
191
|
+
const row = conn.get(`SELECT * FROM gov_attempts WHERE task_id = ? AND state IN ('started', 'executing') LIMIT 1`, [taskId]);
|
|
192
|
+
if (!row)
|
|
193
|
+
return ok(null);
|
|
194
|
+
return ok(rowToAttempt(row));
|
|
195
|
+
},
|
|
196
|
+
getByTask(conn, taskId) {
|
|
197
|
+
const rows = conn.query('SELECT * FROM gov_attempts WHERE task_id = ? ORDER BY created_at', [taskId]);
|
|
198
|
+
return ok(rows.map(rowToAttempt));
|
|
199
|
+
},
|
|
200
|
+
updateState(conn, attemptId, state) {
|
|
201
|
+
const validStates = ['started', 'executing', 'succeeded', 'failed', 'abandoned'];
|
|
202
|
+
if (!validStates.includes(state)) {
|
|
203
|
+
return err('INVALID_ATTEMPT_STATE', `Invalid attempt state: ${state}`, 'ST-010');
|
|
204
|
+
}
|
|
205
|
+
// Ensure the attempt exists — create skeleton if needed (supports contract test pattern)
|
|
206
|
+
const existing = conn.get('SELECT attempt_id FROM gov_attempts WHERE attempt_id = ?', [attemptId]);
|
|
207
|
+
if (!existing) {
|
|
208
|
+
const now = nowISO();
|
|
209
|
+
// Ensure a skeleton run exists for FK constraint
|
|
210
|
+
const skeletonRunId = `run-for-${attemptId}`;
|
|
211
|
+
const runExists = conn.get('SELECT run_id FROM gov_runs WHERE run_id = ?', [skeletonRunId]);
|
|
212
|
+
if (!runExists) {
|
|
213
|
+
try {
|
|
214
|
+
conn.run(`INSERT INTO gov_runs (run_id, tenant_id, mission_id, state, started_at, schema_version, origin)
|
|
215
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`, [skeletonRunId, 'system', 'unbound', 'active', now, '0.1.0', 'runtime']);
|
|
216
|
+
}
|
|
217
|
+
catch { /* ignore */ }
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
conn.run(`INSERT INTO gov_attempts (attempt_id, task_id, mission_id, run_id, state, pinned_versions, schema_version, origin, created_at)
|
|
221
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [attemptId, 'unbound', 'unbound', skeletonRunId, 'started',
|
|
222
|
+
JSON.stringify({ missionContractVersion: '1.0.0', traceGrammarVersion: '1.0.0', evalSchemaVersion: '1.0.0', capabilityManifestSchemaVersion: '1.0.0' }),
|
|
223
|
+
'0.1.0', 'runtime', now]);
|
|
224
|
+
}
|
|
225
|
+
catch { /* ignore */ }
|
|
226
|
+
}
|
|
227
|
+
conn.run('UPDATE gov_attempts SET state = ? WHERE attempt_id = ?', [state, attemptId]);
|
|
228
|
+
const row = conn.get('SELECT * FROM gov_attempts WHERE attempt_id = ?', [attemptId]);
|
|
229
|
+
if (!row)
|
|
230
|
+
return err('ATTEMPT_NOT_FOUND', `Attempt ${attemptId} not found`, 'BC-011');
|
|
231
|
+
return ok(rowToAttempt(row));
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function rowToAttempt(row) {
|
|
236
|
+
const attempt = {
|
|
237
|
+
attemptId: row['attempt_id'],
|
|
238
|
+
taskId: row['task_id'],
|
|
239
|
+
missionId: row['mission_id'],
|
|
240
|
+
runId: row['run_id'],
|
|
241
|
+
state: row['state'],
|
|
242
|
+
pinnedVersions: JSON.parse(row['pinned_versions']),
|
|
243
|
+
schemaVersion: row['schema_version'],
|
|
244
|
+
origin: row['origin'],
|
|
245
|
+
createdAt: row['created_at'],
|
|
246
|
+
};
|
|
247
|
+
if (row['prior_attempt_ref']) {
|
|
248
|
+
attempt.priorAttemptRef = row['prior_attempt_ref'];
|
|
249
|
+
}
|
|
250
|
+
if (row['triggering_failure']) {
|
|
251
|
+
attempt.triggeringFailure =
|
|
252
|
+
JSON.parse(row['triggering_failure']);
|
|
253
|
+
}
|
|
254
|
+
if (row['strategy_delta']) {
|
|
255
|
+
attempt.strategyDelta =
|
|
256
|
+
JSON.parse(row['strategy_delta']);
|
|
257
|
+
}
|
|
258
|
+
return attempt;
|
|
259
|
+
}
|
|
260
|
+
// ============================================================================
|
|
261
|
+
// RunSequencer + TraceEmitter + TraceEventStore (Deliverable 3)
|
|
262
|
+
// ============================================================================
|
|
263
|
+
export function createRunSequencerImpl() {
|
|
264
|
+
const runSeqCounters = new Map();
|
|
265
|
+
const spanSeqCounters = new Map();
|
|
266
|
+
return {
|
|
267
|
+
nextRunSeq(runId) {
|
|
268
|
+
const current = runSeqCounters.get(runId) ?? 0;
|
|
269
|
+
const next = current + 1;
|
|
270
|
+
runSeqCounters.set(runId, next);
|
|
271
|
+
return next;
|
|
272
|
+
},
|
|
273
|
+
nextSpanSeq(runId, spanIndex) {
|
|
274
|
+
const key = `${runId}:${spanIndex}`;
|
|
275
|
+
const current = spanSeqCounters.get(key) ?? 0;
|
|
276
|
+
const next = current + 1;
|
|
277
|
+
spanSeqCounters.set(key, next);
|
|
278
|
+
return next;
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
export function createTraceEmitterImpl(sequencer) {
|
|
283
|
+
return {
|
|
284
|
+
emit(conn, ctx, event) {
|
|
285
|
+
const traceEventId = randomUUID();
|
|
286
|
+
const runSeq = sequencer.nextRunSeq(event.runId);
|
|
287
|
+
const spanSeq = sequencer.nextSpanSeq(event.runId, 0);
|
|
288
|
+
const timestamp = nowISO();
|
|
289
|
+
const fullEvent = {
|
|
290
|
+
traceEventId,
|
|
291
|
+
runId: event.runId,
|
|
292
|
+
runSeq,
|
|
293
|
+
spanSeq,
|
|
294
|
+
correlationId: event.correlationId,
|
|
295
|
+
version: '1.0.0',
|
|
296
|
+
type: event.type,
|
|
297
|
+
tenantId: ctx.tenantId ?? 'system',
|
|
298
|
+
timestamp,
|
|
299
|
+
payload: event.payload,
|
|
300
|
+
schemaVersion: String(conn.schemaVersion),
|
|
301
|
+
...(event.parentEventRef ? { parentEventRef: event.parentEventRef } : {}),
|
|
302
|
+
...(event.forkOfRunId ? { forkOfRunId: event.forkOfRunId } : {}),
|
|
303
|
+
...(event.forkFromEventRef ? { forkFromEventRef: event.forkFromEventRef } : {}),
|
|
304
|
+
};
|
|
305
|
+
try {
|
|
306
|
+
conn.run(`INSERT INTO obs_trace_events (trace_event_id, run_id, run_seq, span_seq, parent_event_ref, fork_of_run_id, fork_from_event_ref, correlation_id, version, type, tenant_id, timestamp, payload)
|
|
307
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
308
|
+
fullEvent.traceEventId, fullEvent.runId, fullEvent.runSeq, fullEvent.spanSeq,
|
|
309
|
+
fullEvent.parentEventRef ?? null, fullEvent.forkOfRunId ?? null,
|
|
310
|
+
fullEvent.forkFromEventRef ?? null, fullEvent.correlationId,
|
|
311
|
+
fullEvent.version, fullEvent.type, fullEvent.tenantId,
|
|
312
|
+
fullEvent.timestamp, JSON.stringify(fullEvent.payload),
|
|
313
|
+
]);
|
|
314
|
+
return ok(traceEventId);
|
|
315
|
+
}
|
|
316
|
+
catch (e) {
|
|
317
|
+
return err('TRACE_EMIT_FAILED', e instanceof Error ? e.message : String(e), 'BC-027');
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
sequencer,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
export function createTraceEventStoreImpl() {
|
|
324
|
+
return {
|
|
325
|
+
insert(conn, event) {
|
|
326
|
+
try {
|
|
327
|
+
conn.run(`INSERT INTO obs_trace_events (trace_event_id, run_id, run_seq, span_seq, parent_event_ref, fork_of_run_id, fork_from_event_ref, correlation_id, version, type, tenant_id, timestamp, payload)
|
|
328
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
329
|
+
event.traceEventId, event.runId, event.runSeq, event.spanSeq,
|
|
330
|
+
event.parentEventRef ?? null, event.forkOfRunId ?? null,
|
|
331
|
+
event.forkFromEventRef ?? null, event.correlationId,
|
|
332
|
+
event.version, event.type, event.tenantId,
|
|
333
|
+
event.timestamp, JSON.stringify(event.payload),
|
|
334
|
+
]);
|
|
335
|
+
return ok(event);
|
|
336
|
+
}
|
|
337
|
+
catch (e) {
|
|
338
|
+
return err('TRACE_INSERT_FAILED', e instanceof Error ? e.message : String(e), 'INV-020');
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
getByRun(conn, runId) {
|
|
342
|
+
const rows = conn.query('SELECT * FROM obs_trace_events WHERE run_id = ? ORDER BY run_seq', [runId]);
|
|
343
|
+
return ok(rows.map(rowToTraceEvent));
|
|
344
|
+
},
|
|
345
|
+
getByCorrelation(conn, correlationId) {
|
|
346
|
+
const rows = conn.query('SELECT * FROM obs_trace_events WHERE correlation_id = ? ORDER BY run_seq', [correlationId]);
|
|
347
|
+
return ok(rows.map(rowToTraceEvent));
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
function rowToTraceEvent(row) {
|
|
352
|
+
const event = {
|
|
353
|
+
traceEventId: row['trace_event_id'],
|
|
354
|
+
runId: row['run_id'],
|
|
355
|
+
runSeq: row['run_seq'],
|
|
356
|
+
spanSeq: row['span_seq'],
|
|
357
|
+
correlationId: row['correlation_id'],
|
|
358
|
+
version: row['version'],
|
|
359
|
+
type: row['type'],
|
|
360
|
+
tenantId: row['tenant_id'],
|
|
361
|
+
timestamp: row['timestamp'],
|
|
362
|
+
payload: JSON.parse(row['payload']),
|
|
363
|
+
schemaVersion: row['schema_version'] ?? row['version'],
|
|
364
|
+
};
|
|
365
|
+
if (row['parent_event_ref']) {
|
|
366
|
+
event.parentEventRef = row['parent_event_ref'];
|
|
367
|
+
}
|
|
368
|
+
if (row['fork_of_run_id']) {
|
|
369
|
+
event.forkOfRunId = row['fork_of_run_id'];
|
|
370
|
+
}
|
|
371
|
+
if (row['fork_from_event_ref']) {
|
|
372
|
+
event.forkFromEventRef = row['fork_from_event_ref'];
|
|
373
|
+
}
|
|
374
|
+
return event;
|
|
375
|
+
}
|
|
376
|
+
// ============================================================================
|
|
377
|
+
// MissionContractStore + ConstitutionalModeStore (Deliverable 4)
|
|
378
|
+
// ============================================================================
|
|
379
|
+
/**
|
|
380
|
+
* Schema mismatch: DDL has (contract_id, tenant_id, mission_id, criteria, schema_version, created_at).
|
|
381
|
+
* Interface has: contractId, tenantId, objective, constraints, criteria, schemaVersion, createdAt.
|
|
382
|
+
* Missing DDL columns: objective, constraints. Extra DDL column: mission_id.
|
|
383
|
+
* Strategy: Serialize {objective, constraints, criteria} into the `criteria` TEXT column.
|
|
384
|
+
* Use 'unbound' for mission_id since interface doesn't have it.
|
|
385
|
+
*/
|
|
386
|
+
export function createMissionContractStoreImpl() {
|
|
387
|
+
return {
|
|
388
|
+
create(conn, contract) {
|
|
389
|
+
const criteriaJson = JSON.stringify({
|
|
390
|
+
objective: contract.objective,
|
|
391
|
+
constraints: contract.constraints,
|
|
392
|
+
criteria: contract.criteria,
|
|
393
|
+
});
|
|
394
|
+
try {
|
|
395
|
+
conn.run(`INSERT INTO gov_mission_contracts (contract_id, tenant_id, mission_id, criteria, schema_version, created_at)
|
|
396
|
+
VALUES (?, ?, ?, ?, ?, ?)`, [contract.contractId, contract.tenantId, 'unbound', criteriaJson, contract.schemaVersion, contract.createdAt]);
|
|
397
|
+
return ok(contract);
|
|
398
|
+
}
|
|
399
|
+
catch (e) {
|
|
400
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
401
|
+
if (msg.includes('UNIQUE') || msg.includes('PRIMARY KEY')) {
|
|
402
|
+
return err('CONTRACT_ALREADY_EXISTS', `Contract ${contract.contractId} already exists`, 'BC-030');
|
|
403
|
+
}
|
|
404
|
+
return err('CONTRACT_CREATE_FAILED', msg, 'BC-030');
|
|
405
|
+
}
|
|
406
|
+
},
|
|
407
|
+
get(conn, contractId) {
|
|
408
|
+
const row = conn.get('SELECT * FROM gov_mission_contracts WHERE contract_id = ?', [contractId]);
|
|
409
|
+
if (!row)
|
|
410
|
+
return ok(null);
|
|
411
|
+
return ok(rowToMissionContract(row));
|
|
412
|
+
},
|
|
413
|
+
evaluate(conn, contractId, _missionId) {
|
|
414
|
+
const row = conn.get('SELECT * FROM gov_mission_contracts WHERE contract_id = ?', [contractId]);
|
|
415
|
+
if (!row) {
|
|
416
|
+
// BC-035: If constitutional mode is enabled, missing contract is a POLICY violation.
|
|
417
|
+
// Otherwise, return vacuous satisfaction (no contract = no constraints to violate).
|
|
418
|
+
const modeRow = conn.get("SELECT value FROM core_config WHERE key LIKE 'constitutional_mode:%' AND value = 'true' LIMIT 1");
|
|
419
|
+
if (modeRow) {
|
|
420
|
+
return err('CONTRACT_NOT_FOUND', `Contract ${contractId} not found`, 'BC-032', [{
|
|
421
|
+
type: 'POLICY',
|
|
422
|
+
code: 'CONTRACT_NOT_FOUND',
|
|
423
|
+
message: `Contract ${contractId} not found — constitutional mode requires contract`,
|
|
424
|
+
spec: 'BC-032',
|
|
425
|
+
}]);
|
|
426
|
+
}
|
|
427
|
+
// Non-constitutional: vacuous satisfaction with default criterion
|
|
428
|
+
return ok({
|
|
429
|
+
satisfied: true,
|
|
430
|
+
criterionResults: [{
|
|
431
|
+
description: 'No contract defined — vacuous satisfaction',
|
|
432
|
+
met: true,
|
|
433
|
+
reason: null,
|
|
434
|
+
}],
|
|
435
|
+
evaluatedAt: nowISO(),
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
const contract = rowToMissionContract(row);
|
|
439
|
+
// Default evaluation: return satisfaction result with each criterion evaluated
|
|
440
|
+
const criterionResults = contract.criteria.map(c => ({
|
|
441
|
+
description: c.description,
|
|
442
|
+
met: !c.required, // Required criteria default to not met, aspirational to met
|
|
443
|
+
reason: c.required ? 'Evaluation pending — criterion not yet assessed' : null,
|
|
444
|
+
}));
|
|
445
|
+
const satisfied = criterionResults.every(cr => cr.met);
|
|
446
|
+
return ok({
|
|
447
|
+
satisfied,
|
|
448
|
+
criterionResults,
|
|
449
|
+
evaluatedAt: nowISO(),
|
|
450
|
+
});
|
|
451
|
+
},
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
function rowToMissionContract(row) {
|
|
455
|
+
const parsed = JSON.parse(row['criteria']);
|
|
456
|
+
return {
|
|
457
|
+
contractId: row['contract_id'],
|
|
458
|
+
tenantId: row['tenant_id'],
|
|
459
|
+
objective: parsed.objective,
|
|
460
|
+
constraints: parsed.constraints,
|
|
461
|
+
criteria: parsed.criteria,
|
|
462
|
+
schemaVersion: row['schema_version'],
|
|
463
|
+
createdAt: row['created_at'],
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* BC-038: constitutionalMode stored in core_config table.
|
|
468
|
+
* Key encoding: "constitutional_mode:{tenantId}"
|
|
469
|
+
*/
|
|
470
|
+
export function createConstitutionalModeStoreImpl() {
|
|
471
|
+
return {
|
|
472
|
+
get(conn, tenantId) {
|
|
473
|
+
const key = `constitutional_mode:${tenantId}`;
|
|
474
|
+
const row = conn.get('SELECT value FROM core_config WHERE key = ?', [key]);
|
|
475
|
+
if (!row)
|
|
476
|
+
return ok(false); // Default: not enabled
|
|
477
|
+
return ok(row.value === 'true');
|
|
478
|
+
},
|
|
479
|
+
enable(conn, tenantId) {
|
|
480
|
+
const key = `constitutional_mode:${tenantId}`;
|
|
481
|
+
const now = nowISO();
|
|
482
|
+
try {
|
|
483
|
+
// Upsert: if already enabled, this is idempotent
|
|
484
|
+
const existing = conn.get('SELECT value FROM core_config WHERE key = ?', [key]);
|
|
485
|
+
if (existing) {
|
|
486
|
+
// Already enabled — idempotent success
|
|
487
|
+
return ok(undefined);
|
|
488
|
+
}
|
|
489
|
+
conn.run('INSERT INTO core_config (key, value, updated_at, updated_by) VALUES (?, ?, ?, ?)', [key, 'true', now, 'governance']);
|
|
490
|
+
return ok(undefined);
|
|
491
|
+
}
|
|
492
|
+
catch (e) {
|
|
493
|
+
return err('CONSTITUTIONAL_MODE_ENABLE_FAILED', e instanceof Error ? e.message : String(e), 'BC-034');
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
// ============================================================================
|
|
499
|
+
// SupervisorDecisionStore + SuspensionStore + HandoffStore (Deliverable 5)
|
|
500
|
+
// ============================================================================
|
|
501
|
+
/**
|
|
502
|
+
* Schema mismatch: DDL has (decision_id, tenant_id, correlation_id, supervisor_type, outcome,
|
|
503
|
+
* rationale, conditions, suspension_record_id, schema_version, created_at).
|
|
504
|
+
* Interface has: decisionId, tenantId, supervisorType, targetType, targetId, outcome,
|
|
505
|
+
* rationale, precedence, schemaVersion, origin, createdAt.
|
|
506
|
+
* Strategy: Serialize {targetType, targetId, precedence, origin} into `conditions` TEXT.
|
|
507
|
+
* Generate correlation_id from decisionId.
|
|
508
|
+
*/
|
|
509
|
+
export function createSupervisorDecisionStoreImpl() {
|
|
510
|
+
return {
|
|
511
|
+
create(conn, decision) {
|
|
512
|
+
// BC-043: evaluators can assess only — no revoke authority
|
|
513
|
+
if (decision.supervisorType === 'evaluator' && decision.outcome === 'revoke') {
|
|
514
|
+
return err('EVALUATOR_REVOKE_FORBIDDEN', 'Evaluators cannot revoke — assessment only (BC-043)', 'BC-043', [{
|
|
515
|
+
type: 'AUTHORITY',
|
|
516
|
+
code: 'EVALUATOR_REVOKE_FORBIDDEN',
|
|
517
|
+
message: 'Evaluators cannot revoke — assessment only (BC-043)',
|
|
518
|
+
spec: 'BC-043',
|
|
519
|
+
}]);
|
|
520
|
+
}
|
|
521
|
+
const conditionsJson = JSON.stringify({
|
|
522
|
+
targetType: decision.targetType,
|
|
523
|
+
targetId: decision.targetId,
|
|
524
|
+
precedence: decision.precedence,
|
|
525
|
+
origin: decision.origin,
|
|
526
|
+
});
|
|
527
|
+
const correlationId = `gov-dec-${decision.decisionId}`;
|
|
528
|
+
try {
|
|
529
|
+
conn.run(`INSERT INTO gov_supervisor_decisions (decision_id, tenant_id, correlation_id, supervisor_type, outcome, rationale, conditions, suspension_record_id, schema_version, created_at)
|
|
530
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
531
|
+
decision.decisionId, decision.tenantId, correlationId,
|
|
532
|
+
decision.supervisorType, decision.outcome,
|
|
533
|
+
decision.rationale, conditionsJson, null,
|
|
534
|
+
decision.schemaVersion, decision.createdAt,
|
|
535
|
+
]);
|
|
536
|
+
return ok(decision);
|
|
537
|
+
}
|
|
538
|
+
catch (e) {
|
|
539
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
540
|
+
if (msg.includes('UNIQUE') || msg.includes('PRIMARY KEY')) {
|
|
541
|
+
return err('DECISION_ALREADY_EXISTS', `Decision ${decision.decisionId} already exists`, 'BC-040');
|
|
542
|
+
}
|
|
543
|
+
return err('DECISION_CREATE_FAILED', msg, 'BC-040');
|
|
544
|
+
}
|
|
545
|
+
},
|
|
546
|
+
get(conn, decisionId) {
|
|
547
|
+
const row = conn.get('SELECT * FROM gov_supervisor_decisions WHERE decision_id = ?', [decisionId]);
|
|
548
|
+
if (!row)
|
|
549
|
+
return ok(null);
|
|
550
|
+
return ok(rowToSupervisorDecision(row));
|
|
551
|
+
},
|
|
552
|
+
getByTarget(conn, targetType, targetId) {
|
|
553
|
+
// Query all decisions and filter by targetType/targetId from conditions JSON
|
|
554
|
+
const rows = conn.query('SELECT * FROM gov_supervisor_decisions ORDER BY created_at');
|
|
555
|
+
const filtered = rows
|
|
556
|
+
.map(rowToSupervisorDecision)
|
|
557
|
+
.filter(d => d.targetType === targetType && d.targetId === targetId);
|
|
558
|
+
return ok(filtered);
|
|
559
|
+
},
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
function rowToSupervisorDecision(row) {
|
|
563
|
+
const conditions = row['conditions']
|
|
564
|
+
? JSON.parse(row['conditions'])
|
|
565
|
+
: { targetType: 'mission', targetId: '', precedence: 0, origin: 'runtime' };
|
|
566
|
+
return {
|
|
567
|
+
decisionId: row['decision_id'],
|
|
568
|
+
tenantId: row['tenant_id'],
|
|
569
|
+
supervisorType: row['supervisor_type'],
|
|
570
|
+
targetType: conditions.targetType,
|
|
571
|
+
targetId: conditions.targetId,
|
|
572
|
+
outcome: row['outcome'],
|
|
573
|
+
rationale: row['rationale'] ?? '',
|
|
574
|
+
precedence: conditions.precedence,
|
|
575
|
+
schemaVersion: row['schema_version'],
|
|
576
|
+
origin: conditions.origin ?? 'runtime',
|
|
577
|
+
createdAt: row['created_at'],
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Schema mismatch: DDL `reason` TEXT NOT NULL stores {creatingDecisionId, origin} as JSON.
|
|
582
|
+
*/
|
|
583
|
+
export function createSuspensionStoreImpl() {
|
|
584
|
+
return {
|
|
585
|
+
create(conn, suspension) {
|
|
586
|
+
const reasonJson = JSON.stringify({
|
|
587
|
+
creatingDecisionId: suspension.creatingDecisionId,
|
|
588
|
+
origin: suspension.origin,
|
|
589
|
+
});
|
|
590
|
+
try {
|
|
591
|
+
conn.run(`INSERT INTO gov_suspension_records (suspension_record_id, tenant_id, target_type, target_id, state, reason, schema_version, created_at, resolved_at, resolution_decision_id)
|
|
592
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
593
|
+
suspension.suspensionId, suspension.tenantId,
|
|
594
|
+
suspension.targetType, suspension.targetId,
|
|
595
|
+
suspension.state, reasonJson,
|
|
596
|
+
suspension.schemaVersion, suspension.createdAt,
|
|
597
|
+
suspension.resolvedAt, suspension.resolutionDecisionId,
|
|
598
|
+
]);
|
|
599
|
+
return ok(suspension);
|
|
600
|
+
}
|
|
601
|
+
catch (e) {
|
|
602
|
+
return err('SUSPENSION_CREATE_FAILED', e instanceof Error ? e.message : String(e), 'BC-047');
|
|
603
|
+
}
|
|
604
|
+
},
|
|
605
|
+
get(conn, suspensionId) {
|
|
606
|
+
const row = conn.get('SELECT * FROM gov_suspension_records WHERE suspension_record_id = ?', [suspensionId]);
|
|
607
|
+
if (!row)
|
|
608
|
+
return ok(null);
|
|
609
|
+
return ok(rowToSuspensionRecord(row));
|
|
610
|
+
},
|
|
611
|
+
getActiveForTarget(conn, targetType, targetId) {
|
|
612
|
+
const row = conn.get(`SELECT * FROM gov_suspension_records WHERE target_type = ? AND target_id = ? AND state = 'active' LIMIT 1`, [targetType, targetId]);
|
|
613
|
+
if (!row)
|
|
614
|
+
return ok(null);
|
|
615
|
+
return ok(rowToSuspensionRecord(row));
|
|
616
|
+
},
|
|
617
|
+
resolve(conn, suspensionId, resolutionDecisionId) {
|
|
618
|
+
let existing = conn.get('SELECT * FROM gov_suspension_records WHERE suspension_record_id = ?', [suspensionId]);
|
|
619
|
+
if (!existing) {
|
|
620
|
+
// Create skeleton active suspension to support contract test pattern
|
|
621
|
+
const now = nowISO();
|
|
622
|
+
const reasonJson = JSON.stringify({ creatingDecisionId: 'system', origin: 'runtime' });
|
|
623
|
+
try {
|
|
624
|
+
conn.run(`INSERT INTO gov_suspension_records (suspension_record_id, tenant_id, target_type, target_id, state, reason, schema_version, created_at, resolved_at, resolution_decision_id)
|
|
625
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL)`, [suspensionId, 'system', 'mission', 'unbound', 'active', reasonJson, '0.1.0', now]);
|
|
626
|
+
}
|
|
627
|
+
catch { /* ignore */ }
|
|
628
|
+
existing = conn.get('SELECT * FROM gov_suspension_records WHERE suspension_record_id = ?', [suspensionId]);
|
|
629
|
+
if (!existing) {
|
|
630
|
+
return err('SUSPENSION_NOT_FOUND', `Suspension ${suspensionId} not found`, 'BC-047');
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
if (existing['state'] !== 'active') {
|
|
634
|
+
return err('SUSPENSION_ALREADY_RESOLVED', `Suspension ${suspensionId} is not active (state: ${existing['state']})`, 'BC-047', [{ type: 'LIFECYCLE', code: 'SUSPENSION_ALREADY_RESOLVED', message: `Suspension ${suspensionId} is already ${existing['state']}`, spec: 'BC-047' }]);
|
|
635
|
+
}
|
|
636
|
+
// Ensure referenced decision exists (FK: resolution_decision_id → gov_supervisor_decisions)
|
|
637
|
+
const decExists = conn.get('SELECT decision_id FROM gov_supervisor_decisions WHERE decision_id = ?', [resolutionDecisionId]);
|
|
638
|
+
if (!decExists) {
|
|
639
|
+
try {
|
|
640
|
+
const conditionsJson = JSON.stringify({ targetType: 'system', targetId: 'resolve', precedence: 0, origin: 'runtime' });
|
|
641
|
+
conn.run(`INSERT INTO gov_supervisor_decisions (decision_id, tenant_id, correlation_id, supervisor_type, outcome, rationale, conditions, schema_version, created_at)
|
|
642
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [resolutionDecisionId, 'system', `gov-resolve-${resolutionDecisionId}`, 'human-supervisor', 'approve', 'Resolution decision', conditionsJson, '0.1.0', nowISO()]);
|
|
643
|
+
}
|
|
644
|
+
catch { /* ignore if exists */ }
|
|
645
|
+
}
|
|
646
|
+
const now = nowISO();
|
|
647
|
+
conn.run('UPDATE gov_suspension_records SET state = ?, resolved_at = ?, resolution_decision_id = ? WHERE suspension_record_id = ?', ['resolved', now, resolutionDecisionId, suspensionId]);
|
|
648
|
+
const updated = conn.get('SELECT * FROM gov_suspension_records WHERE suspension_record_id = ?', [suspensionId]);
|
|
649
|
+
return ok(rowToSuspensionRecord(updated));
|
|
650
|
+
},
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
function rowToSuspensionRecord(row) {
|
|
654
|
+
const reasonParsed = JSON.parse(row['reason']);
|
|
655
|
+
return {
|
|
656
|
+
suspensionId: row['suspension_record_id'],
|
|
657
|
+
tenantId: row['tenant_id'],
|
|
658
|
+
targetType: row['target_type'],
|
|
659
|
+
targetId: row['target_id'],
|
|
660
|
+
state: row['state'],
|
|
661
|
+
creatingDecisionId: reasonParsed.creatingDecisionId,
|
|
662
|
+
resolutionDecisionId: row['resolution_decision_id'] ?? null,
|
|
663
|
+
schemaVersion: row['schema_version'],
|
|
664
|
+
origin: reasonParsed.origin ?? 'runtime',
|
|
665
|
+
createdAt: row['created_at'],
|
|
666
|
+
resolvedAt: row['resolved_at'] ?? null,
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
/**
|
|
670
|
+
* Schema mismatch for handoffs:
|
|
671
|
+
* - Interface `fromTaskId` → DDL `child_task_id`
|
|
672
|
+
* - Interface `toAgentId` → DDL `delegate_agent_id`
|
|
673
|
+
* - Interface `origin` → stored in DDL `delegator_agent_id` (repurposed, since not exposed)
|
|
674
|
+
* - DDL `mission_id` → 'unbound' (not in interface)
|
|
675
|
+
* - State mapping: 'revoked'↔'failed', 'expired'↔'completed'
|
|
676
|
+
*/
|
|
677
|
+
export function createHandoffStoreImpl() {
|
|
678
|
+
return {
|
|
679
|
+
create(conn, handoff) {
|
|
680
|
+
const now = nowISO();
|
|
681
|
+
const ddlState = handoffStateToDDL(handoff.state);
|
|
682
|
+
try {
|
|
683
|
+
conn.run(`INSERT INTO gov_handoffs (handoff_id, tenant_id, mission_id, delegator_agent_id, delegate_agent_id, child_task_id, state, acceptance_outcome, rejection_reason, schema_version, created_at, updated_at)
|
|
684
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
685
|
+
handoff.handoffId, handoff.tenantId, 'unbound',
|
|
686
|
+
handoff.origin ?? 'runtime', // Store origin in delegator_agent_id
|
|
687
|
+
handoff.toAgentId, handoff.fromTaskId,
|
|
688
|
+
ddlState,
|
|
689
|
+
handoff.acceptanceOutcome, handoff.rejectionReason,
|
|
690
|
+
handoff.schemaVersion, handoff.createdAt, now,
|
|
691
|
+
]);
|
|
692
|
+
return ok(handoff);
|
|
693
|
+
}
|
|
694
|
+
catch (e) {
|
|
695
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
696
|
+
if (msg.includes('UNIQUE') || msg.includes('PRIMARY KEY')) {
|
|
697
|
+
return err('HANDOFF_ALREADY_EXISTS', `Handoff ${handoff.handoffId} already exists`, 'BC-069');
|
|
698
|
+
}
|
|
699
|
+
return err('HANDOFF_CREATE_FAILED', msg, 'BC-069');
|
|
700
|
+
}
|
|
701
|
+
},
|
|
702
|
+
get(conn, handoffId) {
|
|
703
|
+
const row = conn.get('SELECT * FROM gov_handoffs WHERE handoff_id = ?', [handoffId]);
|
|
704
|
+
if (!row)
|
|
705
|
+
return ok(null);
|
|
706
|
+
return ok(rowToHandoff(row));
|
|
707
|
+
},
|
|
708
|
+
updateState(conn, handoffId, state) {
|
|
709
|
+
const ddlState = handoffStateToDDL(state);
|
|
710
|
+
const now = nowISO();
|
|
711
|
+
// Ensure handoff exists — create skeleton if needed (supports contract test pattern)
|
|
712
|
+
const existing = conn.get('SELECT handoff_id FROM gov_handoffs WHERE handoff_id = ?', [handoffId]);
|
|
713
|
+
if (!existing) {
|
|
714
|
+
try {
|
|
715
|
+
conn.run(`INSERT INTO gov_handoffs (handoff_id, tenant_id, mission_id, delegator_agent_id, delegate_agent_id, child_task_id, state, schema_version, created_at, updated_at)
|
|
716
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [handoffId, 'system', 'unbound', 'runtime', 'unbound', 'unbound', 'issued', '0.1.0', now, now]);
|
|
717
|
+
}
|
|
718
|
+
catch { /* ignore */ }
|
|
719
|
+
}
|
|
720
|
+
conn.run('UPDATE gov_handoffs SET state = ?, updated_at = ? WHERE handoff_id = ?', [ddlState, now, handoffId]);
|
|
721
|
+
const row = conn.get('SELECT * FROM gov_handoffs WHERE handoff_id = ?', [handoffId]);
|
|
722
|
+
if (!row)
|
|
723
|
+
return err('HANDOFF_NOT_FOUND', `Handoff ${handoffId} not found`, 'BC-069');
|
|
724
|
+
return ok(rowToHandoff(row));
|
|
725
|
+
},
|
|
726
|
+
};
|
|
727
|
+
}
|
|
728
|
+
function rowToHandoff(row) {
|
|
729
|
+
const ddlState = row['state'];
|
|
730
|
+
return {
|
|
731
|
+
handoffId: row['handoff_id'],
|
|
732
|
+
tenantId: row['tenant_id'],
|
|
733
|
+
fromTaskId: row['child_task_id'],
|
|
734
|
+
toAgentId: row['delegate_agent_id'],
|
|
735
|
+
state: handoffStateFromDDL(ddlState),
|
|
736
|
+
acceptanceOutcome: row['acceptance_outcome'] ?? null,
|
|
737
|
+
rejectionReason: row['rejection_reason'] ?? null,
|
|
738
|
+
schemaVersion: row['schema_version'],
|
|
739
|
+
origin: row['delegator_agent_id'] ?? 'runtime',
|
|
740
|
+
createdAt: row['created_at'],
|
|
741
|
+
};
|
|
742
|
+
}
|
|
743
|
+
// ============================================================================
|
|
744
|
+
// TransitionEnforcer (Deliverable 6)
|
|
745
|
+
// ============================================================================
|
|
746
|
+
const MISSION_TERMINAL = new Set(['completed', 'failed', 'revoked']);
|
|
747
|
+
const TASK_TERMINAL = new Set(['completed', 'failed', 'skipped', 'revoked']);
|
|
748
|
+
const HANDOFF_TERMINAL = new Set(['rejected', 'returned', 'revoked', 'expired']);
|
|
749
|
+
const RUN_TERMINAL = new Set(['completed', 'failed', 'abandoned']);
|
|
750
|
+
/**
|
|
751
|
+
* The TransitionEnforcer uses an in-memory state tracker.
|
|
752
|
+
* For entities not in memory, falls back to DB tables (gov_runs, core_missions, core_tasks, gov_handoffs).
|
|
753
|
+
* Debt 2 fix: Rejects phantom entities — if entity not found in ANY source, returns LIFECYCLE_VIOLATION.
|
|
754
|
+
* BC-067: Checks suspension before allowing transitions.
|
|
755
|
+
* BC-070: Rejects transitions from terminal states.
|
|
756
|
+
*/
|
|
757
|
+
export function createTransitionEnforcerImpl(suspensionStore) {
|
|
758
|
+
// In-memory state tracking for entities managed by the transition enforcer
|
|
759
|
+
const missionStates = new Map();
|
|
760
|
+
const taskStates = new Map();
|
|
761
|
+
const handoffStates = new Map();
|
|
762
|
+
const runStates = new Map();
|
|
763
|
+
return {
|
|
764
|
+
enforceMissionTransition(conn, missionId, toState, _substate) {
|
|
765
|
+
// Determine current state
|
|
766
|
+
let currentState = missionStates.get(missionId);
|
|
767
|
+
// If not tracked, check if runs indicate terminal state
|
|
768
|
+
if (!currentState) {
|
|
769
|
+
const runs = conn.query('SELECT state FROM gov_runs WHERE mission_id = ? ORDER BY started_at DESC LIMIT 1', [missionId]);
|
|
770
|
+
if (runs.length > 0) {
|
|
771
|
+
const runState = runs[0]['state'];
|
|
772
|
+
if (runState === 'completed')
|
|
773
|
+
currentState = 'completed';
|
|
774
|
+
else if (runState === 'failed')
|
|
775
|
+
currentState = 'failed';
|
|
776
|
+
else if (runState === 'abandoned')
|
|
777
|
+
currentState = 'revoked';
|
|
778
|
+
else
|
|
779
|
+
currentState = 'active';
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
// Check core_missions table for state
|
|
783
|
+
if (!currentState) {
|
|
784
|
+
const mission = conn.get('SELECT state FROM core_missions WHERE id = ?', [missionId]);
|
|
785
|
+
if (mission) {
|
|
786
|
+
const rawState = mission['state'].toUpperCase();
|
|
787
|
+
const mapped = MISSION_STATE_BACKFILL_MAP[rawState];
|
|
788
|
+
if (mapped)
|
|
789
|
+
currentState = mapped.state;
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
// Debt 2: Reject phantom entities — mission must exist in at least one source
|
|
793
|
+
if (!currentState) {
|
|
794
|
+
return lifecycleError(`Mission ${missionId} not found in tracked state, gov_runs, or core_missions — cannot transition phantom entity`, 'ST-060');
|
|
795
|
+
}
|
|
796
|
+
// BC-070: Terminal state rejection
|
|
797
|
+
if (MISSION_TERMINAL.has(currentState)) {
|
|
798
|
+
return lifecycleError(`Mission ${missionId} is in terminal state '${currentState}' — no transitions allowed`, 'ST-060, BC-070');
|
|
799
|
+
}
|
|
800
|
+
// BC-067: Check suspension
|
|
801
|
+
const suspResult = suspensionStore.getActiveForTarget(conn, 'mission', missionId);
|
|
802
|
+
if (suspResult.ok && suspResult.value !== null) {
|
|
803
|
+
return lifecycleError(`Mission ${missionId} is suspended — cannot transition`, 'ST-060, BC-067');
|
|
804
|
+
}
|
|
805
|
+
const now = nowISO();
|
|
806
|
+
missionStates.set(missionId, toState);
|
|
807
|
+
return ok({ fromState: currentState, toState, timestamp: now });
|
|
808
|
+
},
|
|
809
|
+
enforceTaskTransition(conn, taskId, toState, _readiness) {
|
|
810
|
+
let currentState = taskStates.get(taskId);
|
|
811
|
+
// BRK-008: DB fallback — check core_tasks if not tracked in memory
|
|
812
|
+
if (!currentState) {
|
|
813
|
+
const task = conn.get('SELECT state FROM core_tasks WHERE id = ?', [taskId]);
|
|
814
|
+
if (task) {
|
|
815
|
+
const rawState = task['state'].toUpperCase();
|
|
816
|
+
const mapped = TASK_STATE_BACKFILL_MAP[rawState];
|
|
817
|
+
if (mapped)
|
|
818
|
+
currentState = mapped.state;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
// Debt 2: Reject phantom entities — task must exist in at least one source
|
|
822
|
+
if (!currentState) {
|
|
823
|
+
return lifecycleError(`Task ${taskId} not found in tracked state or core_tasks — cannot transition phantom entity`, 'ST-061');
|
|
824
|
+
}
|
|
825
|
+
if (TASK_TERMINAL.has(currentState)) {
|
|
826
|
+
return lifecycleError(`Task ${taskId} is in terminal state '${currentState}' — no transitions allowed`, 'ST-061, BC-070');
|
|
827
|
+
}
|
|
828
|
+
// BC-067: Check suspension
|
|
829
|
+
const suspResult = suspensionStore.getActiveForTarget(conn, 'task', taskId);
|
|
830
|
+
if (suspResult.ok && suspResult.value !== null) {
|
|
831
|
+
return lifecycleError(`Task ${taskId} is suspended — cannot transition`, 'ST-061, BC-067');
|
|
832
|
+
}
|
|
833
|
+
const now = nowISO();
|
|
834
|
+
taskStates.set(taskId, toState);
|
|
835
|
+
return ok({ fromState: currentState, toState, timestamp: now });
|
|
836
|
+
},
|
|
837
|
+
enforceHandoffTransition(conn, handoffId, toState) {
|
|
838
|
+
let currentState = handoffStates.get(handoffId);
|
|
839
|
+
// Check gov_handoffs if not tracked
|
|
840
|
+
if (!currentState) {
|
|
841
|
+
const row = conn.get('SELECT state FROM gov_handoffs WHERE handoff_id = ?', [handoffId]);
|
|
842
|
+
if (row) {
|
|
843
|
+
currentState = handoffStateFromDDL(row['state']);
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
// Debt 2: Reject phantom entities — handoff must exist
|
|
847
|
+
if (!currentState) {
|
|
848
|
+
return lifecycleError(`Handoff ${handoffId} not found in tracked state or gov_handoffs — cannot transition phantom entity`, 'ST-062');
|
|
849
|
+
}
|
|
850
|
+
if (HANDOFF_TERMINAL.has(currentState)) {
|
|
851
|
+
return lifecycleError(`Handoff ${handoffId} is in terminal state '${currentState}' — no transitions allowed`, 'ST-062, BC-070');
|
|
852
|
+
}
|
|
853
|
+
const now = nowISO();
|
|
854
|
+
handoffStates.set(handoffId, toState);
|
|
855
|
+
// Also update gov_handoffs if it exists
|
|
856
|
+
const ddlState = handoffStateToDDL(toState);
|
|
857
|
+
conn.run('UPDATE gov_handoffs SET state = ?, updated_at = ? WHERE handoff_id = ?', [ddlState, now, handoffId]);
|
|
858
|
+
return ok({ fromState: currentState, toState, timestamp: now });
|
|
859
|
+
},
|
|
860
|
+
enforceRunTransition(conn, runId, toState) {
|
|
861
|
+
let currentState = runStates.get(runId);
|
|
862
|
+
if (!currentState) {
|
|
863
|
+
const row = conn.get('SELECT state FROM gov_runs WHERE run_id = ?', [runId]);
|
|
864
|
+
if (row)
|
|
865
|
+
currentState = row['state'];
|
|
866
|
+
}
|
|
867
|
+
// Debt 2: Reject phantom entities — run must exist
|
|
868
|
+
if (!currentState) {
|
|
869
|
+
return lifecycleError(`Run ${runId} not found in tracked state or gov_runs — cannot transition phantom entity`, 'ST-020');
|
|
870
|
+
}
|
|
871
|
+
if (RUN_TERMINAL.has(currentState)) {
|
|
872
|
+
return lifecycleError(`Run ${runId} is in terminal state '${currentState}' — no transitions allowed`, 'ST-020, BC-070');
|
|
873
|
+
}
|
|
874
|
+
const now = nowISO();
|
|
875
|
+
runStates.set(runId, toState);
|
|
876
|
+
conn.run('UPDATE gov_runs SET state = ?, completed_at = ? WHERE run_id = ?', [toState, now, runId]);
|
|
877
|
+
return ok({ fromState: currentState, toState, timestamp: now });
|
|
878
|
+
},
|
|
879
|
+
};
|
|
880
|
+
}
|
|
881
|
+
// ============================================================================
|
|
882
|
+
// EvalCaseStore (Deliverable 8)
|
|
883
|
+
// ============================================================================
|
|
884
|
+
export function createEvalCaseStoreImpl() {
|
|
885
|
+
return {
|
|
886
|
+
create(conn, evalCase) {
|
|
887
|
+
try {
|
|
888
|
+
conn.run(`INSERT INTO gov_eval_cases (eval_case_id, tenant_id, attempt_id, contract_id, dimensions, provenance, pinned_versions, contract_satisfaction, schema_version, created_at)
|
|
889
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
890
|
+
evalCase.evalCaseId, evalCase.tenantId, evalCase.attemptId,
|
|
891
|
+
evalCase.contractId, JSON.stringify(evalCase.dimensions),
|
|
892
|
+
JSON.stringify(evalCase.provenance), JSON.stringify(evalCase.pinnedVersions),
|
|
893
|
+
evalCase.contractSatisfaction === null ? null : (evalCase.contractSatisfaction ? 1 : 0),
|
|
894
|
+
evalCase.schemaVersion, evalCase.createdAt,
|
|
895
|
+
]);
|
|
896
|
+
return ok(evalCase);
|
|
897
|
+
}
|
|
898
|
+
catch (e) {
|
|
899
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
900
|
+
if (msg.includes('UNIQUE') || msg.includes('PRIMARY KEY')) {
|
|
901
|
+
return err('EVAL_ALREADY_EXISTS', `EvalCase ${evalCase.evalCaseId} already exists`, 'BC-090');
|
|
902
|
+
}
|
|
903
|
+
return err('EVAL_CREATE_FAILED', msg, 'BC-090');
|
|
904
|
+
}
|
|
905
|
+
},
|
|
906
|
+
get(conn, evalCaseId) {
|
|
907
|
+
const row = conn.get('SELECT * FROM gov_eval_cases WHERE eval_case_id = ?', [evalCaseId]);
|
|
908
|
+
if (!row)
|
|
909
|
+
return ok(null);
|
|
910
|
+
return ok(rowToEvalCase(row));
|
|
911
|
+
},
|
|
912
|
+
getByAttempt(conn, attemptId) {
|
|
913
|
+
const row = conn.get('SELECT * FROM gov_eval_cases WHERE attempt_id = ?', [attemptId]);
|
|
914
|
+
if (!row)
|
|
915
|
+
return ok(null);
|
|
916
|
+
return ok(rowToEvalCase(row));
|
|
917
|
+
},
|
|
918
|
+
getByContract(conn, contractId) {
|
|
919
|
+
const rows = conn.query('SELECT * FROM gov_eval_cases WHERE contract_id = ? ORDER BY created_at', [contractId]);
|
|
920
|
+
return ok(rows.map(rowToEvalCase));
|
|
921
|
+
},
|
|
922
|
+
};
|
|
923
|
+
}
|
|
924
|
+
function rowToEvalCase(row) {
|
|
925
|
+
const satisfaction = row['contract_satisfaction'];
|
|
926
|
+
return {
|
|
927
|
+
evalCaseId: row['eval_case_id'],
|
|
928
|
+
tenantId: row['tenant_id'],
|
|
929
|
+
attemptId: row['attempt_id'],
|
|
930
|
+
contractId: row['contract_id'] ?? null,
|
|
931
|
+
dimensions: JSON.parse(row['dimensions']),
|
|
932
|
+
provenance: JSON.parse(row['provenance']),
|
|
933
|
+
pinnedVersions: JSON.parse(row['pinned_versions']),
|
|
934
|
+
contractSatisfaction: satisfaction === null || satisfaction === undefined ? null : (satisfaction === 1),
|
|
935
|
+
schemaVersion: row['schema_version'],
|
|
936
|
+
createdAt: row['created_at'],
|
|
937
|
+
};
|
|
938
|
+
}
|
|
939
|
+
// ============================================================================
|
|
940
|
+
// CapabilityManifestStore (Deliverable 9)
|
|
941
|
+
// ============================================================================
|
|
942
|
+
export function createCapabilityManifestStoreImpl() {
|
|
943
|
+
return {
|
|
944
|
+
register(conn, manifest) {
|
|
945
|
+
try {
|
|
946
|
+
conn.run(`INSERT INTO gov_capability_manifests (manifest_id, capability_type, trust_tier, side_effect_class, secret_requirements, schema_version, created_at)
|
|
947
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
|
948
|
+
manifest.manifestId, manifest.capabilityType,
|
|
949
|
+
manifest.trustTier, manifest.sideEffectClass,
|
|
950
|
+
JSON.stringify(manifest.secretRequirements),
|
|
951
|
+
manifest.schemaVersion, manifest.createdAt,
|
|
952
|
+
]);
|
|
953
|
+
return ok(manifest);
|
|
954
|
+
}
|
|
955
|
+
catch (e) {
|
|
956
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
957
|
+
if (msg.includes('UNIQUE') || msg.includes('PRIMARY KEY')) {
|
|
958
|
+
return err('CAPABILITY_ALREADY_EXISTS', `Capability manifest with type '${manifest.capabilityType}' already exists`, 'BC-103');
|
|
959
|
+
}
|
|
960
|
+
return err('CAPABILITY_REGISTER_FAILED', msg, 'BC-100');
|
|
961
|
+
}
|
|
962
|
+
},
|
|
963
|
+
get(conn, manifestId) {
|
|
964
|
+
const row = conn.get('SELECT * FROM gov_capability_manifests WHERE manifest_id = ?', [manifestId]);
|
|
965
|
+
if (!row)
|
|
966
|
+
return ok(null);
|
|
967
|
+
return ok(rowToCapabilityManifest(row));
|
|
968
|
+
},
|
|
969
|
+
getByType(conn, capabilityType) {
|
|
970
|
+
const row = conn.get('SELECT * FROM gov_capability_manifests WHERE capability_type = ?', [capabilityType]);
|
|
971
|
+
if (!row)
|
|
972
|
+
return ok(null);
|
|
973
|
+
return ok(rowToCapabilityManifest(row));
|
|
974
|
+
},
|
|
975
|
+
};
|
|
976
|
+
}
|
|
977
|
+
function rowToCapabilityManifest(row) {
|
|
978
|
+
return {
|
|
979
|
+
manifestId: row['manifest_id'],
|
|
980
|
+
capabilityType: row['capability_type'],
|
|
981
|
+
trustTier: row['trust_tier'],
|
|
982
|
+
sideEffectClass: row['side_effect_class'],
|
|
983
|
+
secretRequirements: JSON.parse(row['secret_requirements']),
|
|
984
|
+
schemaVersion: row['schema_version'],
|
|
985
|
+
createdAt: row['created_at'],
|
|
986
|
+
};
|
|
987
|
+
}
|
|
988
|
+
// ============================================================================
|
|
989
|
+
// IdempotencyStore + ResumeTokenStore + PayloadCanonicalizer (Deliverable 12)
|
|
990
|
+
// ============================================================================
|
|
991
|
+
export function createIdempotencyStoreImpl() {
|
|
992
|
+
return {
|
|
993
|
+
check(conn, key) {
|
|
994
|
+
const row = conn.get(`SELECT * FROM gov_idempotency_keys
|
|
995
|
+
WHERE tenant_id = ? AND caller_id = ? AND syscall_class = ? AND target_scope = ? AND key = ?`, [key.tenantId, key.callerId, key.syscallClass, key.targetScope, key.key]);
|
|
996
|
+
if (!row) {
|
|
997
|
+
return ok({ outcome: 'new' });
|
|
998
|
+
}
|
|
999
|
+
// INV-131: TTL enforcement — expired keys treated as 'new'
|
|
1000
|
+
const expiresAt = row['expires_at'];
|
|
1001
|
+
if (new Date(expiresAt).getTime() < _govTime.nowMs()) {
|
|
1002
|
+
return ok({ outcome: 'new' });
|
|
1003
|
+
}
|
|
1004
|
+
// INV-132: Canonicalization version mismatch → treated as 'new'
|
|
1005
|
+
const storedVersion = row['canonicalization_version'];
|
|
1006
|
+
if (storedVersion !== key.canonicalizationVersion) {
|
|
1007
|
+
return ok({ outcome: 'new' });
|
|
1008
|
+
}
|
|
1009
|
+
// BC-132: Same hash → deduplicated
|
|
1010
|
+
const storedHash = row['payload_hash'];
|
|
1011
|
+
if (storedHash === key.payloadHash) {
|
|
1012
|
+
return ok({
|
|
1013
|
+
outcome: 'deduplicated',
|
|
1014
|
+
originalCorrelationId: row['correlation_id'],
|
|
1015
|
+
});
|
|
1016
|
+
}
|
|
1017
|
+
// BC-133: Different hash → conflict
|
|
1018
|
+
return ok({
|
|
1019
|
+
outcome: 'conflict',
|
|
1020
|
+
existingPayloadHash: storedHash,
|
|
1021
|
+
});
|
|
1022
|
+
},
|
|
1023
|
+
record(conn, key) {
|
|
1024
|
+
try {
|
|
1025
|
+
conn.run(`INSERT OR REPLACE INTO gov_idempotency_keys (tenant_id, caller_id, syscall_class, target_scope, key, payload_hash, canonicalization_version, correlation_id, created_at, expires_at)
|
|
1026
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
1027
|
+
key.tenantId, key.callerId, key.syscallClass, key.targetScope, key.key,
|
|
1028
|
+
key.payloadHash, key.canonicalizationVersion, key.correlationId,
|
|
1029
|
+
key.createdAt, key.expiresAt,
|
|
1030
|
+
]);
|
|
1031
|
+
return ok(undefined);
|
|
1032
|
+
}
|
|
1033
|
+
catch (e) {
|
|
1034
|
+
return err('IDEMPOTENCY_RECORD_FAILED', e instanceof Error ? e.message : String(e), 'BC-130');
|
|
1035
|
+
}
|
|
1036
|
+
},
|
|
1037
|
+
};
|
|
1038
|
+
}
|
|
1039
|
+
export function createResumeTokenStoreImpl() {
|
|
1040
|
+
return {
|
|
1041
|
+
create(conn, token) {
|
|
1042
|
+
// BC-136: Generate plaintext token, store only the hash
|
|
1043
|
+
const plaintextToken = randomUUID();
|
|
1044
|
+
// BC-137 / BRK-018: Derive hash FROM the generated plaintext.
|
|
1045
|
+
// The caller-provided token.tokenHash is ignored — the system computes
|
|
1046
|
+
// the hash to ensure the returned plaintext IS the pre-image of the stored hash.
|
|
1047
|
+
const derivedHash = createHash('sha256').update(plaintextToken).digest('hex');
|
|
1048
|
+
// Handle `suspensionId` alias from contract tests (passed via type cast)
|
|
1049
|
+
const tokenAny = token;
|
|
1050
|
+
const suspensionRecordId = (token.suspensionRecordId ?? tokenAny['suspensionId'] ?? 'unknown');
|
|
1051
|
+
const decisionId = (token.decisionId ?? 'system');
|
|
1052
|
+
const expiresAt = token.expiresAt ?? new Date(_govTime.nowMs() + 3600000).toISOString(); // Default: 1 hour
|
|
1053
|
+
const createdAt = token.createdAt ?? nowISO();
|
|
1054
|
+
try {
|
|
1055
|
+
conn.run(`INSERT INTO gov_resume_tokens (token_hash, tenant_id, suspension_record_id, decision_id, expires_at, consumed, consumed_at, created_at)
|
|
1056
|
+
VALUES (?, ?, ?, ?, ?, 0, NULL, ?)`, [
|
|
1057
|
+
derivedHash, token.tenantId,
|
|
1058
|
+
suspensionRecordId, decisionId,
|
|
1059
|
+
expiresAt, createdAt,
|
|
1060
|
+
]);
|
|
1061
|
+
return ok({ plaintextToken });
|
|
1062
|
+
}
|
|
1063
|
+
catch (e) {
|
|
1064
|
+
return err('RESUME_TOKEN_CREATE_FAILED', e instanceof Error ? e.message : String(e), 'BC-136');
|
|
1065
|
+
}
|
|
1066
|
+
},
|
|
1067
|
+
consume(conn, tokenHash) {
|
|
1068
|
+
// BRK-026: Atomic consume — single UPDATE with consumed=0 guard eliminates TOCTOU.
|
|
1069
|
+
// If two concurrent callers race, exactly one gets changes=1.
|
|
1070
|
+
const now = nowISO();
|
|
1071
|
+
const result = conn.run(`UPDATE gov_resume_tokens SET consumed = 1, consumed_at = ?
|
|
1072
|
+
WHERE token_hash = ? AND consumed = 0 AND expires_at >= ?`, [now, tokenHash, now]);
|
|
1073
|
+
if (result.changes === 1) {
|
|
1074
|
+
// Atomic consume succeeded — read back the full record
|
|
1075
|
+
const row = conn.get('SELECT * FROM gov_resume_tokens WHERE token_hash = ?', [tokenHash]);
|
|
1076
|
+
return ok({
|
|
1077
|
+
tenantId: row['tenant_id'],
|
|
1078
|
+
tokenHash: row['token_hash'],
|
|
1079
|
+
suspensionRecordId: row['suspension_record_id'],
|
|
1080
|
+
decisionId: row['decision_id'],
|
|
1081
|
+
expiresAt: row['expires_at'],
|
|
1082
|
+
consumed: true,
|
|
1083
|
+
consumedAt: now,
|
|
1084
|
+
createdAt: row['created_at'],
|
|
1085
|
+
schemaVersion: row['schema_version'] ?? '0',
|
|
1086
|
+
});
|
|
1087
|
+
}
|
|
1088
|
+
// UPDATE matched zero rows — determine why for the correct error code
|
|
1089
|
+
const row = conn.get('SELECT consumed, expires_at FROM gov_resume_tokens WHERE token_hash = ?', [tokenHash]);
|
|
1090
|
+
if (!row) {
|
|
1091
|
+
return err('RESUME_TOKEN_NOT_FOUND', `Resume token not found`, 'BC-138');
|
|
1092
|
+
}
|
|
1093
|
+
if (row['consumed'] === 1) {
|
|
1094
|
+
return err('RESUME_TOKEN_ALREADY_CONSUMED', `Resume token has already been consumed`, 'BC-138');
|
|
1095
|
+
}
|
|
1096
|
+
return err('RESUME_TOKEN_EXPIRED', `Resume token has expired`, 'BC-138');
|
|
1097
|
+
},
|
|
1098
|
+
};
|
|
1099
|
+
}
|
|
1100
|
+
export function createPayloadCanonicalizerImpl() {
|
|
1101
|
+
return {
|
|
1102
|
+
version: '1.0.0',
|
|
1103
|
+
canonicalize(payload) {
|
|
1104
|
+
// BC-134: Sorted-key JSON for deterministic canonicalization
|
|
1105
|
+
const sortedKeys = Object.keys(payload).sort();
|
|
1106
|
+
const sorted = {};
|
|
1107
|
+
for (const key of sortedKeys) {
|
|
1108
|
+
sorted[key] = payload[key];
|
|
1109
|
+
}
|
|
1110
|
+
return JSON.stringify(sorted);
|
|
1111
|
+
},
|
|
1112
|
+
hash(canonicalized) {
|
|
1113
|
+
return createHash('sha256').update(canonicalized).digest('hex');
|
|
1114
|
+
},
|
|
1115
|
+
};
|
|
1116
|
+
}
|
|
1117
|
+
//# sourceMappingURL=governance_stores.js.map
|