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,1250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EGP (Execution Governance Protocol) implementation — all 13 subsystems.
|
|
3
|
+
* Spec ref: EGP v1.0 Design Source (FINAL), Architecture Freeze CF-06/CF-11
|
|
4
|
+
*
|
|
5
|
+
* Phase: v3.3.0 — Execution Governance Implementation (Control 3, Phase 5)
|
|
6
|
+
* Status: IMPLEMENTATION — replaces NotImplementedError harness.
|
|
7
|
+
*
|
|
8
|
+
* Architecture: In-memory stateful implementation within governor factory closure.
|
|
9
|
+
* State lives in Maps (reservations, mission budgets, starvation counters).
|
|
10
|
+
* DatabaseConnection accepted for interface compliance; state is not SQL-backed.
|
|
11
|
+
* StarvationTracker explicitly in-memory per AMB-06.
|
|
12
|
+
*
|
|
13
|
+
* Invariants enforced:
|
|
14
|
+
* EGP-I1 Reservation Isolation (overage doesn't leak across tasks)
|
|
15
|
+
* EGP-I3 Atomic Reclaim on Final Terminal per dimension
|
|
16
|
+
* EGP-I4 Dual-Dimension Enforcement (token + deliberation independently)
|
|
17
|
+
* EGP-I5 Starvation Bound (N+1 cycles → priority promotion)
|
|
18
|
+
* EGP-I6 Branch Failure Policies (isolate, fail-fast, quorum)
|
|
19
|
+
* EGP-I7 Capability Mutability Classification per operation
|
|
20
|
+
* EGP-I8 Retry Consumes Same Reservation (cumulative consumption)
|
|
21
|
+
* EGP-I9 Scheduling Determinism (same inputs → same output)
|
|
22
|
+
* EGP-I10 Running Tasks Not Preemptible
|
|
23
|
+
* EGP-I12 Overage Normalization (clamp to zero, debt to mission)
|
|
24
|
+
* EGP-I13 Conservation Law per dimension
|
|
25
|
+
* EGP-I14 v3.3 task requires reservation for execution (DC-EGP-064)
|
|
26
|
+
*/
|
|
27
|
+
import { RESERVATION_STATUS_TRANSITIONS, DEFAULT_CAPABILITY_MUTABILITY, EGP_EVENTS, RESERVATION_ERROR_CODES, WAVE_ERROR_CODES, BRANCH_FAILURE_ERROR_CODES, SCHEDULER_ERROR_CODES, ENFORCEMENT_ERROR_CODES, } from '../interfaces/egp_types.js';
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// Result Helpers
|
|
30
|
+
// ============================================================================
|
|
31
|
+
function ok(value) {
|
|
32
|
+
return { ok: true, value };
|
|
33
|
+
}
|
|
34
|
+
function err(code, message, spec = '') {
|
|
35
|
+
return { ok: false, error: { code, message, spec } };
|
|
36
|
+
}
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Freeze Helpers
|
|
39
|
+
// ============================================================================
|
|
40
|
+
function freezeReservation(r) {
|
|
41
|
+
return Object.freeze({
|
|
42
|
+
reservationId: r.reservationId,
|
|
43
|
+
taskId: r.taskId,
|
|
44
|
+
missionId: r.missionId,
|
|
45
|
+
reservedTokens: r.reservedTokens,
|
|
46
|
+
consumedTokens: r.consumedTokens,
|
|
47
|
+
reservedDeliberation: r.reservedDeliberation,
|
|
48
|
+
consumedDeliberation: r.consumedDeliberation,
|
|
49
|
+
status: r.status,
|
|
50
|
+
allocationMethod: r.allocationMethod,
|
|
51
|
+
createdAt: r.createdAt,
|
|
52
|
+
releasedAt: r.releasedAt,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function freezeDimension(d) {
|
|
56
|
+
return Object.freeze({
|
|
57
|
+
allocated: d.allocated,
|
|
58
|
+
totalConsumed: d.totalConsumed,
|
|
59
|
+
totalReserved: d.totalReserved,
|
|
60
|
+
unreservedRemaining: d.unreservedRemaining,
|
|
61
|
+
missionDebt: d.missionDebt,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function freezeBudgetState(b) {
|
|
65
|
+
return Object.freeze({
|
|
66
|
+
missionId: b.missionId,
|
|
67
|
+
token: freezeDimension(b.token),
|
|
68
|
+
deliberation: freezeDimension(b.deliberation),
|
|
69
|
+
overBudgetFaultActive: b.token.missionDebt > 0 || b.deliberation.missionDebt > 0,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// ============================================================================
|
|
73
|
+
// Event Emission Helpers
|
|
74
|
+
// ============================================================================
|
|
75
|
+
function emitEvent(deps, type, scope, payload) {
|
|
76
|
+
deps.events.emit({ type, scope, propagation: 'up', payload });
|
|
77
|
+
}
|
|
78
|
+
function emitTrace(deps, conn, ctx, type, payload) {
|
|
79
|
+
if (!deps.traceEmitter)
|
|
80
|
+
return;
|
|
81
|
+
const egpCtx = ctx;
|
|
82
|
+
if (!egpCtx.correlationId)
|
|
83
|
+
return;
|
|
84
|
+
deps.traceEmitter.emit(conn, ctx, {
|
|
85
|
+
correlationId: egpCtx.correlationId,
|
|
86
|
+
type,
|
|
87
|
+
payload,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// Factory: createExecutionGovernorImpl
|
|
92
|
+
// ============================================================================
|
|
93
|
+
export function createExecutionGovernorImpl(deps) {
|
|
94
|
+
// ── Internal State ──
|
|
95
|
+
const reservationMap = new Map();
|
|
96
|
+
const taskIndex = new Map(); // taskId → reservationId
|
|
97
|
+
let reservationCounter = 0;
|
|
98
|
+
let waveCounter = 0;
|
|
99
|
+
// BRK-EGP-B08: Released reservation retention period (ms).
|
|
100
|
+
// Released reservations are cleaned up after this period on next access.
|
|
101
|
+
const RELEASED_RETENTION_MS = 5 * 60 * 1000; // 5 minutes
|
|
102
|
+
const missionBudgets = new Map();
|
|
103
|
+
const starvationCounters = new Map();
|
|
104
|
+
// ── Internal Helpers ──
|
|
105
|
+
function getOrCreateBudget(missionId) {
|
|
106
|
+
const existing = missionBudgets.get(missionId);
|
|
107
|
+
if (existing)
|
|
108
|
+
return existing;
|
|
109
|
+
const budget = {
|
|
110
|
+
missionId,
|
|
111
|
+
token: { allocated: 0, totalConsumed: 0, totalReserved: 0, unreservedRemaining: 0, missionDebt: 0 },
|
|
112
|
+
deliberation: { allocated: 0, totalConsumed: 0, totalReserved: 0, unreservedRemaining: 0, missionDebt: 0 },
|
|
113
|
+
};
|
|
114
|
+
missionBudgets.set(missionId, budget);
|
|
115
|
+
return budget;
|
|
116
|
+
}
|
|
117
|
+
function findReservationByTask(taskId) {
|
|
118
|
+
const resId = taskIndex.get(taskId);
|
|
119
|
+
if (!resId)
|
|
120
|
+
return null;
|
|
121
|
+
const res = reservationMap.get(resId);
|
|
122
|
+
if (!res || res.status === 'released')
|
|
123
|
+
return null;
|
|
124
|
+
return res;
|
|
125
|
+
}
|
|
126
|
+
function validateTransition(current, target) {
|
|
127
|
+
const allowed = RESERVATION_STATUS_TRANSITIONS[current];
|
|
128
|
+
return allowed.includes(target);
|
|
129
|
+
}
|
|
130
|
+
function generateReservationId() {
|
|
131
|
+
return `egp-res-${++reservationCounter}`;
|
|
132
|
+
}
|
|
133
|
+
function generateWaveId() {
|
|
134
|
+
return `egp-wave-${++waveCounter}`;
|
|
135
|
+
}
|
|
136
|
+
// ── 1. BudgetReservationStore ──
|
|
137
|
+
const reservations = Object.freeze({
|
|
138
|
+
create(conn, ctx, input) {
|
|
139
|
+
// Check for existing non-released reservation
|
|
140
|
+
const existing = findReservationByTask(input.taskId);
|
|
141
|
+
if (existing) {
|
|
142
|
+
return err(RESERVATION_ERROR_CODES.ALREADY_EXISTS, `Task ${input.taskId} already has a non-released reservation`, '§5.1');
|
|
143
|
+
}
|
|
144
|
+
const resId = generateReservationId();
|
|
145
|
+
const now = deps.time.nowISO();
|
|
146
|
+
const mutable = {
|
|
147
|
+
reservationId: resId,
|
|
148
|
+
taskId: input.taskId,
|
|
149
|
+
missionId: input.missionId,
|
|
150
|
+
reservedTokens: input.reservedTokens,
|
|
151
|
+
consumedTokens: 0,
|
|
152
|
+
reservedDeliberation: input.reservedDeliberation,
|
|
153
|
+
consumedDeliberation: 0,
|
|
154
|
+
status: 'reserved',
|
|
155
|
+
allocationMethod: input.allocationMethod,
|
|
156
|
+
createdAt: now,
|
|
157
|
+
releasedAt: null,
|
|
158
|
+
};
|
|
159
|
+
reservationMap.set(resId, mutable);
|
|
160
|
+
taskIndex.set(input.taskId, resId);
|
|
161
|
+
// Emit events
|
|
162
|
+
emitEvent(deps, EGP_EVENTS.RESERVATION_CREATED, 'task', {
|
|
163
|
+
reservationId: resId,
|
|
164
|
+
taskId: input.taskId,
|
|
165
|
+
missionId: input.missionId,
|
|
166
|
+
reservedTokens: input.reservedTokens,
|
|
167
|
+
reservedDeliberation: input.reservedDeliberation,
|
|
168
|
+
});
|
|
169
|
+
// Trace emission (Phase 0A)
|
|
170
|
+
emitTrace(deps, conn, ctx, 'egp.reservation.created', {
|
|
171
|
+
reservationId: resId,
|
|
172
|
+
taskId: input.taskId,
|
|
173
|
+
missionId: input.missionId,
|
|
174
|
+
});
|
|
175
|
+
return ok(freezeReservation(mutable));
|
|
176
|
+
},
|
|
177
|
+
createBatch(conn, ctx, inputs) {
|
|
178
|
+
return conn.transaction(() => {
|
|
179
|
+
const results = [];
|
|
180
|
+
for (const input of inputs) {
|
|
181
|
+
const result = reservations.create(conn, ctx, input);
|
|
182
|
+
if (!result.ok)
|
|
183
|
+
return result;
|
|
184
|
+
results.push(result.value);
|
|
185
|
+
}
|
|
186
|
+
return ok(Object.freeze(results));
|
|
187
|
+
});
|
|
188
|
+
},
|
|
189
|
+
getByTaskId(_conn, taskId) {
|
|
190
|
+
const resId = taskIndex.get(taskId);
|
|
191
|
+
if (!resId)
|
|
192
|
+
return ok(null);
|
|
193
|
+
const res = reservationMap.get(resId);
|
|
194
|
+
if (!res)
|
|
195
|
+
return ok(null);
|
|
196
|
+
return ok(freezeReservation(res));
|
|
197
|
+
},
|
|
198
|
+
getById(_conn, reservationId) {
|
|
199
|
+
const res = reservationMap.get(reservationId);
|
|
200
|
+
if (!res) {
|
|
201
|
+
return err(RESERVATION_ERROR_CODES.NOT_FOUND, `Reservation ${reservationId} not found`, '§5.1');
|
|
202
|
+
}
|
|
203
|
+
return ok(freezeReservation(res));
|
|
204
|
+
},
|
|
205
|
+
activate(_conn, reservationId) {
|
|
206
|
+
const res = reservationMap.get(reservationId);
|
|
207
|
+
if (!res) {
|
|
208
|
+
return err(RESERVATION_ERROR_CODES.NOT_FOUND, `Reservation ${reservationId} not found`, '§5.1');
|
|
209
|
+
}
|
|
210
|
+
if (!validateTransition(res.status, 'active')) {
|
|
211
|
+
return err(RESERVATION_ERROR_CODES.INVALID_TRANSITION, `Cannot transition from ${res.status} to active`, '§5.1');
|
|
212
|
+
}
|
|
213
|
+
res.status = 'active';
|
|
214
|
+
emitEvent(deps, EGP_EVENTS.RESERVATION_ACTIVATED, 'task', {
|
|
215
|
+
reservationId, taskId: res.taskId,
|
|
216
|
+
});
|
|
217
|
+
return ok(undefined);
|
|
218
|
+
},
|
|
219
|
+
retain(_conn, reservationId) {
|
|
220
|
+
const res = reservationMap.get(reservationId);
|
|
221
|
+
if (!res) {
|
|
222
|
+
return err(RESERVATION_ERROR_CODES.NOT_FOUND, `Reservation ${reservationId} not found`, '§5.1');
|
|
223
|
+
}
|
|
224
|
+
if (!validateTransition(res.status, 'retained')) {
|
|
225
|
+
return err(RESERVATION_ERROR_CODES.INVALID_TRANSITION, `Cannot transition from ${res.status} to retained`, '§5.1');
|
|
226
|
+
}
|
|
227
|
+
res.status = 'retained';
|
|
228
|
+
emitEvent(deps, EGP_EVENTS.RESERVATION_RETAINED, 'task', {
|
|
229
|
+
reservationId, taskId: res.taskId,
|
|
230
|
+
});
|
|
231
|
+
return ok(undefined);
|
|
232
|
+
},
|
|
233
|
+
reactivate(_conn, reservationId) {
|
|
234
|
+
const res = reservationMap.get(reservationId);
|
|
235
|
+
if (!res) {
|
|
236
|
+
return err(RESERVATION_ERROR_CODES.NOT_FOUND, `Reservation ${reservationId} not found`, '§5.1');
|
|
237
|
+
}
|
|
238
|
+
if (!validateTransition(res.status, 'active')) {
|
|
239
|
+
return err(RESERVATION_ERROR_CODES.INVALID_TRANSITION, `Cannot transition from ${res.status} to active`, '§5.1');
|
|
240
|
+
}
|
|
241
|
+
res.status = 'active';
|
|
242
|
+
emitEvent(deps, EGP_EVENTS.RESERVATION_ACTIVATED, 'task', {
|
|
243
|
+
reservationId, taskId: res.taskId,
|
|
244
|
+
});
|
|
245
|
+
return ok(undefined);
|
|
246
|
+
},
|
|
247
|
+
updateConsumed(_conn, reservationId, tokensConsumed, deliberationConsumed) {
|
|
248
|
+
// DC-EGP-002: Non-negative consumption validation
|
|
249
|
+
if (tokensConsumed < 0 || deliberationConsumed < 0) {
|
|
250
|
+
return err(ENFORCEMENT_ERROR_CODES.INVALID_CONSUMPTION, 'Consumption values must be non-negative', 'DC-EGP-002');
|
|
251
|
+
}
|
|
252
|
+
const res = reservationMap.get(reservationId);
|
|
253
|
+
if (!res) {
|
|
254
|
+
return err(RESERVATION_ERROR_CODES.NOT_FOUND, `Reservation ${reservationId} not found`, '§5.1');
|
|
255
|
+
}
|
|
256
|
+
// EGP-I8: Cumulative consumption across retry attempts
|
|
257
|
+
res.consumedTokens += tokensConsumed;
|
|
258
|
+
res.consumedDeliberation += deliberationConsumed;
|
|
259
|
+
return ok(undefined);
|
|
260
|
+
},
|
|
261
|
+
release(_conn, _ctx, reservationId, reason) {
|
|
262
|
+
const res = reservationMap.get(reservationId);
|
|
263
|
+
if (!res) {
|
|
264
|
+
return err(RESERVATION_ERROR_CODES.NOT_FOUND, `Reservation ${reservationId} not found`, '§5.1');
|
|
265
|
+
}
|
|
266
|
+
if (!validateTransition(res.status, 'released')) {
|
|
267
|
+
return err(RESERVATION_ERROR_CODES.INVALID_TRANSITION, `Cannot transition from ${res.status} to released`, '§5.1');
|
|
268
|
+
}
|
|
269
|
+
// EGP-I3: Atomic reclaim per dimension
|
|
270
|
+
const overageTokens = Math.max(0, res.consumedTokens - res.reservedTokens);
|
|
271
|
+
const overageDeliberation = Math.max(0, res.consumedDeliberation - res.reservedDeliberation);
|
|
272
|
+
const reclaimedTokens = Math.max(0, res.reservedTokens - res.consumedTokens);
|
|
273
|
+
const reclaimedDeliberation = Math.max(0, res.reservedDeliberation - res.consumedDeliberation);
|
|
274
|
+
res.status = 'released';
|
|
275
|
+
res.releasedAt = deps.time.nowISO();
|
|
276
|
+
// Remove from task index (released reservations not found by task lookup)
|
|
277
|
+
taskIndex.delete(res.taskId);
|
|
278
|
+
emitEvent(deps, EGP_EVENTS.RESERVATION_RELEASED, 'task', {
|
|
279
|
+
reservationId, taskId: res.taskId, reason,
|
|
280
|
+
reclaimedTokens, reclaimedDeliberation,
|
|
281
|
+
overageTokens, overageDeliberation,
|
|
282
|
+
});
|
|
283
|
+
return ok(Object.freeze({ reclaimedTokens, reclaimedDeliberation, overageTokens, overageDeliberation }));
|
|
284
|
+
},
|
|
285
|
+
getActiveByMission(_conn, missionId) {
|
|
286
|
+
const active = [];
|
|
287
|
+
const now = deps.time.nowMs();
|
|
288
|
+
// BRK-EGP-B08: Opportunistic cleanup of released reservations
|
|
289
|
+
// older than retention period for this mission.
|
|
290
|
+
const toRemove = [];
|
|
291
|
+
for (const [resId, res] of reservationMap.entries()) {
|
|
292
|
+
if (res.missionId === missionId) {
|
|
293
|
+
if (res.status === 'released' && res.releasedAt) {
|
|
294
|
+
const ageMs = now - new Date(res.releasedAt).getTime();
|
|
295
|
+
if (ageMs > RELEASED_RETENTION_MS) {
|
|
296
|
+
toRemove.push(resId);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else if (res.status !== 'released') {
|
|
300
|
+
active.push(freezeReservation(res));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
for (const resId of toRemove) {
|
|
305
|
+
reservationMap.delete(resId);
|
|
306
|
+
}
|
|
307
|
+
return ok(Object.freeze(active));
|
|
308
|
+
},
|
|
309
|
+
});
|
|
310
|
+
// ── 2. MissionBudgetLedger ──
|
|
311
|
+
const ledger = Object.freeze({
|
|
312
|
+
getState(_conn, missionId) {
|
|
313
|
+
const budget = getOrCreateBudget(missionId);
|
|
314
|
+
return ok(freezeBudgetState(budget));
|
|
315
|
+
},
|
|
316
|
+
reserveFromPool(_conn, missionId, tokenAmount, deliberationAmount) {
|
|
317
|
+
const budget = getOrCreateBudget(missionId);
|
|
318
|
+
budget.token.unreservedRemaining -= tokenAmount;
|
|
319
|
+
budget.token.totalReserved += tokenAmount;
|
|
320
|
+
budget.deliberation.unreservedRemaining -= deliberationAmount;
|
|
321
|
+
budget.deliberation.totalReserved += deliberationAmount;
|
|
322
|
+
return ok(undefined);
|
|
323
|
+
},
|
|
324
|
+
returnToPool(_conn, missionId, tokenAmount, deliberationAmount) {
|
|
325
|
+
const budget = getOrCreateBudget(missionId);
|
|
326
|
+
budget.token.unreservedRemaining += tokenAmount;
|
|
327
|
+
budget.token.totalReserved -= tokenAmount;
|
|
328
|
+
budget.deliberation.unreservedRemaining += deliberationAmount;
|
|
329
|
+
budget.deliberation.totalReserved -= deliberationAmount;
|
|
330
|
+
return ok(undefined);
|
|
331
|
+
},
|
|
332
|
+
recordConsumption(_conn, missionId, tokenAmount, deliberationAmount) {
|
|
333
|
+
const budget = getOrCreateBudget(missionId);
|
|
334
|
+
budget.token.totalConsumed += tokenAmount;
|
|
335
|
+
budget.deliberation.totalConsumed += deliberationAmount;
|
|
336
|
+
return ok(undefined);
|
|
337
|
+
},
|
|
338
|
+
recordOverage(_conn, _ctx, missionId, tokenOverage, deliberationOverage) {
|
|
339
|
+
const budget = getOrCreateBudget(missionId);
|
|
340
|
+
const triggeringDimensions = [];
|
|
341
|
+
// Token dimension
|
|
342
|
+
if (tokenOverage > 0) {
|
|
343
|
+
if (tokenOverage > budget.token.unreservedRemaining) {
|
|
344
|
+
const excess = tokenOverage - budget.token.unreservedRemaining;
|
|
345
|
+
budget.token.unreservedRemaining = 0;
|
|
346
|
+
budget.token.missionDebt += excess;
|
|
347
|
+
triggeringDimensions.push('token');
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
budget.token.unreservedRemaining -= tokenOverage;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
// Deliberation dimension
|
|
354
|
+
if (deliberationOverage > 0) {
|
|
355
|
+
if (deliberationOverage > budget.deliberation.unreservedRemaining) {
|
|
356
|
+
const excess = deliberationOverage - budget.deliberation.unreservedRemaining;
|
|
357
|
+
budget.deliberation.unreservedRemaining = 0;
|
|
358
|
+
budget.deliberation.missionDebt += excess;
|
|
359
|
+
triggeringDimensions.push('deliberation');
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
budget.deliberation.unreservedRemaining -= deliberationOverage;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// EGP-I12: Over-budget fault state
|
|
366
|
+
if (budget.token.missionDebt > 0 || budget.deliberation.missionDebt > 0) {
|
|
367
|
+
const fault = Object.freeze({
|
|
368
|
+
missionId,
|
|
369
|
+
active: true,
|
|
370
|
+
triggeringDimensions: Object.freeze(triggeringDimensions),
|
|
371
|
+
tokenDebt: budget.token.missionDebt,
|
|
372
|
+
deliberationDebt: budget.deliberation.missionDebt,
|
|
373
|
+
admissionBlocked: true,
|
|
374
|
+
schedulingBlocked: true,
|
|
375
|
+
});
|
|
376
|
+
emitEvent(deps, EGP_EVENTS.MISSION_BUDGET_EXCEEDED, 'mission', {
|
|
377
|
+
missionId,
|
|
378
|
+
tokenDebt: budget.token.missionDebt,
|
|
379
|
+
deliberationDebt: budget.deliberation.missionDebt,
|
|
380
|
+
});
|
|
381
|
+
return ok(fault);
|
|
382
|
+
}
|
|
383
|
+
return ok(null);
|
|
384
|
+
},
|
|
385
|
+
checkConservation(conn, missionId) {
|
|
386
|
+
const budget = getOrCreateBudget(missionId);
|
|
387
|
+
// EGP-I13: allocated + missionDebt = totalConsumed + totalReserved + unreservedRemaining
|
|
388
|
+
const tokenLeft = budget.token.allocated + budget.token.missionDebt;
|
|
389
|
+
const tokenRight = budget.token.totalConsumed + budget.token.totalReserved + budget.token.unreservedRemaining;
|
|
390
|
+
const tokenDelta = tokenLeft - tokenRight;
|
|
391
|
+
const delibLeft = budget.deliberation.allocated + budget.deliberation.missionDebt;
|
|
392
|
+
const delibRight = budget.deliberation.totalConsumed + budget.deliberation.totalReserved + budget.deliberation.unreservedRemaining;
|
|
393
|
+
const delibDelta = delibLeft - delibRight;
|
|
394
|
+
const result = Object.freeze({
|
|
395
|
+
holds: tokenDelta === 0 && delibDelta === 0,
|
|
396
|
+
token: Object.freeze({ leftSide: tokenLeft, rightSide: tokenRight, delta: tokenDelta }),
|
|
397
|
+
deliberation: Object.freeze({ leftSide: delibLeft, rightSide: delibRight, delta: delibDelta }),
|
|
398
|
+
});
|
|
399
|
+
// DC-EGP-051: Audit entry for conservation check
|
|
400
|
+
deps.audit.append(conn, {
|
|
401
|
+
tenantId: null,
|
|
402
|
+
actorType: 'system',
|
|
403
|
+
actorId: 'egp',
|
|
404
|
+
action: 'conservation_check',
|
|
405
|
+
resourceType: 'mission',
|
|
406
|
+
resourceId: missionId,
|
|
407
|
+
detail: {
|
|
408
|
+
holds: result.holds,
|
|
409
|
+
tokenDelta,
|
|
410
|
+
delibDelta,
|
|
411
|
+
tokenLeft,
|
|
412
|
+
tokenRight,
|
|
413
|
+
delibLeft,
|
|
414
|
+
delibRight,
|
|
415
|
+
},
|
|
416
|
+
});
|
|
417
|
+
return ok(result);
|
|
418
|
+
},
|
|
419
|
+
initializeBudget(_conn, missionId, tokenAllocation, deliberationAllocation) {
|
|
420
|
+
const budget = getOrCreateBudget(missionId);
|
|
421
|
+
budget.token.allocated = tokenAllocation;
|
|
422
|
+
budget.token.unreservedRemaining = tokenAllocation;
|
|
423
|
+
budget.deliberation.allocated = deliberationAllocation;
|
|
424
|
+
budget.deliberation.unreservedRemaining = deliberationAllocation;
|
|
425
|
+
return ok(undefined);
|
|
426
|
+
},
|
|
427
|
+
finalizeReservation(_conn, missionId, consumedTokens, consumedDeliberation, reclaimedTokens, reclaimedDeliberation) {
|
|
428
|
+
const budget = getOrCreateBudget(missionId);
|
|
429
|
+
// EGP-I3 + EGP-I13: Atomic reservation finalization
|
|
430
|
+
// reserved -= (consumed + reclaimed) — full reservation removed
|
|
431
|
+
budget.token.totalReserved -= (consumedTokens + reclaimedTokens);
|
|
432
|
+
budget.deliberation.totalReserved -= (consumedDeliberation + reclaimedDeliberation);
|
|
433
|
+
// unreserved += reclaimed — unconsumed returned to pool
|
|
434
|
+
budget.token.unreservedRemaining += reclaimedTokens;
|
|
435
|
+
budget.deliberation.unreservedRemaining += reclaimedDeliberation;
|
|
436
|
+
// consumed += consumed — consumption recorded at mission level
|
|
437
|
+
budget.token.totalConsumed += consumedTokens;
|
|
438
|
+
budget.deliberation.totalConsumed += consumedDeliberation;
|
|
439
|
+
return ok(undefined);
|
|
440
|
+
},
|
|
441
|
+
});
|
|
442
|
+
// ── 3. WaveComposer ──
|
|
443
|
+
const waveComposer = Object.freeze({
|
|
444
|
+
compose(_conn, _ctx, input) {
|
|
445
|
+
// Validate inputs (DC-EGP-068)
|
|
446
|
+
if (input.eligibleTasks.length === 0) {
|
|
447
|
+
return err(WAVE_ERROR_CODES.NO_ELIGIBLE_TASKS, 'No eligible tasks for wave composition', 'PSD-3');
|
|
448
|
+
}
|
|
449
|
+
if (input.tokenPool < 0 || input.deliberationPool < 0) {
|
|
450
|
+
return err(WAVE_ERROR_CODES.INVALID_POOL, 'Pool values must be non-negative', 'DC-EGP-068');
|
|
451
|
+
}
|
|
452
|
+
// Check for duplicate taskIds
|
|
453
|
+
const taskIdSet = new Set();
|
|
454
|
+
for (const task of input.eligibleTasks) {
|
|
455
|
+
if (taskIdSet.has(task.taskId)) {
|
|
456
|
+
return err(WAVE_ERROR_CODES.DUPLICATE_TASK, `Duplicate taskId: ${task.taskId}`, 'DC-EGP-068');
|
|
457
|
+
}
|
|
458
|
+
taskIdSet.add(task.taskId);
|
|
459
|
+
}
|
|
460
|
+
// Check for invalid estimates
|
|
461
|
+
for (const task of input.eligibleTasks) {
|
|
462
|
+
if (task.estimatedTokens < 0 || isNaN(task.estimatedTokens) ||
|
|
463
|
+
task.estimatedDeliberationTokens < 0 || isNaN(task.estimatedDeliberationTokens)) {
|
|
464
|
+
return err(WAVE_ERROR_CODES.INVALID_TASK_ESTIMATE, `Invalid estimate for task ${task.taskId}`, 'DC-EGP-068');
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
// EGP-I9: Snapshot pool (immutable during composition)
|
|
468
|
+
const tokenPoolSnapshot = input.tokenPool;
|
|
469
|
+
const deliberationPoolSnapshot = input.deliberationPool;
|
|
470
|
+
const theWaveId = generateWaveId();
|
|
471
|
+
// Sort by priority for determinism (EGP-I9)
|
|
472
|
+
const sortedTasks = [...input.eligibleTasks].sort((a, b) => a.priority - b.priority);
|
|
473
|
+
// Iterative allocation: allocate, exclude below-minimum, re-allocate with remaining tasks
|
|
474
|
+
// This ensures that when equal allocation produces sub-minimum shares, we remove tasks
|
|
475
|
+
// and give the remaining tasks larger shares until all scheduled tasks meet minimums.
|
|
476
|
+
let candidateTasks = [...sortedTasks];
|
|
477
|
+
const excluded = [];
|
|
478
|
+
let stable = false;
|
|
479
|
+
// BRK-EGP-B07: Math.floor in allocation produces budget "dust" — the total
|
|
480
|
+
// allocated tokens may be less than the pool by up to (N-1) tokens where N is
|
|
481
|
+
// the number of scheduled tasks. This is accepted behavior: floor guarantees no
|
|
482
|
+
// individual task receives more than its share (prevents over-allocation), and the
|
|
483
|
+
// dust (≤ N-1 tokens) returns to the unreserved pool implicitly. The dust amount
|
|
484
|
+
// is bounded and does not accumulate across waves. Conservation law still holds
|
|
485
|
+
// because allocated - sum(reservations) = dust ≥ 0, which is accounted for in
|
|
486
|
+
// the unreservedRemaining term.
|
|
487
|
+
while (!stable) {
|
|
488
|
+
stable = true;
|
|
489
|
+
const allocations = new Map();
|
|
490
|
+
const candDelibTasks = candidateTasks.filter(t => t.requiresDeliberation);
|
|
491
|
+
if (input.allocationMethod === 'proportional') {
|
|
492
|
+
const totalEstTokens = candidateTasks.reduce((s, t) => s + t.estimatedTokens, 0);
|
|
493
|
+
const totalEstDelib = candDelibTasks.reduce((s, t) => s + t.estimatedDeliberationTokens, 0);
|
|
494
|
+
for (const task of candidateTasks) {
|
|
495
|
+
const tokenShare = totalEstTokens > 0
|
|
496
|
+
? (task.estimatedTokens / totalEstTokens) * tokenPoolSnapshot
|
|
497
|
+
: tokenPoolSnapshot / candidateTasks.length;
|
|
498
|
+
let delibShare = 0;
|
|
499
|
+
if (task.requiresDeliberation && totalEstDelib > 0) {
|
|
500
|
+
delibShare = (task.estimatedDeliberationTokens / totalEstDelib) * deliberationPoolSnapshot;
|
|
501
|
+
}
|
|
502
|
+
allocations.set(task.taskId, {
|
|
503
|
+
tokens: Math.floor(tokenShare),
|
|
504
|
+
deliberation: Math.floor(delibShare),
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
else if (input.allocationMethod === 'equal') {
|
|
509
|
+
const tokenPerTask = candidateTasks.length > 0
|
|
510
|
+
? Math.floor(tokenPoolSnapshot / candidateTasks.length)
|
|
511
|
+
: 0;
|
|
512
|
+
const delibPerTask = candDelibTasks.length > 0
|
|
513
|
+
? Math.floor(deliberationPoolSnapshot / candDelibTasks.length)
|
|
514
|
+
: 0;
|
|
515
|
+
for (const task of candidateTasks) {
|
|
516
|
+
allocations.set(task.taskId, {
|
|
517
|
+
tokens: tokenPerTask,
|
|
518
|
+
deliberation: task.requiresDeliberation ? delibPerTask : 0,
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
else if (input.allocationMethod === 'explicit') {
|
|
523
|
+
for (const task of candidateTasks) {
|
|
524
|
+
allocations.set(task.taskId, {
|
|
525
|
+
tokens: task.estimatedTokens,
|
|
526
|
+
deliberation: task.requiresDeliberation ? task.estimatedDeliberationTokens : 0,
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
// Check if any candidate is below minimum viable — if so, exclude ONE (lowest priority)
|
|
531
|
+
// and re-iterate. Excluding only one at a time ensures remaining tasks get larger shares
|
|
532
|
+
// on the next pass, preventing the case where all tasks are excluded simultaneously
|
|
533
|
+
// when re-allocation with fewer tasks would produce viable shares.
|
|
534
|
+
let excludedOne = false;
|
|
535
|
+
// Iterate in reverse (lowest priority first) to exclude the least important task
|
|
536
|
+
for (let i = candidateTasks.length - 1; i >= 0; i--) {
|
|
537
|
+
const task = candidateTasks[i];
|
|
538
|
+
const alloc = allocations.get(task.taskId);
|
|
539
|
+
if (alloc.tokens < input.minimumViableTokens) {
|
|
540
|
+
excluded.push({ taskId: task.taskId, reason: `Token allocation ${alloc.tokens} below minimum ${input.minimumViableTokens}` });
|
|
541
|
+
candidateTasks.splice(i, 1);
|
|
542
|
+
stable = false;
|
|
543
|
+
excludedOne = true;
|
|
544
|
+
break; // Exclude only one per iteration, then re-allocate
|
|
545
|
+
}
|
|
546
|
+
if (task.requiresDeliberation && alloc.deliberation < input.minimumViableDeliberation) {
|
|
547
|
+
excluded.push({ taskId: task.taskId, reason: `Deliberation allocation ${alloc.deliberation} below minimum ${input.minimumViableDeliberation}` });
|
|
548
|
+
candidateTasks.splice(i, 1);
|
|
549
|
+
stable = false;
|
|
550
|
+
excludedOne = true;
|
|
551
|
+
break; // Exclude only one per iteration, then re-allocate
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
if (!excludedOne) {
|
|
555
|
+
// All candidates meet minimums — stable
|
|
556
|
+
stable = true;
|
|
557
|
+
}
|
|
558
|
+
if (candidateTasks.length === 0)
|
|
559
|
+
break;
|
|
560
|
+
}
|
|
561
|
+
const scheduled = candidateTasks;
|
|
562
|
+
// Compute final allocations for scheduled tasks
|
|
563
|
+
const finalAllocations = new Map();
|
|
564
|
+
const finalDelibTasks = scheduled.filter(t => t.requiresDeliberation);
|
|
565
|
+
if (input.allocationMethod === 'proportional') {
|
|
566
|
+
const totalEstTokens = scheduled.reduce((s, t) => s + t.estimatedTokens, 0);
|
|
567
|
+
const totalEstDelib = finalDelibTasks.reduce((s, t) => s + t.estimatedDeliberationTokens, 0);
|
|
568
|
+
for (const task of scheduled) {
|
|
569
|
+
const tokenShare = totalEstTokens > 0
|
|
570
|
+
? (task.estimatedTokens / totalEstTokens) * tokenPoolSnapshot
|
|
571
|
+
: tokenPoolSnapshot / scheduled.length;
|
|
572
|
+
let delibShare = 0;
|
|
573
|
+
if (task.requiresDeliberation && totalEstDelib > 0) {
|
|
574
|
+
delibShare = (task.estimatedDeliberationTokens / totalEstDelib) * deliberationPoolSnapshot;
|
|
575
|
+
}
|
|
576
|
+
finalAllocations.set(task.taskId, {
|
|
577
|
+
tokens: Math.floor(tokenShare),
|
|
578
|
+
deliberation: Math.floor(delibShare),
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
else if (input.allocationMethod === 'equal') {
|
|
583
|
+
const tokenPerTask = scheduled.length > 0
|
|
584
|
+
? Math.floor(tokenPoolSnapshot / scheduled.length)
|
|
585
|
+
: 0;
|
|
586
|
+
const delibPerTask = finalDelibTasks.length > 0
|
|
587
|
+
? Math.floor(deliberationPoolSnapshot / finalDelibTasks.length)
|
|
588
|
+
: 0;
|
|
589
|
+
for (const task of scheduled) {
|
|
590
|
+
finalAllocations.set(task.taskId, {
|
|
591
|
+
tokens: tokenPerTask,
|
|
592
|
+
deliberation: task.requiresDeliberation ? delibPerTask : 0,
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
else if (input.allocationMethod === 'explicit') {
|
|
597
|
+
for (const task of scheduled) {
|
|
598
|
+
finalAllocations.set(task.taskId, {
|
|
599
|
+
tokens: task.estimatedTokens,
|
|
600
|
+
deliberation: task.requiresDeliberation ? task.estimatedDeliberationTokens : 0,
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
// BRK-EGP-B06: Build reservations through formal createBatch path,
|
|
605
|
+
// not direct map insertion. This ensures conservation checks apply,
|
|
606
|
+
// duplicate-reservation guards fire, and lifecycle events emit.
|
|
607
|
+
const batchInputs = scheduled.map(task => {
|
|
608
|
+
const alloc = finalAllocations.get(task.taskId);
|
|
609
|
+
return {
|
|
610
|
+
taskId: task.taskId,
|
|
611
|
+
missionId: input.missionId,
|
|
612
|
+
reservedTokens: alloc.tokens,
|
|
613
|
+
reservedDeliberation: alloc.deliberation,
|
|
614
|
+
allocationMethod: input.allocationMethod,
|
|
615
|
+
};
|
|
616
|
+
});
|
|
617
|
+
const batchResult = reservations.createBatch(_conn, _ctx, batchInputs);
|
|
618
|
+
if (!batchResult.ok) {
|
|
619
|
+
return batchResult;
|
|
620
|
+
}
|
|
621
|
+
const waveReservations = batchResult.value;
|
|
622
|
+
// Emit WAVE_COMPOSED event
|
|
623
|
+
if (scheduled.length > 0) {
|
|
624
|
+
emitEvent(deps, EGP_EVENTS.WAVE_COMPOSED, 'mission', {
|
|
625
|
+
waveId: theWaveId,
|
|
626
|
+
missionId: input.missionId,
|
|
627
|
+
scheduledCount: scheduled.length,
|
|
628
|
+
excludedCount: excluded.length,
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
return ok(Object.freeze({
|
|
632
|
+
waveId: theWaveId,
|
|
633
|
+
missionId: input.missionId,
|
|
634
|
+
scheduledTaskIds: Object.freeze(scheduled.map(t => t.taskId)),
|
|
635
|
+
reservations: Object.freeze(waveReservations),
|
|
636
|
+
excludedTasks: Object.freeze(excluded),
|
|
637
|
+
allocationMethod: input.allocationMethod,
|
|
638
|
+
tokenPoolSnapshot,
|
|
639
|
+
deliberationPoolSnapshot,
|
|
640
|
+
}));
|
|
641
|
+
},
|
|
642
|
+
});
|
|
643
|
+
// ── 4. BranchFailureHandler ──
|
|
644
|
+
const branchFailure = Object.freeze({
|
|
645
|
+
handleFailure(conn, _ctx, input) {
|
|
646
|
+
const cancelledTaskIds = [];
|
|
647
|
+
const releasedReservationIds = [];
|
|
648
|
+
const affectedFanIns = [];
|
|
649
|
+
if (input.policy === 'isolate') {
|
|
650
|
+
// EGP-I6: Siblings unaffected under isolate
|
|
651
|
+
// No cancellations
|
|
652
|
+
}
|
|
653
|
+
else if (input.policy === 'fail-fast') {
|
|
654
|
+
// Cancel PENDING/SCHEDULED siblings (NOT RUNNING — EGP-I10)
|
|
655
|
+
for (const sibling of input.siblingStates) {
|
|
656
|
+
if (sibling.state === 'PENDING' || sibling.state === 'SCHEDULED') {
|
|
657
|
+
cancelledTaskIds.push(sibling.taskId);
|
|
658
|
+
// Release reservation if exists
|
|
659
|
+
const res = findReservationByTask(sibling.taskId);
|
|
660
|
+
if (res) {
|
|
661
|
+
releasedReservationIds.push(res.reservationId);
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
else if (input.policy === 'quorum') {
|
|
667
|
+
// Quorum: evaluate fan-in dependents for impossibility
|
|
668
|
+
// No sibling cancellation under quorum
|
|
669
|
+
}
|
|
670
|
+
// Evaluate fan-in dependents
|
|
671
|
+
for (const fanIn of input.fanInDependents) {
|
|
672
|
+
const allStates = fanIn.allPredecessorIds.map(predId => {
|
|
673
|
+
// Find state from sibling states or the failed task
|
|
674
|
+
if (predId === input.failedTaskId) {
|
|
675
|
+
return { taskId: predId, state: 'FAILED' };
|
|
676
|
+
}
|
|
677
|
+
const sibState = input.siblingStates.find(s => s.taskId === predId);
|
|
678
|
+
if (sibState)
|
|
679
|
+
return sibState;
|
|
680
|
+
// If cancelled by fail-fast
|
|
681
|
+
if (cancelledTaskIds.includes(predId)) {
|
|
682
|
+
return { taskId: predId, state: 'CANCELLED' };
|
|
683
|
+
}
|
|
684
|
+
return { taskId: predId, state: 'PENDING' };
|
|
685
|
+
});
|
|
686
|
+
const fanInResult = branchFailure.evaluateFanIn(conn, fanIn.taskId, input.policy, allStates, fanIn.quorumThreshold);
|
|
687
|
+
if (fanInResult.ok) {
|
|
688
|
+
affectedFanIns.push(fanInResult.value);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
emitEvent(deps, EGP_EVENTS.BRANCH_FAILURE_EVALUATED, 'mission', {
|
|
692
|
+
failedTaskId: input.failedTaskId,
|
|
693
|
+
missionId: input.missionId,
|
|
694
|
+
policy: input.policy,
|
|
695
|
+
cancelledCount: cancelledTaskIds.length,
|
|
696
|
+
});
|
|
697
|
+
return ok(Object.freeze({
|
|
698
|
+
failedTaskId: input.failedTaskId,
|
|
699
|
+
missionId: input.missionId,
|
|
700
|
+
policy: input.policy,
|
|
701
|
+
cancelledTaskIds: Object.freeze(cancelledTaskIds),
|
|
702
|
+
releasedReservationIds: Object.freeze(releasedReservationIds),
|
|
703
|
+
affectedFanIns: Object.freeze(affectedFanIns),
|
|
704
|
+
}));
|
|
705
|
+
},
|
|
706
|
+
evaluateFanIn(_conn, taskId, policy, predecessors, quorumThreshold) {
|
|
707
|
+
const completed = predecessors.filter(p => p.state === 'COMPLETED');
|
|
708
|
+
const failed = predecessors.filter(p => p.state === 'FAILED');
|
|
709
|
+
const cancelled = predecessors.filter(p => p.state === 'CANCELLED');
|
|
710
|
+
const terminal = new Set(['COMPLETED', 'FAILED', 'CANCELLED']);
|
|
711
|
+
const active = predecessors.filter(p => !terminal.has(p.state));
|
|
712
|
+
if (policy === 'quorum') {
|
|
713
|
+
// Validate threshold
|
|
714
|
+
if (quorumThreshold !== undefined && (quorumThreshold < 0 || quorumThreshold > 1.0)) {
|
|
715
|
+
return err(BRANCH_FAILURE_ERROR_CODES.QUORUM_THRESHOLD_INVALID, `Quorum threshold ${quorumThreshold} out of range [0.0, 1.0]`, 'EGP-I6');
|
|
716
|
+
}
|
|
717
|
+
const threshold = quorumThreshold ?? 1.0;
|
|
718
|
+
const total = predecessors.length;
|
|
719
|
+
const requiredSuccesses = Math.ceil(threshold * total);
|
|
720
|
+
const completedSuccessCount = completed.length;
|
|
721
|
+
const remainingActiveCount = active.length;
|
|
722
|
+
const met = completedSuccessCount >= requiredSuccesses;
|
|
723
|
+
const impossible = completedSuccessCount + remainingActiveCount < requiredSuccesses;
|
|
724
|
+
let reason;
|
|
725
|
+
let eligible;
|
|
726
|
+
if (met) {
|
|
727
|
+
reason = 'quorum_met';
|
|
728
|
+
eligible = true;
|
|
729
|
+
}
|
|
730
|
+
else if (impossible) {
|
|
731
|
+
reason = 'quorum_impossible';
|
|
732
|
+
eligible = false;
|
|
733
|
+
}
|
|
734
|
+
else {
|
|
735
|
+
reason = 'waiting';
|
|
736
|
+
eligible = false;
|
|
737
|
+
}
|
|
738
|
+
return ok(Object.freeze({
|
|
739
|
+
taskId,
|
|
740
|
+
eligible,
|
|
741
|
+
reason,
|
|
742
|
+
completedPredecessors: Object.freeze(completed.map(p => p.taskId)),
|
|
743
|
+
failedPredecessors: Object.freeze(failed.map(p => p.taskId)),
|
|
744
|
+
cancelledPredecessors: Object.freeze(cancelled.map(p => p.taskId)),
|
|
745
|
+
activePredecessors: Object.freeze(active.map(p => p.taskId)),
|
|
746
|
+
quorumState: Object.freeze({
|
|
747
|
+
threshold,
|
|
748
|
+
requiredSuccesses,
|
|
749
|
+
completedSuccessCount,
|
|
750
|
+
remainingActiveCount,
|
|
751
|
+
met,
|
|
752
|
+
impossible,
|
|
753
|
+
}),
|
|
754
|
+
}));
|
|
755
|
+
}
|
|
756
|
+
if (policy === 'isolate') {
|
|
757
|
+
// Eligible when ALL predecessors terminally resolved
|
|
758
|
+
const allResolved = predecessors.every(p => terminal.has(p.state));
|
|
759
|
+
return ok(Object.freeze({
|
|
760
|
+
taskId,
|
|
761
|
+
eligible: allResolved,
|
|
762
|
+
reason: allResolved ? 'all_resolved' : 'waiting',
|
|
763
|
+
completedPredecessors: Object.freeze(completed.map(p => p.taskId)),
|
|
764
|
+
failedPredecessors: Object.freeze(failed.map(p => p.taskId)),
|
|
765
|
+
cancelledPredecessors: Object.freeze(cancelled.map(p => p.taskId)),
|
|
766
|
+
activePredecessors: Object.freeze(active.map(p => p.taskId)),
|
|
767
|
+
}));
|
|
768
|
+
}
|
|
769
|
+
// fail-fast: eligible when ALL predecessors COMPLETED
|
|
770
|
+
const allCompleted = predecessors.every(p => p.state === 'COMPLETED');
|
|
771
|
+
// If any cancelled or failed under fail-fast, fan-in is cancelled
|
|
772
|
+
const hasFailed = failed.length > 0 || cancelled.length > 0;
|
|
773
|
+
return ok(Object.freeze({
|
|
774
|
+
taskId,
|
|
775
|
+
eligible: allCompleted,
|
|
776
|
+
reason: allCompleted ? 'all_completed'
|
|
777
|
+
: hasFailed ? 'cancelled'
|
|
778
|
+
: 'waiting',
|
|
779
|
+
completedPredecessors: Object.freeze(completed.map(p => p.taskId)),
|
|
780
|
+
failedPredecessors: Object.freeze(failed.map(p => p.taskId)),
|
|
781
|
+
cancelledPredecessors: Object.freeze(cancelled.map(p => p.taskId)),
|
|
782
|
+
activePredecessors: Object.freeze(active.map(p => p.taskId)),
|
|
783
|
+
}));
|
|
784
|
+
},
|
|
785
|
+
});
|
|
786
|
+
// ── 5. CapabilityRetryPolicy ──
|
|
787
|
+
const retryPolicy = Object.freeze({
|
|
788
|
+
evaluate(capabilityType, operationId, mutabilityClass, sandboxResetAvailable) {
|
|
789
|
+
let retryPermitted;
|
|
790
|
+
let requiresSandboxReset = false;
|
|
791
|
+
switch (mutabilityClass) {
|
|
792
|
+
case 'read-only':
|
|
793
|
+
retryPermitted = true;
|
|
794
|
+
break;
|
|
795
|
+
case 'side-effecting':
|
|
796
|
+
requiresSandboxReset = true;
|
|
797
|
+
retryPermitted = sandboxResetAvailable;
|
|
798
|
+
break;
|
|
799
|
+
case 'mutating':
|
|
800
|
+
retryPermitted = true;
|
|
801
|
+
break;
|
|
802
|
+
case 'mutating-external':
|
|
803
|
+
retryPermitted = false;
|
|
804
|
+
break;
|
|
805
|
+
default:
|
|
806
|
+
retryPermitted = false;
|
|
807
|
+
}
|
|
808
|
+
let reason;
|
|
809
|
+
if (retryPermitted && requiresSandboxReset) {
|
|
810
|
+
reason = `${mutabilityClass} operation retry permitted with sandbox reset`;
|
|
811
|
+
}
|
|
812
|
+
else if (retryPermitted) {
|
|
813
|
+
reason = `${mutabilityClass} operation safe to retry`;
|
|
814
|
+
}
|
|
815
|
+
else if (requiresSandboxReset && !sandboxResetAvailable) {
|
|
816
|
+
reason = `${mutabilityClass} operation requires sandbox reset (unavailable)`;
|
|
817
|
+
}
|
|
818
|
+
else {
|
|
819
|
+
reason = `${mutabilityClass} operation not safe for auto-retry`;
|
|
820
|
+
}
|
|
821
|
+
const decision = {
|
|
822
|
+
capabilityType,
|
|
823
|
+
...(operationId !== undefined ? { operationId } : {}),
|
|
824
|
+
mutabilityClass,
|
|
825
|
+
retryPermitted,
|
|
826
|
+
requiresSandboxReset,
|
|
827
|
+
reason,
|
|
828
|
+
};
|
|
829
|
+
return ok(Object.freeze(decision));
|
|
830
|
+
},
|
|
831
|
+
getDefaultClass(capabilityType) {
|
|
832
|
+
const defaultClass = DEFAULT_CAPABILITY_MUTABILITY[capabilityType];
|
|
833
|
+
// Unclassified defaults to mutating-external (safest)
|
|
834
|
+
return ok(defaultClass ?? 'mutating-external');
|
|
835
|
+
},
|
|
836
|
+
});
|
|
837
|
+
// ── 6. SchedulerEngine ──
|
|
838
|
+
const scheduler = Object.freeze({
|
|
839
|
+
executeCycle(conn, ctx, input) {
|
|
840
|
+
// DC-EGP-060: Zero workers → error
|
|
841
|
+
if (input.availableWorkers <= 0) {
|
|
842
|
+
return err(SCHEDULER_ERROR_CODES.NO_WORKERS_AVAILABLE, 'No workers available for scheduling', 'EGP-I10');
|
|
843
|
+
}
|
|
844
|
+
const waves = [];
|
|
845
|
+
const starvationUpdates = [];
|
|
846
|
+
const unscheduledMissions = [];
|
|
847
|
+
let workersRemaining = input.availableWorkers;
|
|
848
|
+
// Sort missions: starvation-promoted first, then natural order
|
|
849
|
+
const sortedMissions = [...input.eligibleMissions].sort((a, b) => {
|
|
850
|
+
const aPromoted = a.starvationCounter > input.starvationBound;
|
|
851
|
+
const bPromoted = b.starvationCounter > input.starvationBound;
|
|
852
|
+
if (aPromoted && !bPromoted)
|
|
853
|
+
return -1;
|
|
854
|
+
if (!aPromoted && bPromoted)
|
|
855
|
+
return 1;
|
|
856
|
+
return 0;
|
|
857
|
+
});
|
|
858
|
+
const scheduledMissionIds = new Set();
|
|
859
|
+
for (const mission of sortedMissions) {
|
|
860
|
+
if (workersRemaining <= 0) {
|
|
861
|
+
unscheduledMissions.push({ missionId: mission.missionId, reason: 'No workers available' });
|
|
862
|
+
continue;
|
|
863
|
+
}
|
|
864
|
+
const promoted = mission.starvationCounter > input.starvationBound;
|
|
865
|
+
// Compose wave for this mission
|
|
866
|
+
const waveInput = {
|
|
867
|
+
missionId: mission.missionId,
|
|
868
|
+
eligibleTasks: mission.eligibleTasks,
|
|
869
|
+
tokenPool: mission.tokenPool,
|
|
870
|
+
deliberationPool: mission.deliberationPool,
|
|
871
|
+
allocationMethod: input.allocationMethod,
|
|
872
|
+
minimumViableTokens: input.minimumViableTokens,
|
|
873
|
+
minimumViableDeliberation: input.minimumViableDeliberation,
|
|
874
|
+
};
|
|
875
|
+
const waveResult = waveComposer.compose(conn, ctx, waveInput);
|
|
876
|
+
if (waveResult.ok && waveResult.value.scheduledTaskIds.length > 0) {
|
|
877
|
+
waves.push(waveResult.value);
|
|
878
|
+
workersRemaining -= waveResult.value.scheduledTaskIds.length;
|
|
879
|
+
scheduledMissionIds.add(mission.missionId);
|
|
880
|
+
if (promoted) {
|
|
881
|
+
emitEvent(deps, EGP_EVENTS.STARVATION_BOUND_TRIGGERED, 'mission', {
|
|
882
|
+
missionId: mission.missionId,
|
|
883
|
+
starvationCounter: mission.starvationCounter,
|
|
884
|
+
starvationBound: input.starvationBound,
|
|
885
|
+
});
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
else {
|
|
889
|
+
unscheduledMissions.push({
|
|
890
|
+
missionId: mission.missionId,
|
|
891
|
+
reason: waveResult.ok ? 'No tasks met minimum viable' : 'Wave composition failed',
|
|
892
|
+
});
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
// Starvation updates: reset scheduled, increment unscheduled
|
|
896
|
+
// Only increment if at least one mission was scheduled (not pure saturation)
|
|
897
|
+
const anyScheduled = scheduledMissionIds.size > 0;
|
|
898
|
+
for (const mission of input.eligibleMissions) {
|
|
899
|
+
if (scheduledMissionIds.has(mission.missionId)) {
|
|
900
|
+
starvation.reset(mission.missionId);
|
|
901
|
+
starvationUpdates.push({
|
|
902
|
+
missionId: mission.missionId,
|
|
903
|
+
newCounter: 0,
|
|
904
|
+
promoted: mission.starvationCounter > input.starvationBound,
|
|
905
|
+
});
|
|
906
|
+
}
|
|
907
|
+
else if (anyScheduled) {
|
|
908
|
+
// EGP-I5: Only increment during non-pure saturation
|
|
909
|
+
starvation.increment(mission.missionId);
|
|
910
|
+
starvationUpdates.push({
|
|
911
|
+
missionId: mission.missionId,
|
|
912
|
+
newCounter: starvation.getCounter(mission.missionId),
|
|
913
|
+
promoted: false,
|
|
914
|
+
});
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
// Build replay record
|
|
918
|
+
const firstWave = waves[0];
|
|
919
|
+
const replayRecord = Object.freeze({
|
|
920
|
+
waveId: firstWave ? firstWave.waveId : generateWaveId(),
|
|
921
|
+
missionId: sortedMissions[0]?.missionId ?? '',
|
|
922
|
+
eligibleTaskIds: Object.freeze(input.eligibleMissions.flatMap(m => m.eligibleTasks.map(t => t.taskId))),
|
|
923
|
+
taskPriorities: Object.freeze(input.eligibleMissions.flatMap(m => m.eligibleTasks.map(t => Object.freeze({ taskId: t.taskId, priority: t.priority })))),
|
|
924
|
+
taskDimensions: Object.freeze(input.eligibleMissions.flatMap(m => m.eligibleTasks.map(t => Object.freeze({
|
|
925
|
+
taskId: t.taskId,
|
|
926
|
+
requiresDeliberation: t.requiresDeliberation,
|
|
927
|
+
estimatedTokens: t.estimatedTokens,
|
|
928
|
+
estimatedDeliberationTokens: t.estimatedDeliberationTokens,
|
|
929
|
+
})))),
|
|
930
|
+
tokenPoolSnapshot: input.eligibleMissions[0]?.tokenPool ?? 0,
|
|
931
|
+
deliberationPoolSnapshot: input.eligibleMissions[0]?.deliberationPool ?? 0,
|
|
932
|
+
workerAvailability: input.availableWorkers,
|
|
933
|
+
computedReservations: Object.freeze(waves.flatMap(w => w.reservations.map(r => Object.freeze({
|
|
934
|
+
taskId: r.taskId,
|
|
935
|
+
reservedTokens: r.reservedTokens,
|
|
936
|
+
reservedDeliberation: r.reservedDeliberation,
|
|
937
|
+
})))),
|
|
938
|
+
allocationMethod: input.allocationMethod,
|
|
939
|
+
selectedTaskIds: Object.freeze(waves.flatMap(w => [...w.scheduledTaskIds])),
|
|
940
|
+
starvationCounters: Object.freeze(starvationUpdates.map(u => Object.freeze({
|
|
941
|
+
missionId: u.missionId,
|
|
942
|
+
counter: u.newCounter,
|
|
943
|
+
}))),
|
|
944
|
+
timestamp: deps.time.nowISO(),
|
|
945
|
+
});
|
|
946
|
+
return ok(Object.freeze({
|
|
947
|
+
waves: Object.freeze(waves),
|
|
948
|
+
starvationUpdates: Object.freeze(starvationUpdates.map(u => Object.freeze(u))),
|
|
949
|
+
unscheduledMissions: Object.freeze(unscheduledMissions.map(u => Object.freeze(u))),
|
|
950
|
+
workerAvailabilitySnapshot: input.availableWorkers,
|
|
951
|
+
replayRecord,
|
|
952
|
+
}));
|
|
953
|
+
},
|
|
954
|
+
});
|
|
955
|
+
// ── 7. ReservationEnforcer ──
|
|
956
|
+
const enforcer = Object.freeze({
|
|
957
|
+
checkHeadroom(conn, taskId, additionalTokens, additionalDeliberation) {
|
|
958
|
+
const res = findReservationByTask(taskId);
|
|
959
|
+
if (!res) {
|
|
960
|
+
// No reservation found — return zero headroom
|
|
961
|
+
return ok(Object.freeze({
|
|
962
|
+
allowed: false,
|
|
963
|
+
tokenHeadroom: 0,
|
|
964
|
+
deliberationHeadroom: 0,
|
|
965
|
+
tokenExhausted: true,
|
|
966
|
+
deliberationExhausted: false,
|
|
967
|
+
wouldCauseTokenOverage: additionalTokens > 0,
|
|
968
|
+
wouldCauseDeliberationOverage: additionalDeliberation > 0,
|
|
969
|
+
projectedTokenOverage: additionalTokens,
|
|
970
|
+
projectedDeliberationOverage: additionalDeliberation,
|
|
971
|
+
}));
|
|
972
|
+
}
|
|
973
|
+
// Check suspension (DC-EGP-062)
|
|
974
|
+
if (deps.suspensionQuery) {
|
|
975
|
+
const suspResult = deps.suspensionQuery.getActiveForTarget(conn, 'task', taskId);
|
|
976
|
+
if (suspResult.ok && suspResult.value !== null) {
|
|
977
|
+
return ok(Object.freeze({
|
|
978
|
+
allowed: false,
|
|
979
|
+
tokenHeadroom: res.reservedTokens - res.consumedTokens,
|
|
980
|
+
deliberationHeadroom: res.reservedDeliberation - res.consumedDeliberation,
|
|
981
|
+
tokenExhausted: false,
|
|
982
|
+
deliberationExhausted: false,
|
|
983
|
+
wouldCauseTokenOverage: false,
|
|
984
|
+
wouldCauseDeliberationOverage: false,
|
|
985
|
+
projectedTokenOverage: 0,
|
|
986
|
+
projectedDeliberationOverage: 0,
|
|
987
|
+
}));
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
const tokenHeadroom = res.reservedTokens - res.consumedTokens;
|
|
991
|
+
const deliberationHeadroom = res.reservedDeliberation - res.consumedDeliberation;
|
|
992
|
+
const tokenExhausted = tokenHeadroom <= 0;
|
|
993
|
+
// Only consider deliberation exhausted if there's a deliberation reservation
|
|
994
|
+
const deliberationExhausted = res.reservedDeliberation > 0 && deliberationHeadroom <= 0;
|
|
995
|
+
const projectedTokenTotal = res.consumedTokens + additionalTokens;
|
|
996
|
+
const projectedDelibTotal = res.consumedDeliberation + additionalDeliberation;
|
|
997
|
+
const wouldCauseTokenOverage = projectedTokenTotal > res.reservedTokens;
|
|
998
|
+
const wouldCauseDeliberationOverage = res.reservedDeliberation > 0 && projectedDelibTotal > res.reservedDeliberation;
|
|
999
|
+
const projectedTokenOverage = Math.max(0, projectedTokenTotal - res.reservedTokens);
|
|
1000
|
+
const projectedDeliberationOverage = res.reservedDeliberation > 0
|
|
1001
|
+
? Math.max(0, projectedDelibTotal - res.reservedDeliberation)
|
|
1002
|
+
: 0;
|
|
1003
|
+
const allowed = !tokenExhausted && !deliberationExhausted;
|
|
1004
|
+
// Emit event if exhausted
|
|
1005
|
+
if (tokenExhausted || deliberationExhausted) {
|
|
1006
|
+
emitEvent(deps, EGP_EVENTS.TASK_BUDGET_EXCEEDED, 'task', {
|
|
1007
|
+
taskId,
|
|
1008
|
+
tokenExhausted,
|
|
1009
|
+
deliberationExhausted,
|
|
1010
|
+
tokenHeadroom,
|
|
1011
|
+
deliberationHeadroom,
|
|
1012
|
+
});
|
|
1013
|
+
}
|
|
1014
|
+
return ok(Object.freeze({
|
|
1015
|
+
allowed,
|
|
1016
|
+
tokenHeadroom,
|
|
1017
|
+
deliberationHeadroom,
|
|
1018
|
+
tokenExhausted,
|
|
1019
|
+
deliberationExhausted,
|
|
1020
|
+
wouldCauseTokenOverage,
|
|
1021
|
+
wouldCauseDeliberationOverage,
|
|
1022
|
+
projectedTokenOverage,
|
|
1023
|
+
projectedDeliberationOverage,
|
|
1024
|
+
}));
|
|
1025
|
+
},
|
|
1026
|
+
handleOverage(conn, ctx, taskId, tokenOverage, deliberationOverage) {
|
|
1027
|
+
const res = findReservationByTask(taskId);
|
|
1028
|
+
if (!res) {
|
|
1029
|
+
// Debt 2: Missing reservation during overage means budget enforcement is impossible — do not silently skip
|
|
1030
|
+
return err('RESERVATION_NOT_FOUND', `No active reservation found for task ${taskId} — cannot record overage`, 'EGP-I14');
|
|
1031
|
+
}
|
|
1032
|
+
return ledger.recordOverage(conn, ctx, res.missionId, tokenOverage, deliberationOverage);
|
|
1033
|
+
},
|
|
1034
|
+
});
|
|
1035
|
+
// ── 8. ReplanCalculator ──
|
|
1036
|
+
const replanCalculator = Object.freeze({
|
|
1037
|
+
calculateReplanBudget(_conn, _ctx, input) {
|
|
1038
|
+
const cancelledTasks = [];
|
|
1039
|
+
const runningTasksExcluded = [];
|
|
1040
|
+
let replanBudgetTokens = 0;
|
|
1041
|
+
let replanBudgetDeliberation = 0;
|
|
1042
|
+
for (const task of input.currentGraphTasks) {
|
|
1043
|
+
if (task.state === 'RUNNING') {
|
|
1044
|
+
// EGP-I10: Running tasks not preemptible
|
|
1045
|
+
const res = findReservationByTask(task.taskId);
|
|
1046
|
+
runningTasksExcluded.push({
|
|
1047
|
+
taskId: task.taskId,
|
|
1048
|
+
committedTokens: res ? res.reservedTokens : 0,
|
|
1049
|
+
committedDeliberation: res ? res.reservedDeliberation : 0,
|
|
1050
|
+
});
|
|
1051
|
+
}
|
|
1052
|
+
else {
|
|
1053
|
+
// SCHEDULED, PENDING, FAILED — cancel and release
|
|
1054
|
+
const res = findReservationByTask(task.taskId);
|
|
1055
|
+
let releasedTokens = 0;
|
|
1056
|
+
let releasedDeliberation = 0;
|
|
1057
|
+
if (res) {
|
|
1058
|
+
releasedTokens = Math.max(0, res.reservedTokens - res.consumedTokens);
|
|
1059
|
+
releasedDeliberation = Math.max(0, res.reservedDeliberation - res.consumedDeliberation);
|
|
1060
|
+
// Release the reservation
|
|
1061
|
+
res.status = 'released';
|
|
1062
|
+
res.releasedAt = deps.time.nowISO();
|
|
1063
|
+
taskIndex.delete(res.taskId);
|
|
1064
|
+
}
|
|
1065
|
+
replanBudgetTokens += releasedTokens;
|
|
1066
|
+
replanBudgetDeliberation += releasedDeliberation;
|
|
1067
|
+
cancelledTasks.push({
|
|
1068
|
+
taskId: task.taskId,
|
|
1069
|
+
previousState: task.state,
|
|
1070
|
+
releasedTokens,
|
|
1071
|
+
releasedDeliberation,
|
|
1072
|
+
});
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
return ok(Object.freeze({
|
|
1076
|
+
replanBudgetTokens,
|
|
1077
|
+
replanBudgetDeliberation,
|
|
1078
|
+
cancelledTasks: Object.freeze(cancelledTasks.map(t => Object.freeze(t))),
|
|
1079
|
+
runningTasksExcluded: Object.freeze(runningTasksExcluded.map(t => Object.freeze(t))),
|
|
1080
|
+
}));
|
|
1081
|
+
},
|
|
1082
|
+
});
|
|
1083
|
+
// ── 9. StarvationTracker (AMB-06: in-memory only) ──
|
|
1084
|
+
const starvation = Object.freeze({
|
|
1085
|
+
increment(missionId) {
|
|
1086
|
+
const current = starvationCounters.get(missionId) ?? 0;
|
|
1087
|
+
starvationCounters.set(missionId, current + 1);
|
|
1088
|
+
},
|
|
1089
|
+
reset(missionId) {
|
|
1090
|
+
starvationCounters.set(missionId, 0);
|
|
1091
|
+
},
|
|
1092
|
+
getCounter(missionId) {
|
|
1093
|
+
return starvationCounters.get(missionId) ?? 0;
|
|
1094
|
+
},
|
|
1095
|
+
isAboveBound(missionId, bound) {
|
|
1096
|
+
const counter = starvationCounters.get(missionId) ?? 0;
|
|
1097
|
+
return counter > bound;
|
|
1098
|
+
},
|
|
1099
|
+
getAllCounters() {
|
|
1100
|
+
return new Map(starvationCounters);
|
|
1101
|
+
},
|
|
1102
|
+
});
|
|
1103
|
+
// ── 10. EGPTerminalOperationHandler ──
|
|
1104
|
+
const terminalOp = Object.freeze({
|
|
1105
|
+
execute(conn, ctx, taskId, terminalState, hasRetriesRemaining) {
|
|
1106
|
+
const res = findReservationByTask(taskId);
|
|
1107
|
+
// v3.2 compatibility: no reservation → no-op
|
|
1108
|
+
if (!res) {
|
|
1109
|
+
return ok(Object.freeze({
|
|
1110
|
+
action: 'none',
|
|
1111
|
+
reclaimedTokens: 0,
|
|
1112
|
+
reclaimedDeliberation: 0,
|
|
1113
|
+
overageTokens: 0,
|
|
1114
|
+
overageDeliberation: 0,
|
|
1115
|
+
reservationId: null,
|
|
1116
|
+
}));
|
|
1117
|
+
}
|
|
1118
|
+
// FAILED with retries remaining → retain (EGP-I8)
|
|
1119
|
+
if (terminalState === 'FAILED' && hasRetriesRemaining) {
|
|
1120
|
+
const retainResult = reservations.retain(conn, res.reservationId);
|
|
1121
|
+
if (!retainResult.ok)
|
|
1122
|
+
return retainResult;
|
|
1123
|
+
return ok(Object.freeze({
|
|
1124
|
+
action: 'retained',
|
|
1125
|
+
reclaimedTokens: 0,
|
|
1126
|
+
reclaimedDeliberation: 0,
|
|
1127
|
+
overageTokens: 0,
|
|
1128
|
+
overageDeliberation: 0,
|
|
1129
|
+
reservationId: res.reservationId,
|
|
1130
|
+
}));
|
|
1131
|
+
}
|
|
1132
|
+
// Final terminal: release and reclaim (EGP-I3)
|
|
1133
|
+
const releaseResult = reservations.release(conn, ctx, res.reservationId, terminalState);
|
|
1134
|
+
if (!releaseResult.ok)
|
|
1135
|
+
return releaseResult;
|
|
1136
|
+
return ok(Object.freeze({
|
|
1137
|
+
action: 'released',
|
|
1138
|
+
reclaimedTokens: releaseResult.value.reclaimedTokens,
|
|
1139
|
+
reclaimedDeliberation: releaseResult.value.reclaimedDeliberation,
|
|
1140
|
+
overageTokens: releaseResult.value.overageTokens,
|
|
1141
|
+
overageDeliberation: releaseResult.value.overageDeliberation,
|
|
1142
|
+
reservationId: res.reservationId,
|
|
1143
|
+
}));
|
|
1144
|
+
},
|
|
1145
|
+
});
|
|
1146
|
+
// ── 11. ReservationAdmissionGate (DC-EGP-064) ──
|
|
1147
|
+
const admissionGate = Object.freeze({
|
|
1148
|
+
checkAdmission(conn, _ctx, taskId, taskVersion) {
|
|
1149
|
+
// v3.2 backward compatibility (PSD-5)
|
|
1150
|
+
if (taskVersion === '3.2') {
|
|
1151
|
+
return ok(Object.freeze({
|
|
1152
|
+
admitted: true,
|
|
1153
|
+
reason: 'v3.2 task exempt from reservation requirement',
|
|
1154
|
+
reservationId: null,
|
|
1155
|
+
}));
|
|
1156
|
+
}
|
|
1157
|
+
// v3.3: EGP-I14 — must have non-released reservation
|
|
1158
|
+
const res = findReservationByTask(taskId);
|
|
1159
|
+
if (!res) {
|
|
1160
|
+
return ok(Object.freeze({
|
|
1161
|
+
admitted: false,
|
|
1162
|
+
reason: 'No non-released reservation found for v3.3 task',
|
|
1163
|
+
reservationId: null,
|
|
1164
|
+
}));
|
|
1165
|
+
}
|
|
1166
|
+
// Check suspension (DC-EGP-062)
|
|
1167
|
+
if (deps.suspensionQuery) {
|
|
1168
|
+
const taskSusp = deps.suspensionQuery.getActiveForTarget(conn, 'task', taskId);
|
|
1169
|
+
if (taskSusp.ok && taskSusp.value !== null) {
|
|
1170
|
+
return ok(Object.freeze({
|
|
1171
|
+
admitted: false,
|
|
1172
|
+
reason: 'Task is suspended',
|
|
1173
|
+
reservationId: res.reservationId,
|
|
1174
|
+
}));
|
|
1175
|
+
}
|
|
1176
|
+
const missionSusp = deps.suspensionQuery.getActiveForTarget(conn, 'mission', res.missionId);
|
|
1177
|
+
if (missionSusp.ok && missionSusp.value !== null) {
|
|
1178
|
+
return ok(Object.freeze({
|
|
1179
|
+
admitted: false,
|
|
1180
|
+
reason: 'Mission is suspended',
|
|
1181
|
+
reservationId: res.reservationId,
|
|
1182
|
+
}));
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
return ok(Object.freeze({
|
|
1186
|
+
admitted: true,
|
|
1187
|
+
reason: 'Reservation confirmed',
|
|
1188
|
+
reservationId: res.reservationId,
|
|
1189
|
+
}));
|
|
1190
|
+
},
|
|
1191
|
+
});
|
|
1192
|
+
// ── 12. ReservationAgeMonitor ──
|
|
1193
|
+
const ageMonitor = Object.freeze({
|
|
1194
|
+
getOrphanedReservations(_conn, maxAgeMs) {
|
|
1195
|
+
const now = deps.time.nowMs();
|
|
1196
|
+
const orphans = [];
|
|
1197
|
+
for (const res of reservationMap.values()) {
|
|
1198
|
+
if (res.status === 'reserved') {
|
|
1199
|
+
const ageMs = now - new Date(res.createdAt).getTime();
|
|
1200
|
+
if (ageMs > maxAgeMs) {
|
|
1201
|
+
orphans.push(Object.freeze({
|
|
1202
|
+
reservationId: res.reservationId,
|
|
1203
|
+
taskId: res.taskId,
|
|
1204
|
+
missionId: res.missionId,
|
|
1205
|
+
ageMs,
|
|
1206
|
+
status: res.status,
|
|
1207
|
+
}));
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
return ok(Object.freeze(orphans));
|
|
1212
|
+
},
|
|
1213
|
+
});
|
|
1214
|
+
// ── 13. SuspendedReservationQuery ──
|
|
1215
|
+
const suspendedQuery = Object.freeze({
|
|
1216
|
+
isTaskSuspended(conn, taskId) {
|
|
1217
|
+
if (!deps.suspensionQuery)
|
|
1218
|
+
return ok(false);
|
|
1219
|
+
const result = deps.suspensionQuery.getActiveForTarget(conn, 'task', taskId);
|
|
1220
|
+
if (!result.ok)
|
|
1221
|
+
return result;
|
|
1222
|
+
return ok(result.value !== null);
|
|
1223
|
+
},
|
|
1224
|
+
isMissionSuspended(conn, missionId) {
|
|
1225
|
+
if (!deps.suspensionQuery)
|
|
1226
|
+
return ok(false);
|
|
1227
|
+
const result = deps.suspensionQuery.getActiveForTarget(conn, 'mission', missionId);
|
|
1228
|
+
if (!result.ok)
|
|
1229
|
+
return result;
|
|
1230
|
+
return ok(result.value !== null);
|
|
1231
|
+
},
|
|
1232
|
+
});
|
|
1233
|
+
// ── Facade ──
|
|
1234
|
+
return Object.freeze({
|
|
1235
|
+
reservations,
|
|
1236
|
+
ledger,
|
|
1237
|
+
waveComposer,
|
|
1238
|
+
branchFailure,
|
|
1239
|
+
retryPolicy,
|
|
1240
|
+
scheduler,
|
|
1241
|
+
enforcer,
|
|
1242
|
+
replanCalculator,
|
|
1243
|
+
starvation,
|
|
1244
|
+
terminalOp,
|
|
1245
|
+
admissionGate,
|
|
1246
|
+
ageMonitor,
|
|
1247
|
+
suspendedQuery,
|
|
1248
|
+
});
|
|
1249
|
+
}
|
|
1250
|
+
//# sourceMappingURL=egp_stores.js.map
|