@dcyfr/ai 1.0.4 → 2.1.1
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 +116 -0
- package/README.md +381 -9
- package/dist/ai/agents/agent-loader.d.ts +12 -0
- package/dist/ai/agents/agent-loader.d.ts.map +1 -1
- package/dist/ai/agents/agent-loader.js +74 -65
- package/dist/ai/agents/agent-loader.js.map +1 -1
- package/dist/ai/agents/agent-registry.d.ts +2 -0
- package/dist/ai/agents/agent-registry.d.ts.map +1 -1
- package/dist/ai/agents/agent-registry.js +15 -14
- package/dist/ai/agents/agent-registry.js.map +1 -1
- package/dist/ai/agents/agent-router.d.ts +20 -5
- package/dist/ai/agents/agent-router.d.ts.map +1 -1
- package/dist/ai/agents/agent-router.js +89 -43
- package/dist/ai/agents/agent-router.js.map +1 -1
- package/dist/ai/agents/index.d.ts +6 -1
- package/dist/ai/agents/index.d.ts.map +1 -1
- package/dist/ai/agents/index.js +9 -3
- package/dist/ai/agents/index.js.map +1 -1
- package/dist/ai/agents/instruction-template.d.ts +45 -0
- package/dist/ai/agents/instruction-template.d.ts.map +1 -0
- package/dist/ai/agents/instruction-template.js +197 -0
- package/dist/ai/agents/instruction-template.js.map +1 -0
- package/dist/ai/agents/persona-resolver.d.ts +90 -0
- package/dist/ai/agents/persona-resolver.d.ts.map +1 -0
- package/dist/ai/agents/persona-resolver.js +121 -0
- package/dist/ai/agents/persona-resolver.js.map +1 -0
- package/dist/ai/agents/schema.d.ts +166 -0
- package/dist/ai/agents/schema.d.ts.map +1 -0
- package/dist/ai/agents/schema.js +94 -0
- package/dist/ai/agents/schema.js.map +1 -0
- package/dist/ai/agents/types.d.ts +102 -0
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/agents-builtin/architecture/index.js +3 -3
- package/dist/ai/agents-builtin/content/index.js +1 -1
- package/dist/ai/agents-builtin/data/index.js +1 -1
- package/dist/ai/agents-builtin/development/index.js +4 -4
- package/dist/ai/agents-builtin/devops/index.js +1 -1
- package/dist/ai/agents-builtin/index.js +33 -33
- package/dist/ai/agents-builtin/performance/index.js +1 -1
- package/dist/ai/agents-builtin/research/index.js +1 -1
- package/dist/ai/agents-builtin/security/index.js +1 -1
- package/dist/ai/agents-builtin/testing/index.js +2 -2
- package/dist/ai/config/loader.d.ts.map +1 -1
- package/dist/ai/config/loader.js +6 -3
- package/dist/ai/config/loader.js.map +1 -1
- package/dist/ai/config/schema.d.ts +242 -1156
- package/dist/ai/config/schema.d.ts.map +1 -1
- package/dist/ai/config/schema.js +69 -20
- package/dist/ai/config/schema.js.map +1 -1
- package/dist/ai/core/provider-registry.d.ts +32 -0
- package/dist/ai/core/provider-registry.d.ts.map +1 -1
- package/dist/ai/core/provider-registry.js +189 -14
- package/dist/ai/core/provider-registry.js.map +1 -1
- package/dist/ai/core/telemetry-engine.d.ts +26 -0
- package/dist/ai/core/telemetry-engine.d.ts.map +1 -1
- package/dist/ai/core/telemetry-engine.js +81 -1
- package/dist/ai/core/telemetry-engine.js.map +1 -1
- package/dist/ai/delegation/agent-registry.d.ts +143 -0
- package/dist/ai/delegation/agent-registry.d.ts.map +1 -0
- package/dist/ai/delegation/agent-registry.js +231 -0
- package/dist/ai/delegation/agent-registry.js.map +1 -0
- package/dist/ai/delegation/blast-radius-tracker.d.ts +65 -0
- package/dist/ai/delegation/blast-radius-tracker.d.ts.map +1 -0
- package/dist/ai/delegation/blast-radius-tracker.js +81 -0
- package/dist/ai/delegation/blast-radius-tracker.js.map +1 -0
- package/dist/ai/delegation/capability-bootstrap.d.ts +40 -0
- package/dist/ai/delegation/capability-bootstrap.d.ts.map +1 -0
- package/dist/ai/delegation/capability-bootstrap.js +431 -0
- package/dist/ai/delegation/capability-bootstrap.js.map +1 -0
- package/dist/ai/delegation/capability-registry.d.ts +81 -0
- package/dist/ai/delegation/capability-registry.d.ts.map +1 -0
- package/dist/ai/delegation/capability-registry.js +339 -0
- package/dist/ai/delegation/capability-registry.js.map +1 -0
- package/dist/ai/delegation/chain-tracker.d.ts +152 -0
- package/dist/ai/delegation/chain-tracker.d.ts.map +1 -0
- package/dist/ai/delegation/chain-tracker.js +336 -0
- package/dist/ai/delegation/chain-tracker.js.map +1 -0
- package/dist/ai/delegation/circuit-breaker.d.ts +59 -0
- package/dist/ai/delegation/circuit-breaker.d.ts.map +1 -0
- package/dist/ai/delegation/circuit-breaker.js +153 -0
- package/dist/ai/delegation/circuit-breaker.js.map +1 -0
- package/dist/ai/delegation/contract-manager.d.ts +415 -0
- package/dist/ai/delegation/contract-manager.d.ts.map +1 -0
- package/dist/ai/delegation/contract-manager.js +1258 -0
- package/dist/ai/delegation/contract-manager.js.map +1 -0
- package/dist/ai/delegation/delegation-manager.d.ts +505 -0
- package/dist/ai/delegation/delegation-manager.d.ts.map +1 -0
- package/dist/ai/delegation/delegation-manager.js +773 -0
- package/dist/ai/delegation/delegation-manager.js.map +1 -0
- package/dist/ai/delegation/event-schemas.d.ts +101 -0
- package/dist/ai/delegation/event-schemas.d.ts.map +1 -0
- package/dist/ai/delegation/event-schemas.js +59 -0
- package/dist/ai/delegation/event-schemas.js.map +1 -0
- package/dist/ai/delegation/execution-mode-dashboard.d.ts +109 -0
- package/dist/ai/delegation/execution-mode-dashboard.d.ts.map +1 -0
- package/dist/ai/delegation/execution-mode-dashboard.js +167 -0
- package/dist/ai/delegation/execution-mode-dashboard.js.map +1 -0
- package/dist/ai/delegation/feature-flags.d.ts +191 -0
- package/dist/ai/delegation/feature-flags.d.ts.map +1 -0
- package/dist/ai/delegation/feature-flags.js +332 -0
- package/dist/ai/delegation/feature-flags.js.map +1 -0
- package/dist/ai/delegation/index.d.ts +51 -0
- package/dist/ai/delegation/index.d.ts.map +1 -0
- package/dist/ai/delegation/index.js +39 -0
- package/dist/ai/delegation/index.js.map +1 -0
- package/dist/ai/delegation/middleware/chain-depth-middleware.d.ts +39 -0
- package/dist/ai/delegation/middleware/chain-depth-middleware.d.ts.map +1 -0
- package/dist/ai/delegation/middleware/chain-depth-middleware.js +77 -0
- package/dist/ai/delegation/middleware/chain-depth-middleware.js.map +1 -0
- package/dist/ai/delegation/middleware/chain-tracker-middleware.d.ts +46 -0
- package/dist/ai/delegation/middleware/chain-tracker-middleware.d.ts.map +1 -0
- package/dist/ai/delegation/middleware/chain-tracker-middleware.js +89 -0
- package/dist/ai/delegation/middleware/chain-tracker-middleware.js.map +1 -0
- package/dist/ai/delegation/middleware/content-policy-middleware.d.ts +31 -0
- package/dist/ai/delegation/middleware/content-policy-middleware.d.ts.map +1 -0
- package/dist/ai/delegation/middleware/content-policy-middleware.js +82 -0
- package/dist/ai/delegation/middleware/content-policy-middleware.js.map +1 -0
- package/dist/ai/delegation/middleware/feature-flag-middleware.d.ts +46 -0
- package/dist/ai/delegation/middleware/feature-flag-middleware.d.ts.map +1 -0
- package/dist/ai/delegation/middleware/feature-flag-middleware.js +59 -0
- package/dist/ai/delegation/middleware/feature-flag-middleware.js.map +1 -0
- package/dist/ai/delegation/middleware/identity-middleware.d.ts +23 -0
- package/dist/ai/delegation/middleware/identity-middleware.d.ts.map +1 -0
- package/dist/ai/delegation/middleware/identity-middleware.js +64 -0
- package/dist/ai/delegation/middleware/identity-middleware.js.map +1 -0
- package/dist/ai/delegation/middleware/permissions-middleware.d.ts +48 -0
- package/dist/ai/delegation/middleware/permissions-middleware.d.ts.map +1 -0
- package/dist/ai/delegation/middleware/permissions-middleware.js +107 -0
- package/dist/ai/delegation/middleware/permissions-middleware.js.map +1 -0
- package/dist/ai/delegation/middleware/rate-limiter-middleware.d.ts +38 -0
- package/dist/ai/delegation/middleware/rate-limiter-middleware.d.ts.map +1 -0
- package/dist/ai/delegation/middleware/rate-limiter-middleware.js +65 -0
- package/dist/ai/delegation/middleware/rate-limiter-middleware.js.map +1 -0
- package/dist/ai/delegation/middleware/reputation-middleware.d.ts +39 -0
- package/dist/ai/delegation/middleware/reputation-middleware.d.ts.map +1 -0
- package/dist/ai/delegation/middleware/reputation-middleware.js +75 -0
- package/dist/ai/delegation/middleware/reputation-middleware.js.map +1 -0
- package/dist/ai/delegation/middleware/resource-limiter-middleware.d.ts +52 -0
- package/dist/ai/delegation/middleware/resource-limiter-middleware.d.ts.map +1 -0
- package/dist/ai/delegation/middleware/resource-limiter-middleware.js +112 -0
- package/dist/ai/delegation/middleware/resource-limiter-middleware.js.map +1 -0
- package/dist/ai/delegation/middleware/threat-validator-middleware.d.ts +23 -0
- package/dist/ai/delegation/middleware/threat-validator-middleware.d.ts.map +1 -0
- package/dist/ai/delegation/middleware/threat-validator-middleware.js +83 -0
- package/dist/ai/delegation/middleware/threat-validator-middleware.js.map +1 -0
- package/dist/ai/delegation/middleware/tlp-middleware.d.ts +23 -0
- package/dist/ai/delegation/middleware/tlp-middleware.d.ts.map +1 -0
- package/dist/ai/delegation/middleware/tlp-middleware.js +59 -0
- package/dist/ai/delegation/middleware/tlp-middleware.js.map +1 -0
- package/dist/ai/delegation/monitoring.d.ts +298 -0
- package/dist/ai/delegation/monitoring.d.ts.map +1 -0
- package/dist/ai/delegation/monitoring.js +584 -0
- package/dist/ai/delegation/monitoring.js.map +1 -0
- package/dist/ai/delegation/security-middleware-chain.d.ts +71 -0
- package/dist/ai/delegation/security-middleware-chain.d.ts.map +1 -0
- package/dist/ai/delegation/security-middleware-chain.js +163 -0
- package/dist/ai/delegation/security-middleware-chain.js.map +1 -0
- package/dist/ai/delegation/session-checkpoint.d.ts +77 -0
- package/dist/ai/delegation/session-checkpoint.d.ts.map +1 -0
- package/dist/ai/delegation/session-checkpoint.js +131 -0
- package/dist/ai/delegation/session-checkpoint.js.map +1 -0
- package/dist/ai/delegation/session-manager.d.ts +131 -0
- package/dist/ai/delegation/session-manager.d.ts.map +1 -0
- package/dist/ai/delegation/session-manager.js +243 -0
- package/dist/ai/delegation/session-manager.js.map +1 -0
- package/dist/ai/delegation/session-queue.d.ts +95 -0
- package/dist/ai/delegation/session-queue.d.ts.map +1 -0
- package/dist/ai/delegation/session-queue.js +136 -0
- package/dist/ai/delegation/session-queue.js.map +1 -0
- package/dist/ai/delegation/timeout-watchdog.d.ts +60 -0
- package/dist/ai/delegation/timeout-watchdog.d.ts.map +1 -0
- package/dist/ai/delegation/timeout-watchdog.js +100 -0
- package/dist/ai/delegation/timeout-watchdog.js.map +1 -0
- package/dist/ai/examples/integration-demo.d.ts +27 -0
- package/dist/ai/examples/integration-demo.d.ts.map +1 -0
- package/dist/ai/examples/integration-demo.js +536 -0
- package/dist/ai/examples/integration-demo.js.map +1 -0
- package/dist/ai/index.d.ts +25 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +34 -11
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/mcp/servers/analytics/index.js +67 -11
- package/dist/ai/mcp/servers/analytics/index.js.map +1 -1
- package/dist/ai/mcp/servers/content-manager/index.d.ts.map +1 -1
- package/dist/ai/mcp/servers/content-manager/index.js +50 -4
- package/dist/ai/mcp/servers/content-manager/index.js.map +1 -1
- package/dist/ai/mcp/servers/delegation-monitor/index.d.ts +36 -0
- package/dist/ai/mcp/servers/delegation-monitor/index.d.ts.map +1 -0
- package/dist/ai/mcp/servers/delegation-monitor/index.js +757 -0
- package/dist/ai/mcp/servers/delegation-monitor/index.js.map +1 -0
- package/dist/ai/mcp/servers/design-tokens/index.d.ts.map +1 -1
- package/dist/ai/mcp/servers/design-tokens/index.js +62 -39
- package/dist/ai/mcp/servers/design-tokens/index.js.map +1 -1
- package/dist/ai/mcp/servers/promptintel/index.js +15 -3
- package/dist/ai/mcp/servers/promptintel/index.js.map +1 -1
- package/dist/ai/mcp/servers/shared/rate-limiter.d.ts.map +1 -1
- package/dist/ai/mcp/servers/shared/rate-limiter.js +3 -1
- package/dist/ai/mcp/servers/shared/rate-limiter.js.map +1 -1
- package/dist/ai/mcp/servers/shared/redis-client.d.ts.map +1 -1
- package/dist/ai/mcp/servers/shared/redis-client.js +54 -47
- package/dist/ai/mcp/servers/shared/redis-client.js.map +1 -1
- package/dist/ai/mcp/servers/shared/types.d.ts +9 -0
- package/dist/ai/mcp/servers/shared/types.d.ts.map +1 -1
- package/dist/ai/mcp/servers/shared/utils.d.ts +9 -1
- package/dist/ai/mcp/servers/shared/utils.d.ts.map +1 -1
- package/dist/ai/mcp/servers/shared/utils.js +52 -2
- package/dist/ai/mcp/servers/shared/utils.js.map +1 -1
- package/dist/ai/memory/config.d.ts +18 -3
- package/dist/ai/memory/config.d.ts.map +1 -1
- package/dist/ai/memory/config.js +61 -15
- package/dist/ai/memory/config.js.map +1 -1
- package/dist/ai/memory/dcyfr-memory.d.ts +4 -0
- package/dist/ai/memory/dcyfr-memory.d.ts.map +1 -1
- package/dist/ai/memory/dcyfr-memory.js +44 -6
- package/dist/ai/memory/dcyfr-memory.js.map +1 -1
- package/dist/ai/memory/mem0-client.d.ts.map +1 -1
- package/dist/ai/memory/mem0-client.js +53 -14
- package/dist/ai/memory/mem0-client.js.map +1 -1
- package/dist/ai/permissions/attenuation-engine.d.ts +159 -0
- package/dist/ai/permissions/attenuation-engine.d.ts.map +1 -0
- package/dist/ai/permissions/attenuation-engine.js +511 -0
- package/dist/ai/permissions/attenuation-engine.js.map +1 -0
- package/dist/ai/plugins/plugin-loader.d.ts +4 -0
- package/dist/ai/plugins/plugin-loader.d.ts.map +1 -1
- package/dist/ai/plugins/plugin-loader.js +28 -28
- package/dist/ai/plugins/plugin-loader.js.map +1 -1
- package/dist/ai/reputation/execution-mode-reputation.d.ts +104 -0
- package/dist/ai/reputation/execution-mode-reputation.d.ts.map +1 -0
- package/dist/ai/reputation/execution-mode-reputation.js +142 -0
- package/dist/ai/reputation/execution-mode-reputation.js.map +1 -0
- package/dist/ai/reputation/reputation-engine.d.ts +204 -0
- package/dist/ai/reputation/reputation-engine.d.ts.map +1 -0
- package/dist/ai/reputation/reputation-engine.js +426 -0
- package/dist/ai/reputation/reputation-engine.js.map +1 -0
- package/dist/ai/runtime/agent-runtime.d.ts +193 -0
- package/dist/ai/runtime/agent-runtime.d.ts.map +1 -0
- package/dist/ai/runtime/agent-runtime.js +1009 -0
- package/dist/ai/runtime/agent-runtime.js.map +1 -0
- package/dist/ai/runtime/index.d.ts +11 -0
- package/dist/ai/runtime/index.d.ts.map +1 -0
- package/dist/ai/runtime/index.js +9 -0
- package/dist/ai/runtime/index.js.map +1 -0
- package/dist/ai/runtime/telemetry-schema.d.ts +192 -0
- package/dist/ai/runtime/telemetry-schema.d.ts.map +1 -0
- package/dist/ai/runtime/telemetry-schema.js +200 -0
- package/dist/ai/runtime/telemetry-schema.js.map +1 -0
- package/dist/ai/runtime/types.d.ts +236 -0
- package/dist/ai/runtime/types.d.ts.map +1 -0
- package/dist/ai/runtime/types.js +10 -0
- package/dist/ai/runtime/types.js.map +1 -0
- package/dist/ai/src/batch-processor.d.ts +298 -0
- package/dist/ai/src/batch-processor.d.ts.map +1 -0
- package/dist/ai/src/batch-processor.js +520 -0
- package/dist/ai/src/batch-processor.js.map +1 -0
- package/dist/ai/src/capability-bootstrap.d.ts +222 -0
- package/dist/ai/src/capability-bootstrap.d.ts.map +1 -0
- package/dist/ai/src/capability-bootstrap.js +421 -0
- package/dist/ai/src/capability-bootstrap.js.map +1 -0
- package/dist/ai/src/capability-manifest-generator.d.ts +61 -0
- package/dist/ai/src/capability-manifest-generator.d.ts.map +1 -0
- package/dist/ai/src/capability-manifest-generator.js +700 -0
- package/dist/ai/src/capability-manifest-generator.js.map +1 -0
- package/dist/ai/src/capability-registry.d.ts +157 -0
- package/dist/ai/src/capability-registry.d.ts.map +1 -0
- package/dist/ai/src/capability-registry.js +577 -0
- package/dist/ai/src/capability-registry.js.map +1 -0
- package/dist/ai/src/cli/telemetry-dashboard.d.ts +132 -0
- package/dist/ai/src/cli/telemetry-dashboard.d.ts.map +1 -0
- package/dist/ai/src/cli/telemetry-dashboard.js +565 -0
- package/dist/ai/src/cli/telemetry-dashboard.js.map +1 -0
- package/dist/ai/src/delegation/feature-flags.d.ts +213 -0
- package/dist/ai/src/delegation/feature-flags.d.ts.map +1 -0
- package/dist/ai/src/delegation/feature-flags.js +395 -0
- package/dist/ai/src/delegation/feature-flags.js.map +1 -0
- package/dist/ai/src/delegation/liability-firebreak.d.ts +303 -0
- package/dist/ai/src/delegation/liability-firebreak.d.ts.map +1 -0
- package/dist/ai/src/delegation/liability-firebreak.js +643 -0
- package/dist/ai/src/delegation/liability-firebreak.js.map +1 -0
- package/dist/ai/src/delegation/security-threat-model.d.ts +171 -0
- package/dist/ai/src/delegation/security-threat-model.d.ts.map +1 -0
- package/dist/ai/src/delegation/security-threat-model.js +723 -0
- package/dist/ai/src/delegation/security-threat-model.js.map +1 -0
- package/dist/ai/src/delegation/tlp-enforcement.d.ts +146 -0
- package/dist/ai/src/delegation/tlp-enforcement.d.ts.map +1 -0
- package/dist/ai/src/delegation/tlp-enforcement.js +382 -0
- package/dist/ai/src/delegation/tlp-enforcement.js.map +1 -0
- package/dist/ai/src/delegation-capability-integration.d.ts +154 -0
- package/dist/ai/src/delegation-capability-integration.d.ts.map +1 -0
- package/dist/ai/src/delegation-capability-integration.js +351 -0
- package/dist/ai/src/delegation-capability-integration.js.map +1 -0
- package/dist/ai/src/end-to-end-workflow-orchestrator.d.ts +325 -0
- package/dist/ai/src/end-to-end-workflow-orchestrator.d.ts.map +1 -0
- package/dist/ai/src/end-to-end-workflow-orchestrator.js +801 -0
- package/dist/ai/src/end-to-end-workflow-orchestrator.js.map +1 -0
- package/dist/ai/src/enhanced-capability-detection.d.ts +237 -0
- package/dist/ai/src/enhanced-capability-detection.d.ts.map +1 -0
- package/dist/ai/src/enhanced-capability-detection.js +448 -0
- package/dist/ai/src/enhanced-capability-detection.js.map +1 -0
- package/dist/ai/src/intelligent-cache-manager.d.ts +327 -0
- package/dist/ai/src/intelligent-cache-manager.d.ts.map +1 -0
- package/dist/ai/src/intelligent-cache-manager.js +634 -0
- package/dist/ai/src/intelligent-cache-manager.js.map +1 -0
- package/dist/ai/src/mcp-auto-configuration.d.ts +232 -0
- package/dist/ai/src/mcp-auto-configuration.d.ts.map +1 -0
- package/dist/ai/src/mcp-auto-configuration.js +445 -0
- package/dist/ai/src/mcp-auto-configuration.js.map +1 -0
- package/dist/ai/src/performance-profiler.d.ts +351 -0
- package/dist/ai/src/performance-profiler.d.ts.map +1 -0
- package/dist/ai/src/performance-profiler.js +475 -0
- package/dist/ai/src/performance-profiler.js.map +1 -0
- package/dist/ai/src/personas/hooks/before-llm-call.d.ts +96 -0
- package/dist/ai/src/personas/hooks/before-llm-call.d.ts.map +1 -0
- package/dist/ai/src/personas/hooks/before-llm-call.js +83 -0
- package/dist/ai/src/personas/hooks/before-llm-call.js.map +1 -0
- package/dist/ai/src/personas/index.d.ts +10 -0
- package/dist/ai/src/personas/index.d.ts.map +1 -0
- package/dist/ai/src/personas/index.js +10 -0
- package/dist/ai/src/personas/index.js.map +1 -0
- package/dist/ai/src/personas/persona-loader.d.ts +42 -0
- package/dist/ai/src/personas/persona-loader.d.ts.map +1 -0
- package/dist/ai/src/personas/persona-loader.js +162 -0
- package/dist/ai/src/personas/persona-loader.js.map +1 -0
- package/dist/ai/src/personas/types.d.ts +199 -0
- package/dist/ai/src/personas/types.d.ts.map +1 -0
- package/dist/ai/src/personas/types.js +7 -0
- package/dist/ai/src/personas/types.js.map +1 -0
- package/dist/ai/src/personas/voice-resolver.d.ts +40 -0
- package/dist/ai/src/personas/voice-resolver.d.ts.map +1 -0
- package/dist/ai/src/personas/voice-resolver.js +201 -0
- package/dist/ai/src/personas/voice-resolver.js.map +1 -0
- package/dist/ai/src/resource-monitor.d.ts +311 -0
- package/dist/ai/src/resource-monitor.d.ts.map +1 -0
- package/dist/ai/src/resource-monitor.js +475 -0
- package/dist/ai/src/resource-monitor.js.map +1 -0
- package/dist/ai/src/runtime/agent-runtime.d.ts +340 -0
- package/dist/ai/src/runtime/agent-runtime.d.ts.map +1 -0
- package/dist/ai/src/runtime/agent-runtime.js +1084 -0
- package/dist/ai/src/runtime/agent-runtime.js.map +1 -0
- package/dist/ai/src/telemetry/delegation-telemetry.d.ts +287 -0
- package/dist/ai/src/telemetry/delegation-telemetry.d.ts.map +1 -0
- package/dist/ai/src/telemetry/delegation-telemetry.js +389 -0
- package/dist/ai/src/telemetry/delegation-telemetry.js.map +1 -0
- package/dist/ai/src/telemetry/index.d.ts +48 -0
- package/dist/ai/src/telemetry/index.d.ts.map +1 -0
- package/dist/ai/src/telemetry/index.js +48 -0
- package/dist/ai/src/telemetry/index.js.map +1 -0
- package/dist/ai/src/telemetry/runtime-telemetry-integration.d.ts +67 -0
- package/dist/ai/src/telemetry/runtime-telemetry-integration.d.ts.map +1 -0
- package/dist/ai/src/telemetry/runtime-telemetry-integration.js +415 -0
- package/dist/ai/src/telemetry/runtime-telemetry-integration.js.map +1 -0
- package/dist/ai/src/telemetry/telemetry-utils.d.ts +119 -0
- package/dist/ai/src/telemetry/telemetry-utils.d.ts.map +1 -0
- package/dist/ai/src/telemetry/telemetry-utils.js +250 -0
- package/dist/ai/src/telemetry/telemetry-utils.js.map +1 -0
- package/dist/ai/src/types/agent-capabilities.d.ts +227 -0
- package/dist/ai/src/types/agent-capabilities.d.ts.map +1 -0
- package/dist/ai/src/types/agent-capabilities.js +11 -0
- package/dist/ai/src/types/agent-capabilities.js.map +1 -0
- package/dist/ai/src/types/context-verification.d.ts +158 -0
- package/dist/ai/src/types/context-verification.d.ts.map +1 -0
- package/dist/ai/src/types/context-verification.js +73 -0
- package/dist/ai/src/types/context-verification.js.map +1 -0
- package/dist/ai/src/types/delegation-contracts.d.ts +296 -0
- package/dist/ai/src/types/delegation-contracts.d.ts.map +1 -0
- package/dist/ai/src/types/delegation-contracts.js +17 -0
- package/dist/ai/src/types/delegation-contracts.js.map +1 -0
- package/dist/ai/src/validation-pipeline-integration.d.ts +266 -0
- package/dist/ai/src/validation-pipeline-integration.d.ts.map +1 -0
- package/dist/ai/src/validation-pipeline-integration.js +695 -0
- package/dist/ai/src/validation-pipeline-integration.js.map +1 -0
- package/dist/ai/src/verification/multi-modal-formatters.d.ts +57 -0
- package/dist/ai/src/verification/multi-modal-formatters.d.ts.map +1 -0
- package/dist/ai/src/verification/multi-modal-formatters.js +655 -0
- package/dist/ai/src/verification/multi-modal-formatters.js.map +1 -0
- package/dist/ai/src/verification/output-formatter.d.ts +186 -0
- package/dist/ai/src/verification/output-formatter.d.ts.map +1 -0
- package/dist/ai/src/verification/output-formatter.js +296 -0
- package/dist/ai/src/verification/output-formatter.js.map +1 -0
- package/dist/ai/src/verification/parser-integration.d.ts +137 -0
- package/dist/ai/src/verification/parser-integration.d.ts.map +1 -0
- package/dist/ai/src/verification/parser-integration.js +273 -0
- package/dist/ai/src/verification/parser-integration.js.map +1 -0
- package/dist/ai/types/agent-capabilities.d.ts +387 -0
- package/dist/ai/types/agent-capabilities.d.ts.map +1 -0
- package/dist/ai/types/agent-capabilities.js +32 -0
- package/dist/ai/types/agent-capabilities.js.map +1 -0
- package/dist/ai/types/delegation-contracts.d.ts +291 -0
- package/dist/ai/types/delegation-contracts.d.ts.map +1 -0
- package/dist/ai/types/delegation-contracts.js +14 -0
- package/dist/ai/types/delegation-contracts.js.map +1 -0
- package/dist/ai/types/index.d.ts +4 -1
- package/dist/ai/types/index.d.ts.map +1 -1
- package/dist/ai/types/index.js +4 -1
- package/dist/ai/types/index.js.map +1 -1
- package/dist/ai/types/permission-tokens.d.ts +365 -0
- package/dist/ai/types/permission-tokens.d.ts.map +1 -0
- package/dist/ai/types/permission-tokens.js +13 -0
- package/dist/ai/types/permission-tokens.js.map +1 -0
- package/dist/ai/types/security-middleware.d.ts +130 -0
- package/dist/ai/types/security-middleware.d.ts.map +1 -0
- package/dist/ai/types/security-middleware.js +13 -0
- package/dist/ai/types/security-middleware.js.map +1 -0
- package/dist/ai/utils/storage.d.ts.map +1 -1
- package/dist/ai/utils/storage.js +6 -3
- package/dist/ai/utils/storage.js.map +1 -1
- package/dist/ai/validation/validation-framework.js +1 -1
- package/dist/ai/verification/policy-framework.d.ts +161 -0
- package/dist/ai/verification/policy-framework.d.ts.map +1 -0
- package/dist/ai/verification/policy-framework.js +436 -0
- package/dist/ai/verification/policy-framework.js.map +1 -0
- package/package.json +36 -8
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DCYFR Session Manager
|
|
3
|
+
* TLP:AMBER - Internal Use Only
|
|
4
|
+
*
|
|
5
|
+
* Lifecycle tracking for delegation sessions.
|
|
6
|
+
*
|
|
7
|
+
* Manages:
|
|
8
|
+
* - In-memory session store with periodic flush to disk
|
|
9
|
+
* - Session state transitions: active → paused → archived
|
|
10
|
+
* - Status indicators: unread | in-progress | blocked
|
|
11
|
+
* - Archived session persistence at `logs/delegation/sessions/YYYY-MM-DD/<session-id>.jsonl`
|
|
12
|
+
*
|
|
13
|
+
* @module delegation/session-manager
|
|
14
|
+
* @version 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
import { EventEmitter } from 'events';
|
|
17
|
+
import { appendFileSync, mkdirSync } from 'fs';
|
|
18
|
+
import { join, dirname } from 'path';
|
|
19
|
+
import { fileURLToPath } from 'url';
|
|
20
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
21
|
+
// SessionManager
|
|
22
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
23
|
+
/**
|
|
24
|
+
* Tracks delegation session lifecycle and status indicators.
|
|
25
|
+
*
|
|
26
|
+
* Emits:
|
|
27
|
+
* - `session:created` — A new session was registered.
|
|
28
|
+
* - `session:updated` — A session's state or status changed.
|
|
29
|
+
* - `session:paused` — A session transitioned to paused.
|
|
30
|
+
* - `session:archived` — A session was archived (written to disk).
|
|
31
|
+
* - `session:blocked` — A session became blocked.
|
|
32
|
+
* - `session:unblocked` — A blocked session was cleared.
|
|
33
|
+
* - `flush` — Periodic background flush completed.
|
|
34
|
+
*/
|
|
35
|
+
export class SessionManager extends EventEmitter {
|
|
36
|
+
sessions = new Map();
|
|
37
|
+
archiveBaseDir;
|
|
38
|
+
flushTimer = null;
|
|
39
|
+
constructor(options = {}) {
|
|
40
|
+
super();
|
|
41
|
+
if (options.archiveBaseDir) {
|
|
42
|
+
this.archiveBaseDir = options.archiveBaseDir;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const thisDir = dirname(fileURLToPath(import.meta.url));
|
|
46
|
+
const workspaceRoot = join(thisDir, '..', '..', '..', '..', '..', '..');
|
|
47
|
+
this.archiveBaseDir = join(workspaceRoot, 'logs', 'delegation', 'sessions');
|
|
48
|
+
}
|
|
49
|
+
const flushMs = options.flushIntervalMs ?? 60_000;
|
|
50
|
+
if (flushMs > 0) {
|
|
51
|
+
this.flushTimer = setInterval(() => this._flushArchived(), flushMs);
|
|
52
|
+
// Don't block the process for the background flush timer.
|
|
53
|
+
if (typeof this.flushTimer.unref === 'function') {
|
|
54
|
+
this.flushTimer.unref();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// ─────────────── Lifecycle ───────────────
|
|
59
|
+
/**
|
|
60
|
+
* Register a new session (initial status: 'unread', lifecycle: 'active').
|
|
61
|
+
*/
|
|
62
|
+
register(sessionId, contractId, executionMode, initialState) {
|
|
63
|
+
const now = new Date().toISOString();
|
|
64
|
+
const session = {
|
|
65
|
+
sessionId,
|
|
66
|
+
contractId,
|
|
67
|
+
executionMode,
|
|
68
|
+
lifeCycle: 'active',
|
|
69
|
+
status: 'unread',
|
|
70
|
+
state: { ...initialState },
|
|
71
|
+
createdAt: now,
|
|
72
|
+
updatedAt: now,
|
|
73
|
+
};
|
|
74
|
+
this.sessions.set(sessionId, session);
|
|
75
|
+
this.emit('session:created', session);
|
|
76
|
+
return session;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Update the in-memory state for an existing session.
|
|
80
|
+
* Automatically marks lifecycle as 'active' if it was 'paused'.
|
|
81
|
+
*/
|
|
82
|
+
updateState(sessionId, newState) {
|
|
83
|
+
const session = this._requireSession(sessionId);
|
|
84
|
+
session.state = { ...session.state, ...newState, lastActivity: new Date().toISOString() };
|
|
85
|
+
session.updatedAt = new Date().toISOString();
|
|
86
|
+
if (session.lifeCycle === 'paused') {
|
|
87
|
+
session.lifeCycle = 'active';
|
|
88
|
+
}
|
|
89
|
+
this.emit('session:updated', session);
|
|
90
|
+
return session;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Pause a session (lifecycle: 'paused').
|
|
94
|
+
*/
|
|
95
|
+
pause(sessionId) {
|
|
96
|
+
const session = this._requireSession(sessionId);
|
|
97
|
+
if (session.lifeCycle === 'archived') {
|
|
98
|
+
throw new Error(`Cannot pause archived session ${sessionId}`);
|
|
99
|
+
}
|
|
100
|
+
session.lifeCycle = 'paused';
|
|
101
|
+
session.state.status = 'paused';
|
|
102
|
+
session.updatedAt = new Date().toISOString();
|
|
103
|
+
this.emit('session:paused', session);
|
|
104
|
+
return session;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Archive a session — transitions to 'archived' and queues disk write.
|
|
108
|
+
* Archived sessions are dropped from the in-memory store after the next flush.
|
|
109
|
+
*/
|
|
110
|
+
archive(sessionId) {
|
|
111
|
+
const session = this._requireSession(sessionId);
|
|
112
|
+
session.lifeCycle = 'archived';
|
|
113
|
+
session.state.status = 'archived';
|
|
114
|
+
session.archivedAt = new Date().toISOString();
|
|
115
|
+
session.updatedAt = session.archivedAt;
|
|
116
|
+
this._writeArchivedSession(session);
|
|
117
|
+
this.sessions.delete(sessionId);
|
|
118
|
+
this.emit('session:archived', session);
|
|
119
|
+
return session;
|
|
120
|
+
}
|
|
121
|
+
// ─────────────── Status indicators ───────────────
|
|
122
|
+
/**
|
|
123
|
+
* Mark a session as 'in-progress' (user has read it and work is active).
|
|
124
|
+
*/
|
|
125
|
+
markInProgress(sessionId) {
|
|
126
|
+
const session = this._requireSession(sessionId);
|
|
127
|
+
session.status = 'in-progress';
|
|
128
|
+
session.updatedAt = new Date().toISOString();
|
|
129
|
+
this.emit('session:updated', session);
|
|
130
|
+
return session;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Mark a session as 'blocked' with an optional reason.
|
|
134
|
+
*/
|
|
135
|
+
block(sessionId, reason) {
|
|
136
|
+
const session = this._requireSession(sessionId);
|
|
137
|
+
session.status = 'blocked';
|
|
138
|
+
session.blockReason = reason;
|
|
139
|
+
session.updatedAt = new Date().toISOString();
|
|
140
|
+
this.emit('session:blocked', session);
|
|
141
|
+
return session;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Clear a 'blocked' status — transitions back to 'in-progress'.
|
|
145
|
+
*/
|
|
146
|
+
unblock(sessionId) {
|
|
147
|
+
const session = this._requireSession(sessionId);
|
|
148
|
+
if (session.status !== 'blocked')
|
|
149
|
+
return session;
|
|
150
|
+
session.status = 'in-progress';
|
|
151
|
+
delete session.blockReason;
|
|
152
|
+
session.updatedAt = new Date().toISOString();
|
|
153
|
+
this.emit('session:unblocked', session);
|
|
154
|
+
return session;
|
|
155
|
+
}
|
|
156
|
+
// ─────────────── Queries ───────────────
|
|
157
|
+
/** Retrieve a session by ID. Returns `undefined` if not found. */
|
|
158
|
+
get(sessionId) {
|
|
159
|
+
return this.sessions.get(sessionId);
|
|
160
|
+
}
|
|
161
|
+
/** Return all in-memory sessions. */
|
|
162
|
+
getAll() {
|
|
163
|
+
return Array.from(this.sessions.values());
|
|
164
|
+
}
|
|
165
|
+
/** Return sessions filtered by lifecycle. */
|
|
166
|
+
getByLifeCycle(lifeCycle) {
|
|
167
|
+
return this.getAll().filter((s) => s.lifeCycle === lifeCycle);
|
|
168
|
+
}
|
|
169
|
+
/** Return sessions filtered by workflow status. */
|
|
170
|
+
getByStatus(status) {
|
|
171
|
+
return this.getAll().filter((s) => s.status === status);
|
|
172
|
+
}
|
|
173
|
+
/** Return all unread sessions. */
|
|
174
|
+
getUnread() {
|
|
175
|
+
return this.getByStatus('unread');
|
|
176
|
+
}
|
|
177
|
+
/** Return all in-progress sessions. */
|
|
178
|
+
getInProgress() {
|
|
179
|
+
return this.getByStatus('in-progress');
|
|
180
|
+
}
|
|
181
|
+
/** Return all blocked sessions. */
|
|
182
|
+
getBlocked() {
|
|
183
|
+
return this.getByStatus('blocked');
|
|
184
|
+
}
|
|
185
|
+
/** Return sessions by execution mode. */
|
|
186
|
+
getByMode(mode) {
|
|
187
|
+
return this.getAll().filter((s) => s.executionMode === mode);
|
|
188
|
+
}
|
|
189
|
+
/** Return all active sessions associated with a given contract ID. */
|
|
190
|
+
getByContractId(contractId) {
|
|
191
|
+
return this.getAll().filter((s) => s.contractId === contractId);
|
|
192
|
+
}
|
|
193
|
+
/** Return the first active session for a contract, or undefined if none found. */
|
|
194
|
+
getActiveSessionForContract(contractId) {
|
|
195
|
+
return this.getByContractId(contractId).find((s) => s.lifeCycle === 'active');
|
|
196
|
+
}
|
|
197
|
+
/** Total count of in-memory sessions. */
|
|
198
|
+
get size() {
|
|
199
|
+
return this.sessions.size;
|
|
200
|
+
}
|
|
201
|
+
// ─────────────── Cleanup ───────────────
|
|
202
|
+
/**
|
|
203
|
+
* Stop the background flush timer and release resources.
|
|
204
|
+
*/
|
|
205
|
+
destroy() {
|
|
206
|
+
if (this.flushTimer !== null) {
|
|
207
|
+
clearInterval(this.flushTimer);
|
|
208
|
+
this.flushTimer = null;
|
|
209
|
+
}
|
|
210
|
+
this.removeAllListeners();
|
|
211
|
+
}
|
|
212
|
+
// ─────────────── Private ───────────────
|
|
213
|
+
_requireSession(sessionId) {
|
|
214
|
+
const s = this.sessions.get(sessionId);
|
|
215
|
+
if (!s)
|
|
216
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
217
|
+
return s;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Write an archived session as a JSONL line to the date-based archive file.
|
|
221
|
+
* Path: `<archiveBaseDir>/YYYY-MM-DD/<session-id>.jsonl`
|
|
222
|
+
*/
|
|
223
|
+
_writeArchivedSession(session) {
|
|
224
|
+
try {
|
|
225
|
+
const date = (session.archivedAt ?? new Date().toISOString()).slice(0, 10);
|
|
226
|
+
const dayDir = join(this.archiveBaseDir, date);
|
|
227
|
+
mkdirSync(dayDir, { recursive: true });
|
|
228
|
+
const filePath = join(dayDir, `${session.sessionId}.jsonl`);
|
|
229
|
+
appendFileSync(filePath, JSON.stringify(session) + '\n', 'utf8');
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// Non-fatal — session is removed from memory regardless
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Periodic flush: nothing to flush for in-memory only — the archive write
|
|
237
|
+
* happens inline in `archive()`. This hook is reserved for future batching.
|
|
238
|
+
*/
|
|
239
|
+
_flushArchived() {
|
|
240
|
+
this.emit('flush', { timestamp: new Date().toISOString(), activeSessions: this.sessions.size });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../packages/ai/delegation/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DCYFR Background Session Queue
|
|
3
|
+
* TLP:AMBER - Internal Use Only
|
|
4
|
+
*
|
|
5
|
+
* FIFO queue managing the 10-slot background session concurrency limit.
|
|
6
|
+
* Prevents resource exhaustion while providing observability into queue state.
|
|
7
|
+
*
|
|
8
|
+
* @module delegation/session-queue
|
|
9
|
+
* @version 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'events';
|
|
12
|
+
/** Maximum concurrent background sessions. */
|
|
13
|
+
export declare const MAX_BACKGROUND_SESSIONS = 10;
|
|
14
|
+
/** Status of the background session queue. */
|
|
15
|
+
export interface BackgroundQueueStatus {
|
|
16
|
+
/** Number of active background sessions. */
|
|
17
|
+
activeCount: number;
|
|
18
|
+
/** Remaining capacity for new background sessions. */
|
|
19
|
+
remainingCapacity: number;
|
|
20
|
+
/** Whether the queue is at maximum capacity. */
|
|
21
|
+
atCapacity: boolean;
|
|
22
|
+
/** List of currently active session IDs. */
|
|
23
|
+
activeSessionIds: string[];
|
|
24
|
+
/** List of session IDs waiting to be processed (queue depth). */
|
|
25
|
+
queuedSessionIds: string[];
|
|
26
|
+
}
|
|
27
|
+
/** Entry stored in the queue. */
|
|
28
|
+
export interface QueueEntry {
|
|
29
|
+
sessionId: string;
|
|
30
|
+
contractId: string;
|
|
31
|
+
/** ISO 8601 timestamp when the entry was enqueued. */
|
|
32
|
+
enqueuedAt: string;
|
|
33
|
+
/** Optional resolve function called when a slot opens. */
|
|
34
|
+
resolve?: () => void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* FIFO queue managing concurrent background delegation sessions.
|
|
38
|
+
*
|
|
39
|
+
* Emits the following events:
|
|
40
|
+
* - `enqueued` — A new session entered the queue (waiting for slot).
|
|
41
|
+
* - `activated` — A session moved from queue to active set.
|
|
42
|
+
* - `released` — A session slot was released.
|
|
43
|
+
* - `status` — Queue status changed (active/queued counts changed).
|
|
44
|
+
*/
|
|
45
|
+
export declare class BackgroundSessionQueue extends EventEmitter {
|
|
46
|
+
private readonly maxSlots;
|
|
47
|
+
/** Set of session IDs currently occupying an active slot. */
|
|
48
|
+
private readonly activeSessions;
|
|
49
|
+
/** FIFO queue of sessions waiting for a slot. */
|
|
50
|
+
private readonly waitQueue;
|
|
51
|
+
/** Map of sessionId → QueueEntry for active sessions. */
|
|
52
|
+
private readonly activeEntries;
|
|
53
|
+
constructor(maxSlots?: number);
|
|
54
|
+
/**
|
|
55
|
+
* Attempt to acquire a background slot for the given session.
|
|
56
|
+
*
|
|
57
|
+
* - If capacity is available, resolves immediately and marks the slot active.
|
|
58
|
+
* - If at capacity, enqueues the session and resolves when a slot opens.
|
|
59
|
+
*
|
|
60
|
+
* @returns A promise that resolves when the session has an active slot.
|
|
61
|
+
*/
|
|
62
|
+
acquire(sessionId: string, contractId: string): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Release a background slot previously acquired for `sessionId`.
|
|
65
|
+
* If there are queued sessions, the next one is activated immediately.
|
|
66
|
+
*/
|
|
67
|
+
release(sessionId: string): void;
|
|
68
|
+
/**
|
|
69
|
+
* Returns `true` if there is at least one free background slot.
|
|
70
|
+
*/
|
|
71
|
+
hasCapacity(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Number of active background sessions.
|
|
74
|
+
*/
|
|
75
|
+
get activeCount(): number;
|
|
76
|
+
/**
|
|
77
|
+
* Number of sessions waiting for a slot.
|
|
78
|
+
*/
|
|
79
|
+
get queueDepth(): number;
|
|
80
|
+
/**
|
|
81
|
+
* Current queue snapshot for observability.
|
|
82
|
+
*/
|
|
83
|
+
getStatus(): BackgroundQueueStatus;
|
|
84
|
+
/**
|
|
85
|
+
* Whether a given sessionId currently holds an active slot.
|
|
86
|
+
*/
|
|
87
|
+
isActive(sessionId: string): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Whether a given sessionId is waiting in the queue.
|
|
90
|
+
*/
|
|
91
|
+
isQueued(sessionId: string): boolean;
|
|
92
|
+
private _activate;
|
|
93
|
+
private _emitStatus;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=session-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-queue.d.ts","sourceRoot":"","sources":["../../../packages/ai/delegation/session-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,8CAA8C;AAC9C,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,8CAA8C;AAC9C,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,UAAU,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,iEAAiE;IACjE,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,iCAAiC;AACjC,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IAU1C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IATrC,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IAEpD,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAE9C,yDAAyD;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiC;gBAElC,QAAQ,GAAE,MAAgC;IAMvE;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7D;;;OAGG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAiBhC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,SAAS,IAAI,qBAAqB;IAUlC;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAMpC,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,WAAW;CAGpB"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DCYFR Background Session Queue
|
|
3
|
+
* TLP:AMBER - Internal Use Only
|
|
4
|
+
*
|
|
5
|
+
* FIFO queue managing the 10-slot background session concurrency limit.
|
|
6
|
+
* Prevents resource exhaustion while providing observability into queue state.
|
|
7
|
+
*
|
|
8
|
+
* @module delegation/session-queue
|
|
9
|
+
* @version 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'events';
|
|
12
|
+
/** Maximum concurrent background sessions. */
|
|
13
|
+
export const MAX_BACKGROUND_SESSIONS = 10;
|
|
14
|
+
/**
|
|
15
|
+
* FIFO queue managing concurrent background delegation sessions.
|
|
16
|
+
*
|
|
17
|
+
* Emits the following events:
|
|
18
|
+
* - `enqueued` — A new session entered the queue (waiting for slot).
|
|
19
|
+
* - `activated` — A session moved from queue to active set.
|
|
20
|
+
* - `released` — A session slot was released.
|
|
21
|
+
* - `status` — Queue status changed (active/queued counts changed).
|
|
22
|
+
*/
|
|
23
|
+
export class BackgroundSessionQueue extends EventEmitter {
|
|
24
|
+
maxSlots;
|
|
25
|
+
/** Set of session IDs currently occupying an active slot. */
|
|
26
|
+
activeSessions = new Set();
|
|
27
|
+
/** FIFO queue of sessions waiting for a slot. */
|
|
28
|
+
waitQueue = [];
|
|
29
|
+
/** Map of sessionId → QueueEntry for active sessions. */
|
|
30
|
+
activeEntries = new Map();
|
|
31
|
+
constructor(maxSlots = MAX_BACKGROUND_SESSIONS) {
|
|
32
|
+
super();
|
|
33
|
+
this.maxSlots = maxSlots;
|
|
34
|
+
}
|
|
35
|
+
// ───────────── Public API ─────────────
|
|
36
|
+
/**
|
|
37
|
+
* Attempt to acquire a background slot for the given session.
|
|
38
|
+
*
|
|
39
|
+
* - If capacity is available, resolves immediately and marks the slot active.
|
|
40
|
+
* - If at capacity, enqueues the session and resolves when a slot opens.
|
|
41
|
+
*
|
|
42
|
+
* @returns A promise that resolves when the session has an active slot.
|
|
43
|
+
*/
|
|
44
|
+
acquire(sessionId, contractId) {
|
|
45
|
+
if (this.activeSessions.size < this.maxSlots) {
|
|
46
|
+
this._activate({ sessionId, contractId, enqueuedAt: new Date().toISOString() });
|
|
47
|
+
return Promise.resolve();
|
|
48
|
+
}
|
|
49
|
+
return new Promise((resolve) => {
|
|
50
|
+
const entry = {
|
|
51
|
+
sessionId,
|
|
52
|
+
contractId,
|
|
53
|
+
enqueuedAt: new Date().toISOString(),
|
|
54
|
+
resolve,
|
|
55
|
+
};
|
|
56
|
+
this.waitQueue.push(entry);
|
|
57
|
+
this.emit('enqueued', { sessionId, contractId, queuePosition: this.waitQueue.length });
|
|
58
|
+
this._emitStatus();
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Release a background slot previously acquired for `sessionId`.
|
|
63
|
+
* If there are queued sessions, the next one is activated immediately.
|
|
64
|
+
*/
|
|
65
|
+
release(sessionId) {
|
|
66
|
+
if (!this.activeSessions.has(sessionId))
|
|
67
|
+
return;
|
|
68
|
+
this.activeSessions.delete(sessionId);
|
|
69
|
+
this.activeEntries.delete(sessionId);
|
|
70
|
+
this.emit('released', { sessionId });
|
|
71
|
+
// Promote next waiting session
|
|
72
|
+
if (this.waitQueue.length > 0) {
|
|
73
|
+
const next = this.waitQueue.shift();
|
|
74
|
+
this._activate(next);
|
|
75
|
+
next.resolve?.();
|
|
76
|
+
}
|
|
77
|
+
this._emitStatus();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Returns `true` if there is at least one free background slot.
|
|
81
|
+
*/
|
|
82
|
+
hasCapacity() {
|
|
83
|
+
return this.activeSessions.size < this.maxSlots;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Number of active background sessions.
|
|
87
|
+
*/
|
|
88
|
+
get activeCount() {
|
|
89
|
+
return this.activeSessions.size;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Number of sessions waiting for a slot.
|
|
93
|
+
*/
|
|
94
|
+
get queueDepth() {
|
|
95
|
+
return this.waitQueue.length;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Current queue snapshot for observability.
|
|
99
|
+
*/
|
|
100
|
+
getStatus() {
|
|
101
|
+
return {
|
|
102
|
+
activeCount: this.activeSessions.size,
|
|
103
|
+
remainingCapacity: this.maxSlots - this.activeSessions.size,
|
|
104
|
+
atCapacity: this.activeSessions.size >= this.maxSlots,
|
|
105
|
+
activeSessionIds: Array.from(this.activeSessions),
|
|
106
|
+
queuedSessionIds: this.waitQueue.map((e) => e.sessionId),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Whether a given sessionId currently holds an active slot.
|
|
111
|
+
*/
|
|
112
|
+
isActive(sessionId) {
|
|
113
|
+
return this.activeSessions.has(sessionId);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Whether a given sessionId is waiting in the queue.
|
|
117
|
+
*/
|
|
118
|
+
isQueued(sessionId) {
|
|
119
|
+
return this.waitQueue.some((e) => e.sessionId === sessionId);
|
|
120
|
+
}
|
|
121
|
+
// ───────────── Private helpers ─────────────
|
|
122
|
+
_activate(entry) {
|
|
123
|
+
this.activeSessions.add(entry.sessionId);
|
|
124
|
+
this.activeEntries.set(entry.sessionId, entry);
|
|
125
|
+
this.emit('activated', {
|
|
126
|
+
sessionId: entry.sessionId,
|
|
127
|
+
contractId: entry.contractId,
|
|
128
|
+
activatedAt: new Date().toISOString(),
|
|
129
|
+
});
|
|
130
|
+
this._emitStatus();
|
|
131
|
+
}
|
|
132
|
+
_emitStatus() {
|
|
133
|
+
this.emit('status', this.getStatus());
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=session-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-queue.js","sourceRoot":"","sources":["../../../packages/ai/delegation/session-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract Timeout Watchdog
|
|
3
|
+
* TLP:AMBER - Internal Use Only
|
|
4
|
+
*
|
|
5
|
+
* Design decision D3: Periodic watchdog model.
|
|
6
|
+
* Scans all active contracts on a configurable interval and fires timeout events
|
|
7
|
+
* for contracts whose `timeout_ms` has elapsed. Also exposes `heartbeat()` so
|
|
8
|
+
* long-running delegations can extend their deadline.
|
|
9
|
+
*
|
|
10
|
+
* @module delegation/timeout-watchdog
|
|
11
|
+
* @version 1.0.0
|
|
12
|
+
* @date 2026-02-24
|
|
13
|
+
*/
|
|
14
|
+
import { EventEmitter } from 'events';
|
|
15
|
+
export interface WatchdogConfig {
|
|
16
|
+
/** How often the watchdog ticks. Default: 30 000 ms */
|
|
17
|
+
intervalMs?: number;
|
|
18
|
+
/** Grace period added to a heartbeat. Default: 30 000 ms */
|
|
19
|
+
heartbeatGraceMs?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface WatchdogContract {
|
|
22
|
+
contract_id: string;
|
|
23
|
+
created_at: string;
|
|
24
|
+
timeout_ms: number;
|
|
25
|
+
last_heartbeat_at?: string;
|
|
26
|
+
status: string;
|
|
27
|
+
}
|
|
28
|
+
export interface TimeoutEvent {
|
|
29
|
+
contract_id: string;
|
|
30
|
+
created_at: string;
|
|
31
|
+
timeout_ms: number;
|
|
32
|
+
elapsed_ms: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* ContractTimeoutWatchdog emits:
|
|
36
|
+
* - `contract_timeout` when a contract's deadline has passed
|
|
37
|
+
* - `heartbeat_updated` when heartbeat() extends a deadline
|
|
38
|
+
* - `watchdog_tick` on every scan cycle (for observability)
|
|
39
|
+
*/
|
|
40
|
+
export declare class ContractTimeoutWatchdog extends EventEmitter {
|
|
41
|
+
private readonly intervalMs;
|
|
42
|
+
private readonly heartbeatGraceMs;
|
|
43
|
+
private timer;
|
|
44
|
+
/** Contracts registered for timeout monitoring */
|
|
45
|
+
private readonly tracked;
|
|
46
|
+
/** Per-contract extended deadline (heartbeat grants extra time) */
|
|
47
|
+
private readonly extendedDeadlines;
|
|
48
|
+
constructor(config?: WatchdogConfig);
|
|
49
|
+
start(): void;
|
|
50
|
+
stop(): void;
|
|
51
|
+
track(contract: WatchdogContract): void;
|
|
52
|
+
untrack(contractId: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Extend the deadline for a contract by `heartbeatGraceMs`.
|
|
55
|
+
* Called by the contract-manager's heartbeat endpoint.
|
|
56
|
+
*/
|
|
57
|
+
heartbeat(contractId: string): void;
|
|
58
|
+
private tick;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=timeout-watchdog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout-watchdog.d.ts","sourceRoot":"","sources":["../../../packages/ai/delegation/timeout-watchdog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,KAAK,CAA+C;IAE5D,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6B;gBAEnD,MAAM,GAAE,cAAmB;IAUvC,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;IAWZ,KAAK,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIvC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAKjC;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAUnC,OAAO,CAAC,IAAI;CA6Bb"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract Timeout Watchdog
|
|
3
|
+
* TLP:AMBER - Internal Use Only
|
|
4
|
+
*
|
|
5
|
+
* Design decision D3: Periodic watchdog model.
|
|
6
|
+
* Scans all active contracts on a configurable interval and fires timeout events
|
|
7
|
+
* for contracts whose `timeout_ms` has elapsed. Also exposes `heartbeat()` so
|
|
8
|
+
* long-running delegations can extend their deadline.
|
|
9
|
+
*
|
|
10
|
+
* @module delegation/timeout-watchdog
|
|
11
|
+
* @version 1.0.0
|
|
12
|
+
* @date 2026-02-24
|
|
13
|
+
*/
|
|
14
|
+
import { EventEmitter } from 'events';
|
|
15
|
+
/**
|
|
16
|
+
* ContractTimeoutWatchdog emits:
|
|
17
|
+
* - `contract_timeout` when a contract's deadline has passed
|
|
18
|
+
* - `heartbeat_updated` when heartbeat() extends a deadline
|
|
19
|
+
* - `watchdog_tick` on every scan cycle (for observability)
|
|
20
|
+
*/
|
|
21
|
+
export class ContractTimeoutWatchdog extends EventEmitter {
|
|
22
|
+
intervalMs;
|
|
23
|
+
heartbeatGraceMs;
|
|
24
|
+
timer = null;
|
|
25
|
+
/** Contracts registered for timeout monitoring */
|
|
26
|
+
tracked = new Map();
|
|
27
|
+
/** Per-contract extended deadline (heartbeat grants extra time) */
|
|
28
|
+
extendedDeadlines = new Map();
|
|
29
|
+
constructor(config = {}) {
|
|
30
|
+
super();
|
|
31
|
+
this.intervalMs = config.intervalMs ?? 30_000;
|
|
32
|
+
this.heartbeatGraceMs = config.heartbeatGraceMs ?? 30_000;
|
|
33
|
+
}
|
|
34
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
35
|
+
// Lifecycle
|
|
36
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
37
|
+
start() {
|
|
38
|
+
if (this.timer)
|
|
39
|
+
return;
|
|
40
|
+
this.timer = setInterval(() => this.tick(), this.intervalMs);
|
|
41
|
+
// Use unref() if available (Node.js) so watchdog doesn't block process exit
|
|
42
|
+
if (this.timer && typeof this.timer.unref === 'function') {
|
|
43
|
+
this.timer.unref();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
stop() {
|
|
47
|
+
if (this.timer) {
|
|
48
|
+
clearInterval(this.timer);
|
|
49
|
+
this.timer = null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
53
|
+
// Contract tracking
|
|
54
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
55
|
+
track(contract) {
|
|
56
|
+
this.tracked.set(contract.contract_id, contract);
|
|
57
|
+
}
|
|
58
|
+
untrack(contractId) {
|
|
59
|
+
this.tracked.delete(contractId);
|
|
60
|
+
this.extendedDeadlines.delete(contractId);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Extend the deadline for a contract by `heartbeatGraceMs`.
|
|
64
|
+
* Called by the contract-manager's heartbeat endpoint.
|
|
65
|
+
*/
|
|
66
|
+
heartbeat(contractId) {
|
|
67
|
+
const extended = Date.now() + this.heartbeatGraceMs;
|
|
68
|
+
this.extendedDeadlines.set(contractId, extended);
|
|
69
|
+
this.emit('heartbeat_updated', { contract_id: contractId, extended_until: new Date(extended).toISOString() });
|
|
70
|
+
}
|
|
71
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
72
|
+
// Internal tick
|
|
73
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
74
|
+
tick() {
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
const expired = [];
|
|
77
|
+
for (const contract of this.tracked.values()) {
|
|
78
|
+
if (contract.status !== 'active')
|
|
79
|
+
continue;
|
|
80
|
+
const extendedDeadline = this.extendedDeadlines.get(contract.contract_id);
|
|
81
|
+
const baseline = new Date(contract.created_at).getTime() + contract.timeout_ms;
|
|
82
|
+
const deadline = extendedDeadline !== undefined ? Math.max(baseline, extendedDeadline) : baseline;
|
|
83
|
+
if (now > deadline) {
|
|
84
|
+
expired.push({
|
|
85
|
+
contract_id: contract.contract_id,
|
|
86
|
+
created_at: contract.created_at,
|
|
87
|
+
timeout_ms: contract.timeout_ms,
|
|
88
|
+
elapsed_ms: now - new Date(contract.created_at).getTime(),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
this.emit('watchdog_tick', { checked: this.tracked.size, expired: expired.length, timestamp_ms: now });
|
|
93
|
+
for (const ev of expired) {
|
|
94
|
+
// Untrack before emitting so re-entrant calls don't double-fire
|
|
95
|
+
this.untrack(ev.contract_id);
|
|
96
|
+
this.emit('contract_timeout', ev);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=timeout-watchdog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout-watchdog.js","sourceRoot":"","sources":["../../../packages/ai/delegation/timeout-watchdog.ts"],"names":[],"mappings":"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"}
|